linux/net/core/net-sysfs.c
<<
>>
Prefs
   1/*
   2 * net-sysfs.c - network device class and attributes
   3 *
   4 * Copyright (c) 2003 Stephen Hemminger <shemminger@osdl.org>
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License
   8 *      as published by the Free Software Foundation; either version
   9 *      2 of the License, or (at your option) any later version.
  10 */
  11
  12#include <linux/capability.h>
  13#include <linux/kernel.h>
  14#include <linux/netdevice.h>
  15#include <linux/if_arp.h>
  16#include <linux/slab.h>
  17#include <linux/nsproxy.h>
  18#include <net/sock.h>
  19#include <net/net_namespace.h>
  20#include <linux/rtnetlink.h>
  21#include <linux/wireless.h>
  22#include <linux/vmalloc.h>
  23#include <linux/export.h>
  24#include <net/wext.h>
  25
  26#include "net-sysfs.h"
  27
  28#ifdef CONFIG_SYSFS
  29static const char fmt_hex[] = "%#x\n";
  30static const char fmt_long_hex[] = "%#lx\n";
  31static const char fmt_dec[] = "%d\n";
  32static const char fmt_udec[] = "%u\n";
  33static const char fmt_ulong[] = "%lu\n";
  34static const char fmt_u64[] = "%llu\n";
  35
  36static inline int dev_isalive(const struct net_device *dev)
  37{
  38        return dev->reg_state <= NETREG_REGISTERED;
  39}
  40
  41/* use same locking rules as GIF* ioctl's */
  42static ssize_t netdev_show(const struct device *dev,
  43                           struct device_attribute *attr, char *buf,
  44                           ssize_t (*format)(const struct net_device *, char *))
  45{
  46        struct net_device *net = to_net_dev(dev);
  47        ssize_t ret = -EINVAL;
  48
  49        read_lock(&dev_base_lock);
  50        if (dev_isalive(net))
  51                ret = (*format)(net, buf);
  52        read_unlock(&dev_base_lock);
  53
  54        return ret;
  55}
  56
  57/* generate a show function for simple field */
  58#define NETDEVICE_SHOW(field, format_string)                            \
  59static ssize_t format_##field(const struct net_device *net, char *buf)  \
  60{                                                                       \
  61        return sprintf(buf, format_string, net->field);                 \
  62}                                                                       \
  63static ssize_t show_##field(struct device *dev,                         \
  64                            struct device_attribute *attr, char *buf)   \
  65{                                                                       \
  66        return netdev_show(dev, attr, buf, format_##field);             \
  67}
  68
  69
  70/* use same locking and permission rules as SIF* ioctl's */
  71static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,
  72                            const char *buf, size_t len,
  73                            int (*set)(struct net_device *, unsigned long))
  74{
  75        struct net_device *net = to_net_dev(dev);
  76        char *endp;
  77        unsigned long new;
  78        int ret = -EINVAL;
  79
  80        if (!capable(CAP_NET_ADMIN))
  81                return -EPERM;
  82
  83        new = simple_strtoul(buf, &endp, 0);
  84        if (endp == buf)
  85                goto err;
  86
  87        if (!rtnl_trylock())
  88                return restart_syscall();
  89
  90        if (dev_isalive(net)) {
  91                if ((ret = (*set)(net, new)) == 0)
  92                        ret = len;
  93        }
  94        rtnl_unlock();
  95 err:
  96        return ret;
  97}
  98
  99NETDEVICE_SHOW(dev_id, fmt_hex);
 100NETDEVICE_SHOW(addr_assign_type, fmt_dec);
 101NETDEVICE_SHOW(addr_len, fmt_dec);
 102NETDEVICE_SHOW(iflink, fmt_dec);
 103NETDEVICE_SHOW(ifindex, fmt_dec);
 104NETDEVICE_SHOW(type, fmt_dec);
 105NETDEVICE_SHOW(link_mode, fmt_dec);
 106
 107/* use same locking rules as GIFHWADDR ioctl's */
 108static ssize_t show_address(struct device *dev, struct device_attribute *attr,
 109                            char *buf)
 110{
 111        struct net_device *net = to_net_dev(dev);
 112        ssize_t ret = -EINVAL;
 113
 114        read_lock(&dev_base_lock);
 115        if (dev_isalive(net))
 116                ret = sysfs_format_mac(buf, net->dev_addr, net->addr_len);
 117        read_unlock(&dev_base_lock);
 118        return ret;
 119}
 120
 121static ssize_t show_broadcast(struct device *dev,
 122                            struct device_attribute *attr, char *buf)
 123{
 124        struct net_device *net = to_net_dev(dev);
 125        if (dev_isalive(net))
 126                return sysfs_format_mac(buf, net->broadcast, net->addr_len);
 127        return -EINVAL;
 128}
 129
 130static ssize_t show_carrier(struct device *dev,
 131                            struct device_attribute *attr, char *buf)
 132{
 133        struct net_device *netdev = to_net_dev(dev);
 134        if (netif_running(netdev)) {
 135                return sprintf(buf, fmt_dec, !!netif_carrier_ok(netdev));
 136        }
 137        return -EINVAL;
 138}
 139
 140static ssize_t show_speed(struct device *dev,
 141                          struct device_attribute *attr, char *buf)
 142{
 143        struct net_device *netdev = to_net_dev(dev);
 144        int ret = -EINVAL;
 145
 146        if (!rtnl_trylock())
 147                return restart_syscall();
 148
 149        if (netif_running(netdev)) {
 150                struct ethtool_cmd cmd;
 151                if (!__ethtool_get_settings(netdev, &cmd))
 152                        ret = sprintf(buf, fmt_udec, ethtool_cmd_speed(&cmd));
 153        }
 154        rtnl_unlock();
 155        return ret;
 156}
 157
 158static ssize_t show_duplex(struct device *dev,
 159                           struct device_attribute *attr, char *buf)
 160{
 161        struct net_device *netdev = to_net_dev(dev);
 162        int ret = -EINVAL;
 163
 164        if (!rtnl_trylock())
 165                return restart_syscall();
 166
 167        if (netif_running(netdev)) {
 168                struct ethtool_cmd cmd;
 169                if (!__ethtool_get_settings(netdev, &cmd))
 170                        ret = sprintf(buf, "%s\n",
 171                                      cmd.duplex ? "full" : "half");
 172        }
 173        rtnl_unlock();
 174        return ret;
 175}
 176
 177static ssize_t show_dormant(struct device *dev,
 178                            struct device_attribute *attr, char *buf)
 179{
 180        struct net_device *netdev = to_net_dev(dev);
 181
 182        if (netif_running(netdev))
 183                return sprintf(buf, fmt_dec, !!netif_dormant(netdev));
 184
 185        return -EINVAL;
 186}
 187
 188static const char *const operstates[] = {
 189        "unknown",
 190        "notpresent", /* currently unused */
 191        "down",
 192        "lowerlayerdown",
 193        "testing", /* currently unused */
 194        "dormant",
 195        "up"
 196};
 197
 198static ssize_t show_operstate(struct device *dev,
 199                              struct device_attribute *attr, char *buf)
 200{
 201        const struct net_device *netdev = to_net_dev(dev);
 202        unsigned char operstate;
 203
 204        read_lock(&dev_base_lock);
 205        operstate = netdev->operstate;
 206        if (!netif_running(netdev))
 207                operstate = IF_OPER_DOWN;
 208        read_unlock(&dev_base_lock);
 209
 210        if (operstate >= ARRAY_SIZE(operstates))
 211                return -EINVAL; /* should not happen */
 212
 213        return sprintf(buf, "%s\n", operstates[operstate]);
 214}
 215
 216/* read-write attributes */
 217NETDEVICE_SHOW(mtu, fmt_dec);
 218
 219static int change_mtu(struct net_device *net, unsigned long new_mtu)
 220{
 221        return dev_set_mtu(net, (int) new_mtu);
 222}
 223
 224static ssize_t store_mtu(struct device *dev, struct device_attribute *attr,
 225                         const char *buf, size_t len)
 226{
 227        return netdev_store(dev, attr, buf, len, change_mtu);
 228}
 229
 230NETDEVICE_SHOW(flags, fmt_hex);
 231
 232static int change_flags(struct net_device *net, unsigned long new_flags)
 233{
 234        return dev_change_flags(net, (unsigned) new_flags);
 235}
 236
 237static ssize_t store_flags(struct device *dev, struct device_attribute *attr,
 238                           const char *buf, size_t len)
 239{
 240        return netdev_store(dev, attr, buf, len, change_flags);
 241}
 242
 243NETDEVICE_SHOW(tx_queue_len, fmt_ulong);
 244
 245static int change_tx_queue_len(struct net_device *net, unsigned long new_len)
 246{
 247        net->tx_queue_len = new_len;
 248        return 0;
 249}
 250
 251static ssize_t store_tx_queue_len(struct device *dev,
 252                                  struct device_attribute *attr,
 253                                  const char *buf, size_t len)
 254{
 255        return netdev_store(dev, attr, buf, len, change_tx_queue_len);
 256}
 257
 258static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr,
 259                             const char *buf, size_t len)
 260{
 261        struct net_device *netdev = to_net_dev(dev);
 262        size_t count = len;
 263        ssize_t ret;
 264
 265        if (!capable(CAP_NET_ADMIN))
 266                return -EPERM;
 267
 268        /* ignore trailing newline */
 269        if (len >  0 && buf[len - 1] == '\n')
 270                --count;
 271
 272        if (!rtnl_trylock())
 273                return restart_syscall();
 274        ret = dev_set_alias(netdev, buf, count);
 275        rtnl_unlock();
 276
 277        return ret < 0 ? ret : len;
 278}
 279
 280static ssize_t show_ifalias(struct device *dev,
 281                            struct device_attribute *attr, char *buf)
 282{
 283        const struct net_device *netdev = to_net_dev(dev);
 284        ssize_t ret = 0;
 285
 286        if (!rtnl_trylock())
 287                return restart_syscall();
 288        if (netdev->ifalias)
 289                ret = sprintf(buf, "%s\n", netdev->ifalias);
 290        rtnl_unlock();
 291        return ret;
 292}
 293
 294NETDEVICE_SHOW(group, fmt_dec);
 295
 296static int change_group(struct net_device *net, unsigned long new_group)
 297{
 298        dev_set_group(net, (int) new_group);
 299        return 0;
 300}
 301
 302static ssize_t store_group(struct device *dev, struct device_attribute *attr,
 303                         const char *buf, size_t len)
 304{
 305        return netdev_store(dev, attr, buf, len, change_group);
 306}
 307
 308static struct device_attribute net_class_attributes[] = {
 309        __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL),
 310        __ATTR(addr_len, S_IRUGO, show_addr_len, NULL),
 311        __ATTR(dev_id, S_IRUGO, show_dev_id, NULL),
 312        __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias),
 313        __ATTR(iflink, S_IRUGO, show_iflink, NULL),
 314        __ATTR(ifindex, S_IRUGO, show_ifindex, NULL),
 315        __ATTR(type, S_IRUGO, show_type, NULL),
 316        __ATTR(link_mode, S_IRUGO, show_link_mode, NULL),
 317        __ATTR(address, S_IRUGO, show_address, NULL),
 318        __ATTR(broadcast, S_IRUGO, show_broadcast, NULL),
 319        __ATTR(carrier, S_IRUGO, show_carrier, NULL),
 320        __ATTR(speed, S_IRUGO, show_speed, NULL),
 321        __ATTR(duplex, S_IRUGO, show_duplex, NULL),
 322        __ATTR(dormant, S_IRUGO, show_dormant, NULL),
 323        __ATTR(operstate, S_IRUGO, show_operstate, NULL),
 324        __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu),
 325        __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags),
 326        __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len,
 327               store_tx_queue_len),
 328        __ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group),
 329        {}
 330};
 331
 332/* Show a given an attribute in the statistics group */
 333static ssize_t netstat_show(const struct device *d,
 334                            struct device_attribute *attr, char *buf,
 335                            unsigned long offset)
 336{
 337        struct net_device *dev = to_net_dev(d);
 338        ssize_t ret = -EINVAL;
 339
 340        WARN_ON(offset > sizeof(struct rtnl_link_stats64) ||
 341                        offset % sizeof(u64) != 0);
 342
 343        read_lock(&dev_base_lock);
 344        if (dev_isalive(dev)) {
 345                struct rtnl_link_stats64 temp;
 346                const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
 347
 348                ret = sprintf(buf, fmt_u64, *(u64 *)(((u8 *) stats) + offset));
 349        }
 350        read_unlock(&dev_base_lock);
 351        return ret;
 352}
 353
 354/* generate a read-only statistics attribute */
 355#define NETSTAT_ENTRY(name)                                             \
 356static ssize_t show_##name(struct device *d,                            \
 357                           struct device_attribute *attr, char *buf)    \
 358{                                                                       \
 359        return netstat_show(d, attr, buf,                               \
 360                            offsetof(struct rtnl_link_stats64, name));  \
 361}                                                                       \
 362static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
 363
 364NETSTAT_ENTRY(rx_packets);
 365NETSTAT_ENTRY(tx_packets);
 366NETSTAT_ENTRY(rx_bytes);
 367NETSTAT_ENTRY(tx_bytes);
 368NETSTAT_ENTRY(rx_errors);
 369NETSTAT_ENTRY(tx_errors);
 370NETSTAT_ENTRY(rx_dropped);
 371NETSTAT_ENTRY(tx_dropped);
 372NETSTAT_ENTRY(multicast);
 373NETSTAT_ENTRY(collisions);
 374NETSTAT_ENTRY(rx_length_errors);
 375NETSTAT_ENTRY(rx_over_errors);
 376NETSTAT_ENTRY(rx_crc_errors);
 377NETSTAT_ENTRY(rx_frame_errors);
 378NETSTAT_ENTRY(rx_fifo_errors);
 379NETSTAT_ENTRY(rx_missed_errors);
 380NETSTAT_ENTRY(tx_aborted_errors);
 381NETSTAT_ENTRY(tx_carrier_errors);
 382NETSTAT_ENTRY(tx_fifo_errors);
 383NETSTAT_ENTRY(tx_heartbeat_errors);
 384NETSTAT_ENTRY(tx_window_errors);
 385NETSTAT_ENTRY(rx_compressed);
 386NETSTAT_ENTRY(tx_compressed);
 387
 388static struct attribute *netstat_attrs[] = {
 389        &dev_attr_rx_packets.attr,
 390        &dev_attr_tx_packets.attr,
 391        &dev_attr_rx_bytes.attr,
 392        &dev_attr_tx_bytes.attr,
 393        &dev_attr_rx_errors.attr,
 394        &dev_attr_tx_errors.attr,
 395        &dev_attr_rx_dropped.attr,
 396        &dev_attr_tx_dropped.attr,
 397        &dev_attr_multicast.attr,
 398        &dev_attr_collisions.attr,
 399        &dev_attr_rx_length_errors.attr,
 400        &dev_attr_rx_over_errors.attr,
 401        &dev_attr_rx_crc_errors.attr,
 402        &dev_attr_rx_frame_errors.attr,
 403        &dev_attr_rx_fifo_errors.attr,
 404        &dev_attr_rx_missed_errors.attr,
 405        &dev_attr_tx_aborted_errors.attr,
 406        &dev_attr_tx_carrier_errors.attr,
 407        &dev_attr_tx_fifo_errors.attr,
 408        &dev_attr_tx_heartbeat_errors.attr,
 409        &dev_attr_tx_window_errors.attr,
 410        &dev_attr_rx_compressed.attr,
 411        &dev_attr_tx_compressed.attr,
 412        NULL
 413};
 414
 415
 416static struct attribute_group netstat_group = {
 417        .name  = "statistics",
 418        .attrs  = netstat_attrs,
 419};
 420
 421#ifdef CONFIG_WIRELESS_EXT_SYSFS
 422/* helper function that does all the locking etc for wireless stats */
 423static ssize_t wireless_show(struct device *d, char *buf,
 424                             ssize_t (*format)(const struct iw_statistics *,
 425                                               char *))
 426{
 427        struct net_device *dev = to_net_dev(d);
 428        const struct iw_statistics *iw;
 429        ssize_t ret = -EINVAL;
 430
 431        if (!rtnl_trylock())
 432                return restart_syscall();
 433        if (dev_isalive(dev)) {
 434                iw = get_wireless_stats(dev);
 435                if (iw)
 436                        ret = (*format)(iw, buf);
 437        }
 438        rtnl_unlock();
 439
 440        return ret;
 441}
 442
 443/* show function template for wireless fields */
 444#define WIRELESS_SHOW(name, field, format_string)                       \
 445static ssize_t format_iw_##name(const struct iw_statistics *iw, char *buf) \
 446{                                                                       \
 447        return sprintf(buf, format_string, iw->field);                  \
 448}                                                                       \
 449static ssize_t show_iw_##name(struct device *d,                         \
 450                              struct device_attribute *attr, char *buf) \
 451{                                                                       \
 452        return wireless_show(d, buf, format_iw_##name);                 \
 453}                                                                       \
 454static DEVICE_ATTR(name, S_IRUGO, show_iw_##name, NULL)
 455
 456WIRELESS_SHOW(status, status, fmt_hex);
 457WIRELESS_SHOW(link, qual.qual, fmt_dec);
 458WIRELESS_SHOW(level, qual.level, fmt_dec);
 459WIRELESS_SHOW(noise, qual.noise, fmt_dec);
 460WIRELESS_SHOW(nwid, discard.nwid, fmt_dec);
 461WIRELESS_SHOW(crypt, discard.code, fmt_dec);
 462WIRELESS_SHOW(fragment, discard.fragment, fmt_dec);
 463WIRELESS_SHOW(misc, discard.misc, fmt_dec);
 464WIRELESS_SHOW(retries, discard.retries, fmt_dec);
 465WIRELESS_SHOW(beacon, miss.beacon, fmt_dec);
 466
 467static struct attribute *wireless_attrs[] = {
 468        &dev_attr_status.attr,
 469        &dev_attr_link.attr,
 470        &dev_attr_level.attr,
 471        &dev_attr_noise.attr,
 472        &dev_attr_nwid.attr,
 473        &dev_attr_crypt.attr,
 474        &dev_attr_fragment.attr,
 475        &dev_attr_retries.attr,
 476        &dev_attr_misc.attr,
 477        &dev_attr_beacon.attr,
 478        NULL
 479};
 480
 481static struct attribute_group wireless_group = {
 482        .name = "wireless",
 483        .attrs = wireless_attrs,
 484};
 485#endif
 486#endif /* CONFIG_SYSFS */
 487
 488#ifdef CONFIG_RPS
 489/*
 490 * RX queue sysfs structures and functions.
 491 */
 492struct rx_queue_attribute {
 493        struct attribute attr;
 494        ssize_t (*show)(struct netdev_rx_queue *queue,
 495            struct rx_queue_attribute *attr, char *buf);
 496        ssize_t (*store)(struct netdev_rx_queue *queue,
 497            struct rx_queue_attribute *attr, const char *buf, size_t len);
 498};
 499#define to_rx_queue_attr(_attr) container_of(_attr,             \
 500    struct rx_queue_attribute, attr)
 501
 502#define to_rx_queue(obj) container_of(obj, struct netdev_rx_queue, kobj)
 503
 504static ssize_t rx_queue_attr_show(struct kobject *kobj, struct attribute *attr,
 505                                  char *buf)
 506{
 507        struct rx_queue_attribute *attribute = to_rx_queue_attr(attr);
 508        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 509
 510        if (!attribute->show)
 511                return -EIO;
 512
 513        return attribute->show(queue, attribute, buf);
 514}
 515
 516static ssize_t rx_queue_attr_store(struct kobject *kobj, struct attribute *attr,
 517                                   const char *buf, size_t count)
 518{
 519        struct rx_queue_attribute *attribute = to_rx_queue_attr(attr);
 520        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 521
 522        if (!attribute->store)
 523                return -EIO;
 524
 525        return attribute->store(queue, attribute, buf, count);
 526}
 527
 528static const struct sysfs_ops rx_queue_sysfs_ops = {
 529        .show = rx_queue_attr_show,
 530        .store = rx_queue_attr_store,
 531};
 532
 533static ssize_t show_rps_map(struct netdev_rx_queue *queue,
 534                            struct rx_queue_attribute *attribute, char *buf)
 535{
 536        struct rps_map *map;
 537        cpumask_var_t mask;
 538        size_t len = 0;
 539        int i;
 540
 541        if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
 542                return -ENOMEM;
 543
 544        rcu_read_lock();
 545        map = rcu_dereference(queue->rps_map);
 546        if (map)
 547                for (i = 0; i < map->len; i++)
 548                        cpumask_set_cpu(map->cpus[i], mask);
 549
 550        len += cpumask_scnprintf(buf + len, PAGE_SIZE, mask);
 551        if (PAGE_SIZE - len < 3) {
 552                rcu_read_unlock();
 553                free_cpumask_var(mask);
 554                return -EINVAL;
 555        }
 556        rcu_read_unlock();
 557
 558        free_cpumask_var(mask);
 559        len += sprintf(buf + len, "\n");
 560        return len;
 561}
 562
 563static ssize_t store_rps_map(struct netdev_rx_queue *queue,
 564                      struct rx_queue_attribute *attribute,
 565                      const char *buf, size_t len)
 566{
 567        struct rps_map *old_map, *map;
 568        cpumask_var_t mask;
 569        int err, cpu, i;
 570        static DEFINE_SPINLOCK(rps_map_lock);
 571
 572        if (!capable(CAP_NET_ADMIN))
 573                return -EPERM;
 574
 575        if (!alloc_cpumask_var(&mask, GFP_KERNEL))
 576                return -ENOMEM;
 577
 578        err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
 579        if (err) {
 580                free_cpumask_var(mask);
 581                return err;
 582        }
 583
 584        map = kzalloc(max_t(unsigned,
 585            RPS_MAP_SIZE(cpumask_weight(mask)), L1_CACHE_BYTES),
 586            GFP_KERNEL);
 587        if (!map) {
 588                free_cpumask_var(mask);
 589                return -ENOMEM;
 590        }
 591
 592        i = 0;
 593        for_each_cpu_and(cpu, mask, cpu_online_mask)
 594                map->cpus[i++] = cpu;
 595
 596        if (i)
 597                map->len = i;
 598        else {
 599                kfree(map);
 600                map = NULL;
 601        }
 602
 603        spin_lock(&rps_map_lock);
 604        old_map = rcu_dereference_protected(queue->rps_map,
 605                                            lockdep_is_held(&rps_map_lock));
 606        rcu_assign_pointer(queue->rps_map, map);
 607        spin_unlock(&rps_map_lock);
 608
 609        if (old_map)
 610                kfree_rcu(old_map, rcu);
 611
 612        free_cpumask_var(mask);
 613        return len;
 614}
 615
 616static ssize_t show_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
 617                                           struct rx_queue_attribute *attr,
 618                                           char *buf)
 619{
 620        struct rps_dev_flow_table *flow_table;
 621        unsigned int val = 0;
 622
 623        rcu_read_lock();
 624        flow_table = rcu_dereference(queue->rps_flow_table);
 625        if (flow_table)
 626                val = flow_table->mask + 1;
 627        rcu_read_unlock();
 628
 629        return sprintf(buf, "%u\n", val);
 630}
 631
 632static void rps_dev_flow_table_release_work(struct work_struct *work)
 633{
 634        struct rps_dev_flow_table *table = container_of(work,
 635            struct rps_dev_flow_table, free_work);
 636
 637        vfree(table);
 638}
 639
 640static void rps_dev_flow_table_release(struct rcu_head *rcu)
 641{
 642        struct rps_dev_flow_table *table = container_of(rcu,
 643            struct rps_dev_flow_table, rcu);
 644
 645        INIT_WORK(&table->free_work, rps_dev_flow_table_release_work);
 646        schedule_work(&table->free_work);
 647}
 648
 649static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue,
 650                                     struct rx_queue_attribute *attr,
 651                                     const char *buf, size_t len)
 652{
 653        unsigned int count;
 654        char *endp;
 655        struct rps_dev_flow_table *table, *old_table;
 656        static DEFINE_SPINLOCK(rps_dev_flow_lock);
 657
 658        if (!capable(CAP_NET_ADMIN))
 659                return -EPERM;
 660
 661        count = simple_strtoul(buf, &endp, 0);
 662        if (endp == buf)
 663                return -EINVAL;
 664
 665        if (count) {
 666                int i;
 667
 668                if (count > INT_MAX)
 669                        return -EINVAL;
 670                count = roundup_pow_of_two(count);
 671                if (count > (ULONG_MAX - sizeof(struct rps_dev_flow_table))
 672                                / sizeof(struct rps_dev_flow)) {
 673                        /* Enforce a limit to prevent overflow */
 674                        return -EINVAL;
 675                }
 676                table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count));
 677                if (!table)
 678                        return -ENOMEM;
 679
 680                table->mask = count - 1;
 681                for (i = 0; i < count; i++)
 682                        table->flows[i].cpu = RPS_NO_CPU;
 683        } else
 684                table = NULL;
 685
 686        spin_lock(&rps_dev_flow_lock);
 687        old_table = rcu_dereference_protected(queue->rps_flow_table,
 688                                              lockdep_is_held(&rps_dev_flow_lock));
 689        rcu_assign_pointer(queue->rps_flow_table, table);
 690        spin_unlock(&rps_dev_flow_lock);
 691
 692        if (old_table)
 693                call_rcu(&old_table->rcu, rps_dev_flow_table_release);
 694
 695        return len;
 696}
 697
 698static struct rx_queue_attribute rps_cpus_attribute =
 699        __ATTR(rps_cpus, S_IRUGO | S_IWUSR, show_rps_map, store_rps_map);
 700
 701
 702static struct rx_queue_attribute rps_dev_flow_table_cnt_attribute =
 703        __ATTR(rps_flow_cnt, S_IRUGO | S_IWUSR,
 704            show_rps_dev_flow_table_cnt, store_rps_dev_flow_table_cnt);
 705
 706static struct attribute *rx_queue_default_attrs[] = {
 707        &rps_cpus_attribute.attr,
 708        &rps_dev_flow_table_cnt_attribute.attr,
 709        NULL
 710};
 711
 712static void rx_queue_release(struct kobject *kobj)
 713{
 714        struct netdev_rx_queue *queue = to_rx_queue(kobj);
 715        struct rps_map *map;
 716        struct rps_dev_flow_table *flow_table;
 717
 718
 719        map = rcu_dereference_protected(queue->rps_map, 1);
 720        if (map) {
 721                RCU_INIT_POINTER(queue->rps_map, NULL);
 722                kfree_rcu(map, rcu);
 723        }
 724
 725        flow_table = rcu_dereference_protected(queue->rps_flow_table, 1);
 726        if (flow_table) {
 727                RCU_INIT_POINTER(queue->rps_flow_table, NULL);
 728                call_rcu(&flow_table->rcu, rps_dev_flow_table_release);
 729        }
 730
 731        memset(kobj, 0, sizeof(*kobj));
 732        dev_put(queue->dev);
 733}
 734
 735static struct kobj_type rx_queue_ktype = {
 736        .sysfs_ops = &rx_queue_sysfs_ops,
 737        .release = rx_queue_release,
 738        .default_attrs = rx_queue_default_attrs,
 739};
 740
 741static int rx_queue_add_kobject(struct net_device *net, int index)
 742{
 743        struct netdev_rx_queue *queue = net->_rx + index;
 744        struct kobject *kobj = &queue->kobj;
 745        int error = 0;
 746
 747        kobj->kset = net->queues_kset;
 748        error = kobject_init_and_add(kobj, &rx_queue_ktype, NULL,
 749            "rx-%u", index);
 750        if (error) {
 751                kobject_put(kobj);
 752                return error;
 753        }
 754
 755        kobject_uevent(kobj, KOBJ_ADD);
 756        dev_hold(queue->dev);
 757
 758        return error;
 759}
 760#endif /* CONFIG_RPS */
 761
 762int
 763net_rx_queue_update_kobjects(struct net_device *net, int old_num, int new_num)
 764{
 765#ifdef CONFIG_RPS
 766        int i;
 767        int error = 0;
 768
 769        for (i = old_num; i < new_num; i++) {
 770                error = rx_queue_add_kobject(net, i);
 771                if (error) {
 772                        new_num = old_num;
 773                        break;
 774                }
 775        }
 776
 777        while (--i >= new_num)
 778                kobject_put(&net->_rx[i].kobj);
 779
 780        return error;
 781#else
 782        return 0;
 783#endif
 784}
 785
 786#ifdef CONFIG_XPS
 787/*
 788 * netdev_queue sysfs structures and functions.
 789 */
 790struct netdev_queue_attribute {
 791        struct attribute attr;
 792        ssize_t (*show)(struct netdev_queue *queue,
 793            struct netdev_queue_attribute *attr, char *buf);
 794        ssize_t (*store)(struct netdev_queue *queue,
 795            struct netdev_queue_attribute *attr, const char *buf, size_t len);
 796};
 797#define to_netdev_queue_attr(_attr) container_of(_attr,         \
 798    struct netdev_queue_attribute, attr)
 799
 800#define to_netdev_queue(obj) container_of(obj, struct netdev_queue, kobj)
 801
 802static ssize_t netdev_queue_attr_show(struct kobject *kobj,
 803                                      struct attribute *attr, char *buf)
 804{
 805        struct netdev_queue_attribute *attribute = to_netdev_queue_attr(attr);
 806        struct netdev_queue *queue = to_netdev_queue(kobj);
 807
 808        if (!attribute->show)
 809                return -EIO;
 810
 811        return attribute->show(queue, attribute, buf);
 812}
 813
 814static ssize_t netdev_queue_attr_store(struct kobject *kobj,
 815                                       struct attribute *attr,
 816                                       const char *buf, size_t count)
 817{
 818        struct netdev_queue_attribute *attribute = to_netdev_queue_attr(attr);
 819        struct netdev_queue *queue = to_netdev_queue(kobj);
 820
 821        if (!attribute->store)
 822                return -EIO;
 823
 824        return attribute->store(queue, attribute, buf, count);
 825}
 826
 827static const struct sysfs_ops netdev_queue_sysfs_ops = {
 828        .show = netdev_queue_attr_show,
 829        .store = netdev_queue_attr_store,
 830};
 831
 832static inline unsigned int get_netdev_queue_index(struct netdev_queue *queue)
 833{
 834        struct net_device *dev = queue->dev;
 835        int i;
 836
 837        for (i = 0; i < dev->num_tx_queues; i++)
 838                if (queue == &dev->_tx[i])
 839                        break;
 840
 841        BUG_ON(i >= dev->num_tx_queues);
 842
 843        return i;
 844}
 845
 846
 847static ssize_t show_xps_map(struct netdev_queue *queue,
 848                            struct netdev_queue_attribute *attribute, char *buf)
 849{
 850        struct net_device *dev = queue->dev;
 851        struct xps_dev_maps *dev_maps;
 852        cpumask_var_t mask;
 853        unsigned long index;
 854        size_t len = 0;
 855        int i;
 856
 857        if (!zalloc_cpumask_var(&mask, GFP_KERNEL))
 858                return -ENOMEM;
 859
 860        index = get_netdev_queue_index(queue);
 861
 862        rcu_read_lock();
 863        dev_maps = rcu_dereference(dev->xps_maps);
 864        if (dev_maps) {
 865                for_each_possible_cpu(i) {
 866                        struct xps_map *map =
 867                            rcu_dereference(dev_maps->cpu_map[i]);
 868                        if (map) {
 869                                int j;
 870                                for (j = 0; j < map->len; j++) {
 871                                        if (map->queues[j] == index) {
 872                                                cpumask_set_cpu(i, mask);
 873                                                break;
 874                                        }
 875                                }
 876                        }
 877                }
 878        }
 879        rcu_read_unlock();
 880
 881        len += cpumask_scnprintf(buf + len, PAGE_SIZE, mask);
 882        if (PAGE_SIZE - len < 3) {
 883                free_cpumask_var(mask);
 884                return -EINVAL;
 885        }
 886
 887        free_cpumask_var(mask);
 888        len += sprintf(buf + len, "\n");
 889        return len;
 890}
 891
 892static DEFINE_MUTEX(xps_map_mutex);
 893#define xmap_dereference(P)             \
 894        rcu_dereference_protected((P), lockdep_is_held(&xps_map_mutex))
 895
 896static ssize_t store_xps_map(struct netdev_queue *queue,
 897                      struct netdev_queue_attribute *attribute,
 898                      const char *buf, size_t len)
 899{
 900        struct net_device *dev = queue->dev;
 901        cpumask_var_t mask;
 902        int err, i, cpu, pos, map_len, alloc_len, need_set;
 903        unsigned long index;
 904        struct xps_map *map, *new_map;
 905        struct xps_dev_maps *dev_maps, *new_dev_maps;
 906        int nonempty = 0;
 907        int numa_node = -2;
 908
 909        if (!capable(CAP_NET_ADMIN))
 910                return -EPERM;
 911
 912        if (!alloc_cpumask_var(&mask, GFP_KERNEL))
 913                return -ENOMEM;
 914
 915        index = get_netdev_queue_index(queue);
 916
 917        err = bitmap_parse(buf, len, cpumask_bits(mask), nr_cpumask_bits);
 918        if (err) {
 919                free_cpumask_var(mask);
 920                return err;
 921        }
 922
 923        new_dev_maps = kzalloc(max_t(unsigned,
 924            XPS_DEV_MAPS_SIZE, L1_CACHE_BYTES), GFP_KERNEL);
 925        if (!new_dev_maps) {
 926                free_cpumask_var(mask);
 927                return -ENOMEM;
 928        }
 929
 930        mutex_lock(&xps_map_mutex);
 931
 932        dev_maps = xmap_dereference(dev->xps_maps);
 933
 934        for_each_possible_cpu(cpu) {
 935                map = dev_maps ?
 936                        xmap_dereference(dev_maps->cpu_map[cpu]) : NULL;
 937                new_map = map;
 938                if (map) {
 939                        for (pos = 0; pos < map->len; pos++)
 940                                if (map->queues[pos] == index)
 941                                        break;
 942                        map_len = map->len;
 943                        alloc_len = map->alloc_len;
 944                } else
 945                        pos = map_len = alloc_len = 0;
 946
 947                need_set = cpumask_test_cpu(cpu, mask) && cpu_online(cpu);
 948#ifdef CONFIG_NUMA
 949                if (need_set) {
 950                        if (numa_node == -2)
 951                                numa_node = cpu_to_node(cpu);
 952                        else if (numa_node != cpu_to_node(cpu))
 953                                numa_node = -1;
 954                }
 955#endif
 956                if (need_set && pos >= map_len) {
 957                        /* Need to add queue to this CPU's map */
 958                        if (map_len >= alloc_len) {
 959                                alloc_len = alloc_len ?
 960                                    2 * alloc_len : XPS_MIN_MAP_ALLOC;
 961                                new_map = kzalloc_node(XPS_MAP_SIZE(alloc_len),
 962                                                       GFP_KERNEL,
 963                                                       cpu_to_node(cpu));
 964                                if (!new_map)
 965                                        goto error;
 966                                new_map->alloc_len = alloc_len;
 967                                for (i = 0; i < map_len; i++)
 968                                        new_map->queues[i] = map->queues[i];
 969                                new_map->len = map_len;
 970                        }
 971                        new_map->queues[new_map->len++] = index;
 972                } else if (!need_set && pos < map_len) {
 973                        /* Need to remove queue from this CPU's map */
 974                        if (map_len > 1)
 975                                new_map->queues[pos] =
 976                                    new_map->queues[--new_map->len];
 977                        else
 978                                new_map = NULL;
 979                }
 980                RCU_INIT_POINTER(new_dev_maps->cpu_map[cpu], new_map);
 981        }
 982
 983        /* Cleanup old maps */
 984        for_each_possible_cpu(cpu) {
 985                map = dev_maps ?
 986                        xmap_dereference(dev_maps->cpu_map[cpu]) : NULL;
 987                if (map && xmap_dereference(new_dev_maps->cpu_map[cpu]) != map)
 988                        kfree_rcu(map, rcu);
 989                if (new_dev_maps->cpu_map[cpu])
 990                        nonempty = 1;
 991        }
 992
 993        if (nonempty)
 994                RCU_INIT_POINTER(dev->xps_maps, new_dev_maps);
 995        else {
 996                kfree(new_dev_maps);
 997                RCU_INIT_POINTER(dev->xps_maps, NULL);
 998        }
 999
1000        if (dev_maps)
1001                kfree_rcu(dev_maps, rcu);
1002
1003        netdev_queue_numa_node_write(queue, (numa_node >= 0) ? numa_node :
1004                                            NUMA_NO_NODE);
1005
1006        mutex_unlock(&xps_map_mutex);
1007
1008        free_cpumask_var(mask);
1009        return len;
1010
1011error:
1012        mutex_unlock(&xps_map_mutex);
1013
1014        if (new_dev_maps)
1015                for_each_possible_cpu(i)
1016                        kfree(rcu_dereference_protected(
1017                                new_dev_maps->cpu_map[i],
1018                                1));
1019        kfree(new_dev_maps);
1020        free_cpumask_var(mask);
1021        return -ENOMEM;
1022}
1023
1024static struct netdev_queue_attribute xps_cpus_attribute =
1025    __ATTR(xps_cpus, S_IRUGO | S_IWUSR, show_xps_map, store_xps_map);
1026
1027static struct attribute *netdev_queue_default_attrs[] = {
1028        &xps_cpus_attribute.attr,
1029        NULL
1030};
1031
1032static void netdev_queue_release(struct kobject *kobj)
1033{
1034        struct netdev_queue *queue = to_netdev_queue(kobj);
1035        struct net_device *dev = queue->dev;
1036        struct xps_dev_maps *dev_maps;
1037        struct xps_map *map;
1038        unsigned long index;
1039        int i, pos, nonempty = 0;
1040
1041        index = get_netdev_queue_index(queue);
1042
1043        mutex_lock(&xps_map_mutex);
1044        dev_maps = xmap_dereference(dev->xps_maps);
1045
1046        if (dev_maps) {
1047                for_each_possible_cpu(i) {
1048                        map = xmap_dereference(dev_maps->cpu_map[i]);
1049                        if (!map)
1050                                continue;
1051
1052                        for (pos = 0; pos < map->len; pos++)
1053                                if (map->queues[pos] == index)
1054                                        break;
1055
1056                        if (pos < map->len) {
1057                                if (map->len > 1)
1058                                        map->queues[pos] =
1059                                            map->queues[--map->len];
1060                                else {
1061                                        RCU_INIT_POINTER(dev_maps->cpu_map[i],
1062                                            NULL);
1063                                        kfree_rcu(map, rcu);
1064                                        map = NULL;
1065                                }
1066                        }
1067                        if (map)
1068                                nonempty = 1;
1069                }
1070
1071                if (!nonempty) {
1072                        RCU_INIT_POINTER(dev->xps_maps, NULL);
1073                        kfree_rcu(dev_maps, rcu);
1074                }
1075        }
1076
1077        mutex_unlock(&xps_map_mutex);
1078
1079        memset(kobj, 0, sizeof(*kobj));
1080        dev_put(queue->dev);
1081}
1082
1083static struct kobj_type netdev_queue_ktype = {
1084        .sysfs_ops = &netdev_queue_sysfs_ops,
1085        .release = netdev_queue_release,
1086        .default_attrs = netdev_queue_default_attrs,
1087};
1088
1089static int netdev_queue_add_kobject(struct net_device *net, int index)
1090{
1091        struct netdev_queue *queue = net->_tx + index;
1092        struct kobject *kobj = &queue->kobj;
1093        int error = 0;
1094
1095        kobj->kset = net->queues_kset;
1096        error = kobject_init_and_add(kobj, &netdev_queue_ktype, NULL,
1097            "tx-%u", index);
1098        if (error) {
1099                kobject_put(kobj);
1100                return error;
1101        }
1102
1103        kobject_uevent(kobj, KOBJ_ADD);
1104        dev_hold(queue->dev);
1105
1106        return error;
1107}
1108#endif /* CONFIG_XPS */
1109
1110int
1111netdev_queue_update_kobjects(struct net_device *net, int old_num, int new_num)
1112{
1113#ifdef CONFIG_XPS
1114        int i;
1115        int error = 0;
1116
1117        for (i = old_num; i < new_num; i++) {
1118                error = netdev_queue_add_kobject(net, i);
1119                if (error) {
1120                        new_num = old_num;
1121                        break;
1122                }
1123        }
1124
1125        while (--i >= new_num)
1126                kobject_put(&net->_tx[i].kobj);
1127
1128        return error;
1129#else
1130        return 0;
1131#endif
1132}
1133
1134static int register_queue_kobjects(struct net_device *net)
1135{
1136        int error = 0, txq = 0, rxq = 0, real_rx = 0, real_tx = 0;
1137
1138#if defined(CONFIG_RPS) || defined(CONFIG_XPS)
1139        net->queues_kset = kset_create_and_add("queues",
1140            NULL, &net->dev.kobj);
1141        if (!net->queues_kset)
1142                return -ENOMEM;
1143#endif
1144
1145#ifdef CONFIG_RPS
1146        real_rx = net->real_num_rx_queues;
1147#endif
1148        real_tx = net->real_num_tx_queues;
1149
1150        error = net_rx_queue_update_kobjects(net, 0, real_rx);
1151        if (error)
1152                goto error;
1153        rxq = real_rx;
1154
1155        error = netdev_queue_update_kobjects(net, 0, real_tx);
1156        if (error)
1157                goto error;
1158        txq = real_tx;
1159
1160        return 0;
1161
1162error:
1163        netdev_queue_update_kobjects(net, txq, 0);
1164        net_rx_queue_update_kobjects(net, rxq, 0);
1165        return error;
1166}
1167
1168static void remove_queue_kobjects(struct net_device *net)
1169{
1170        int real_rx = 0, real_tx = 0;
1171
1172#ifdef CONFIG_RPS
1173        real_rx = net->real_num_rx_queues;
1174#endif
1175        real_tx = net->real_num_tx_queues;
1176
1177        net_rx_queue_update_kobjects(net, real_rx, 0);
1178        netdev_queue_update_kobjects(net, real_tx, 0);
1179#if defined(CONFIG_RPS) || defined(CONFIG_XPS)
1180        kset_unregister(net->queues_kset);
1181#endif
1182}
1183
1184static void *net_grab_current_ns(void)
1185{
1186        struct net *ns = current->nsproxy->net_ns;
1187#ifdef CONFIG_NET_NS
1188        if (ns)
1189                atomic_inc(&ns->passive);
1190#endif
1191        return ns;
1192}
1193
1194static const void *net_initial_ns(void)
1195{
1196        return &init_net;
1197}
1198
1199static const void *net_netlink_ns(struct sock *sk)
1200{
1201        return sock_net(sk);
1202}
1203
1204struct kobj_ns_type_operations net_ns_type_operations = {
1205        .type = KOBJ_NS_TYPE_NET,
1206        .grab_current_ns = net_grab_current_ns,
1207        .netlink_ns = net_netlink_ns,
1208        .initial_ns = net_initial_ns,
1209        .drop_ns = net_drop_ns,
1210};
1211EXPORT_SYMBOL_GPL(net_ns_type_operations);
1212
1213#ifdef CONFIG_HOTPLUG
1214static int netdev_uevent(struct device *d, struct kobj_uevent_env *env)
1215{
1216        struct net_device *dev = to_net_dev(d);
1217        int retval;
1218
1219        /* pass interface to uevent. */
1220        retval = add_uevent_var(env, "INTERFACE=%s", dev->name);
1221        if (retval)
1222                goto exit;
1223
1224        /* pass ifindex to uevent.
1225         * ifindex is useful as it won't change (interface name may change)
1226         * and is what RtNetlink uses natively. */
1227        retval = add_uevent_var(env, "IFINDEX=%d", dev->ifindex);
1228
1229exit:
1230        return retval;
1231}
1232#endif
1233
1234/*
1235 *      netdev_release -- destroy and free a dead device.
1236 *      Called when last reference to device kobject is gone.
1237 */
1238static void netdev_release(struct device *d)
1239{
1240        struct net_device *dev = to_net_dev(d);
1241
1242        BUG_ON(dev->reg_state != NETREG_RELEASED);
1243
1244        kfree(dev->ifalias);
1245        kfree((char *)dev - dev->padded);
1246}
1247
1248static const void *net_namespace(struct device *d)
1249{
1250        struct net_device *dev;
1251        dev = container_of(d, struct net_device, dev);
1252        return dev_net(dev);
1253}
1254
1255static struct class net_class = {
1256        .name = "net",
1257        .dev_release = netdev_release,
1258#ifdef CONFIG_SYSFS
1259        .dev_attrs = net_class_attributes,
1260#endif /* CONFIG_SYSFS */
1261#ifdef CONFIG_HOTPLUG
1262        .dev_uevent = netdev_uevent,
1263#endif
1264        .ns_type = &net_ns_type_operations,
1265        .namespace = net_namespace,
1266};
1267
1268/* Delete sysfs entries but hold kobject reference until after all
1269 * netdev references are gone.
1270 */
1271void netdev_unregister_kobject(struct net_device * net)
1272{
1273        struct device *dev = &(net->dev);
1274
1275        kobject_get(&dev->kobj);
1276
1277        remove_queue_kobjects(net);
1278
1279        device_del(dev);
1280}
1281
1282/* Create sysfs entries for network device. */
1283int netdev_register_kobject(struct net_device *net)
1284{
1285        struct device *dev = &(net->dev);
1286        const struct attribute_group **groups = net->sysfs_groups;
1287        int error = 0;
1288
1289        device_initialize(dev);
1290        dev->class = &net_class;
1291        dev->platform_data = net;
1292        dev->groups = groups;
1293
1294        dev_set_name(dev, "%s", net->name);
1295
1296#ifdef CONFIG_SYSFS
1297        /* Allow for a device specific group */
1298        if (*groups)
1299                groups++;
1300
1301        *groups++ = &netstat_group;
1302#ifdef CONFIG_WIRELESS_EXT_SYSFS
1303        if (net->ieee80211_ptr)
1304                *groups++ = &wireless_group;
1305#ifdef CONFIG_WIRELESS_EXT
1306        else if (net->wireless_handlers)
1307                *groups++ = &wireless_group;
1308#endif
1309#endif
1310#endif /* CONFIG_SYSFS */
1311
1312        error = device_add(dev);
1313        if (error)
1314                return error;
1315
1316        error = register_queue_kobjects(net);
1317        if (error) {
1318                device_del(dev);
1319                return error;
1320        }
1321
1322        return error;
1323}
1324
1325int netdev_class_create_file(struct class_attribute *class_attr)
1326{
1327        return class_create_file(&net_class, class_attr);
1328}
1329EXPORT_SYMBOL(netdev_class_create_file);
1330
1331void netdev_class_remove_file(struct class_attribute *class_attr)
1332{
1333        class_remove_file(&net_class, class_attr);
1334}
1335EXPORT_SYMBOL(netdev_class_remove_file);
1336
1337int netdev_kobject_init(void)
1338{
1339        kobj_ns_type_register(&net_ns_type_operations);
1340        return class_register(&net_class);
1341}
1342