diff mbox series

[02/18] RDMA/core: Save the MR type in the ib_mr structure

Message ID 1551981764-26557-3-git-send-email-maxg@mellanox.com (mailing list archive)
State Superseded
Headers show
Series Introduce new API for T10-PI offload | expand

Commit Message

Max Gurtovoy March 7, 2019, 6:02 p.m. UTC
This is a preparation for the signature verbs API change. This change is
needed since the MR type will define, in the upcoming patches, the need
for allocating internal resources in LLD for signature handover related
operations. It will also help to make sure that signature related
functions are called with an appropriate MR type and fail otherwise.

Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
Signed-off-by: Israel Rukshin <israelr@mellanox.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
---
 drivers/infiniband/core/uverbs_cmd.c | 1 +
 drivers/infiniband/core/verbs.c      | 1 +
 include/rdma/ib_verbs.h              | 1 +
 3 files changed, 3 insertions(+)

Comments

Bart Van Assche March 7, 2019, 6:27 p.m. UTC | #1
On Thu, 2019-03-07 at 20:02 +0200, Max Gurtovoy wrote:
> This is a preparation for the signature verbs API change. This change is
> needed since the MR type will define, in the upcoming patches, the need
> for allocating internal resources in LLD for signature handover related
> operations. It will also help to make sure that signature related
> functions are called with an appropriate MR type and fail otherwise.
> 
> Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
> Signed-off-by: Israel Rukshin <israelr@mellanox.com>
> Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
> ---
>  drivers/infiniband/core/uverbs_cmd.c | 1 +
>  drivers/infiniband/core/verbs.c      | 1 +
>  include/rdma/ib_verbs.h              | 1 +
>  3 files changed, 3 insertions(+)
> 
> diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
> index 3317300ab036..72c5a8daf558 100644
> --- a/drivers/infiniband/core/uverbs_cmd.c
> +++ b/drivers/infiniband/core/uverbs_cmd.c
> @@ -737,6 +737,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
>  
>  	mr->device  = pd->device;
>  	mr->pd      = pd;
> +	mr->type    = IB_MR_TYPE_MEM_REG;
>  	mr->dm	    = NULL;
>  	mr->uobject = uobj;
>  	atomic_inc(&pd->usecnt);
> diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
> index ac011836bb54..4588b933d4b4 100644
> --- a/drivers/infiniband/core/verbs.c
> +++ b/drivers/infiniband/core/verbs.c
> @@ -1992,6 +1992,7 @@ struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
>  		mr->need_inval = false;
>  		mr->res.type = RDMA_RESTRACK_MR;
>  		rdma_restrack_kadd(&mr->res);
> +		mr->type = mr_type;
>  	}
>  
>  	return mr;
> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> index f89b521245ec..42a9e297c21f 100644
> --- a/include/rdma/ib_verbs.h
> +++ b/include/rdma/ib_verbs.h
> @@ -1695,6 +1695,7 @@ struct ib_mr {
>  	u64		   iova;
>  	u64		   length;
>  	unsigned int	   page_size;
> +	enum ib_mr_type	   type;
>  	bool		   need_inval;
>  	union {
>  		struct ib_uobject	*uobject;	/* user */

How about __ib_alloc_pd() and UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)()?
I think those functions also create a memory region. Shouldn't mr->type
be initialized from these functions too?

Bart.
Jason Gunthorpe March 26, 2019, 2:11 p.m. UTC | #2
On Thu, Mar 7, 2019 at 2:27 PM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On Thu, 2019-03-07 at 20:02 +0200, Max Gurtovoy wrote:
> > This is a preparation for the signature verbs API change. This change is
> > needed since the MR type will define, in the upcoming patches, the need
> > for allocating internal resources in LLD for signature handover related
> > operations. It will also help to make sure that signature related
> > functions are called with an appropriate MR type and fail otherwise.
> >
> > Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
> > Signed-off-by: Israel Rukshin <israelr@mellanox.com>
> > Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
> > ---
> >  drivers/infiniband/core/uverbs_cmd.c | 1 +
> >  drivers/infiniband/core/verbs.c      | 1 +
> >  include/rdma/ib_verbs.h              | 1 +
> >  3 files changed, 3 insertions(+)
> >
> > diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
> > index 3317300ab036..72c5a8daf558 100644
> > --- a/drivers/infiniband/core/uverbs_cmd.c
> > +++ b/drivers/infiniband/core/uverbs_cmd.c
> > @@ -737,6 +737,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
> >
> >       mr->device  = pd->device;
> >       mr->pd      = pd;
> > +     mr->type    = IB_MR_TYPE_MEM_REG;
> >       mr->dm      = NULL;
> >       mr->uobject = uobj;
> >       atomic_inc(&pd->usecnt);
> > diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
> > index ac011836bb54..4588b933d4b4 100644
> > --- a/drivers/infiniband/core/verbs.c
> > +++ b/drivers/infiniband/core/verbs.c
> > @@ -1992,6 +1992,7 @@ struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
> >               mr->need_inval = false;
> >               mr->res.type = RDMA_RESTRACK_MR;
> >               rdma_restrack_kadd(&mr->res);
> > +             mr->type = mr_type;
> >       }
> >
> >       return mr;
> > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
> > index f89b521245ec..42a9e297c21f 100644
> > --- a/include/rdma/ib_verbs.h
> > +++ b/include/rdma/ib_verbs.h
> > @@ -1695,6 +1695,7 @@ struct ib_mr {
> >       u64                iova;
> >       u64                length;
> >       unsigned int       page_size;
> > +     enum ib_mr_type    type;
> >       bool               need_inval;
> >       union {
> >               struct ib_uobject       *uobject;       /* user */
>
> How about __ib_alloc_pd() and UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)()?
> I think those functions also create a memory region. Shouldn't mr->type
> be initialized from these functions too?

Max??

Jason
Max Gurtovoy March 27, 2019, 11:08 a.m. UTC | #3
On 3/26/2019 4:11 PM, Jason Gunthorpe wrote:
> On Thu, Mar 7, 2019 at 2:27 PM Bart Van Assche <bvanassche@acm.org> wrote:
>> On Thu, 2019-03-07 at 20:02 +0200, Max Gurtovoy wrote:
>>> This is a preparation for the signature verbs API change. This change is
>>> needed since the MR type will define, in the upcoming patches, the need
>>> for allocating internal resources in LLD for signature handover related
>>> operations. It will also help to make sure that signature related
>>> functions are called with an appropriate MR type and fail otherwise.
>>>
>>> Signed-off-by: Max Gurtovoy <maxg@mellanox.com>
>>> Signed-off-by: Israel Rukshin <israelr@mellanox.com>
>>> Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
>>> ---
>>>   drivers/infiniband/core/uverbs_cmd.c | 1 +
>>>   drivers/infiniband/core/verbs.c      | 1 +
>>>   include/rdma/ib_verbs.h              | 1 +
>>>   3 files changed, 3 insertions(+)
>>>
>>> diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
>>> index 3317300ab036..72c5a8daf558 100644
>>> --- a/drivers/infiniband/core/uverbs_cmd.c
>>> +++ b/drivers/infiniband/core/uverbs_cmd.c
>>> @@ -737,6 +737,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
>>>
>>>        mr->device  = pd->device;
>>>        mr->pd      = pd;
>>> +     mr->type    = IB_MR_TYPE_MEM_REG;
>>>        mr->dm      = NULL;
>>>        mr->uobject = uobj;
>>>        atomic_inc(&pd->usecnt);
>>> diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
>>> index ac011836bb54..4588b933d4b4 100644
>>> --- a/drivers/infiniband/core/verbs.c
>>> +++ b/drivers/infiniband/core/verbs.c
>>> @@ -1992,6 +1992,7 @@ struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
>>>                mr->need_inval = false;
>>>                mr->res.type = RDMA_RESTRACK_MR;
>>>                rdma_restrack_kadd(&mr->res);
>>> +             mr->type = mr_type;
>>>        }
>>>
>>>        return mr;
>>> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
>>> index f89b521245ec..42a9e297c21f 100644
>>> --- a/include/rdma/ib_verbs.h
>>> +++ b/include/rdma/ib_verbs.h
>>> @@ -1695,6 +1695,7 @@ struct ib_mr {
>>>        u64                iova;
>>>        u64                length;
>>>        unsigned int       page_size;
>>> +     enum ib_mr_type    type;
>>>        bool               need_inval;
>>>        union {
>>>                struct ib_uobject       *uobject;       /* user */
>> How about __ib_alloc_pd() and UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)()?
>> I think those functions also create a memory region. Shouldn't mr->type
>> be initialized from these functions too?
> Max??

The way I see this MR type is to give a hint for LLD for resource 
allocations.

Currently the only code that really uses these types is the kernel MR 
allocation functions ib_alloc_mr.

Adding IB_MR_TYPE_MEM_REG to user space MRs just for saying we did it, 
not really helps us here. Maybe we can add a new type IB_MR_TYPE_USER 
for hinting LLD.

Same for the dma_mr allocation in alloc_pd function.

In the future we can maybe reuse code in the core layer and LLDs using 
these types, but for now it will help for readability.

Thoughts ?

Max.


>
> Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 3317300ab036..72c5a8daf558 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -737,6 +737,7 @@  static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
 
 	mr->device  = pd->device;
 	mr->pd      = pd;
+	mr->type    = IB_MR_TYPE_MEM_REG;
 	mr->dm	    = NULL;
 	mr->uobject = uobj;
 	atomic_inc(&pd->usecnt);
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index ac011836bb54..4588b933d4b4 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -1992,6 +1992,7 @@  struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
 		mr->need_inval = false;
 		mr->res.type = RDMA_RESTRACK_MR;
 		rdma_restrack_kadd(&mr->res);
+		mr->type = mr_type;
 	}
 
 	return mr;
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index f89b521245ec..42a9e297c21f 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -1695,6 +1695,7 @@  struct ib_mr {
 	u64		   iova;
 	u64		   length;
 	unsigned int	   page_size;
+	enum ib_mr_type	   type;
 	bool		   need_inval;
 	union {
 		struct ib_uobject	*uobject;	/* user */