Re: [PATCH rdma-next v4 8/9] RDMA/nldev: Share with user-space object IDs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 05, 2019 at 03:14:27PM -0700, Jason Gunthorpe wrote:
> On Sat, Feb 02, 2019 at 01:42:52PM +0200, Leon Romanovsky wrote:
> > From: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> >
> > Give to the user space tools unique identifier for PD, MR, CQ and CM_ID
> > objects, so they can be able to query on them with .doit callbacks.
> >
> > QP .doit is not supported yet, till all drivers will be updated
> > to provide their LQPN to be equal to their restrack ID.
> >
> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> >  drivers/infiniband/core/nldev.c  | 48 ++++++++++++++++++++++++++++++++
> >  include/uapi/rdma/rdma_netlink.h |  9 ++++++
> >  2 files changed, 57 insertions(+)
> >
> > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
> > index 1fd06ca18829..e460025fbddf 100644
> > +++ b/drivers/infiniband/core/nldev.c
> > @@ -107,6 +107,10 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
> >  	[RDMA_NLDEV_ATTR_DRIVER_U32]		= { .type = NLA_U32 },
> >  	[RDMA_NLDEV_ATTR_DRIVER_S64]		= { .type = NLA_S64 },
> >  	[RDMA_NLDEV_ATTR_DRIVER_U64]		= { .type = NLA_U64 },
> > +	[RDMA_NLDEV_ATTR_RES_PDN]		= { .type = NLA_U32 },
> > +	[RDMA_NLDEV_ATTR_RES_CQN]               = { .type = NLA_U32 },
> > +	[RDMA_NLDEV_ATTR_RES_MRN]               = { .type = NLA_U32 },
> > +	[RDMA_NLDEV_ATTR_RES_CM_IDN]            = { .type = NLA_U32 },
> >  };
> >
> >  static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
> > @@ -369,6 +373,34 @@ static bool fill_res_entry(struct ib_device *dev, struct sk_buff *msg,
> >  	return dev->ops.fill_res_entry(msg, res);
> >  }
> >
> > +static bool fill_res_ids(struct sk_buff *msg, struct rdma_restrack_entry *res)
> > +{
> > +	bool ret;
> > +
> > +	switch (res->type) {
> > +	case RDMA_RESTRACK_PD:
> > +		ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_PDN,
> > +				  rdma_res_to_id(res));
> > +		break;
> > +	case RDMA_RESTRACK_CQ:
> > +		ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CQN,
> > +				  rdma_res_to_id(res));
> > +		break;
> > +	case RDMA_RESTRACK_MR:
> > +		ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_MRN,
> > +				  rdma_res_to_id(res));
> > +		break;
> > +	case RDMA_RESTRACK_CM_ID:
> > +		ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CM_IDN,
> > +				  rdma_res_to_id(res));
> > +		break;
> > +	default:
> > +		ret = true;
> > +	}
> > +
> > +	return ret;
> > +}
> > +
> >  static int fill_res_qp_entry(struct sk_buff *msg, bool has_cap_net_admin,
> >  			     struct rdma_restrack_entry *res, uint32_t port)
> >  {
> > @@ -465,6 +497,9 @@ static int fill_res_cm_id_entry(struct sk_buff *msg, bool has_cap_net_admin,
> >  		    &cm_id->route.addr.dst_addr))
> >  		goto err;
> >
> > +	if (fill_res_ids(msg, res))
> > +		goto err;
>
> Is there some reason this isn't just written as
>
>   ret = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_CM_IDN, rdma_res_to_id(res));
>   if (ret)
>          return ret;
>
> ?

Yes, in next patch, I'm filling parent ID in that function.

>
> I'm confused why we jump to a case statement when every caller in this
> patch seems to already know what type it is.

I did it to localize all changes of IDs in one place.

>
> Jason

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux