RDMA: Manual changes for sysfs_emit and neatening
authorJoe Perches <joe@perches.com>
Thu, 8 Oct 2020 02:36:26 +0000 (19:36 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Sat, 31 Oct 2020 00:03:52 +0000 (21:03 -0300)
Make changes to use sysfs_emit in the RDMA code as cocci scripts can not
be written to handle _all_ the possible variants of various sprintf family
uses in sysfs show functions.

While there, make the code more legible and update its style to be more
like the typical kernel styles.

Miscellanea:

o Use intermediate pointers for dereferences
o Add and use string lookup functions
o return early when any intermediate call fails so normal return is
  at the bottom of the function
o mlx4/mcg.c:sysfs_show_group: use scnprintf to format intermediate strings

Link: https://lore.kernel.org/r/f5c9e4c9d8dafca1b7b70bd597ee7f8f219c31c8.1602122880.git.joe@perches.com
Signed-off-by: Joe Perches <joe@perches.com>
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/sysfs.c
drivers/infiniband/hw/hfi1/sysfs.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/mcg.c
drivers/infiniband/hw/mlx4/sysfs.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/qib/qib_sysfs.c
drivers/infiniband/hw/usnic/usnic_ib_sysfs.c
drivers/infiniband/ulp/srp/ib_srp.c

index 4e335fc4d016ee342ccbc55cfd08e481ea578b1c..4dd803f23aaa80194760e66f4bd54d81e3eb01ef 100644 (file)
@@ -1224,29 +1224,34 @@ err_put:
        return ret;
 }
 
-static ssize_t node_type_show(struct device *device,
-                             struct device_attribute *attr, char *buf)
+static const char *node_type_string(int node_type)
 {
-       struct ib_device *dev = rdma_device_to_ibdev(device);
-
-       switch (dev->node_type) {
+       switch (node_type) {
        case RDMA_NODE_IB_CA:
-               return sysfs_emit(buf, "%d: CA\n", dev->node_type);
+               return "CA";
+       case RDMA_NODE_IB_SWITCH:
+               return "switch";
+       case RDMA_NODE_IB_ROUTER:
+               return "router";
        case RDMA_NODE_RNIC:
-               return sysfs_emit(buf, "%d: RNIC\n", dev->node_type);
+               return "RNIC";
        case RDMA_NODE_USNIC:
-               return sysfs_emit(buf, "%d: usNIC\n", dev->node_type);
+               return "usNIC";
        case RDMA_NODE_USNIC_UDP:
-               return sysfs_emit(buf, "%d: usNIC UDP\n", dev->node_type);
+               return "usNIC UDP";
        case RDMA_NODE_UNSPECIFIED:
-               return sysfs_emit(buf, "%d: unspecified\n", dev->node_type);
-       case RDMA_NODE_IB_SWITCH:
-               return sysfs_emit(buf, "%d: switch\n", dev->node_type);
-       case RDMA_NODE_IB_ROUTER:
-               return sysfs_emit(buf, "%d: router\n", dev->node_type);
-       default:
-               return sysfs_emit(buf, "%d: <unknown>\n", dev->node_type);
+               return "unspecified";
        }
+       return "<unknown>";
+}
+
+static ssize_t node_type_show(struct device *device,
+                             struct device_attribute *attr, char *buf)
+{
+       struct ib_device *dev = rdma_device_to_ibdev(device);
+
+       return sysfs_emit(buf, "%d: %s\n", dev->node_type,
+                         node_type_string(dev->node_type));
 }
 static DEVICE_ATTR_RO(node_type);
 
@@ -1254,13 +1259,13 @@ static ssize_t sys_image_guid_show(struct device *device,
                                   struct device_attribute *dev_attr, char *buf)
 {
        struct ib_device *dev = rdma_device_to_ibdev(device);
+       __be16 *guid = (__be16 *)&dev->attrs.sys_image_guid;
 
-       return sysfs_emit(
-               buf, "%04x:%04x:%04x:%04x\n",
-               be16_to_cpu(((__be16 *)&dev->attrs.sys_image_guid)[0]),
-               be16_to_cpu(((__be16 *)&dev->attrs.sys_image_guid)[1]),
-               be16_to_cpu(((__be16 *)&dev->attrs.sys_image_guid)[2]),
-               be16_to_cpu(((__be16 *)&dev->attrs.sys_image_guid)[3]));
+       return sysfs_emit(buf, "%04x:%04x:%04x:%04x\n",
+                         be16_to_cpu(guid[0]),
+                         be16_to_cpu(guid[1]),
+                         be16_to_cpu(guid[2]),
+                         be16_to_cpu(guid[3]));
 }
 static DEVICE_ATTR_RO(sys_image_guid);
 
@@ -1268,12 +1273,13 @@ static ssize_t node_guid_show(struct device *device,
                              struct device_attribute *attr, char *buf)
 {
        struct ib_device *dev = rdma_device_to_ibdev(device);
+       __be16 *node_guid = (__be16 *)&dev->node_guid;
 
        return sysfs_emit(buf, "%04x:%04x:%04x:%04x\n",
-                         be16_to_cpu(((__be16 *)&dev->node_guid)[0]),
-                         be16_to_cpu(((__be16 *)&dev->node_guid)[1]),
-                         be16_to_cpu(((__be16 *)&dev->node_guid)[2]),
-                         be16_to_cpu(((__be16 *)&dev->node_guid)[3]));
+                         be16_to_cpu(node_guid[0]),
+                         be16_to_cpu(node_guid[1]),
+                         be16_to_cpu(node_guid[2]),
+                         be16_to_cpu(node_guid[3]));
 }
 static DEVICE_ATTR_RO(node_guid);
 
@@ -1309,10 +1315,11 @@ static ssize_t fw_ver_show(struct device *device, struct device_attribute *attr,
                           char *buf)
 {
        struct ib_device *dev = rdma_device_to_ibdev(device);
+       char version[IB_FW_VERSION_NAME_MAX] = {};
+
+       ib_get_device_fw_str(dev, version);
 
-       ib_get_device_fw_str(dev, buf);
-       strlcat(buf, "\n", IB_FW_VERSION_NAME_MAX);
-       return strlen(buf);
+       return sysfs_emit(buf, "%s\n", version);
 }
 static DEVICE_ATTR_RO(fw_ver);
 
index e2a88f3cea7fcbccd970d24cd9f98870dafbbf61..9a695e1571c04137c07c636bc10920f6f97aee1d 100644 (file)
@@ -510,13 +510,11 @@ static ssize_t board_id_show(struct device *device,
        struct hfi1_ibdev *dev =
                rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev);
        struct hfi1_devdata *dd = dd_from_dev(dev);
-       int ret;
 
        if (!dd->boardname)
-               ret = -EINVAL;
-       else
-               ret = sysfs_emit(buf, "%s\n", dd->boardname);
-       return ret;
+               return -EINVAL;
+
+       return sysfs_emit(buf, "%s\n", dd->boardname);
 }
 static DEVICE_ATTR_RO(board_id);
 
@@ -570,6 +568,7 @@ static ssize_t serial_show(struct device *device,
                rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev);
        struct hfi1_devdata *dd = dd_from_dev(dev);
 
+       /* dd->serial is already newline terminated in chip.c */
        return sysfs_emit(buf, "%s", dd->serial);
 }
 static DEVICE_ATTR_RO(serial);
@@ -598,9 +597,8 @@ static DEVICE_ATTR_WO(chip_reset);
  * Convert the reported temperature from an integer (reported in
  * units of 0.25C) to a floating point number.
  */
-#define temp2str(temp, buf, size, idx)                                 \
-       scnprintf((buf) + (idx), (size) - (idx), "%u.%02u ",            \
-                             ((temp) >> 2), ((temp) & 0x3) * 25)
+#define temp_d(t) ((t) >> 2)
+#define temp_f(t) (((t)&0x3) * 25u)
 
 /*
  * Dump tempsense values, in decimal, to ease shell-scripts.
@@ -615,19 +613,17 @@ static ssize_t tempsense_show(struct device *device,
        int ret;
 
        ret = hfi1_tempsense_rd(dd, &temp);
-       if (!ret) {
-               int idx = 0;
-
-               idx += temp2str(temp.curr, buf, PAGE_SIZE, idx);
-               idx += temp2str(temp.lo_lim, buf, PAGE_SIZE, idx);
-               idx += temp2str(temp.hi_lim, buf, PAGE_SIZE, idx);
-               idx += temp2str(temp.crit_lim, buf, PAGE_SIZE, idx);
-               idx += scnprintf(buf + idx, PAGE_SIZE - idx,
-                               "%u %u %u\n", temp.triggers & 0x1,
-                               temp.triggers & 0x2, temp.triggers & 0x4);
-               ret = idx;
-       }
-       return ret;
+       if (ret)
+               return ret;
+
+       return sysfs_emit(buf, "%u.%02u %u.%02u %u.%02u %u.%02u %u %u %u\n",
+                         temp_d(temp.curr), temp_f(temp.curr),
+                         temp_d(temp.lo_lim), temp_f(temp.lo_lim),
+                         temp_d(temp.hi_lim), temp_f(temp.hi_lim),
+                         temp_d(temp.crit_lim), temp_f(temp.crit_lim),
+                         temp.triggers & 0x1,
+                         temp.triggers & 0x2,
+                         temp.triggers & 0x4);
 }
 static DEVICE_ATTR_RO(tempsense);
 
index 2ac932834f989114483189781e2298b88399a4d6..f0864f40ea1ac0802a8ebeec284bdc705f9c49ac 100644 (file)
@@ -2024,6 +2024,7 @@ static ssize_t hca_type_show(struct device *device,
 {
        struct mlx4_ib_dev *dev =
                rdma_device_to_drv_device(device, struct mlx4_ib_dev, ib_dev);
+
        return sysfs_emit(buf, "MT%d\n", dev->dev->persist->pdev->device);
 }
 static DEVICE_ATTR_RO(hca_type);
@@ -2033,6 +2034,7 @@ static ssize_t hw_rev_show(struct device *device,
 {
        struct mlx4_ib_dev *dev =
                rdma_device_to_drv_device(device, struct mlx4_ib_dev, ib_dev);
+
        return sysfs_emit(buf, "%x\n", dev->dev->rev_id);
 }
 static DEVICE_ATTR_RO(hw_rev);
index 5e4ec9786081cf3a42dfe2f51532b3d6f4ee581b..33f525b744f286c8db8b58407bf8efe4e5f3ed16 100644 (file)
@@ -988,53 +988,63 @@ int mlx4_ib_mcg_multiplex_handler(struct ib_device *ibdev, int port,
 }
 
 static ssize_t sysfs_show_group(struct device *dev,
-               struct device_attribute *attr, char *buf)
+                               struct device_attribute *attr, char *buf)
 {
        struct mcast_group *group =
                container_of(attr, struct mcast_group, dentry);
        struct mcast_req *req = NULL;
-       char pending_str[40];
        char state_str[40];
-       ssize_t len = 0;
-       int f;
+       char pending_str[40];
+       int len;
+       int i;
+       u32 hoplimit;
 
        if (group->state == MCAST_IDLE)
-               sprintf(state_str, "%s", get_state_string(group->state));
+               scnprintf(state_str, sizeof(state_str), "%s",
+                         get_state_string(group->state));
        else
-               sprintf(state_str, "%s(TID=0x%llx)",
-                               get_state_string(group->state),
-                               be64_to_cpu(group->last_req_tid));
+               scnprintf(state_str, sizeof(state_str), "%s(TID=0x%llx)",
+                         get_state_string(group->state),
+                         be64_to_cpu(group->last_req_tid));
+
        if (list_empty(&group->pending_list)) {
-               sprintf(pending_str, "No");
+               scnprintf(pending_str, sizeof(pending_str), "No");
        } else {
-               req = list_first_entry(&group->pending_list, struct mcast_req, group_list);
-               sprintf(pending_str, "Yes(TID=0x%llx)",
-                               be64_to_cpu(req->sa_mad.mad_hdr.tid));
+               req = list_first_entry(&group->pending_list, struct mcast_req,
+                                      group_list);
+               scnprintf(pending_str, sizeof(pending_str), "Yes(TID=0x%llx)",
+                         be64_to_cpu(req->sa_mad.mad_hdr.tid));
        }
-       len += sprintf(buf + len, "%1d [%02d,%02d,%02d] %4d %4s %5s     ",
-                       group->rec.scope_join_state & 0xf,
-                       group->members[2], group->members[1], group->members[0],
-                       atomic_read(&group->refcount),
-                       pending_str,
-                       state_str);
-       for (f = 0; f < MAX_VFS; ++f)
-               if (group->func[f].state == MCAST_MEMBER)
-                       len += sprintf(buf + len, "%d[%1x] ",
-                                       f, group->func[f].join_state);
-
-       len += sprintf(buf + len, "\t\t(%4hx %4x %2x %2x %2x %2x %2x "
-               "%4x %4x %2x %2x)\n",
-               be16_to_cpu(group->rec.pkey),
-               be32_to_cpu(group->rec.qkey),
-               (group->rec.mtusel_mtu & 0xc0) >> 6,
-               group->rec.mtusel_mtu & 0x3f,
-               group->rec.tclass,
-               (group->rec.ratesel_rate & 0xc0) >> 6,
-               group->rec.ratesel_rate & 0x3f,
-               (be32_to_cpu(group->rec.sl_flowlabel_hoplimit) & 0xf0000000) >> 28,
-               (be32_to_cpu(group->rec.sl_flowlabel_hoplimit) & 0x0fffff00) >> 8,
-               be32_to_cpu(group->rec.sl_flowlabel_hoplimit) & 0x000000ff,
-               group->rec.proxy_join);
+
+       len = sysfs_emit(buf, "%1d [%02d,%02d,%02d] %4d %4s %5s     ",
+                        group->rec.scope_join_state & 0xf,
+                        group->members[2],
+                        group->members[1],
+                        group->members[0],
+                        atomic_read(&group->refcount),
+                        pending_str,
+                        state_str);
+
+       for (i = 0; i < MAX_VFS; i++) {
+               if (group->func[i].state == MCAST_MEMBER)
+                       len += sysfs_emit_at(buf, len, "%d[%1x] ", i,
+                                            group->func[i].join_state);
+       }
+
+       hoplimit = be32_to_cpu(group->rec.sl_flowlabel_hoplimit);
+       len += sysfs_emit_at(buf, len,
+                            "\t\t(%4hx %4x %2x %2x %2x %2x %2x %4x %4x %2x %2x)\n",
+                            be16_to_cpu(group->rec.pkey),
+                            be32_to_cpu(group->rec.qkey),
+                            (group->rec.mtusel_mtu & 0xc0) >> 6,
+                            (group->rec.mtusel_mtu & 0x3f),
+                            group->rec.tclass,
+                            (group->rec.ratesel_rate & 0xc0) >> 6,
+                            (group->rec.ratesel_rate & 0x3f),
+                            (hoplimit & 0xf0000000) >> 28,
+                            (hoplimit & 0x0fffff00) >> 8,
+                            (hoplimit & 0x000000ff),
+                            group->rec.proxy_join);
 
        return len;
 }
index 22ae363088ed654d7ad61b361405ce6b3d9752fb..0279b780c4461e19aa902e122f9248ffd33c624e 100644 (file)
@@ -117,22 +117,24 @@ static ssize_t show_port_gid(struct device *dev,
        struct mlx4_ib_iov_port *port = mlx4_ib_iov_dentry->ctx;
        struct mlx4_ib_dev *mdev = port->dev;
        union ib_gid gid;
-       ssize_t ret;
+       int ret;
+       __be16 *raw;
 
        ret = __mlx4_ib_query_gid(&mdev->ib_dev, port->num,
                                  mlx4_ib_iov_dentry->entry_num, &gid, 1);
        if (ret)
                return ret;
-       ret = sysfs_emit(buf, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
-                        be16_to_cpu(((__be16 *)gid.raw)[0]),
-                        be16_to_cpu(((__be16 *)gid.raw)[1]),
-                        be16_to_cpu(((__be16 *)gid.raw)[2]),
-                        be16_to_cpu(((__be16 *)gid.raw)[3]),
-                        be16_to_cpu(((__be16 *)gid.raw)[4]),
-                        be16_to_cpu(((__be16 *)gid.raw)[5]),
-                        be16_to_cpu(((__be16 *)gid.raw)[6]),
-                        be16_to_cpu(((__be16 *)gid.raw)[7]));
-       return ret;
+
+       raw = (__be16 *)gid.raw;
+       return sysfs_emit(buf, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+                         be16_to_cpu(raw[0]),
+                         be16_to_cpu(raw[1]),
+                         be16_to_cpu(raw[2]),
+                         be16_to_cpu(raw[3]),
+                         be16_to_cpu(raw[4]),
+                         be16_to_cpu(raw[5]),
+                         be16_to_cpu(raw[6]),
+                         be16_to_cpu(raw[7]));
 }
 
 static ssize_t show_phys_port_pkey(struct device *dev,
@@ -542,14 +544,10 @@ static ssize_t sysfs_show_smi_enabled(struct device *dev,
 {
        struct mlx4_port *p =
                container_of(attr, struct mlx4_port, smi_enabled);
-       ssize_t len = 0;
 
-       if (mlx4_vf_smi_enabled(p->dev->dev, p->slave, p->port_num))
-               len = sysfs_emit(buf, "%d\n", 1);
-       else
-               len = sysfs_emit(buf, "%d\n", 0);
-
-       return len;
+       return sysfs_emit(buf, "%d\n",
+                         !!mlx4_vf_smi_enabled(p->dev->dev, p->slave,
+                                               p->port_num));
 }
 
 static ssize_t sysfs_show_enable_smi_admin(struct device *dev,
@@ -558,14 +556,10 @@ static ssize_t sysfs_show_enable_smi_admin(struct device *dev,
 {
        struct mlx4_port *p =
                container_of(attr, struct mlx4_port, enable_smi_admin);
-       ssize_t len = 0;
-
-       if (mlx4_vf_get_enable_smi_admin(p->dev->dev, p->slave, p->port_num))
-               len = sysfs_emit(buf, "%d\n", 1);
-       else
-               len = sysfs_emit(buf, "%d\n", 0);
 
-       return len;
+       return sysfs_emit(buf, "%d\n",
+                         !!mlx4_vf_get_enable_smi_admin(p->dev->dev, p->slave,
+                                                        p->port_num));
 }
 
 static ssize_t sysfs_store_enable_smi_admin(struct device *dev,
index 12179a41456dd7ffe629e9b97a387bcc83fea6df..1a3dd07f993b3bbe521cf8850e0ea90142d82dc8 100644 (file)
@@ -965,25 +965,30 @@ static ssize_t hw_rev_show(struct device *device,
 }
 static DEVICE_ATTR_RO(hw_rev);
 
-static ssize_t hca_type_show(struct device *device,
-                            struct device_attribute *attr, char *buf)
+static const char *hca_type_string(int hca_type)
 {
-       struct mthca_dev *dev =
-               rdma_device_to_drv_device(device, struct mthca_dev, ib_dev);
-
-       switch (dev->pdev->device) {
+       switch (hca_type) {
        case PCI_DEVICE_ID_MELLANOX_TAVOR:
-               return sysfs_emit(buf, "MT23108\n");
+               return "MT23108";
        case PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT:
-               return sysfs_emit(buf, "MT25208 (MT23108 compat mode)\n");
+               return "MT25208 (MT23108 compat mode)";
        case PCI_DEVICE_ID_MELLANOX_ARBEL:
-               return sysfs_emit(buf, "MT25208\n");
+               return "MT25208";
        case PCI_DEVICE_ID_MELLANOX_SINAI:
        case PCI_DEVICE_ID_MELLANOX_SINAI_OLD:
-               return sysfs_emit(buf, "MT25204\n");
-       default:
-               return sysfs_emit(buf, "unknown\n");
+               return "MT25204";
        }
+
+       return "unknown";
+}
+
+static ssize_t hca_type_show(struct device *device,
+                            struct device_attribute *attr, char *buf)
+{
+       struct mthca_dev *dev =
+               rdma_device_to_drv_device(device, struct mthca_dev, ib_dev);
+
+       return sysfs_emit(buf, "%s\n", hca_type_string(dev->pdev->device));
 }
 static DEVICE_ATTR_RO(hca_type);
 
index 818282bc7c5bcb44876e3faf3d4ce86626566ed3..3761f21cef97b34fe0b92c1d73c8e072fc20afbe 100644 (file)
@@ -575,13 +575,10 @@ static ssize_t hca_type_show(struct device *device,
        struct qib_ibdev *dev =
                rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev);
        struct qib_devdata *dd = dd_from_dev(dev);
-       int ret;
 
        if (!dd->boardname)
-               ret = -EINVAL;
-       else
-               ret = sysfs_emit(buf, "%s\n", dd->boardname);
-       return ret;
+               return -EINVAL;
+       return sysfs_emit(buf, "%s\n", dd->boardname);
 }
 static DEVICE_ATTR_RO(hca_type);
 static DEVICE_ATTR(board_id, 0444, hca_type_show, NULL);
@@ -647,17 +644,16 @@ static ssize_t nfreectxts_show(struct device *device,
 }
 static DEVICE_ATTR_RO(nfreectxts);
 
-static ssize_t serial_show(struct device *device,
-                          struct device_attribute *attr, char *buf)
+static ssize_t serial_show(struct device *device, struct device_attribute *attr,
+                          char *buf)
 {
        struct qib_ibdev *dev =
                rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev);
        struct qib_devdata *dd = dd_from_dev(dev);
+       const u8 *end = memchr(dd->serial, 0, ARRAY_SIZE(dd->serial));
+       int size = end ? end - dd->serial : ARRAY_SIZE(dd->serial);
 
-       buf[sizeof(dd->serial)] = '\0';
-       memcpy(buf, dd->serial, sizeof(dd->serial));
-       strcat(buf, "\n");
-       return strlen(buf);
+       return sysfs_emit(buf, ".%*s\n", size, dd->serial);
 }
 static DEVICE_ATTR_RO(serial);
 
@@ -690,26 +686,26 @@ static ssize_t tempsense_show(struct device *device,
        struct qib_ibdev *dev =
                rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev);
        struct qib_devdata *dd = dd_from_dev(dev);
-       int ret;
-       int idx;
+       int i;
        u8 regvals[8];
 
-       ret = -ENXIO;
-       for (idx = 0; idx < 8; ++idx) {
-               if (idx == 6)
+       for (i = 0; i < 8; i++) {
+               int ret;
+
+               if (i == 6)
                        continue;
-               ret = dd->f_tempsense_rd(dd, idx);
+               ret = dd->f_tempsense_rd(dd, i);
                if (ret < 0)
-                       break;
-               regvals[idx] = ret;
+                       return ret;     /* return error on bad read */
+               regvals[i] = ret;
        }
-       if (idx == 8)
-               ret = sysfs_emit(buf, "%d %d %02X %02X %d %d\n",
-                                *(signed char *)(regvals),
-                                *(signed char *)(regvals + 1), regvals[2],
-                                regvals[3], *(signed char *)(regvals + 5),
-                                *(signed char *)(regvals + 7));
-       return ret;
+       return sysfs_emit(buf, "%d %d %02X %02X %d %d\n",
+                         (signed char)regvals[0],
+                         (signed char)regvals[1],
+                         regvals[2],
+                         regvals[3],
+                         (signed char)regvals[5],
+                         (signed char)regvals[7]);
 }
 static DEVICE_ATTR_RO(tempsense);
 
index 0af72fca00ff45ceca5dd2f35260422f30a307eb..250948c382f9a6f2ff5726af7c1bbde56f725f1c 100644 (file)
@@ -57,7 +57,7 @@ static ssize_t board_id_show(struct device *device,
        subsystem_device_id = us_ibdev->pdev->subsystem_device;
        mutex_unlock(&us_ibdev->usdev_lock);
 
-       return sysfs_emit(buf, "%hu\n", subsystem_device_id);
+       return sysfs_emit(buf, "%u\n", subsystem_device_id);
 }
 static DEVICE_ATTR_RO(board_id);
 
@@ -69,19 +69,13 @@ config_show(struct device *device, struct device_attribute *attr, char *buf)
 {
        struct usnic_ib_dev *us_ibdev =
                rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev);
-       char *ptr;
-       unsigned left;
-       unsigned n;
        enum usnic_vnic_res_type res_type;
-
-       /* Buffer space limit is 1 page */
-       ptr = buf;
-       left = PAGE_SIZE;
+       int len;
 
        mutex_lock(&us_ibdev->usdev_lock);
        if (kref_read(&us_ibdev->vf_cnt) > 0) {
                char *busname;
-
+               char *sep = "";
                /*
                 * bus name seems to come with annoying prefix.
                 * Remove it if it is predictable
@@ -90,39 +84,35 @@ config_show(struct device *device, struct device_attribute *attr, char *buf)
                if (strncmp(busname, "PCI Bus ", 8) == 0)
                        busname += 8;
 
-               n = scnprintf(ptr, left,
-                       "%s: %s:%d.%d, %s, %pM, %u VFs\n Per VF:",
-                       dev_name(&us_ibdev->ib_dev.dev),
-                       busname,
-                       PCI_SLOT(us_ibdev->pdev->devfn),
-                       PCI_FUNC(us_ibdev->pdev->devfn),
-                       netdev_name(us_ibdev->netdev),
-                       us_ibdev->ufdev->mac,
-                       kref_read(&us_ibdev->vf_cnt));
-               UPDATE_PTR_LEFT(n, ptr, left);
+               len = sysfs_emit(buf, "%s: %s:%d.%d, %s, %pM, %u VFs\n",
+                                dev_name(&us_ibdev->ib_dev.dev),
+                                busname,
+                                PCI_SLOT(us_ibdev->pdev->devfn),
+                                PCI_FUNC(us_ibdev->pdev->devfn),
+                                netdev_name(us_ibdev->netdev),
+                                us_ibdev->ufdev->mac,
+                                kref_read(&us_ibdev->vf_cnt));
 
+               len += sysfs_emit_at(buf, len, " Per VF:");
                for (res_type = USNIC_VNIC_RES_TYPE_EOL;
-                               res_type < USNIC_VNIC_RES_TYPE_MAX;
-                               res_type++) {
+                    res_type < USNIC_VNIC_RES_TYPE_MAX; res_type++) {
                        if (us_ibdev->vf_res_cnt[res_type] == 0)
                                continue;
-                       n = scnprintf(ptr, left, " %d %s%s",
-                               us_ibdev->vf_res_cnt[res_type],
-                               usnic_vnic_res_type_to_str(res_type),
-                               (res_type < (USNIC_VNIC_RES_TYPE_MAX - 1)) ?
-                                "," : "");
-                       UPDATE_PTR_LEFT(n, ptr, left);
+                       len += sysfs_emit_at(buf, len, "%s %d %s",
+                                            sep,
+                                            us_ibdev->vf_res_cnt[res_type],
+                                            usnic_vnic_res_type_to_str(res_type));
+                       sep = ",";
                }
-               n = scnprintf(ptr, left, "\n");
-               UPDATE_PTR_LEFT(n, ptr, left);
+               len += sysfs_emit_at(buf, len, "\n");
        } else {
-               n = scnprintf(ptr, left, "%s: no VFs\n",
-                               dev_name(&us_ibdev->ib_dev.dev));
-               UPDATE_PTR_LEFT(n, ptr, left);
+               len = sysfs_emit(buf, "%s: no VFs\n",
+                                dev_name(&us_ibdev->ib_dev.dev));
        }
+
        mutex_unlock(&us_ibdev->usdev_lock);
 
-       return ptr - buf;
+       return len;
 }
 static DEVICE_ATTR_RO(config);
 
index f686d1d6e91cfbc1da1993805db712ff4b89ef15..ee22ea44a40a15642626939c5687b9caf9dced43 100644 (file)
@@ -2925,6 +2925,7 @@ static ssize_t show_pkey(struct device *dev, struct device_attribute *attr,
 
        if (target->using_rdma_cm)
                return -ENOENT;
+
        return sysfs_emit(buf, "0x%04x\n", be16_to_cpu(target->ib_cm.pkey));
 }
 
@@ -2944,6 +2945,7 @@ static ssize_t show_dgid(struct device *dev, struct device_attribute *attr,
 
        if (target->using_rdma_cm)
                return -ENOENT;
+
        return sysfs_emit(buf, "%pI6\n", ch->ib_cm.path.dgid.raw);
 }
 
@@ -2954,6 +2956,7 @@ static ssize_t show_orig_dgid(struct device *dev,
 
        if (target->using_rdma_cm)
                return -ENOENT;
+
        return sysfs_emit(buf, "%pI6\n", target->ib_cm.orig_dgid.raw);
 }
 
@@ -2968,6 +2971,7 @@ static ssize_t show_req_lim(struct device *dev,
                ch = &target->ch[i];
                req_lim = min(req_lim, ch->req_lim);
        }
+
        return sysfs_emit(buf, "%d\n", req_lim);
 }