[ofa-general] Re: [PATCH] uverbs: return ENOSYS for unimplemented commands (not EINVAL)

Jeff Squyres jsquyres at cisco.com
Wed Dec 3 07:08:03 PST 2008


+1 for this patch (returning ENOSYS instead of EINVAL): it makes life  
a bunch easier for Open MPI because we can tell the difference between  
"it isn't implemented" and a bug in certain versions of ConnectX  
firmware.

Roland -- do you think you'll apply this patch?


On Dec 2, 2008, at 12:43 PM, Jack Morgenstein wrote:

> uverbs: return ENOSYS for unimplemented commands (not EINVAL)
>
> In the original commit (883a99c7024c5763d6d4f22d9239c133893e8d74)
> (Add a mask of device methods allowed for userspace),
> the driver returned EINVAL for unimplemented commands.
>
> This creates a problem that there is no way to differentiate between
> an unimplemented command and an implemented one which is incorrectly
> invoked (which also returns EINVAL).
>
> The fix is to have unimplemented commands return ENOSYS.
>
> Signed-off-by: Jack Morgenstein <jackm at dev.mellanox.co.il>
>
> ---
>
> Roland,
> We've got a bit of a salad here (d--ned if we do, d--ned if we don't).
>
> In userspace, we have low-level libraries put NULL in the virtual  
> function
> table for unimplemented verbs. libibverbs then returns NULL for those
> unimplemented verbs which expect a pointer return (e.g.,  
> ibv_create_srq)
> (also a problem since this does not differentiate between a missing  
> verb and
> an incorrectly-invoked one),
> and ENOSYS for verbs which expect an int returned (e.g., resize_cq).
>
> This is not consistent with what was done in the kernel for  
> unimplemented verbs
> (where EINVAL is returned).
>
> Additionally, what was done in the kernel (returning EINVAL) is  
> problematic
> in that it makes it impossible to differentiate an unimplemented  
> verb from one
> which simply had errors in the calling parameters.
>
> IMHO, the correct fix is to have unimplemented kernel verbs return  
> ENOSYS.
> **(MPI already checks for ENOSYS when deciding whether or not to use  
> resize-cq)**.
>
> I'm not sure, though, how to handle returns from older kernels --  
> should all user
> apps check for either ENOSYS or EINVAL?  What about cases where the  
> verb actually
> is implemented, but incorrectly called -- in older kernels this is  
> already a problem.
> What about apps which checked for ENOSYS (consistent with userspace  
> usage), and
> then run with a new low-level library over an older kernel, and  
> suddenly start getting
> EINVAL returns (for resize_cq, there is no "activation" bit anywhere  
> which gets passed
> from kernel to the user-level)?
>
> Ouch!
>
> Any ideas?
>
> Index: infiniband/drivers/infiniband/core/uverbs_main.c
> ===================================================================
> --- infiniband.orig/drivers/infiniband/core/uverbs_main.c
> +++ infiniband/drivers/infiniband/core/uverbs_main.c
> @@ -584,10 +584,12 @@ static ssize_t ib_uverbs_write(struct fi
>
>         if (hdr.command < 0                             ||
>             hdr.command >= ARRAY_SIZE(uverbs_cmd_table) ||
> -           !uverbs_cmd_table[hdr.command]              ||
> -           !(file->device->ib_dev->uverbs_cmd_mask & (1ull <<  
> hdr.command)))
> +           !uverbs_cmd_table[hdr.command])
>                 return -EINVAL;
>
> +       if (!(file->device->ib_dev->uverbs_cmd_mask & (1ull <<  
> hdr.command)))
> +               return -ENOSYS;
> +
>         if (!file->ucontext &&
>             hdr.command != IB_USER_VERBS_CMD_GET_CONTEXT)
>                 return -EINVAL;


-- 
Jeff Squyres
Cisco Systems




More information about the general mailing list