netvsc: change max channel calculation
authorstephen hemminger <stephen@networkplumber.org>
Wed, 22 Mar 2017 21:50:59 +0000 (14:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Mar 2017 02:38:56 +0000 (19:38 -0700)
The default number of maximum channels should be limited to the
number of cpus available on the numa node of the primary channel.
This also makes sure maximum channels <= num_online_cpus

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c

index b3a7f508434b26c2bde85d6b994949b615b981c8..2f9de2e9f38e93464676fae4c12ac8f81dca2ad5 100644 (file)
@@ -1503,8 +1503,7 @@ static int netvsc_probe(struct hv_device *dev,
        /* Notify the netvsc driver of the new device */
        memset(&device_info, 0, sizeof(device_info));
        device_info.ring_size = ring_size;
-       device_info.max_num_vrss_chns = min_t(u32, VRSS_CHANNEL_DEFAULT,
-                                             num_online_cpus());
+       device_info.num_chn = VRSS_CHANNEL_DEFAULT;
        ret = rndis_filter_device_add(dev, &device_info);
        if (ret != 0) {
                netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
index 382b9a62e3c4ae9189b951e4bb4401864d409c97..d193d549cec667633817ff21b0d4bb1ca32bc15a 100644 (file)
@@ -1181,33 +1181,28 @@ int rndis_filter_device_add(struct hv_device *dev,
        if (ret || rsscap.num_recv_que < 2)
                goto out;
 
-       net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, rsscap.num_recv_que);
-
-       num_rss_qs = min(device_info->max_num_vrss_chns, net_device->max_chn);
-
        /*
         * We will limit the VRSS channels to the number CPUs in the NUMA node
         * the primary channel is currently bound to.
+        *
+        * This also guarantees that num_possible_rss_qs <= num_online_cpus
         */
        node_cpu_mask = cpumask_of_node(cpu_to_node(dev->channel->target_cpu));
-       num_possible_rss_qs = cpumask_weight(node_cpu_mask);
+       num_possible_rss_qs = min_t(u32, cpumask_weight(node_cpu_mask),
+                                   rsscap.num_recv_que);
 
-       /* We will use the given number of channels if available. */
-       if (device_info->num_chn && device_info->num_chn < net_device->max_chn)
-               net_device->num_chn = device_info->num_chn;
-       else
-               net_device->num_chn = min(num_possible_rss_qs, num_rss_qs);
+       net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
 
-       num_rss_qs = net_device->num_chn - 1;
+       /* We will use the given number of channels if available. */
+       net_device->num_chn = min(net_device->max_chn, device_info->num_chn);
 
        for (i = 0; i < ITAB_NUM; i++)
                rndis_device->ind_table[i] = ethtool_rxfh_indir_default(i,
                                                        net_device->num_chn);
 
-       net_device->num_sc_offered = num_rss_qs;
-
-       if (net_device->num_chn == 1)
-               goto out;
+       num_rss_qs = net_device->num_chn - 1;
+       if (num_rss_qs == 0)
+               return 0;
 
        vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);