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