summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2026-03-03 15:23:46 +0300
committerPaolo Abeni <pabeni@redhat.com>2026-03-03 15:23:47 +0300
commited0abfe93fd135dac223e87a3c945017b1fa8bfc (patch)
tree3b2ced4fe1bd36391c25ed8df3894c7eb79ddca8
parente07bd1f7161fd0918e644d97e11608854c3bf14b (diff)
parent1afccc5a201ec7c9023370958bae1312369b64da (diff)
downloadlinux-ed0abfe93fd135dac223e87a3c945017b1fa8bfc.tar.xz
Merge branch 'net-phy-improve-stats-handling-in-mdio_bus-c'
Heiner Kallweit says: ==================== net: phy: improve stats handling in mdio_bus.c Improve stats handling in mdio_bus.c. ==================== Link: https://patch.msgid.link/799114be-1456-442b-b479-142e7ee9d254@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r--drivers/net/phy/mdio_bus.c124
1 files changed, 46 insertions, 78 deletions
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index afdf1ad6c0e6..b32a369cd25f 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -124,52 +124,47 @@ static void mdiobus_release(struct device *d)
}
struct mdio_bus_stat_attr {
- int addr;
+ struct device_attribute attr;
+ int address;
unsigned int field_offset;
};
+static struct mdio_bus_stat_attr *to_sattr(struct device_attribute *attr)
+{
+ return container_of(attr, struct mdio_bus_stat_attr, attr);
+}
+
static u64 mdio_bus_get_stat(struct mdio_bus_stats *s, unsigned int offset)
{
- const char *p = (const char *)s + offset;
+ const u64_stats_t *stats = (const void *)s + offset;
unsigned int start;
u64 val = 0;
do {
start = u64_stats_fetch_begin(&s->syncp);
- val = u64_stats_read((const u64_stats_t *)p);
+ val = u64_stats_read(stats);
} while (u64_stats_fetch_retry(&s->syncp, start));
return val;
}
-static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset)
-{
- unsigned int i;
- u64 val = 0;
-
- for (i = 0; i < PHY_MAX_ADDR; i++)
- val += mdio_bus_get_stat(&bus->stats[i], offset);
-
- return val;
-}
-
static ssize_t mdio_bus_stat_field_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
+ struct mdio_bus_stat_attr *sattr = to_sattr(attr);
struct mii_bus *bus = to_mii_bus(dev);
- struct mdio_bus_stat_attr *sattr;
- struct dev_ext_attribute *eattr;
- u64 val;
-
- eattr = container_of(attr, struct dev_ext_attribute, attr);
- sattr = eattr->var;
+ u64 val = 0;
- if (sattr->addr < 0)
- val = mdio_bus_get_global_stat(bus, sattr->field_offset);
- else
- val = mdio_bus_get_stat(&bus->stats[sattr->addr],
+ if (sattr->address < 0) {
+ /* get global stats */
+ for (int i = 0; i < PHY_MAX_ADDR; i++)
+ val += mdio_bus_get_stat(&bus->stats[i],
+ sattr->field_offset);
+ } else {
+ val = mdio_bus_get_stat(&bus->stats[sattr->address],
sattr->field_offset);
+ }
return sysfs_emit(buf, "%llu\n", val);
}
@@ -178,41 +173,27 @@ static ssize_t mdio_bus_device_stat_field_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
+ struct mdio_bus_stat_attr *sattr = to_sattr(attr);
struct mdio_device *mdiodev = to_mdio_device(dev);
struct mii_bus *bus = mdiodev->bus;
- struct mdio_bus_stat_attr *sattr;
- struct dev_ext_attribute *eattr;
int addr = mdiodev->addr;
u64 val;
- eattr = container_of(attr, struct dev_ext_attribute, attr);
- sattr = eattr->var;
-
val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset);
return sysfs_emit(buf, "%llu\n", val);
}
-#define MDIO_BUS_STATS_ATTR_DECL(field, file) \
-static struct dev_ext_attribute dev_attr_mdio_bus_##field = { \
- .attr = { .attr = { .name = file, .mode = 0444 }, \
- .show = mdio_bus_stat_field_show, \
- }, \
- .var = &((struct mdio_bus_stat_attr) { \
- -1, offsetof(struct mdio_bus_stats, field) \
- }), \
-}; \
-static struct dev_ext_attribute dev_attr_mdio_bus_device_##field = { \
- .attr = { .attr = { .name = file, .mode = 0444 }, \
- .show = mdio_bus_device_stat_field_show, \
- }, \
- .var = &((struct mdio_bus_stat_attr) { \
- -1, offsetof(struct mdio_bus_stats, field) \
- }), \
-};
-
#define MDIO_BUS_STATS_ATTR(field) \
- MDIO_BUS_STATS_ATTR_DECL(field, __stringify(field))
+static const struct mdio_bus_stat_attr dev_attr_mdio_bus_##field = { \
+ .attr = __ATTR(field, 0444, mdio_bus_stat_field_show, NULL), \
+ .address = -1, \
+ .field_offset = offsetof(struct mdio_bus_stats, field), \
+}; \
+static const struct mdio_bus_stat_attr dev_attr_mdio_bus_device_##field = { \
+ .attr = __ATTR(field, 0444, mdio_bus_device_stat_field_show, NULL), \
+ .field_offset = offsetof(struct mdio_bus_stats, field), \
+}
MDIO_BUS_STATS_ATTR(transfers);
MDIO_BUS_STATS_ATTR(errors);
@@ -220,13 +201,13 @@ MDIO_BUS_STATS_ATTR(writes);
MDIO_BUS_STATS_ATTR(reads);
#define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file) \
-static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \
+static const struct mdio_bus_stat_attr \
+dev_attr_mdio_bus_addr_##field##_##addr = { \
.attr = { .attr = { .name = file, .mode = 0444 }, \
.show = mdio_bus_stat_field_show, \
}, \
- .var = &((struct mdio_bus_stat_attr) { \
- addr, offsetof(struct mdio_bus_stats, field) \
- }), \
+ .address = addr, \
+ .field_offset = offsetof(struct mdio_bus_stats, field), \
}
#define MDIO_BUS_STATS_ADDR_ATTR(field, addr) \
@@ -278,7 +259,7 @@ MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(31);
&dev_attr_mdio_bus_addr_writes_##addr.attr.attr, \
&dev_attr_mdio_bus_addr_reads_##addr.attr.attr \
-static struct attribute *mdio_bus_statistics_attrs[] = {
+static const struct attribute *const mdio_bus_statistics_attrs[] = {
&dev_attr_mdio_bus_transfers.attr.attr,
&dev_attr_mdio_bus_errors.attr.attr,
&dev_attr_mdio_bus_writes.attr.attr,
@@ -319,19 +300,15 @@ static struct attribute *mdio_bus_statistics_attrs[] = {
};
static const struct attribute_group mdio_bus_statistics_group = {
- .name = "statistics",
- .attrs = mdio_bus_statistics_attrs,
-};
-
-static const struct attribute_group *mdio_bus_groups[] = {
- &mdio_bus_statistics_group,
- NULL,
+ .name = "statistics",
+ .attrs_const = mdio_bus_statistics_attrs,
};
+__ATTRIBUTE_GROUPS(mdio_bus_statistics);
const struct class mdio_bus_class = {
.name = "mdio_bus",
.dev_release = mdiobus_release,
- .dev_groups = mdio_bus_groups,
+ .dev_groups = mdio_bus_statistics_groups,
};
EXPORT_SYMBOL_GPL(mdio_bus_class);
@@ -381,22 +358,17 @@ EXPORT_SYMBOL(of_mdio_find_bus);
static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret)
{
- preempt_disable();
u64_stats_update_begin(&stats->syncp);
u64_stats_inc(&stats->transfers);
- if (ret < 0) {
+ if (ret < 0)
u64_stats_inc(&stats->errors);
- goto out;
- }
-
- if (op)
+ else if (op)
u64_stats_inc(&stats->reads);
else
u64_stats_inc(&stats->writes);
-out:
+
u64_stats_update_end(&stats->syncp);
- preempt_enable();
}
/**
@@ -986,7 +958,7 @@ static int mdio_uevent(const struct device *dev, struct kobj_uevent_env *env)
return 0;
}
-static struct attribute *mdio_bus_device_statistics_attrs[] = {
+static const struct attribute *const mdio_bus_device_statistics_attrs[] = {
&dev_attr_mdio_bus_device_transfers.attr.attr,
&dev_attr_mdio_bus_device_errors.attr.attr,
&dev_attr_mdio_bus_device_writes.attr.attr,
@@ -995,18 +967,14 @@ static struct attribute *mdio_bus_device_statistics_attrs[] = {
};
static const struct attribute_group mdio_bus_device_statistics_group = {
- .name = "statistics",
- .attrs = mdio_bus_device_statistics_attrs,
-};
-
-static const struct attribute_group *mdio_bus_dev_groups[] = {
- &mdio_bus_device_statistics_group,
- NULL,
+ .name = "statistics",
+ .attrs_const = mdio_bus_device_statistics_attrs,
};
+__ATTRIBUTE_GROUPS(mdio_bus_device_statistics);
const struct bus_type mdio_bus_type = {
.name = "mdio_bus",
- .dev_groups = mdio_bus_dev_groups,
+ .dev_groups = mdio_bus_device_statistics_groups,
.match = mdio_bus_match,
.uevent = mdio_uevent,
};