diff mbox series

RDMA/mlx5: return the EFAULT per ibv_advise_mr(3)

Message ID 20210801092050.6322-1-lizhijian@cn.fujitsu.com (mailing list archive)
State Changes Requested
Headers show
Series RDMA/mlx5: return the EFAULT per ibv_advise_mr(3) | expand

Commit Message

Li Zhijian Aug. 1, 2021, 9:20 a.m. UTC
ibv_advise_mr(3) says:
EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
       or  when  parts of it are not part of the process address space. o One of the
       lkeys provided in the scatter gather list is invalid or with wrong write access

Actually get_prefetchable_mr() will return NULL if it see above conditions

Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
---
 drivers/infiniband/hw/mlx5/odp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Leon Romanovsky Aug. 1, 2021, 11:27 a.m. UTC | #1
On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> ibv_advise_mr(3) says:
> EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
>        or  when  parts of it are not part of the process address space. o One of the
>        lkeys provided in the scatter gather list is invalid or with wrong write access
> 
> Actually get_prefetchable_mr() will return NULL if it see above conditions
> 
> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
> ---
>  drivers/infiniband/hw/mlx5/odp.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 

Thanks,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Jason Gunthorpe Aug. 3, 2021, 4:25 p.m. UTC | #2
On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> ibv_advise_mr(3) says:
> EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
>        or  when  parts of it are not part of the process address space. o One of the
>        lkeys provided in the scatter gather list is invalid or with wrong write access
> 
> Actually get_prefetchable_mr() will return NULL if it see above conditions

No, get_prefetchable_mr() returns NULL if the mkey is invalid

The above is talking about the address, which is checked inside
pagefault_mr() and does return EFAULT for all the cases I can see?

Jason
Leon Romanovsky Aug. 3, 2021, 5:56 p.m. UTC | #3
On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
> On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> > ibv_advise_mr(3) says:
> > EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
> >        or  when  parts of it are not part of the process address space. o One of the
> >        lkeys provided in the scatter gather list is invalid or with wrong write access
> > 
> > Actually get_prefetchable_mr() will return NULL if it see above conditions
> 
> No, get_prefetchable_mr() returns NULL if the mkey is invalid

And what is this?
  1701 static struct mlx5_ib_mr *                         
  1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
  1703                     u32 lkey)

...

  1721         /* prefetch with write-access must be supported by the MR */
  1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
  1723             !mr->umem->writable) {
  1724                 mr = NULL;
  1725                 goto end;
  1726         }


> 
> The above is talking about the address, which is checked inside
> pagefault_mr() and does return EFAULT for all the cases I can see?
> 
> Jason
Jason Gunthorpe Aug. 3, 2021, 6:13 p.m. UTC | #4
On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
> On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
> > On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> > > ibv_advise_mr(3) says:
> > > EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
> > >        or  when  parts of it are not part of the process address space. o One of the
> > >        lkeys provided in the scatter gather list is invalid or with wrong write access
> > > 
> > > Actually get_prefetchable_mr() will return NULL if it see above conditions
> > 
> > No, get_prefetchable_mr() returns NULL if the mkey is invalid
> 
> And what is this?
>   1701 static struct mlx5_ib_mr *                         
>   1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
>   1703                     u32 lkey)
> 
> ...
> 
>   1721         /* prefetch with write-access must be supported by the MR */
>   1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
>   1723             !mr->umem->writable) {
>   1724                 mr = NULL;
>   1725                 goto end;
>   1726         }

I would say that is an invalid mkey

Jason
Leon Romanovsky Aug. 4, 2021, 5:35 a.m. UTC | #5
On Tue, Aug 03, 2021 at 03:13:41PM -0300, Jason Gunthorpe wrote:
> On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
> > On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
> > > On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> > > > ibv_advise_mr(3) says:
> > > > EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
> > > >        or  when  parts of it are not part of the process address space. o One of the
> > > >        lkeys provided in the scatter gather list is invalid or with wrong write access
> > > > 
> > > > Actually get_prefetchable_mr() will return NULL if it see above conditions
> > > 
> > > No, get_prefetchable_mr() returns NULL if the mkey is invalid
> > 
> > And what is this?
> >   1701 static struct mlx5_ib_mr *                         
> >   1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
> >   1703                     u32 lkey)
> > 
> > ...
> > 
> >   1721         /* prefetch with write-access must be supported by the MR */
> >   1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
> >   1723             !mr->umem->writable) {
> >   1724                 mr = NULL;
> >   1725                 goto end;
> >   1726         }
> 
> I would say that is an invalid mkey

I see it is as wrong write access.

Thanks

> 
> Jason
Jason Gunthorpe Aug. 4, 2021, 6:50 p.m. UTC | #6
On Wed, Aug 04, 2021 at 08:35:30AM +0300, Leon Romanovsky wrote:
> On Tue, Aug 03, 2021 at 03:13:41PM -0300, Jason Gunthorpe wrote:
> > On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
> > > On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
> > > > On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> > > > > ibv_advise_mr(3) says:
> > > > > EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
> > > > >        or  when  parts of it are not part of the process address space. o One of the
> > > > >        lkeys provided in the scatter gather list is invalid or with wrong write access
> > > > > 
> > > > > Actually get_prefetchable_mr() will return NULL if it see above conditions
> > > > 
> > > > No, get_prefetchable_mr() returns NULL if the mkey is invalid
> > > 
> > > And what is this?
> > >   1701 static struct mlx5_ib_mr *                         
> > >   1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
> > >   1703                     u32 lkey)
> > > 
> > > ...
> > > 
> > >   1721         /* prefetch with write-access must be supported by the MR */
> > >   1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
> > >   1723             !mr->umem->writable) {
> > >   1724                 mr = NULL;
> > >   1725                 goto end;
> > >   1726         }
> > 
> > I would say that is an invalid mkey
> 
> I see it is as wrong write access.

It just means the man page is wrong

Jason
Leon Romanovsky Aug. 5, 2021, 6:43 a.m. UTC | #7
On Wed, Aug 04, 2021 at 03:50:22PM -0300, Jason Gunthorpe wrote:
> On Wed, Aug 04, 2021 at 08:35:30AM +0300, Leon Romanovsky wrote:
> > On Tue, Aug 03, 2021 at 03:13:41PM -0300, Jason Gunthorpe wrote:
> > > On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
> > > > On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
> > > > > On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
> > > > > > ibv_advise_mr(3) says:
> > > > > > EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
> > > > > >        or  when  parts of it are not part of the process address space. o One of the
> > > > > >        lkeys provided in the scatter gather list is invalid or with wrong write access
> > > > > > 
> > > > > > Actually get_prefetchable_mr() will return NULL if it see above conditions
> > > > > 
> > > > > No, get_prefetchable_mr() returns NULL if the mkey is invalid
> > > > 
> > > > And what is this?
> > > >   1701 static struct mlx5_ib_mr *                         
> > > >   1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
> > > >   1703                     u32 lkey)
> > > > 
> > > > ...
> > > > 
> > > >   1721         /* prefetch with write-access must be supported by the MR */
> > > >   1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
> > > >   1723             !mr->umem->writable) {
> > > >   1724                 mr = NULL;
> > > >   1725                 goto end;
> > > >   1726         }
> > > 
> > > I would say that is an invalid mkey
> > 
> > I see it is as wrong write access.
> 
> It just means the man page is wrong

ok, it can be a solution too.

Thanks

> 
> Jason
Zhijian Li (Fujitsu) Aug. 16, 2021, 2:59 a.m. UTC | #8
On 05/08/2021 14:43, Leon Romanovsky wrote:
> On Wed, Aug 04, 2021 at 03:50:22PM -0300, Jason Gunthorpe wrote:
>> On Wed, Aug 04, 2021 at 08:35:30AM +0300, Leon Romanovsky wrote:
>>> On Tue, Aug 03, 2021 at 03:13:41PM -0300, Jason Gunthorpe wrote:
>>>> On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
>>>>> On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
>>>>>> On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
>>>>>>> ibv_advise_mr(3) says:
>>>>>>> EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
>>>>>>>         or  when  parts of it are not part of the process address space. o One of the
>>>>>>>         lkeys provided in the scatter gather list is invalid or with wrong write access
>>>>>>>
>>>>>>> Actually get_prefetchable_mr() will return NULL if it see above conditions
>>>>>> No, get_prefetchable_mr() returns NULL if the mkey is invalid
>>>>> And what is this?
>>>>>    1701 static struct mlx5_ib_mr *
>>>>>    1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
>>>>>    1703                     u32 lkey)
>>>>>
>>>>> ...
>>>>>
>>>>>    1721         /* prefetch with write-access must be supported by the MR */
>>>>>    1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
>>>>>    1723             !mr->umem->writable) {
>>>>>    1724                 mr = NULL;
>>>>>    1725                 goto end;
>>>>>    1726         }
>>>> I would say that is an invalid mkey
>>> I see it is as wrong write access.
>> It just means the man page is wrong
> ok, it can be a solution too.

It sounds good.  I will try to update the manpage ibv_advise_mr(3) instead.


Thanks
Zhijian
Li Zhijian Aug. 21, 2021, 9:44 a.m. UTC | #9
convert to text and send again


Hi Jason & Leon

It reminds me that ibv_advise_mr doesn't mention ENOENT any more which value the API actually returns now.
the ENOENT cases/situations returned by kernel mlx5 implementation is most likely same with EINVALL as its manpage[1].

So shall we return EINVAL instead of ENOENT in kernel side when get_prefetchable_mr returns NULL?

1781 static int mlx5_ib_prefetch_sg_list(struct ib_pd *pd,
1782                     enum ib_uverbs_advise_mr_advice advice,
1783                     u32 pf_flags, struct ib_sge *sg_list,
1784                     u32 num_sge)
1785 {
1786     u32 bytes_mapped = 0;
1787     int ret = 0;
1788     u32 i;
1789
1790     for (i = 0; i < num_sge; ++i) {
1791         struct mlx5_ib_mr *mr;
1792
1793         mr = get_prefetchable_mr(pd, advice, sg_list[i].lkey);
1794         if (!mr)
1795             return -ENOENT;
1796         ret = pagefault_mr(mr, sg_list[i].addr, sg_list[i].length,
1797                    &bytes_mapped, pf_flags);



=============
RETURN VALUE
        ibv_advise_mr() returns 0 when the call was successful, or the value of errno on failure (which indicates the failure reason).

        EOPNOTSUPP
               libibverbs or provider driver doesn’t support the ibv_advise_mr() verb (ENOSYS may sometimes be returned by old versions of libibverbs).

        ENOTSUP
               The advise operation isn’t supported.

        EFAULT In  one of the following: o When the range requested is out of the MR bounds, or when parts of it are not part of the process address space.  o One of the lkeys provided in the scatter gather
               list is invalid or with wrong write access.

        EINVAL In one of the following: o The PD is invalid.  o The flags are invalid.

[1]:https://github.com/linux-rdma/rdma-core/blob/master/libibverbs/man/ibv_advise_mr.3.md

Thanks

on 2021/8/16 10:59, Li, Zhijian wrote:
> On 05/08/2021 14:43, Leon Romanovsky wrote:
>> On Wed, Aug 04, 2021 at 03:50:22PM -0300, Jason Gunthorpe wrote:
>>> On Wed, Aug 04, 2021 at 08:35:30AM +0300, Leon Romanovsky wrote:
>>>> On Tue, Aug 03, 2021 at 03:13:41PM -0300, Jason Gunthorpe wrote:
>>>>> On Tue, Aug 03, 2021 at 08:56:54PM +0300, Leon Romanovsky wrote:
>>>>>> On Tue, Aug 03, 2021 at 01:25:07PM -0300, Jason Gunthorpe wrote:
>>>>>>> On Sun, Aug 01, 2021 at 05:20:50PM +0800, Li Zhijian wrote:
>>>>>>>> ibv_advise_mr(3) says:
>>>>>>>> EFAULT In one of the following: o When the range requested is out of the  MR  bounds,
>>>>>>>>          or  when  parts of it are not part of the process address space. o One of the
>>>>>>>>          lkeys provided in the scatter gather list is invalid or with wrong write access
>>>>>>>>
>>>>>>>> Actually get_prefetchable_mr() will return NULL if it see above conditions
>>>>>>> No, get_prefetchable_mr() returns NULL if the mkey is invalid
>>>>>> And what is this?
>>>>>>     1701 static struct mlx5_ib_mr *
>>>>>>     1702 get_prefetchable_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
>>>>>>     1703                     u32 lkey)
>>>>>>
>>>>>> ...
>>>>>>
>>>>>>     1721         /* prefetch with write-access must be supported by the MR */
>>>>>>     1722         if (advice == IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE &&
>>>>>>     1723             !mr->umem->writable) {
>>>>>>     1724                 mr = NULL;
>>>>>>     1725                 goto end;
>>>>>>     1726         }
>>>>> I would say that is an invalid mkey
>>>> I see it is as wrong write access.
>>> It just means the man page is wrong
>> ok, it can be a solution too.
> It sounds good.  I will try to update the manpage ibv_advise_mr(3) instead.
>
>
> Thanks
> Zhijian
Jason Gunthorpe Aug. 25, 2021, 5:28 p.m. UTC | #10
On Sat, Aug 21, 2021 at 05:44:43PM +0800, Li, Zhijian wrote:
> convert to text and send again
> 
> 
> Hi Jason & Leon
> 
> It reminds me that ibv_advise_mr doesn't mention ENOENT any more which value the API actually returns now.
> the ENOENT cases/situations returned by kernel mlx5 implementation is most likely same with EINVALL as its manpage[1].
> 
> So shall we return EINVAL instead of ENOENT in kernel side when get_prefetchable_mr returns NULL?

No, the man page should be fixed

Jason
Zhijian Li (Fujitsu) Aug. 26, 2021, 1:18 a.m. UTC | #11
On 26/08/2021 01:28, Jason Gunthorpe wrote:
> On Sat, Aug 21, 2021 at 05:44:43PM +0800, Li, Zhijian wrote:
>> convert to text and send again
>>
>>
>> Hi Jason & Leon
>>
>> It reminds me that ibv_advise_mr doesn't mention ENOENT any more which value the API actually returns now.
>> the ENOENT cases/situations returned by kernel mlx5 implementation is most likely same with EINVALL as its manpage[1].
>>
>> So shall we return EINVAL instead of ENOENT in kernel side when get_prefetchable_mr returns NULL?
> No, the man page should be fixed
thanks a lot, i have submitted a RP to rdma-core https://github.com/linux-rdma/rdma-core/pull/1048

Thanks
Zhijian

>
> Jason
>
>
Li Zhijian Aug. 28, 2021, 8:42 a.m. UTC | #12
Just noticed that there is another code path i was missing will return EINVAL
when get_prefetchable_mr returns NULL

ENOENT:
mlx5_ib_advise_mr_prefetch()
   -> mlx5_ib_prefetch_sg_list()
       -> get_prefetchable_mr()
    return -ENOENT;


EINVAL:
mlx5_ib_advise_mr_prefetch
   ->init_prefetch_work()
      -> get_prefetchable_mr()
     return -EINVAL;

where get_prefetchable_mr will check pd and write access & key
So which value we should return ?

Thanks
  

on 2021/8/26 9:18, Li, Zhijian wrote:
>
> On 26/08/2021 01:28, Jason Gunthorpe wrote:
>> On Sat, Aug 21, 2021 at 05:44:43PM +0800, Li, Zhijian wrote:
>>> convert to text and send again
>>>
>>>
>>> Hi Jason & Leon
>>>
>>> It reminds me that ibv_advise_mr doesn't mention ENOENT any more which value the API actually returns now.
>>> the ENOENT cases/situations returned by kernel mlx5 implementation is most likely same with EINVALL as its manpage[1].
>>>
>>> So shall we return EINVAL instead of ENOENT in kernel side when get_prefetchable_mr returns NULL?
>> No, the man page should be fixed
> thanks a lot, i have submitted a RP to rdma-core https://github.com/linux-rdma/rdma-core/pull/1048
>
> Thanks
> Zhijian
>
>> Jason
>>
>>
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c
index d0d98e584ebc..8d2a626c87cf 100644
--- a/drivers/infiniband/hw/mlx5/odp.c
+++ b/drivers/infiniband/hw/mlx5/odp.c
@@ -1791,7 +1791,7 @@  static int mlx5_ib_prefetch_sg_list(struct ib_pd *pd,
 
 		mr = get_prefetchable_mr(pd, advice, sg_list[i].lkey);
 		if (!mr)
-			return -ENOENT;
+			return -EFAULT;
 		ret = pagefault_mr(mr, sg_list[i].addr, sg_list[i].length,
 				   &bytes_mapped, pf_flags);
 		if (ret < 0) {