Re: [PATCH v1 rdma-next 3/4] RDMA/nldev: add provider-specific device/port tracking

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

 



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


[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