From 466ce3b487b74d999e9329ebe25e6b85390be1c9 Mon Sep 17 00:00:00 2001 From: Alexander Duyck Date: Thu, 10 Jan 2013 08:57:17 +0000 Subject: [PATCH] --- yaml --- r: 351343 b: refs/heads/master c: 10cdc3f3cd541bfeaaf1c6e1710b1500ca19aa7f h: refs/heads/master i: 351341: 02ec9e701dbea5ad28fe2fcb2279c91b92498510 351339: 2ee764b2a195cd7c145c06d6b6b8918b3f1c6629 351335: 3f1c651f1596ad7823a4063af2b9a20300ce8dd3 351327: df5cafbe600c6a06ca02f201ccebd48855f1d012 v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 56 ++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/[refs] b/[refs] index 07f2b29ce7b7..890387ecdb92 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 537c00de1c9ba9876b91d869e84caceefe2b8bf9 +refs/heads/master: 10cdc3f3cd541bfeaaf1c6e1710b1500ca19aa7f diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 257b29516f69..231de8738149 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -1862,45 +1862,55 @@ static DEFINE_MUTEX(xps_map_mutex); #define xmap_dereference(P) \ rcu_dereference_protected((P), lockdep_is_held(&xps_map_mutex)) -void netif_reset_xps_queue(struct net_device *dev, u16 index) +static struct xps_map *remove_xps_queue(struct xps_dev_maps *dev_maps, + int cpu, u16 index) { - struct xps_dev_maps *dev_maps; - struct xps_map *map; - int i, pos, nonempty = 0; - - mutex_lock(&xps_map_mutex); - dev_maps = xmap_dereference(dev->xps_maps); - - if (!dev_maps) - goto out_no_maps; + struct xps_map *map = NULL; + int pos; - for_each_possible_cpu(i) { - map = xmap_dereference(dev_maps->cpu_map[i]); - if (!map) - continue; - - for (pos = 0; pos < map->len; pos++) - if (map->queues[pos] == index) - break; + if (dev_maps) + map = xmap_dereference(dev_maps->cpu_map[cpu]); - if (pos < map->len) { + for (pos = 0; map && pos < map->len; pos++) { + if (map->queues[pos] == index) { if (map->len > 1) { map->queues[pos] = map->queues[--map->len]; } else { - RCU_INIT_POINTER(dev_maps->cpu_map[i], NULL); + RCU_INIT_POINTER(dev_maps->cpu_map[cpu], NULL); kfree_rcu(map, rcu); map = NULL; } + break; } - if (map) - nonempty = 1; } - if (!nonempty) { + return map; +} + +void netif_reset_xps_queue(struct net_device *dev, u16 index) +{ + struct xps_dev_maps *dev_maps; + int cpu; + bool active = false; + + mutex_lock(&xps_map_mutex); + dev_maps = xmap_dereference(dev->xps_maps); + + if (!dev_maps) + goto out_no_maps; + + for_each_possible_cpu(cpu) { + if (remove_xps_queue(dev_maps, cpu, index)) + active = true; + } + + if (!active) { RCU_INIT_POINTER(dev->xps_maps, NULL); kfree_rcu(dev_maps, rcu); } + netdev_queue_numa_node_write(netdev_get_tx_queue(dev, index), + NUMA_NO_NODE); out_no_maps: mutex_unlock(&xps_map_mutex); }