PCI/sysfs: Use sysfs_emit() and sysfs_emit_at() in "show" functions

The sysfs_emit() and sysfs_emit_at() functions were introduced to make
it less ambiguous which function is preferred when writing to the output
buffer in a device attribute's "show" callback [1].

Convert the PCI sysfs object "show" functions from sprintf(), snprintf()
and scnprintf() to sysfs_emit() and sysfs_emit_at() accordingly, as the
latter is aware of the PAGE_SIZE buffer and correctly returns the number
of bytes written into the buffer.

No functional change intended.

[1] Documentation/filesystems/sysfs.rst

Related commit: ad025f8e46 ("PCI/sysfs: Use sysfs_emit() and
sysfs_emit_at() in "show" functions").

Link: https://lore.kernel.org/r/20210603000112.703037-2-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
This commit is contained in:
Krzysztof Wilczyński 2021-06-03 00:01:07 +00:00 committed by Bjorn Helgaas
parent 316ae33051
commit f8cf6e513e
12 changed files with 75 additions and 70 deletions

View file

@ -73,7 +73,7 @@ static ssize_t power_read_file(struct pci_slot *pci_slot, char *buf)
if (retval) if (retval)
return retval; return retval;
return sprintf(buf, "%d\n", value); return sysfs_emit(buf, "%d\n", value);
} }
static ssize_t power_write_file(struct pci_slot *pci_slot, const char *buf, static ssize_t power_write_file(struct pci_slot *pci_slot, const char *buf,
@ -130,7 +130,7 @@ static ssize_t attention_read_file(struct pci_slot *pci_slot, char *buf)
if (retval) if (retval)
return retval; return retval;
return sprintf(buf, "%d\n", value); return sysfs_emit(buf, "%d\n", value);
} }
static ssize_t attention_write_file(struct pci_slot *pci_slot, const char *buf, static ssize_t attention_write_file(struct pci_slot *pci_slot, const char *buf,
@ -175,7 +175,7 @@ static ssize_t latch_read_file(struct pci_slot *pci_slot, char *buf)
if (retval) if (retval)
return retval; return retval;
return sprintf(buf, "%d\n", value); return sysfs_emit(buf, "%d\n", value);
} }
static struct pci_slot_attribute hotplug_slot_attr_latch = { static struct pci_slot_attribute hotplug_slot_attr_latch = {
@ -192,7 +192,7 @@ static ssize_t presence_read_file(struct pci_slot *pci_slot, char *buf)
if (retval) if (retval)
return retval; return retval;
return sprintf(buf, "%d\n", value); return sysfs_emit(buf, "%d\n", value);
} }
static struct pci_slot_attribute hotplug_slot_attr_presence = { static struct pci_slot_attribute hotplug_slot_attr_presence = {

View file

@ -50,7 +50,7 @@ static ssize_t add_slot_store(struct kobject *kobj, struct kobj_attribute *attr,
static ssize_t add_slot_show(struct kobject *kobj, static ssize_t add_slot_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf) struct kobj_attribute *attr, char *buf)
{ {
return sprintf(buf, "0\n"); return sysfs_emit(buf, "0\n");
} }
static ssize_t remove_slot_store(struct kobject *kobj, static ssize_t remove_slot_store(struct kobject *kobj,
@ -80,7 +80,7 @@ static ssize_t remove_slot_store(struct kobject *kobj,
static ssize_t remove_slot_show(struct kobject *kobj, static ssize_t remove_slot_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf) struct kobj_attribute *attr, char *buf)
{ {
return sprintf(buf, "0\n"); return sysfs_emit(buf, "0\n");
} }
static struct kobj_attribute add_slot_attr = static struct kobj_attribute add_slot_attr =

View file

@ -24,50 +24,54 @@
static ssize_t show_ctrl(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_ctrl(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct pci_dev *pdev; struct pci_dev *pdev;
char *out = buf;
int index, busnr; int index, busnr;
struct resource *res; struct resource *res;
struct pci_bus *bus; struct pci_bus *bus;
size_t len = 0;
pdev = to_pci_dev(dev); pdev = to_pci_dev(dev);
bus = pdev->subordinate; bus = pdev->subordinate;
out += sprintf(buf, "Free resources: memory\n"); len += sysfs_emit_at(buf, len, "Free resources: memory\n");
pci_bus_for_each_resource(bus, res, index) { pci_bus_for_each_resource(bus, res, index) {
if (res && (res->flags & IORESOURCE_MEM) && if (res && (res->flags & IORESOURCE_MEM) &&
!(res->flags & IORESOURCE_PREFETCH)) { !(res->flags & IORESOURCE_PREFETCH)) {
out += sprintf(out, "start = %8.8llx, length = %8.8llx\n", len += sysfs_emit_at(buf, len,
(unsigned long long)res->start, "start = %8.8llx, length = %8.8llx\n",
(unsigned long long)resource_size(res)); (unsigned long long)res->start,
(unsigned long long)resource_size(res));
} }
} }
out += sprintf(out, "Free resources: prefetchable memory\n"); len += sysfs_emit_at(buf, len, "Free resources: prefetchable memory\n");
pci_bus_for_each_resource(bus, res, index) { pci_bus_for_each_resource(bus, res, index) {
if (res && (res->flags & IORESOURCE_MEM) && if (res && (res->flags & IORESOURCE_MEM) &&
(res->flags & IORESOURCE_PREFETCH)) { (res->flags & IORESOURCE_PREFETCH)) {
out += sprintf(out, "start = %8.8llx, length = %8.8llx\n", len += sysfs_emit_at(buf, len,
(unsigned long long)res->start, "start = %8.8llx, length = %8.8llx\n",
(unsigned long long)resource_size(res)); (unsigned long long)res->start,
(unsigned long long)resource_size(res));
} }
} }
out += sprintf(out, "Free resources: IO\n"); len += sysfs_emit_at(buf, len, "Free resources: IO\n");
pci_bus_for_each_resource(bus, res, index) { pci_bus_for_each_resource(bus, res, index) {
if (res && (res->flags & IORESOURCE_IO)) { if (res && (res->flags & IORESOURCE_IO)) {
out += sprintf(out, "start = %8.8llx, length = %8.8llx\n", len += sysfs_emit_at(buf, len,
(unsigned long long)res->start, "start = %8.8llx, length = %8.8llx\n",
(unsigned long long)resource_size(res)); (unsigned long long)res->start,
(unsigned long long)resource_size(res));
} }
} }
out += sprintf(out, "Free resources: bus numbers\n"); len += sysfs_emit_at(buf, len, "Free resources: bus numbers\n");
for (busnr = bus->busn_res.start; busnr <= bus->busn_res.end; busnr++) { for (busnr = bus->busn_res.start; busnr <= bus->busn_res.end; busnr++) {
if (!pci_find_bus(pci_domain_nr(bus), busnr)) if (!pci_find_bus(pci_domain_nr(bus), busnr))
break; break;
} }
if (busnr < bus->busn_res.end) if (busnr < bus->busn_res.end)
out += sprintf(out, "start = %8.8x, length = %8.8x\n", len += sysfs_emit_at(buf, len,
busnr, (int)(bus->busn_res.end - busnr)); "start = %8.8x, length = %8.8x\n",
busnr, (int)(bus->busn_res.end - busnr));
return out - buf; return len;
} }
static DEVICE_ATTR(ctrl, S_IRUGO, show_ctrl, NULL); static DEVICE_ATTR(ctrl, S_IRUGO, show_ctrl, NULL);

View file

@ -346,7 +346,7 @@ static ssize_t sriov_totalvfs_show(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%u\n", pci_sriov_get_totalvfs(pdev)); return sysfs_emit(buf, "%u\n", pci_sriov_get_totalvfs(pdev));
} }
static ssize_t sriov_numvfs_show(struct device *dev, static ssize_t sriov_numvfs_show(struct device *dev,
@ -361,7 +361,7 @@ static ssize_t sriov_numvfs_show(struct device *dev,
num_vfs = pdev->sriov->num_VFs; num_vfs = pdev->sriov->num_VFs;
device_unlock(&pdev->dev); device_unlock(&pdev->dev);
return sprintf(buf, "%u\n", num_vfs); return sysfs_emit(buf, "%u\n", num_vfs);
} }
/* /*
@ -435,7 +435,7 @@ static ssize_t sriov_offset_show(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%u\n", pdev->sriov->offset); return sysfs_emit(buf, "%u\n", pdev->sriov->offset);
} }
static ssize_t sriov_stride_show(struct device *dev, static ssize_t sriov_stride_show(struct device *dev,
@ -444,7 +444,7 @@ static ssize_t sriov_stride_show(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%u\n", pdev->sriov->stride); return sysfs_emit(buf, "%u\n", pdev->sriov->stride);
} }
static ssize_t sriov_vf_device_show(struct device *dev, static ssize_t sriov_vf_device_show(struct device *dev,
@ -453,7 +453,7 @@ static ssize_t sriov_vf_device_show(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%x\n", pdev->sriov->vf_device); return sysfs_emit(buf, "%x\n", pdev->sriov->vf_device);
} }
static ssize_t sriov_drivers_autoprobe_show(struct device *dev, static ssize_t sriov_drivers_autoprobe_show(struct device *dev,
@ -462,7 +462,7 @@ static ssize_t sriov_drivers_autoprobe_show(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%u\n", pdev->sriov->drivers_autoprobe); return sysfs_emit(buf, "%u\n", pdev->sriov->drivers_autoprobe);
} }
static ssize_t sriov_drivers_autoprobe_store(struct device *dev, static ssize_t sriov_drivers_autoprobe_store(struct device *dev,

View file

@ -464,11 +464,11 @@ static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
return retval; return retval;
entry = irq_get_msi_desc(irq); entry = irq_get_msi_desc(irq);
if (entry) if (!entry)
return sprintf(buf, "%s\n", return -ENODEV;
entry->msi_attrib.is_msix ? "msix" : "msi");
return -ENODEV; return sysfs_emit(buf, "%s\n",
entry->msi_attrib.is_msix ? "msix" : "msi");
} }
static int populate_msi_sysfs(struct pci_dev *pdev) static int populate_msi_sysfs(struct pci_dev *pdev)

View file

@ -53,7 +53,7 @@ static ssize_t size_show(struct device *dev, struct device_attribute *attr,
if (pdev->p2pdma->pool) if (pdev->p2pdma->pool)
size = gen_pool_size(pdev->p2pdma->pool); size = gen_pool_size(pdev->p2pdma->pool);
return scnprintf(buf, PAGE_SIZE, "%zd\n", size); return sysfs_emit(buf, "%zd\n", size);
} }
static DEVICE_ATTR_RO(size); static DEVICE_ATTR_RO(size);
@ -66,7 +66,7 @@ static ssize_t available_show(struct device *dev, struct device_attribute *attr,
if (pdev->p2pdma->pool) if (pdev->p2pdma->pool)
avail = gen_pool_avail(pdev->p2pdma->pool); avail = gen_pool_avail(pdev->p2pdma->pool);
return scnprintf(buf, PAGE_SIZE, "%zd\n", avail); return sysfs_emit(buf, "%zd\n", avail);
} }
static DEVICE_ATTR_RO(available); static DEVICE_ATTR_RO(available);
@ -75,8 +75,7 @@ static ssize_t published_show(struct device *dev, struct device_attribute *attr,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
return scnprintf(buf, PAGE_SIZE, "%d\n", return sysfs_emit(buf, "%d\n", pdev->p2pdma->p2pmem_published);
pdev->p2pdma->p2pmem_published);
} }
static DEVICE_ATTR_RO(published); static DEVICE_ATTR_RO(published);

View file

@ -178,11 +178,11 @@ static int dsm_get_label(struct device *dev, char *buf,
* this entry must return a null string. * this entry must return a null string.
*/ */
if (attr == ACPI_ATTR_INDEX_SHOW) { if (attr == ACPI_ATTR_INDEX_SHOW) {
len = scnprintf(buf, PAGE_SIZE, "%llu\n", tmp->integer.value); len = sysfs_emit(buf, "%llu\n", tmp->integer.value);
} else if (attr == ACPI_ATTR_LABEL_SHOW) { } else if (attr == ACPI_ATTR_LABEL_SHOW) {
if (tmp[1].type == ACPI_TYPE_STRING) if (tmp[1].type == ACPI_TYPE_STRING)
len = scnprintf(buf, PAGE_SIZE, "%s\n", len = sysfs_emit(buf, "%s\n",
tmp[1].string.pointer); tmp[1].string.pointer);
else if (tmp[1].type == ACPI_TYPE_BUFFER) else if (tmp[1].type == ACPI_TYPE_BUFFER)
len = dsm_label_utf16s_to_utf8s(tmp + 1, buf); len = dsm_label_utf16s_to_utf8s(tmp + 1, buf);
} }

View file

@ -6439,7 +6439,7 @@ static ssize_t resource_alignment_show(struct bus_type *bus, char *buf)
spin_lock(&resource_alignment_lock); spin_lock(&resource_alignment_lock);
if (resource_alignment_param) if (resource_alignment_param)
count = scnprintf(buf, PAGE_SIZE, "%s", resource_alignment_param); count = sysfs_emit(buf, "%s", resource_alignment_param);
spin_unlock(&resource_alignment_lock); spin_unlock(&resource_alignment_lock);
/* /*

View file

@ -529,21 +529,23 @@ static const char *aer_agent_string[] = {
char *buf) \ char *buf) \
{ \ { \
unsigned int i; \ unsigned int i; \
char *str = buf; \
struct pci_dev *pdev = to_pci_dev(dev); \ struct pci_dev *pdev = to_pci_dev(dev); \
u64 *stats = pdev->aer_stats->stats_array; \ u64 *stats = pdev->aer_stats->stats_array; \
size_t len = 0; \
\ \
for (i = 0; i < ARRAY_SIZE(strings_array); i++) { \ for (i = 0; i < ARRAY_SIZE(strings_array); i++) { \
if (strings_array[i]) \ if (strings_array[i]) \
str += sprintf(str, "%s %llu\n", \ len += sysfs_emit_at(buf, len, "%s %llu\n", \
strings_array[i], stats[i]); \ strings_array[i], \
stats[i]); \
else if (stats[i]) \ else if (stats[i]) \
str += sprintf(str, #stats_array "_bit[%d] %llu\n",\ len += sysfs_emit_at(buf, len, \
i, stats[i]); \ #stats_array "_bit[%d] %llu\n",\
i, stats[i]); \
} \ } \
str += sprintf(str, "TOTAL_%s %llu\n", total_string, \ len += sysfs_emit_at(buf, len, "TOTAL_%s %llu\n", total_string, \
pdev->aer_stats->total_field); \ pdev->aer_stats->total_field); \
return str-buf; \ return len; \
} \ } \
static DEVICE_ATTR_RO(name) static DEVICE_ATTR_RO(name)
@ -563,7 +565,7 @@ aer_stats_dev_attr(aer_dev_nonfatal, dev_nonfatal_errs,
char *buf) \ char *buf) \
{ \ { \
struct pci_dev *pdev = to_pci_dev(dev); \ struct pci_dev *pdev = to_pci_dev(dev); \
return sprintf(buf, "%llu\n", pdev->aer_stats->field); \ return sysfs_emit(buf, "%llu\n", pdev->aer_stats->field); \
} \ } \
static DEVICE_ATTR_RO(name) static DEVICE_ATTR_RO(name)

View file

@ -1208,7 +1208,7 @@ static ssize_t aspm_attr_show_common(struct device *dev,
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct pcie_link_state *link = pcie_aspm_get_link(pdev); struct pcie_link_state *link = pcie_aspm_get_link(pdev);
return sprintf(buf, "%d\n", (link->aspm_enabled & state) ? 1 : 0); return sysfs_emit(buf, "%d\n", (link->aspm_enabled & state) ? 1 : 0);
} }
static ssize_t aspm_attr_store_common(struct device *dev, static ssize_t aspm_attr_store_common(struct device *dev,
@ -1265,7 +1265,7 @@ static ssize_t clkpm_show(struct device *dev,
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct pcie_link_state *link = pcie_aspm_get_link(pdev); struct pcie_link_state *link = pcie_aspm_get_link(pdev);
return sprintf(buf, "%d\n", link->clkpm_enabled); return sysfs_emit(buf, "%d\n", link->clkpm_enabled);
} }
static ssize_t clkpm_store(struct device *dev, static ssize_t clkpm_store(struct device *dev,

View file

@ -39,19 +39,19 @@ static const struct sysfs_ops pci_slot_sysfs_ops = {
static ssize_t address_read_file(struct pci_slot *slot, char *buf) static ssize_t address_read_file(struct pci_slot *slot, char *buf)
{ {
if (slot->number == 0xff) if (slot->number == 0xff)
return sprintf(buf, "%04x:%02x\n", return sysfs_emit(buf, "%04x:%02x\n",
pci_domain_nr(slot->bus), pci_domain_nr(slot->bus),
slot->bus->number); slot->bus->number);
else
return sprintf(buf, "%04x:%02x:%02x\n", return sysfs_emit(buf, "%04x:%02x:%02x\n",
pci_domain_nr(slot->bus), pci_domain_nr(slot->bus),
slot->bus->number, slot->bus->number,
slot->number); slot->number);
} }
static ssize_t bus_speed_read(enum pci_bus_speed speed, char *buf) static ssize_t bus_speed_read(enum pci_bus_speed speed, char *buf)
{ {
return sprintf(buf, "%s\n", pci_speed_string(speed)); return sysfs_emit(buf, "%s\n", pci_speed_string(speed));
} }
static ssize_t max_speed_read_file(struct pci_slot *slot, char *buf) static ssize_t max_speed_read_file(struct pci_slot *slot, char *buf)

View file

@ -280,7 +280,7 @@ static ssize_t device_version_show(struct device *dev,
ver = ioread32(&stdev->mmio_sys_info->device_version); ver = ioread32(&stdev->mmio_sys_info->device_version);
return sprintf(buf, "%x\n", ver); return sysfs_emit(buf, "%x\n", ver);
} }
static DEVICE_ATTR_RO(device_version); static DEVICE_ATTR_RO(device_version);
@ -292,7 +292,7 @@ static ssize_t fw_version_show(struct device *dev,
ver = ioread32(&stdev->mmio_sys_info->firmware_version); ver = ioread32(&stdev->mmio_sys_info->firmware_version);
return sprintf(buf, "%08x\n", ver); return sysfs_emit(buf, "%08x\n", ver);
} }
static DEVICE_ATTR_RO(fw_version); static DEVICE_ATTR_RO(fw_version);
@ -344,7 +344,7 @@ static ssize_t component_vendor_show(struct device *dev,
/* component_vendor field not supported after gen3 */ /* component_vendor field not supported after gen3 */
if (stdev->gen != SWITCHTEC_GEN3) if (stdev->gen != SWITCHTEC_GEN3)
return sprintf(buf, "none\n"); return sysfs_emit(buf, "none\n");
return io_string_show(buf, &si->gen3.component_vendor, return io_string_show(buf, &si->gen3.component_vendor,
sizeof(si->gen3.component_vendor)); sizeof(si->gen3.component_vendor));
@ -359,9 +359,9 @@ static ssize_t component_id_show(struct device *dev,
/* component_id field not supported after gen3 */ /* component_id field not supported after gen3 */
if (stdev->gen != SWITCHTEC_GEN3) if (stdev->gen != SWITCHTEC_GEN3)
return sprintf(buf, "none\n"); return sysfs_emit(buf, "none\n");
return sprintf(buf, "PM%04X\n", id); return sysfs_emit(buf, "PM%04X\n", id);
} }
static DEVICE_ATTR_RO(component_id); static DEVICE_ATTR_RO(component_id);
@ -373,9 +373,9 @@ static ssize_t component_revision_show(struct device *dev,
/* component_revision field not supported after gen3 */ /* component_revision field not supported after gen3 */
if (stdev->gen != SWITCHTEC_GEN3) if (stdev->gen != SWITCHTEC_GEN3)
return sprintf(buf, "255\n"); return sysfs_emit(buf, "255\n");
return sprintf(buf, "%d\n", rev); return sysfs_emit(buf, "%d\n", rev);
} }
static DEVICE_ATTR_RO(component_revision); static DEVICE_ATTR_RO(component_revision);
@ -384,7 +384,7 @@ static ssize_t partition_show(struct device *dev,
{ {
struct switchtec_dev *stdev = to_stdev(dev); struct switchtec_dev *stdev = to_stdev(dev);
return sprintf(buf, "%d\n", stdev->partition); return sysfs_emit(buf, "%d\n", stdev->partition);
} }
static DEVICE_ATTR_RO(partition); static DEVICE_ATTR_RO(partition);
@ -393,7 +393,7 @@ static ssize_t partition_count_show(struct device *dev,
{ {
struct switchtec_dev *stdev = to_stdev(dev); struct switchtec_dev *stdev = to_stdev(dev);
return sprintf(buf, "%d\n", stdev->partition_count); return sysfs_emit(buf, "%d\n", stdev->partition_count);
} }
static DEVICE_ATTR_RO(partition_count); static DEVICE_ATTR_RO(partition_count);