Skip to content

Commit

Permalink
net: Add support for XPS without sysfs being defined
Browse files Browse the repository at this point in the history
This patch makes it so that we can support transmit packet steering without
sysfs needing to be enabled.  The reason for making this change is to make
it so that a driver can make use of the XPS even while the sysfs portion of
the interface is not present.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Jan 11, 2013
1 parent 01c5f86 commit 024e967
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 22 deletions.
1 change: 0 additions & 1 deletion include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -2104,7 +2104,6 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
}

#ifdef CONFIG_XPS
extern void netif_reset_xps_queue(struct net_device *dev, u16 index);
extern int netif_set_xps_queue(struct net_device *dev, struct cpumask *mask,
u16 index);
#else
Expand Down
2 changes: 1 addition & 1 deletion net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ config RFS_ACCEL

config XPS
boolean
depends on SMP && SYSFS && USE_GENERIC_SMP_HELPERS
depends on SMP && USE_GENERIC_SMP_HELPERS
default y

config NETPRIO_CGROUP
Expand Down
26 changes: 20 additions & 6 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1887,10 +1887,10 @@ static struct xps_map *remove_xps_queue(struct xps_dev_maps *dev_maps,
return map;
}

void netif_reset_xps_queue(struct net_device *dev, u16 index)
static void netif_reset_xps_queues_gt(struct net_device *dev, u16 index)
{
struct xps_dev_maps *dev_maps;
int cpu;
int cpu, i;
bool active = false;

mutex_lock(&xps_map_mutex);
Expand All @@ -1900,7 +1900,11 @@ void netif_reset_xps_queue(struct net_device *dev, u16 index)
goto out_no_maps;

for_each_possible_cpu(cpu) {
if (remove_xps_queue(dev_maps, cpu, index))
for (i = index; i < dev->num_tx_queues; i++) {
if (!remove_xps_queue(dev_maps, cpu, i))
break;
}
if (i == dev->num_tx_queues)
active = true;
}

Expand All @@ -1909,8 +1913,10 @@ void netif_reset_xps_queue(struct net_device *dev, u16 index)
kfree_rcu(dev_maps, rcu);
}

netdev_queue_numa_node_write(netdev_get_tx_queue(dev, index),
NUMA_NO_NODE);
for (i = index; i < dev->num_tx_queues; i++)
netdev_queue_numa_node_write(netdev_get_tx_queue(dev, i),
NUMA_NO_NODE);

out_no_maps:
mutex_unlock(&xps_map_mutex);
}
Expand Down Expand Up @@ -2096,8 +2102,12 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
if (dev->num_tc)
netif_setup_tc(dev, txq);

if (txq < dev->real_num_tx_queues)
if (txq < dev->real_num_tx_queues) {
qdisc_reset_all_tx_gt(dev, txq);
#ifdef CONFIG_XPS
netif_reset_xps_queues_gt(dev, txq);
#endif
}
}

dev->real_num_tx_queues = txq;
Expand Down Expand Up @@ -5919,6 +5929,10 @@ static void rollback_registered_many(struct list_head *head)

/* Remove entries from kobject tree */
netdev_unregister_kobject(dev);
#ifdef CONFIG_XPS
/* Remove XPS queueing entries */
netif_reset_xps_queues_gt(dev, 0);
#endif
}

synchronize_net();
Expand Down
14 changes: 0 additions & 14 deletions net/core/net-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,16 +1002,6 @@ static ssize_t show_xps_map(struct netdev_queue *queue,
return len;
}

static void xps_queue_release(struct netdev_queue *queue)
{
struct net_device *dev = queue->dev;
unsigned long index;

index = get_netdev_queue_index(queue);

netif_reset_xps_queue(dev, index);
}

static ssize_t store_xps_map(struct netdev_queue *queue,
struct netdev_queue_attribute *attribute,
const char *buf, size_t len)
Expand Down Expand Up @@ -1058,10 +1048,6 @@ static void netdev_queue_release(struct kobject *kobj)
{
struct netdev_queue *queue = to_netdev_queue(kobj);

#ifdef CONFIG_XPS
xps_queue_release(queue);
#endif

memset(kobj, 0, sizeof(*kobj));
dev_put(queue->dev);
}
Expand Down

0 comments on commit 024e967

Please sign in to comment.