These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / core / net-sysfs.c
index 4238d6d..f88a62a 100644 (file)
@@ -31,7 +31,6 @@
 static const char fmt_hex[] = "%#x\n";
 static const char fmt_long_hex[] = "%#lx\n";
 static const char fmt_dec[] = "%d\n";
-static const char fmt_udec[] = "%u\n";
 static const char fmt_ulong[] = "%lu\n";
 static const char fmt_u64[] = "%llu\n";
 
@@ -202,7 +201,7 @@ static ssize_t speed_show(struct device *dev,
        if (netif_running(netdev)) {
                struct ethtool_cmd cmd;
                if (!__ethtool_get_settings(netdev, &cmd))
-                       ret = sprintf(buf, fmt_udec, ethtool_cmd_speed(&cmd));
+                       ret = sprintf(buf, fmt_dec, ethtool_cmd_speed(&cmd));
        }
        rtnl_unlock();
        return ret;
@@ -404,6 +403,19 @@ static ssize_t group_store(struct device *dev, struct device_attribute *attr,
 NETDEVICE_SHOW(group, fmt_dec);
 static DEVICE_ATTR(netdev_group, S_IRUGO | S_IWUSR, group_show, group_store);
 
+static int change_proto_down(struct net_device *dev, unsigned long proto_down)
+{
+       return dev_change_proto_down(dev, (bool) proto_down);
+}
+
+static ssize_t proto_down_store(struct device *dev,
+                               struct device_attribute *attr,
+                               const char *buf, size_t len)
+{
+       return netdev_store(dev, attr, buf, len, change_proto_down);
+}
+NETDEVICE_SHOW_RW(proto_down, fmt_dec);
+
 static ssize_t phys_port_id_show(struct device *dev,
                                 struct device_attribute *attr, char *buf)
 {
@@ -458,11 +470,15 @@ static ssize_t phys_switch_id_show(struct device *dev,
                return restart_syscall();
 
        if (dev_isalive(netdev)) {
-               struct netdev_phys_item_id ppid;
+               struct switchdev_attr attr = {
+                       .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
+                       .flags = SWITCHDEV_F_NO_RECURSE,
+               };
 
-               ret = netdev_switch_parent_id_get(netdev, &ppid);
+               ret = switchdev_port_attr_get(netdev, &attr);
                if (!ret)
-                       ret = sprintf(buf, "%*phN\n", ppid.id_len, ppid.id);
+                       ret = sprintf(buf, "%*phN\n", attr.u.ppid.id_len,
+                                     attr.u.ppid.id);
        }
        rtnl_unlock();
 
@@ -497,6 +513,7 @@ static struct attribute *net_class_attrs[] = {
        &dev_attr_phys_port_id.attr,
        &dev_attr_phys_port_name.attr,
        &dev_attr_phys_switch_id.attr,
+       &dev_attr_proto_down.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(net_class);
@@ -671,7 +688,7 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue,
        struct rps_map *old_map, *map;
        cpumask_var_t mask;
        int err, cpu, i;
-       static DEFINE_SPINLOCK(rps_map_lock);
+       static DEFINE_MUTEX(rps_map_mutex);
 
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
@@ -704,18 +721,21 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue,
                map = NULL;
        }
 
-       spin_lock(&rps_map_lock);
+       mutex_lock(&rps_map_mutex);
        old_map = rcu_dereference_protected(queue->rps_map,
-                                           lockdep_is_held(&rps_map_lock));
+                                           mutex_is_locked(&rps_map_mutex));
        rcu_assign_pointer(queue->rps_map, map);
-       spin_unlock(&rps_map_lock);
 
        if (map)
                static_key_slow_inc(&rps_needed);
-       if (old_map) {
-               kfree_rcu(old_map, rcu);
+       if (old_map)
                static_key_slow_dec(&rps_needed);
-       }
+
+       mutex_unlock(&rps_map_mutex);
+
+       if (old_map)
+               kfree_rcu(old_map, rcu);
+
        free_cpumask_var(mask);
        return len;
 }
@@ -983,15 +1003,12 @@ static ssize_t show_trans_timeout(struct netdev_queue *queue,
 }
 
 #ifdef CONFIG_XPS
-static inline unsigned int get_netdev_queue_index(struct netdev_queue *queue)
+static unsigned int get_netdev_queue_index(struct netdev_queue *queue)
 {
        struct net_device *dev = queue->dev;
-       int i;
-
-       for (i = 0; i < dev->num_tx_queues; i++)
-               if (queue == &dev->_tx[i])
-                       break;
+       unsigned int i;
 
+       i = queue - dev->_tx;
        BUG_ON(i >= dev->num_tx_queues);
 
        return i;
@@ -1460,6 +1477,15 @@ static int of_dev_node_match(struct device *dev, const void *data)
        return ret == 0 ? dev->of_node == data : ret;
 }
 
+/*
+ * of_find_net_device_by_node - lookup the net device for the device node
+ * @np: OF device node
+ *
+ * Looks up the net_device structure corresponding with the device node.
+ * If successful, returns a pointer to the net_device with the embedded
+ * struct device refcount incremented by one, or NULL on failure. The
+ * refcount must be dropped when done with the net_device.
+ */
 struct net_device *of_find_net_device_by_node(struct device_node *np)
 {
        struct device *dev;