diff mbox series

[rdma-next] RDMA/core: Rely on vendors to set right IOVA

Message ID 4b0a31bbc372842613286a10d7a8cbb0ee6069c7.1635400472.git.leonro@nvidia.com (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series [rdma-next] RDMA/core: Rely on vendors to set right IOVA | expand

Commit Message

Leon Romanovsky Oct. 28, 2021, 5:55 a.m. UTC
From: Aharon Landau <aharonl@nvidia.com>

The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
flag is provided.

Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
Signed-off-by: Aharon Landau <aharonl@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
---
 drivers/infiniband/core/uverbs_cmd.c | 3 ---
 1 file changed, 3 deletions(-)

Comments

Christoph Hellwig Oct. 28, 2021, 7:56 a.m. UTC | #1
On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> From: Aharon Landau <aharonl@nvidia.com>
> 
> The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> flag is provided.

How is a "vendor" involved with this?  This should all be upstream code.
Leon Romanovsky Oct. 28, 2021, 9:58 a.m. UTC | #2
On Thu, Oct 28, 2021 at 12:56:46AM -0700, Christoph Hellwig wrote:
> On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> > From: Aharon Landau <aharonl@nvidia.com>
> > 
> > The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> > overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> > flag is provided.
> 
> How is a "vendor" involved with this?  This should all be upstream code.

"vendor" is wrong word here.

I wanted to say that all drivers which support ".rereg_user_mr()"
callback and return new_mr should set everything. In case of IB_MR_REREG_TRANS
flow, it is IOVA which is not cmd.hca_va, but mr->iova.

Thanks
Christoph Hellwig Oct. 28, 2021, 2:02 p.m. UTC | #3
On Thu, Oct 28, 2021 at 12:58:53PM +0300, Leon Romanovsky wrote:
> "vendor" is wrong word here.
> 
> I wanted to say that all drivers which support ".rereg_user_mr()"
> callback and return new_mr should set everything. In case of IB_MR_REREG_TRANS
> flow, it is IOVA which is not cmd.hca_va, but mr->iova.

Thanks, that makes a lot more sense.
Jason Gunthorpe Oct. 29, 2021, 4:27 p.m. UTC | #4
On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> From: Aharon Landau <aharonl@nvidia.com>
> 
> The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> flag is provided.
> 
> Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")

This isn't really a fixes type patch..

> Signed-off-by: Aharon Landau <aharonl@nvidia.com>
> Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>  drivers/infiniband/core/uverbs_cmd.c | 3 ---
>  1 file changed, 3 deletions(-)
> 
> diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
> index 740e6b2efe0e..d1345d76d9b1 100644
> +++ b/drivers/infiniband/core/uverbs_cmd.c
> @@ -837,11 +837,8 @@ static int ib_uverbs_rereg_mr(struct uverbs_attr_bundle *attrs)
>  		new_mr->device = new_pd->device;
>  		new_mr->pd = new_pd;
>  		new_mr->type = IB_MR_TYPE_USER;
> -		new_mr->dm = NULL;
> -		new_mr->sig_attrs = NULL;
>  		new_mr->uobject = uobj;
>  		atomic_inc(&new_pd->usecnt);
> -		new_mr->iova = cmd.hca_va;
>  		new_uobj->object = new_mr;

It is like this because the reg_mr path does it this way, if you want
to change it here then change reg_mr as well, but that needs auditing
all the drivers..

And I'd also suggest removing the other set a few lines below

Jason
Leon Romanovsky Oct. 29, 2021, 4:50 p.m. UTC | #5
On Fri, Oct 29, 2021 at 01:27:02PM -0300, Jason Gunthorpe wrote:
> On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> > From: Aharon Landau <aharonl@nvidia.com>
> > 
> > The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> > overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> > flag is provided.
> > 
> > Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
> 
> This isn't really a fixes type patch..

Why? We see that without this patch MR IOVA is not as expected.

> 
> > Signed-off-by: Aharon Landau <aharonl@nvidia.com>
> > Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
> >  drivers/infiniband/core/uverbs_cmd.c | 3 ---
> >  1 file changed, 3 deletions(-)
> > 
> > diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
> > index 740e6b2efe0e..d1345d76d9b1 100644
> > +++ b/drivers/infiniband/core/uverbs_cmd.c
> > @@ -837,11 +837,8 @@ static int ib_uverbs_rereg_mr(struct uverbs_attr_bundle *attrs)
> >  		new_mr->device = new_pd->device;
> >  		new_mr->pd = new_pd;
> >  		new_mr->type = IB_MR_TYPE_USER;
> > -		new_mr->dm = NULL;
> > -		new_mr->sig_attrs = NULL;
> >  		new_mr->uobject = uobj;
> >  		atomic_inc(&new_pd->usecnt);
> > -		new_mr->iova = cmd.hca_va;
> >  		new_uobj->object = new_mr;
> 
> It is like this because the reg_mr path does it this way, if you want
> to change it here then change reg_mr as well, but that needs auditing
> all the drivers..
> 
> And I'd also suggest removing the other set a few lines below

I decided to be safe than sorry and removed only 100% correct
attributes that does require minimal audit.

Thanks

> 
> Jason
Jason Gunthorpe Oct. 29, 2021, 4:51 p.m. UTC | #6
On Fri, Oct 29, 2021 at 07:50:37PM +0300, Leon Romanovsky wrote:
> On Fri, Oct 29, 2021 at 01:27:02PM -0300, Jason Gunthorpe wrote:
> > On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> > > From: Aharon Landau <aharonl@nvidia.com>
> > > 
> > > The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> > > overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> > > flag is provided.
> > > 
> > > Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
> > 
> > This isn't really a fixes type patch..
> 
> Why? We see that without this patch MR IOVA is not as expected.

How so? Aharon should explain that in the commit message

Jason
Jason Gunthorpe Nov. 3, 2021, 12:51 p.m. UTC | #7
On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> From: Aharon Landau <aharonl@nvidia.com>
> 
> The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> flag is provided.
> 
> Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
> Signed-off-by: Aharon Landau <aharonl@nvidia.com>
> Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
> ---
>  drivers/infiniband/core/uverbs_cmd.c | 3 ---
>  1 file changed, 3 deletions(-)

I rewrote the commit message:

    RDMA/core: Require the driver to set the IOVA correctly during rereg_mr
    
    If the driver returns a new MR during rereg it has to fill it with the
    IOVA from the proper source. If IB_MR_REREG_TRANS is set then the IOVA is
    cmd.hca_va, otherwise the IOVA comes from the old MR. mlx5 for example has
    two calls inside rereg_mr:
    
                    return create_real_mr(new_pd, umem, mr->ibmr.iova,
                                          new_access_flags);
    and
                    return create_real_mr(new_pd, new_umem, iova, new_access_flags);
    
    Unconditionally overwriting the iova in the newly allocated MR will
    corrupt the iova if the first path is used.
    
    Remove the redundant initializations from ib_uverbs_rereg_mr().
    
    Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
    Link: https://lore.kernel.org/r/4b0a31bbc372842613286a10d7a8cbb0ee6069c7.1635400472.git.leonro@nvidia.com
    Signed-off-by: Aharon Landau <aharonl@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

Jason
Leon Romanovsky Nov. 3, 2021, 1:24 p.m. UTC | #8
On Wed, Nov 03, 2021 at 09:51:44AM -0300, Jason Gunthorpe wrote:
> On Thu, Oct 28, 2021 at 08:55:22AM +0300, Leon Romanovsky wrote:
> > From: Aharon Landau <aharonl@nvidia.com>
> > 
> > The vendors set the IOVA of newly created MRs in rereg_user_mr, so don't
> > overwrite it. That ensures that this field is set only if IB_MR_REREG_TRANS
> > flag is provided.
> > 
> > Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
> > Signed-off-by: Aharon Landau <aharonl@nvidia.com>
> > Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
> > ---
> >  drivers/infiniband/core/uverbs_cmd.c | 3 ---
> >  1 file changed, 3 deletions(-)
> 
> I rewrote the commit message:

Thanks a lot.

> 
>     RDMA/core: Require the driver to set the IOVA correctly during rereg_mr
>     
>     If the driver returns a new MR during rereg it has to fill it with the
>     IOVA from the proper source. If IB_MR_REREG_TRANS is set then the IOVA is
>     cmd.hca_va, otherwise the IOVA comes from the old MR. mlx5 for example has
>     two calls inside rereg_mr:
>     
>                     return create_real_mr(new_pd, umem, mr->ibmr.iova,
>                                           new_access_flags);
>     and
>                     return create_real_mr(new_pd, new_umem, iova, new_access_flags);
>     
>     Unconditionally overwriting the iova in the newly allocated MR will
>     corrupt the iova if the first path is used.
>     
>     Remove the redundant initializations from ib_uverbs_rereg_mr().
>     
>     Fixes: 6e0954b11c05 ("RDMA/uverbs: Allow drivers to create a new HW object during rereg_mr")
>     Link: https://lore.kernel.org/r/4b0a31bbc372842613286a10d7a8cbb0ee6069c7.1635400472.git.leonro@nvidia.com
>     Signed-off-by: Aharon Landau <aharonl@nvidia.com>
>     Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
>     Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> 
> Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 740e6b2efe0e..d1345d76d9b1 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -837,11 +837,8 @@  static int ib_uverbs_rereg_mr(struct uverbs_attr_bundle *attrs)
 		new_mr->device = new_pd->device;
 		new_mr->pd = new_pd;
 		new_mr->type = IB_MR_TYPE_USER;
-		new_mr->dm = NULL;
-		new_mr->sig_attrs = NULL;
 		new_mr->uobject = uobj;
 		atomic_inc(&new_pd->usecnt);
-		new_mr->iova = cmd.hca_va;
 		new_uobj->object = new_mr;
 
 		rdma_restrack_new(&new_mr->res, RDMA_RESTRACK_MR);