diff mbox series

RDMA/rxe: For invalidate compare according to set keys in mr

Message ID 20220707073006.328737-1-haris.phnx@gmail.com (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series RDMA/rxe: For invalidate compare according to set keys in mr | expand

Commit Message

Md Haris Iqbal July 7, 2022, 7:30 a.m. UTC
The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
the same value, including the variant bits.

So, if mr->rkey is set, compare the invalidate key with it, otherwise
compare with the mr->lkey.

Since we already did a lookup on the non-varient bits to get this far,
the check's only purpose is to confirm that the wqe has the correct
variant bits.

Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
Cc: rpearsonhpe@gmail.com
Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
---
 drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
 drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
 2 files changed, 7 insertions(+), 7 deletions(-)

Comments

Md Haris Iqbal July 15, 2022, 9:21 a.m. UTC | #1
On Thu, Jul 7, 2022 at 9:30 AM Md Haris Iqbal <haris.phnx@gmail.com> wrote:
>
> The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
> the same value, including the variant bits.
>
> So, if mr->rkey is set, compare the invalidate key with it, otherwise
> compare with the mr->lkey.
>
> Since we already did a lookup on the non-varient bits to get this far,
> the check's only purpose is to confirm that the wqe has the correct
> variant bits.
>
> Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
> Cc: rpearsonhpe@gmail.com
> Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
> ---
>  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
>  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
>  2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> index 0e022ae1b8a5..37484a559d20 100644
> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> @@ -77,7 +77,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
>                          enum rxe_mr_lookup_type type);
>  int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
>  int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
> -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
> +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
>  int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
>  int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
>  int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
> diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
> index fc3942e04a1f..3add52129006 100644
> --- a/drivers/infiniband/sw/rxe/rxe_mr.c
> +++ b/drivers/infiniband/sw/rxe/rxe_mr.c
> @@ -576,22 +576,22 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
>         return mr;
>  }
>
> -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
> +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
>  {
>         struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
>         struct rxe_mr *mr;
>         int ret;
>
> -       mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
> +       mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
>         if (!mr) {
> -               pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
> +               pr_err("%s: No MR for key %#x\n", __func__, key);
>                 ret = -EINVAL;
>                 goto err;
>         }
>
> -       if (rkey != mr->rkey) {
> -               pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
> -                       __func__, rkey, mr->rkey);
> +       if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
> +               pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
> +                       __func__, key, (mr->rkey ? mr->rkey : mr->lkey));
>                 ret = -EINVAL;
>                 goto err_drop_ref;
>         }
> --
> 2.25.1

Ping.

>
Md Haris Iqbal July 22, 2022, 3:10 p.m. UTC | #2
On Fri, Jul 15, 2022 at 11:21 AM haris iqbal <haris.phnx@gmail.com> wrote:
>
> On Thu, Jul 7, 2022 at 9:30 AM Md Haris Iqbal <haris.phnx@gmail.com> wrote:
> >
> > The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
> > the same value, including the variant bits.
> >
> > So, if mr->rkey is set, compare the invalidate key with it, otherwise
> > compare with the mr->lkey.
> >
> > Since we already did a lookup on the non-varient bits to get this far,
> > the check's only purpose is to confirm that the wqe has the correct
> > variant bits.
> >
> > Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
> > Cc: rpearsonhpe@gmail.com
> > Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
> > ---
> >  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
> >  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
> >  2 files changed, 7 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> > index 0e022ae1b8a5..37484a559d20 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> > +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> > @@ -77,7 +77,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> >                          enum rxe_mr_lookup_type type);
> >  int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
> >  int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
> > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
> > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
> >  int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
> >  int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
> >  int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
> > diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
> > index fc3942e04a1f..3add52129006 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_mr.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_mr.c
> > @@ -576,22 +576,22 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> >         return mr;
> >  }
> >
> > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
> > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
> >  {
> >         struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
> >         struct rxe_mr *mr;
> >         int ret;
> >
> > -       mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
> > +       mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
> >         if (!mr) {
> > -               pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
> > +               pr_err("%s: No MR for key %#x\n", __func__, key);
> >                 ret = -EINVAL;
> >                 goto err;
> >         }
> >
> > -       if (rkey != mr->rkey) {
> > -               pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
> > -                       __func__, rkey, mr->rkey);
> > +       if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
> > +               pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
> > +                       __func__, key, (mr->rkey ? mr->rkey : mr->lkey));
> >                 ret = -EINVAL;
> >                 goto err_drop_ref;
> >         }
> > --
> > 2.25.1
>
> Ping.

Ping.

Does this need more discussions or changes?

>
> >
Jason Gunthorpe July 22, 2022, 3:14 p.m. UTC | #3
On Fri, Jul 22, 2022 at 05:10:46PM +0200, haris iqbal wrote:
> On Fri, Jul 15, 2022 at 11:21 AM haris iqbal <haris.phnx@gmail.com> wrote:
> >
> > On Thu, Jul 7, 2022 at 9:30 AM Md Haris Iqbal <haris.phnx@gmail.com> wrote:
> > >
> > > The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
> > > the same value, including the variant bits.
> > >
> > > So, if mr->rkey is set, compare the invalidate key with it, otherwise
> > > compare with the mr->lkey.
> > >
> > > Since we already did a lookup on the non-varient bits to get this far,
> > > the check's only purpose is to confirm that the wqe has the correct
> > > variant bits.
> > >
> > > Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
> > > Cc: rpearsonhpe@gmail.com
> > > Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
> > > ---
> > >  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
> > >  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
> > >  2 files changed, 7 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> > > index 0e022ae1b8a5..37484a559d20 100644
> > > --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> > > +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> > > @@ -77,7 +77,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> > >                          enum rxe_mr_lookup_type type);
> > >  int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
> > >  int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
> > > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
> > > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
> > >  int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
> > >  int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
> > >  int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
> > > diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
> > > index fc3942e04a1f..3add52129006 100644
> > > --- a/drivers/infiniband/sw/rxe/rxe_mr.c
> > > +++ b/drivers/infiniband/sw/rxe/rxe_mr.c
> > > @@ -576,22 +576,22 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> > >         return mr;
> > >  }
> > >
> > > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
> > > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
> > >  {
> > >         struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
> > >         struct rxe_mr *mr;
> > >         int ret;
> > >
> > > -       mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
> > > +       mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
> > >         if (!mr) {
> > > -               pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
> > > +               pr_err("%s: No MR for key %#x\n", __func__, key);
> > >                 ret = -EINVAL;
> > >                 goto err;
> > >         }
> > >
> > > -       if (rkey != mr->rkey) {
> > > -               pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
> > > -                       __func__, rkey, mr->rkey);
> > > +       if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
> > > +               pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
> > > +                       __func__, key, (mr->rkey ? mr->rkey : mr->lkey));
> > >                 ret = -EINVAL;
> > >                 goto err_drop_ref;
> > >         }
> >
> > Ping.
> 
> Ping.
> 
> Does this need more discussions or changes?

I was hoping Bob would say something but I am happy with it..

Jason
Md Haris Iqbal July 22, 2022, 4:50 p.m. UTC | #4
On Fri, Jul 22, 2022 at 5:14 PM Jason Gunthorpe <jgg@ziepe.ca> wrote:
>
> On Fri, Jul 22, 2022 at 05:10:46PM +0200, haris iqbal wrote:
> > On Fri, Jul 15, 2022 at 11:21 AM haris iqbal <haris.phnx@gmail.com> wrote:
> > >
> > > On Thu, Jul 7, 2022 at 9:30 AM Md Haris Iqbal <haris.phnx@gmail.com> wrote:
> > > >
> > > > The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
> > > > the same value, including the variant bits.
> > > >
> > > > So, if mr->rkey is set, compare the invalidate key with it, otherwise
> > > > compare with the mr->lkey.
> > > >
> > > > Since we already did a lookup on the non-varient bits to get this far,
> > > > the check's only purpose is to confirm that the wqe has the correct
> > > > variant bits.
> > > >
> > > > Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
> > > > Cc: rpearsonhpe@gmail.com
> > > > Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
> > > > ---
> > > >  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
> > > >  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
> > > >  2 files changed, 7 insertions(+), 7 deletions(-)
> > > >
> > > > diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
> > > > index 0e022ae1b8a5..37484a559d20 100644
> > > > --- a/drivers/infiniband/sw/rxe/rxe_loc.h
> > > > +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
> > > > @@ -77,7 +77,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> > > >                          enum rxe_mr_lookup_type type);
> > > >  int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
> > > >  int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
> > > > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
> > > > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
> > > >  int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
> > > >  int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
> > > >  int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
> > > > diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
> > > > index fc3942e04a1f..3add52129006 100644
> > > > --- a/drivers/infiniband/sw/rxe/rxe_mr.c
> > > > +++ b/drivers/infiniband/sw/rxe/rxe_mr.c
> > > > @@ -576,22 +576,22 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
> > > >         return mr;
> > > >  }
> > > >
> > > > -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
> > > > +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
> > > >  {
> > > >         struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
> > > >         struct rxe_mr *mr;
> > > >         int ret;
> > > >
> > > > -       mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
> > > > +       mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
> > > >         if (!mr) {
> > > > -               pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
> > > > +               pr_err("%s: No MR for key %#x\n", __func__, key);
> > > >                 ret = -EINVAL;
> > > >                 goto err;
> > > >         }
> > > >
> > > > -       if (rkey != mr->rkey) {
> > > > -               pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
> > > > -                       __func__, rkey, mr->rkey);
> > > > +       if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
> > > > +               pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
> > > > +                       __func__, key, (mr->rkey ? mr->rkey : mr->lkey));
> > > >                 ret = -EINVAL;
> > > >                 goto err_drop_ref;
> > > >         }
> > >
> > > Ping.
> >
> > Ping.
> >
> > Does this need more discussions or changes?
>
> I was hoping Bob would say something but I am happy with it..

Thanks Jason for the response.
We can wait for Bob to share his thoughts.

>
> Jason
Bob Pearson July 22, 2022, 7:04 p.m. UTC | #5
On 7/22/22 11:50, haris iqbal wrote:
> On Fri, Jul 22, 2022 at 5:14 PM Jason Gunthorpe <jgg@ziepe.ca> wrote:
>>
>> On Fri, Jul 22, 2022 at 05:10:46PM +0200, haris iqbal wrote:
>>> On Fri, Jul 15, 2022 at 11:21 AM haris iqbal <haris.phnx@gmail.com> wrote:
>>>>
>>>> On Thu, Jul 7, 2022 at 9:30 AM Md Haris Iqbal <haris.phnx@gmail.com> wrote:
>>>>>
>>>>> The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
>>>>> the same value, including the variant bits.
>>>>>
>>>>> So, if mr->rkey is set, compare the invalidate key with it, otherwise
>>>>> compare with the mr->lkey.
>>>>>
>>>>> Since we already did a lookup on the non-varient bits to get this far,
>>>>> the check's only purpose is to confirm that the wqe has the correct
>>>>> variant bits.
>>>>>
>>>>> Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
>>>>> Cc: rpearsonhpe@gmail.com
>>>>> Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
>>>>> ---
>>>>>  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
>>>>>  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
>>>>>  2 files changed, 7 insertions(+), 7 deletions(-)
>>>>>
>>>>> diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
>>>>> index 0e022ae1b8a5..37484a559d20 100644
>>>>> --- a/drivers/infiniband/sw/rxe/rxe_loc.h
>>>>> +++ b/drivers/infiniband/sw/rxe/rxe_loc.h
>>>>> @@ -77,7 +77,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
>>>>>                          enum rxe_mr_lookup_type type);
>>>>>  int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
>>>>>  int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
>>>>> -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
>>>>> +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
>>>>>  int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
>>>>>  int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
>>>>>  int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
>>>>> diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
>>>>> index fc3942e04a1f..3add52129006 100644
>>>>> --- a/drivers/infiniband/sw/rxe/rxe_mr.c
>>>>> +++ b/drivers/infiniband/sw/rxe/rxe_mr.c
>>>>> @@ -576,22 +576,22 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
>>>>>         return mr;
>>>>>  }
>>>>>
>>>>> -int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
>>>>> +int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
>>>>>  {
>>>>>         struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
>>>>>         struct rxe_mr *mr;
>>>>>         int ret;
>>>>>
>>>>> -       mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
>>>>> +       mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
>>>>>         if (!mr) {
>>>>> -               pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
>>>>> +               pr_err("%s: No MR for key %#x\n", __func__, key);
>>>>>                 ret = -EINVAL;
>>>>>                 goto err;
>>>>>         }
>>>>>
>>>>> -       if (rkey != mr->rkey) {
>>>>> -               pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
>>>>> -                       __func__, rkey, mr->rkey);
>>>>> +       if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
>>>>> +               pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
>>>>> +                       __func__, key, (mr->rkey ? mr->rkey : mr->lkey));
>>>>>                 ret = -EINVAL;
>>>>>                 goto err_drop_ref;
>>>>>         }
>>>>
>>>> Ping.
>>>
>>> Ping.
>>>
>>> Does this need more discussions or changes?
>>
>> I was hoping Bob would say something but I am happy with it..
> 
> Thanks Jason for the response.
> We can wait for Bob to share his thoughts.
> 
>>
>> JasonFine by me

Reviewed-by: Bob Pearson <rpearsonhpe@gmail.com>
Jason Gunthorpe July 22, 2022, 8:38 p.m. UTC | #6
On Thu, Jul 07, 2022 at 09:30:06AM +0200, Md Haris Iqbal wrote:
> The 'rkey' input can be an lkey or rkey, and in rxe the lkey or rkey have
> the same value, including the variant bits.
> 
> So, if mr->rkey is set, compare the invalidate key with it, otherwise
> compare with the mr->lkey.
> 
> Since we already did a lookup on the non-varient bits to get this far,
> the check's only purpose is to confirm that the wqe has the correct
> variant bits.
> 
> Fixes: 001345339f4c ("RDMA/rxe: Separate HW and SW l/rkeys")
> Cc: rpearsonhpe@gmail.com
> Signed-off-by: Md Haris Iqbal <haris.phnx@gmail.com>
> Reviewed-by: Bob Pearson <rpearsonhpe@gmail.com>
> ---
>  drivers/infiniband/sw/rxe/rxe_loc.h |  2 +-
>  drivers/infiniband/sw/rxe/rxe_mr.c  | 12 ++++++------
>  2 files changed, 7 insertions(+), 7 deletions(-)

Applied to for-next, thanks

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
index 0e022ae1b8a5..37484a559d20 100644
--- a/drivers/infiniband/sw/rxe/rxe_loc.h
+++ b/drivers/infiniband/sw/rxe/rxe_loc.h
@@ -77,7 +77,7 @@  struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
 			 enum rxe_mr_lookup_type type);
 int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
 int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
-int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
+int rxe_invalidate_mr(struct rxe_qp *qp, u32 key);
 int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
 int rxe_mr_set_page(struct ib_mr *ibmr, u64 addr);
 int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
index fc3942e04a1f..3add52129006 100644
--- a/drivers/infiniband/sw/rxe/rxe_mr.c
+++ b/drivers/infiniband/sw/rxe/rxe_mr.c
@@ -576,22 +576,22 @@  struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
 	return mr;
 }
 
-int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
+int rxe_invalidate_mr(struct rxe_qp *qp, u32 key)
 {
 	struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
 	struct rxe_mr *mr;
 	int ret;
 
-	mr = rxe_pool_get_index(&rxe->mr_pool, rkey >> 8);
+	mr = rxe_pool_get_index(&rxe->mr_pool, key >> 8);
 	if (!mr) {
-		pr_err("%s: No MR for rkey %#x\n", __func__, rkey);
+		pr_err("%s: No MR for key %#x\n", __func__, key);
 		ret = -EINVAL;
 		goto err;
 	}
 
-	if (rkey != mr->rkey) {
-		pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
-			__func__, rkey, mr->rkey);
+	if (mr->rkey ? (key != mr->rkey) : (key != mr->lkey)) {
+		pr_err("%s: wr key (%#x) doesn't match mr key (%#x)\n",
+			__func__, key, (mr->rkey ? mr->rkey : mr->lkey));
 		ret = -EINVAL;
 		goto err_drop_ref;
 	}