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; ? I'm confused why we jump to a case statement when every caller in this patch seems to already know what type it is. Jason