Re: [PATCH 09/13] RDMA/core: Expose the ib port sysfs attribute machinery

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

 



On Mon, May 17, 2021 at 01:47:37PM -0300, Jason Gunthorpe wrote:
> Other things outside the core code are creating attributes against the
> port. This patch exposes the basic machinery to do this.
> 
> The ib_port_attribute type allows creating groups of attributes attatched
> to the port and comes with the usual machinery to do this.
> 
> Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
> ---
>  drivers/infiniband/core/sysfs.c | 217 +++++++++++++++++---------------
>  include/rdma/ib_sysfs.h         |  41 ++++++
>  2 files changed, 158 insertions(+), 100 deletions(-)
>  create mode 100644 include/rdma/ib_sysfs.h
> 
> diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
> index ce6aecbb5a7616..58a45548bf1568 100644
> --- a/drivers/infiniband/core/sysfs.c
> +++ b/drivers/infiniband/core/sysfs.c
> @@ -44,24 +44,10 @@
>  #include <rdma/ib_pma.h>
>  #include <rdma/ib_cache.h>
>  #include <rdma/rdma_counter.h>
> -
> -struct ib_port;
> -
> -struct port_attribute {
> -	struct attribute attr;
> -	ssize_t (*show)(struct ib_port *, struct port_attribute *, char *buf);
> -	ssize_t (*store)(struct ib_port *, struct port_attribute *,
> -			 const char *buf, size_t count);
> -};
> -
> -#define PORT_ATTR(_name, _mode, _show, _store) \
> -struct port_attribute port_attr_##_name = __ATTR(_name, _mode, _show, _store)
> -
> -#define PORT_ATTR_RO(_name) \
> -struct port_attribute port_attr_##_name = __ATTR_RO(_name)
> +#include <rdma/ib_sysfs.h>
>  
>  struct port_table_attribute {
> -	struct port_attribute	attr;
> +	struct ib_port_attribute attr;
>  	char			name[8];
>  	int			index;
>  	__be16			attr_id;
> @@ -97,7 +83,7 @@ struct hw_stats_device_attribute {
>  };
>  
>  struct hw_stats_port_attribute {
> -	struct port_attribute attr;
> +	struct ib_port_attribute attr;
>  	ssize_t (*show)(struct ib_device *ibdev, struct rdma_hw_stats *stats,
>  			unsigned int index, unsigned int port_num, char *buf);
>  	ssize_t (*store)(struct ib_device *ibdev, struct rdma_hw_stats *stats,
> @@ -119,29 +105,55 @@ struct hw_stats_port_data {
>  static ssize_t port_attr_show(struct kobject *kobj,
>  			      struct attribute *attr, char *buf)
>  {
> -	struct port_attribute *port_attr =
> -		container_of(attr, struct port_attribute, attr);
> +	struct ib_port_attribute *port_attr =
> +		container_of(attr, struct ib_port_attribute, attr);
>  	struct ib_port *p = container_of(kobj, struct ib_port, kobj);
>  
>  	if (!port_attr->show)
>  		return -EIO;
>  
> -	return port_attr->show(p, port_attr, buf);
> +	return port_attr->show(p->ibdev, p->port_num, port_attr, buf);
>  }
>  
>  static ssize_t port_attr_store(struct kobject *kobj,
>  			       struct attribute *attr,
>  			       const char *buf, size_t count)
>  {
> -	struct port_attribute *port_attr =
> -		container_of(attr, struct port_attribute, attr);
> +	struct ib_port_attribute *port_attr =
> +		container_of(attr, struct ib_port_attribute, attr);
>  	struct ib_port *p = container_of(kobj, struct ib_port, kobj);
>  
>  	if (!port_attr->store)
>  		return -EIO;
> -	return port_attr->store(p, port_attr, buf, count);
> +	return port_attr->store(p->ibdev, p->port_num, port_attr, buf, count);
>  }
>  
> +int ib_port_sysfs_create_groups(struct ib_device *ibdev, u32 port_num,
> +				const struct attribute_group **groups)
> +{
> +	return sysfs_create_groups(&ibdev->port_data[port_num].sysfs->kobj,
> +				   groups);
> +}
> +EXPORT_SYMBOL(ib_port_sysfs_create_groups);

You are wrapping _GPL symbols here with a "convenience" function, please
make these all EXPORT_SYMBOL_GPL() so I don't get nervous.

thanks,

greg k-h



[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