Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+46 -78
+46 -78
drivers/net/phy/mdio_bus.c
··· 124 124 } 125 125 126 126 struct mdio_bus_stat_attr { 127 - int addr; 127 + struct device_attribute attr; 128 + int address; 128 129 unsigned int field_offset; 129 130 }; 130 131 132 + static struct mdio_bus_stat_attr *to_sattr(struct device_attribute *attr) 133 + { 134 + return container_of(attr, struct mdio_bus_stat_attr, attr); 135 + } 136 + 131 137 static u64 mdio_bus_get_stat(struct mdio_bus_stats *s, unsigned int offset) 132 138 { 133 - const char *p = (const char *)s + offset; 139 + const u64_stats_t *stats = (const void *)s + offset; 134 140 unsigned int start; 135 141 u64 val = 0; 136 142 137 143 do { 138 144 start = u64_stats_fetch_begin(&s->syncp); 139 - val = u64_stats_read((const u64_stats_t *)p); 145 + val = u64_stats_read(stats); 140 146 } while (u64_stats_fetch_retry(&s->syncp, start)); 141 - 142 - return val; 143 - } 144 - 145 - static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset) 146 - { 147 - unsigned int i; 148 - u64 val = 0; 149 - 150 - for (i = 0; i < PHY_MAX_ADDR; i++) 151 - val += mdio_bus_get_stat(&bus->stats[i], offset); 152 147 153 148 return val; 154 149 } ··· 152 157 struct device_attribute *attr, 153 158 char *buf) 154 159 { 160 + struct mdio_bus_stat_attr *sattr = to_sattr(attr); 155 161 struct mii_bus *bus = to_mii_bus(dev); 156 - struct mdio_bus_stat_attr *sattr; 157 - struct dev_ext_attribute *eattr; 158 - u64 val; 162 + u64 val = 0; 159 163 160 - eattr = container_of(attr, struct dev_ext_attribute, attr); 161 - sattr = eattr->var; 162 - 163 - if (sattr->addr < 0) 164 - val = mdio_bus_get_global_stat(bus, sattr->field_offset); 165 - else 166 - val = mdio_bus_get_stat(&bus->stats[sattr->addr], 164 + if (sattr->address < 0) { 165 + /* get global stats */ 166 + for (int i = 0; i < PHY_MAX_ADDR; i++) 167 + val += mdio_bus_get_stat(&bus->stats[i], 168 + sattr->field_offset); 169 + } else { 170 + val = mdio_bus_get_stat(&bus->stats[sattr->address], 167 171 sattr->field_offset); 172 + } 168 173 169 174 return sysfs_emit(buf, "%llu\n", val); 170 175 } ··· 173 178 struct device_attribute *attr, 174 179 char *buf) 175 180 { 181 + struct mdio_bus_stat_attr *sattr = to_sattr(attr); 176 182 struct mdio_device *mdiodev = to_mdio_device(dev); 177 183 struct mii_bus *bus = mdiodev->bus; 178 - struct mdio_bus_stat_attr *sattr; 179 - struct dev_ext_attribute *eattr; 180 184 int addr = mdiodev->addr; 181 185 u64 val; 182 - 183 - eattr = container_of(attr, struct dev_ext_attribute, attr); 184 - sattr = eattr->var; 185 186 186 187 val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset); 187 188 188 189 return sysfs_emit(buf, "%llu\n", val); 189 190 } 190 191 191 - #define MDIO_BUS_STATS_ATTR_DECL(field, file) \ 192 - static struct dev_ext_attribute dev_attr_mdio_bus_##field = { \ 193 - .attr = { .attr = { .name = file, .mode = 0444 }, \ 194 - .show = mdio_bus_stat_field_show, \ 195 - }, \ 196 - .var = &((struct mdio_bus_stat_attr) { \ 197 - -1, offsetof(struct mdio_bus_stats, field) \ 198 - }), \ 199 - }; \ 200 - static struct dev_ext_attribute dev_attr_mdio_bus_device_##field = { \ 201 - .attr = { .attr = { .name = file, .mode = 0444 }, \ 202 - .show = mdio_bus_device_stat_field_show, \ 203 - }, \ 204 - .var = &((struct mdio_bus_stat_attr) { \ 205 - -1, offsetof(struct mdio_bus_stats, field) \ 206 - }), \ 207 - }; 208 - 209 192 #define MDIO_BUS_STATS_ATTR(field) \ 210 - MDIO_BUS_STATS_ATTR_DECL(field, __stringify(field)) 193 + static const struct mdio_bus_stat_attr dev_attr_mdio_bus_##field = { \ 194 + .attr = __ATTR(field, 0444, mdio_bus_stat_field_show, NULL), \ 195 + .address = -1, \ 196 + .field_offset = offsetof(struct mdio_bus_stats, field), \ 197 + }; \ 198 + static const struct mdio_bus_stat_attr dev_attr_mdio_bus_device_##field = { \ 199 + .attr = __ATTR(field, 0444, mdio_bus_device_stat_field_show, NULL), \ 200 + .field_offset = offsetof(struct mdio_bus_stats, field), \ 201 + } 211 202 212 203 MDIO_BUS_STATS_ATTR(transfers); 213 204 MDIO_BUS_STATS_ATTR(errors); ··· 201 220 MDIO_BUS_STATS_ATTR(reads); 202 221 203 222 #define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file) \ 204 - static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \ 223 + static const struct mdio_bus_stat_attr \ 224 + dev_attr_mdio_bus_addr_##field##_##addr = { \ 205 225 .attr = { .attr = { .name = file, .mode = 0444 }, \ 206 226 .show = mdio_bus_stat_field_show, \ 207 227 }, \ 208 - .var = &((struct mdio_bus_stat_attr) { \ 209 - addr, offsetof(struct mdio_bus_stats, field) \ 210 - }), \ 228 + .address = addr, \ 229 + .field_offset = offsetof(struct mdio_bus_stats, field), \ 211 230 } 212 231 213 232 #define MDIO_BUS_STATS_ADDR_ATTR(field, addr) \ ··· 259 278 &dev_attr_mdio_bus_addr_writes_##addr.attr.attr, \ 260 279 &dev_attr_mdio_bus_addr_reads_##addr.attr.attr \ 261 280 262 - static struct attribute *mdio_bus_statistics_attrs[] = { 281 + static const struct attribute *const mdio_bus_statistics_attrs[] = { 263 282 &dev_attr_mdio_bus_transfers.attr.attr, 264 283 &dev_attr_mdio_bus_errors.attr.attr, 265 284 &dev_attr_mdio_bus_writes.attr.attr, ··· 300 319 }; 301 320 302 321 static const struct attribute_group mdio_bus_statistics_group = { 303 - .name = "statistics", 304 - .attrs = mdio_bus_statistics_attrs, 322 + .name = "statistics", 323 + .attrs_const = mdio_bus_statistics_attrs, 305 324 }; 306 - 307 - static const struct attribute_group *mdio_bus_groups[] = { 308 - &mdio_bus_statistics_group, 309 - NULL, 310 - }; 325 + __ATTRIBUTE_GROUPS(mdio_bus_statistics); 311 326 312 327 const struct class mdio_bus_class = { 313 328 .name = "mdio_bus", 314 329 .dev_release = mdiobus_release, 315 - .dev_groups = mdio_bus_groups, 330 + .dev_groups = mdio_bus_statistics_groups, 316 331 }; 317 332 EXPORT_SYMBOL_GPL(mdio_bus_class); 318 333 ··· 358 381 359 382 static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret) 360 383 { 361 - preempt_disable(); 362 384 u64_stats_update_begin(&stats->syncp); 363 385 364 386 u64_stats_inc(&stats->transfers); 365 - if (ret < 0) { 387 + if (ret < 0) 366 388 u64_stats_inc(&stats->errors); 367 - goto out; 368 - } 369 - 370 - if (op) 389 + else if (op) 371 390 u64_stats_inc(&stats->reads); 372 391 else 373 392 u64_stats_inc(&stats->writes); 374 - out: 393 + 375 394 u64_stats_update_end(&stats->syncp); 376 - preempt_enable(); 377 395 } 378 396 379 397 /** ··· 958 986 return 0; 959 987 } 960 988 961 - static struct attribute *mdio_bus_device_statistics_attrs[] = { 989 + static const struct attribute *const mdio_bus_device_statistics_attrs[] = { 962 990 &dev_attr_mdio_bus_device_transfers.attr.attr, 963 991 &dev_attr_mdio_bus_device_errors.attr.attr, 964 992 &dev_attr_mdio_bus_device_writes.attr.attr, ··· 967 995 }; 968 996 969 997 static const struct attribute_group mdio_bus_device_statistics_group = { 970 - .name = "statistics", 971 - .attrs = mdio_bus_device_statistics_attrs, 998 + .name = "statistics", 999 + .attrs_const = mdio_bus_device_statistics_attrs, 972 1000 }; 973 - 974 - static const struct attribute_group *mdio_bus_dev_groups[] = { 975 - &mdio_bus_device_statistics_group, 976 - NULL, 977 - }; 1001 + __ATTRIBUTE_GROUPS(mdio_bus_device_statistics); 978 1002 979 1003 const struct bus_type mdio_bus_type = { 980 1004 .name = "mdio_bus", 981 - .dev_groups = mdio_bus_dev_groups, 1005 + .dev_groups = mdio_bus_device_statistics_groups, 982 1006 .match = mdio_bus_match, 983 1007 .uevent = mdio_uevent, 984 1008 };