Skip to content

Commit 52a42c2

Browse files
shemmingergregkh
authored andcommitted
vmbus: keep pointer to ring buffer page
Avoid going from struct page to virt address (and back) by just keeping pointer to the allocated pages instead of virt address. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 800b932 commit 52a42c2

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

drivers/hv/channel.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
9191
unsigned long flags;
9292
int ret, err = 0;
9393
struct page *page;
94+
unsigned int order;
9495

9596
if (send_ringbuffer_size % PAGE_SIZE ||
9697
recv_ringbuffer_size % PAGE_SIZE)
9798
return -EINVAL;
9899

100+
order = get_order(send_ringbuffer_size + recv_ringbuffer_size);
101+
99102
spin_lock_irqsave(&newchannel->lock, flags);
100103
if (newchannel->state == CHANNEL_OPEN_STATE) {
101104
newchannel->state = CHANNEL_OPENING_STATE;
@@ -110,21 +113,17 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
110113

111114
/* Allocate the ring buffer */
112115
page = alloc_pages_node(cpu_to_node(newchannel->target_cpu),
113-
GFP_KERNEL|__GFP_ZERO,
114-
get_order(send_ringbuffer_size +
115-
recv_ringbuffer_size));
116+
GFP_KERNEL|__GFP_ZERO, order);
116117

117118
if (!page)
118-
page = alloc_pages(GFP_KERNEL|__GFP_ZERO,
119-
get_order(send_ringbuffer_size +
120-
recv_ringbuffer_size));
119+
page = alloc_pages(GFP_KERNEL|__GFP_ZERO, order);
121120

122121
if (!page) {
123122
err = -ENOMEM;
124123
goto error_set_chnstate;
125124
}
126125

127-
newchannel->ringbuffer_pages = page_address(page);
126+
newchannel->ringbuffer_page = page;
128127
newchannel->ringbuffer_pagecount = (send_ringbuffer_size +
129128
recv_ringbuffer_size) >> PAGE_SHIFT;
130129

@@ -239,8 +238,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
239238
error_free_pages:
240239
hv_ringbuffer_cleanup(&newchannel->outbound);
241240
hv_ringbuffer_cleanup(&newchannel->inbound);
242-
__free_pages(page,
243-
get_order(send_ringbuffer_size + recv_ringbuffer_size));
241+
__free_pages(page, order);
244242
error_set_chnstate:
245243
newchannel->state = CHANNEL_OPEN_STATE;
246244
return err;
@@ -658,8 +656,8 @@ static int vmbus_close_internal(struct vmbus_channel *channel)
658656
hv_ringbuffer_cleanup(&channel->outbound);
659657
hv_ringbuffer_cleanup(&channel->inbound);
660658

661-
free_pages((unsigned long)channel->ringbuffer_pages,
662-
get_order(channel->ringbuffer_pagecount * PAGE_SIZE));
659+
__free_pages(channel->ringbuffer_page,
660+
get_order(channel->ringbuffer_pagecount << PAGE_SHIFT));
663661

664662
out:
665663
return ret;

drivers/uio/uio_hv_generic.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,12 @@ static int hv_uio_ring_mmap(struct file *filp, struct kobject *kobj,
130130
= container_of(kobj, struct vmbus_channel, kobj);
131131
struct hv_device *dev = channel->primary_channel->device_obj;
132132
u16 q_idx = channel->offermsg.offer.sub_channel_index;
133+
void *ring_buffer = page_address(channel->ringbuffer_page);
133134

134135
dev_dbg(&dev->device, "mmap channel %u pages %#lx at %#lx\n",
135136
q_idx, vma_pages(vma), vma->vm_pgoff);
136137

137-
return vm_iomap_memory(vma, virt_to_phys(channel->ringbuffer_pages),
138+
return vm_iomap_memory(vma, virt_to_phys(ring_buffer),
138139
channel->ringbuffer_pagecount << PAGE_SHIFT);
139140
}
140141

@@ -223,7 +224,7 @@ hv_uio_probe(struct hv_device *dev,
223224
/* mem resources */
224225
pdata->info.mem[TXRX_RING_MAP].name = "txrx_rings";
225226
pdata->info.mem[TXRX_RING_MAP].addr
226-
= (uintptr_t)dev->channel->ringbuffer_pages;
227+
= (uintptr_t)page_address(dev->channel->ringbuffer_page);
227228
pdata->info.mem[TXRX_RING_MAP].size
228229
= dev->channel->ringbuffer_pagecount << PAGE_SHIFT;
229230
pdata->info.mem[TXRX_RING_MAP].memtype = UIO_MEM_LOGICAL;

include/linux/hyperv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ struct vmbus_channel {
739739
u32 ringbuffer_gpadlhandle;
740740

741741
/* Allocated memory for ring buffer */
742-
void *ringbuffer_pages;
742+
struct page *ringbuffer_page;
743743
u32 ringbuffer_pagecount;
744744
struct hv_ring_buffer_info outbound; /* send to parent */
745745
struct hv_ring_buffer_info inbound; /* receive from parent */

0 commit comments

Comments
 (0)