Drivers: hv: vmbus: Further improve CPU affiliation logic
authorDexuan Cui <decui@microsoft.com>
Wed, 5 Aug 2015 07:52:39 +0000 (00:52 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Aug 2015 18:44:28 +0000 (11:44 -0700)
Keep track of CPU affiliations of sub-channels within the scope of the primary
channel. This will allow us to better distribute the load amongst available
CPUs.

Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel_mgmt.c
include/linux/hyperv.h

index 39c5afc7970c1f525b077b8965508aa7e512f9b0..2f9aead4ecfc0e696d1fe4f3c8d8fdddbe9e49fc 100644 (file)
@@ -448,8 +448,24 @@ static void init_vp_index(struct vmbus_channel *channel, const uuid_le *type_gui
        cpumask_xor(&available_mask, alloced_mask,
                    cpumask_of_node(primary->numa_node));
 
-       cur_cpu = cpumask_next(-1, &available_mask);
-       cpumask_set_cpu(cur_cpu, alloced_mask);
+       cur_cpu = -1;
+       while (true) {
+               cur_cpu = cpumask_next(cur_cpu, &available_mask);
+               if (cur_cpu >= nr_cpu_ids) {
+                       cur_cpu = -1;
+                       cpumask_copy(&available_mask,
+                                    cpumask_of_node(primary->numa_node));
+                       continue;
+               }
+
+               if (!cpumask_test_cpu(cur_cpu,
+                               &primary->alloced_cpus_in_node)) {
+                       cpumask_set_cpu(cur_cpu,
+                                       &primary->alloced_cpus_in_node);
+                       cpumask_set_cpu(cur_cpu, alloced_mask);
+                       break;
+               }
+       }
 
        channel->target_cpu = cur_cpu;
        channel->target_vp = hv_context.vp_index[cur_cpu];
index 5a3df5a47c8f40a795e06ada1b230654a714bbce..54733d5b503e091e01825c8fd195d1173db92ef3 100644 (file)
@@ -699,6 +699,7 @@ struct vmbus_channel {
        /*
         * State to manage the CPU affiliation of channels.
         */
+       struct cpumask alloced_cpus_in_node;
        int numa_node;
        /*
         * Support for sub-channels. For high performance devices,