On Wed, Oct 13, 2021 at 07:26:49AM +0000, lizhijian@xxxxxxxxxxx wrote: > Hi Jason > > When update the ibv_advise_mr man page, i have a few concerns: > > > On 29/09/2021 01:08, Jason Gunthorpe wrote: > > On Fri, Sep 03, 2021 at 04:48:15PM +0800, Li Zhijian wrote: > >> Previously, ENOENT or EINVAL will be returned by ibv_advise_mr() although > >> the errors all occur at get_prefetchable_mr(). > > What do you think about this instead? > > > > From b739920ed4869decb02a0dbc58256e6c72ec7061 Mon Sep 17 00:00:00 2001 > > From: Jason Gunthorpe <jgg@xxxxxxxxxx> > > Date: Fri, 3 Sep 2021 16:48:15 +0800 > > Subject: [PATCH] IB/mlx5: Flow through a more detailed return code from > > get_prefetchable_mr() > > > > The error returns for various cases detected by get_prefetchable_mr() get > > confused as it flows back to userspace. Properly label each error path and > > flow the error code properly back to the system call. > > > > Suggested-by: Li Zhijian <lizhijian@xxxxxxxxxxxxxx> > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > > drivers/infiniband/hw/mlx5/odp.c | 40 ++++++++++++++++++++------------ > > 1 file changed, 25 insertions(+), 15 deletions(-) > > > > diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c > > index d0d98e584ebcc3..77890a85fc2dd3 100644 > > +++ b/drivers/infiniband/hw/mlx5/odp.c > > @@ -1708,20 +1708,26 @@ get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice, > > > > xa_lock(&dev->odp_mkeys); > > mmkey = xa_load(&dev->odp_mkeys, mlx5_base_mkey(lkey)); > > - if (!mmkey || mmkey->key != lkey || mmkey->type != MLX5_MKEY_MR) > > + if (!mmkey || mmkey->key != lkey) { > > + mr = ERR_PTR(-ENOENT); > > goto end; > > + } > > + if (mmkey->type != MLX5_MKEY_MR) { > > + mr = ERR_PTR(-EINVAL); > > + goto end; > > + } > > > Can we return EINVAL in both above 2 cases so that we can attribute > them to *lkey is invalid* simply. Otherwise it's hard to describe > 2nd case by man page since users/developers cannot link mmkey->type > to the parameters of ibv_advise_mr(). kley is valid in the 2nd case, but points to the wrong kidn of object to prefetch, hence EIVNAL. Eg it is a MW or something. > > mr = container_of(mmkey, struct mlx5_ib_mr, mmkey); > > > > if (mr->ibmr.pd != pd) { > > - mr = NULL; > > + mr = ERR_PTR(-EPERM); > > EINVAL is better for compatible ? since man page said EINVAL in this case before. Referencing a valid lkey outside the caller's security scope should be EPERM. Jason