Alexey Kardashevskiy <a...@ozlabs.ru> writes: > The iommu_table_ops::xchg_no_kill() callback updates TCE. It is quite > possible that not entire table is allocated if it is huge and multilevel > so xchg may also allocate subtables. If failed, it returns H_HARDWARE > for failed allocation and H_TOO_HARD if it needs it but cannot do because > the alloc parameter is "false" (set when called with MMU=off to force > retry with MMU=on). > > The problem is that having separate errors only matters in real mode > (MMU=off) but the only caller with alloc="false" does not check the exact > error code and simply returns H_TOO_HARD; and for every other mode > alloc is "true". Also, the function is also called from the ioctl() > handler of the VFIO SPAPR TCE IOMMU subdriver which does not expect > hypervisor error codes (H_xxx) and will expose them to the userspace. > > This converts wrong error codes to a simple -1. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> > --- > > I could make it "return alloc ? -ENOMEM : -EBUSY" but > is EBUSY a good match for H_TOO_HARD?
I think -EAGAIN would be the best match. But it would be simpler if it just returned -ENOMEM always. In both cases the problem is that the function needs to allocate memory but couldn't. If a caller passes alloc=false, it knows that, so if it sees ENOMEM it can retry with alloc=true. cheers