On Fri, Mar 23, 2018 at 09:49:45AM -0700, Steve Wise wrote: > Add fill_dev_info and fill_port_info functions to rdma_restrack_root. > This allows providers to have provider-specific fill functions for device > and port restrack operations. > > Signed-off-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> > --- > drivers/infiniband/core/nldev.c | 35 +++++++++++++++++++++++++++++------ > include/rdma/restrack.h | 15 +++++++++++++++ > 2 files changed, 44 insertions(+), 6 deletions(-) > > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c > index 8346ede..16c5eba 100644 > --- a/drivers/infiniband/core/nldev.c > +++ b/drivers/infiniband/core/nldev.c > @@ -116,6 +116,22 @@ static int provider_fill_res_entry(struct rdma_restrack_root *resroot, > resroot->fill_res_entry(msg, cb, res) : 0; > } > > +static int provider_fill_dev_info(struct sk_buff *msg, > + struct netlink_callback *cb, > + struct ib_device *device) > +{ > + return device->res.fill_dev_info ? > + device->res.fill_dev_info(msg, cb, device) : 0; > +} > + > +static int provider_fill_port_info(struct sk_buff *msg, > + struct netlink_callback *cb, > + struct ib_device *device, u32 port) > +{ > + return device->res.fill_port_info ? > + device->res.fill_port_info(msg, cb, device, port) : 0; > +} > + > static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device) > { > if (nla_put_u32(msg, RDMA_NLDEV_ATTR_DEV_INDEX, device->index)) > @@ -126,7 +142,8 @@ static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device) > return 0; > } > > -static int fill_dev_info(struct sk_buff *msg, struct ib_device *device) > +static int fill_dev_info(struct sk_buff *msg, struct netlink_callback *cb, > + struct ib_device *device) > { > char fw[IB_FW_VERSION_NAME_MAX]; > > @@ -157,10 +174,14 @@ static int fill_dev_info(struct sk_buff *msg, struct ib_device *device) > return -EMSGSIZE; > if (nla_put_u8(msg, RDMA_NLDEV_ATTR_DEV_NODE_TYPE, device->node_type)) > return -EMSGSIZE; > + > + if (provider_fill_dev_info(msg, cb, device)) > + return -EMSGSIZE; > + > return 0; > } > > -static int fill_port_info(struct sk_buff *msg, > +static int fill_port_info(struct sk_buff *msg, struct netlink_callback *cb, > struct ib_device *device, u32 port) > { > struct ib_port_attr attr; > @@ -196,6 +217,8 @@ static int fill_port_info(struct sk_buff *msg, > return -EMSGSIZE; > if (nla_put_u8(msg, RDMA_NLDEV_ATTR_PORT_PHYS_STATE, attr.phys_state)) > return -EMSGSIZE; > + if (provider_fill_port_info(msg, cb, device, port)) > + return -EMSGSIZE; > return 0; > } > > @@ -555,7 +578,7 @@ static int nldev_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh, > RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET), > 0, 0); > > - err = fill_dev_info(msg, device); > + err = fill_dev_info(msg, NULL, device); > if (err) > goto err_free; > > @@ -586,7 +609,7 @@ static int _nldev_get_dumpit(struct ib_device *device, > RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET), > 0, NLM_F_MULTI); > > - if (fill_dev_info(skb, device)) { > + if (fill_dev_info(skb, cb, device)) { > nlmsg_cancel(skb, nlh); > goto out; > } > @@ -646,7 +669,7 @@ static int nldev_port_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh, > RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET), > 0, 0); > > - err = fill_port_info(msg, device, port); > + err = fill_port_info(msg, NULL, device, port); > if (err) > goto err_free; > > @@ -706,7 +729,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb, > RDMA_NLDEV_CMD_PORT_GET), > 0, NLM_F_MULTI); > > - if (fill_port_info(skb, device, p)) { > + if (fill_port_info(skb, cb, device, p)) { > nlmsg_cancel(skb, nlh); > goto out; > } > diff --git a/include/rdma/restrack.h b/include/rdma/restrack.h > index bd3cd9a..936b56f 100644 > --- a/include/rdma/restrack.h > +++ b/include/rdma/restrack.h > @@ -45,6 +45,7 @@ enum rdma_restrack_type { > > #define RDMA_RESTRACK_HASH_BITS 8 > struct rdma_restrack_entry; > +struct ib_device; > > /** > * struct rdma_restrack_root - main resource tracking management > @@ -67,6 +68,20 @@ struct rdma_restrack_root { > int (*fill_res_entry)(struct sk_buff *msg, > struct netlink_callback *cb, > struct rdma_restrack_entry *entry); > + /** > + * @fill_dev_info: provider-specific fill function > + * > + * Allows rdma providers to add their own device attributes. > + */ > + int (*fill_dev_info)(struct sk_buff *msg, struct netlink_callback *cb, > + struct ib_device *device); > + /** > + * @fill_port_info: provider-specific fill function > + * > + * Allows rdma providers to add their own port attributes. > + */ > + int (*fill_port_info)(struct sk_buff *msg, struct netlink_callback *cb, > + struct ib_device *device, u32 port); Why do you pass "struct netlink_callback *cb" to the drivers? IMHO they need to receive minimum information, pointer to message (they don't need to allocate it), device, port, restrack entry. Thanks > }; > > /** > -- > 1.8.3.1 >
Attachment:
signature.asc
Description: PGP signature