Drivers: hv: vmbus: Allocate ring buffer memory in NUMA aware fashion
authorK. Y. Srinivasan <kys@microsoft.com>
Mon, 1 Jun 2015 04:27:03 +0000 (21:27 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 12 Jun 2015 23:58:33 +0000 (16:58 -0700)
Allocate ring buffer memory from the NUMA node assigned to the channel.
Since this is a performance and not a correctness issue, if the node specific
allocation were to fail, fall back and allocate without specifying the node.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel.c

index 7a1c2db1826be183f0c8803772e4b048a6589bbb..603ce97e9027283044b5da16ed15436a7ddcd3af 100644 (file)
@@ -73,6 +73,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
        unsigned long flags;
        int ret, err = 0;
        unsigned long t;
+       struct page *page;
 
        spin_lock_irqsave(&newchannel->lock, flags);
        if (newchannel->state == CHANNEL_OPEN_STATE) {
@@ -87,8 +88,17 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
        newchannel->channel_callback_context = context;
 
        /* Allocate the ring buffer */
-       out = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
-               get_order(send_ringbuffer_size + recv_ringbuffer_size));
+       page = alloc_pages_node(cpu_to_node(newchannel->target_cpu),
+                               GFP_KERNEL|__GFP_ZERO,
+                               get_order(send_ringbuffer_size +
+                               recv_ringbuffer_size));
+
+       if (!page)
+               out = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
+                                              get_order(send_ringbuffer_size +
+                                              recv_ringbuffer_size));
+       else
+               out = (void *)page_address(page);
 
        if (!out) {
                err = -ENOMEM;