diff options
Diffstat (limited to 'net/core/net-sysfs.c')
| -rw-r--r-- | net/core/net-sysfs.c | 80 | 
1 files changed, 50 insertions, 30 deletions
| diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 1ace0cd01adc..c28cd6665444 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -256,7 +256,7 @@ static ssize_t name_assign_type_show(struct device *dev,  }  static DEVICE_ATTR_RO(name_assign_type); -/* use same locking rules as GIFHWADDR ioctl's (dev_get_mac_address()) */ +/* use same locking rules as GIFHWADDR ioctl's (netif_get_mac_address()) */  static ssize_t address_show(struct device *dev, struct device_attribute *attr,  			    char *buf)  { @@ -641,12 +641,6 @@ static ssize_t phys_port_id_show(struct device *dev,  	struct netdev_phys_item_id ppid;  	ssize_t ret; -	/* The check is also done in dev_get_phys_port_id; this helps returning -	 * early without hitting the locking section below. -	 */ -	if (!netdev->netdev_ops->ndo_get_phys_port_id) -		return -EOPNOTSUPP; -  	ret = sysfs_rtnl_lock(&dev->kobj, &attr->attr, netdev);  	if (ret)  		return ret; @@ -668,13 +662,6 @@ static ssize_t phys_port_name_show(struct device *dev,  	char name[IFNAMSIZ];  	ssize_t ret; -	/* The checks are also done in dev_get_phys_port_name; this helps -	 * returning early without hitting the locking section below. -	 */ -	if (!netdev->netdev_ops->ndo_get_phys_port_name && -	    !netdev->devlink_port) -		return -EOPNOTSUPP; -  	ret = sysfs_rtnl_lock(&dev->kobj, &attr->attr, netdev);  	if (ret)  		return ret; @@ -696,19 +683,11 @@ static ssize_t phys_switch_id_show(struct device *dev,  	struct netdev_phys_item_id ppid = { };  	ssize_t ret; -	/* The checks are also done in dev_get_phys_port_name; this helps -	 * returning early without hitting the locking section below. This works -	 * because recurse is false when calling dev_get_port_parent_id. -	 */ -	if (!netdev->netdev_ops->ndo_get_port_parent_id && -	    !netdev->devlink_port) -		return -EOPNOTSUPP; -  	ret = sysfs_rtnl_lock(&dev->kobj, &attr->attr, netdev);  	if (ret)  		return ret; -	ret = dev_get_port_parent_id(netdev, &ppid, false); +	ret = netif_get_port_parent_id(netdev, &ppid, false);  	if (!ret)  		ret = sysfs_emit(buf, "%*phN\n", ppid.id_len, ppid.id); @@ -718,6 +697,40 @@ static ssize_t phys_switch_id_show(struct device *dev,  }  static DEVICE_ATTR_RO(phys_switch_id); +static struct attribute *netdev_phys_attrs[] __ro_after_init = { +	&dev_attr_phys_port_id.attr, +	&dev_attr_phys_port_name.attr, +	&dev_attr_phys_switch_id.attr, +	NULL, +}; + +static umode_t netdev_phys_is_visible(struct kobject *kobj, +				      struct attribute *attr, int index) +{ +	struct device *dev = kobj_to_dev(kobj); +	struct net_device *netdev = to_net_dev(dev); + +	if (attr == &dev_attr_phys_port_id.attr) { +		if (!netdev->netdev_ops->ndo_get_phys_port_id) +			return 0; +	} else if (attr == &dev_attr_phys_port_name.attr) { +		if (!netdev->netdev_ops->ndo_get_phys_port_name && +		    !netdev->devlink_port) +			return 0; +	} else if (attr == &dev_attr_phys_switch_id.attr) { +		if (!netdev->netdev_ops->ndo_get_port_parent_id && +		    !netdev->devlink_port) +			return 0; +	} + +	return attr->mode; +} + +static const struct attribute_group netdev_phys_group = { +	.attrs = netdev_phys_attrs, +	.is_visible = netdev_phys_is_visible, +}; +  static ssize_t threaded_show(struct device *dev,  			     struct device_attribute *attr, char *buf)  { @@ -744,7 +757,7 @@ static int modify_napi_threaded(struct net_device *dev, unsigned long val)  	if (val != 0 && val != 1)  		return -EOPNOTSUPP; -	ret = dev_set_threaded(dev, val); +	ret = netif_set_threaded(dev, val);  	return ret;  } @@ -783,9 +796,6 @@ static struct attribute *net_class_attrs[] __ro_after_init = {  	&dev_attr_tx_queue_len.attr,  	&dev_attr_gro_flush_timeout.attr,  	&dev_attr_napi_defer_hard_irqs.attr, -	&dev_attr_phys_port_id.attr, -	&dev_attr_phys_port_name.attr, -	&dev_attr_phys_switch_id.attr,  	&dev_attr_proto_down.attr,  	&dev_attr_carrier_up_count.attr,  	&dev_attr_carrier_down_count.attr, @@ -1200,12 +1210,21 @@ static int rx_queue_default_mask(struct net_device *dev,  				 struct netdev_rx_queue *queue)  {  #if IS_ENABLED(CONFIG_RPS) && IS_ENABLED(CONFIG_SYSCTL) -	struct cpumask *rps_default_mask = READ_ONCE(dev_net(dev)->core.rps_default_mask); +	struct cpumask *rps_default_mask; +	int res = 0; +	mutex_lock(&rps_default_mask_mutex); + +	rps_default_mask = dev_net(dev)->core.rps_default_mask;  	if (rps_default_mask && !cpumask_empty(rps_default_mask)) -		return netdev_rx_queue_set_rps_mask(queue, rps_default_mask); -#endif +		res = netdev_rx_queue_set_rps_mask(queue, rps_default_mask); + +	mutex_unlock(&rps_default_mask_mutex); + +	return res; +#else  	return 0; +#endif  }  static int rx_queue_add_kobject(struct net_device *dev, int index) @@ -2328,6 +2347,7 @@ int netdev_register_kobject(struct net_device *ndev)  		groups++;  	*groups++ = &netstat_group; +	*groups++ = &netdev_phys_group;  	if (wireless_group_needed(ndev))  		*groups++ = &wireless_group; | 
