From 7095a53d320f8b409bc8f6a844d97bebfe0f7ca3 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Sat, 1 Dec 2012 06:46:32 -0800 Subject: [PATCH] --- yaml --- r: 354975 b: refs/heads/master c: 6fdf3b21433e901dcba0ac186f00d604ce944f56 h: refs/heads/master i: 354973: dc8867f68486ab963c4ea3a8eccfff44106e0000 354971: 9c6ed27c391862801d5cb045ec3364ca27d16d22 354967: 7ba0716d804c6a7a3c2ce0312d56cdb444fb5cca 354959: a3ed94f9073f7658d5101b5c53e54df52701e36d 354943: c6895ebc13914748f5340350994c4020ba3cc58b v: v3 --- [refs] | 2 +- trunk/drivers/hv/hyperv_vmbus.h | 4 ++++ trunk/drivers/hv/ring_buffer.c | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ab0d486b4d52..e3ef283c86b3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0bffd25ce919f88ea6473150b66d26e7fa5712af +refs/heads/master: 6fdf3b21433e901dcba0ac186f00d604ce944f56 diff --git a/trunk/drivers/hv/hyperv_vmbus.h b/trunk/drivers/hv/hyperv_vmbus.h index d8d1fadb398a..3184f6ff4e74 100644 --- a/trunk/drivers/hv/hyperv_vmbus.h +++ b/trunk/drivers/hv/hyperv_vmbus.h @@ -570,6 +570,10 @@ u32 hv_get_ringbuffer_interrupt_mask(struct hv_ring_buffer_info *ring_info); void hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info, struct hv_ring_buffer_debug_info *debug_info); +void hv_begin_read(struct hv_ring_buffer_info *rbi); + +u32 hv_end_read(struct hv_ring_buffer_info *rbi); + /* * Maximum channels is determined by the size of the interrupt page * which is PAGE_SIZE. 1/2 of PAGE_SIZE is for send endpoint interrupt diff --git a/trunk/drivers/hv/ring_buffer.c b/trunk/drivers/hv/ring_buffer.c index 7233c88f01b8..001079287709 100644 --- a/trunk/drivers/hv/ring_buffer.c +++ b/trunk/drivers/hv/ring_buffer.c @@ -29,6 +29,30 @@ #include "hyperv_vmbus.h" +void hv_begin_read(struct hv_ring_buffer_info *rbi) +{ + rbi->ring_buffer->interrupt_mask = 1; + smp_mb(); +} + +u32 hv_end_read(struct hv_ring_buffer_info *rbi) +{ + u32 read; + u32 write; + + rbi->ring_buffer->interrupt_mask = 0; + smp_mb(); + + /* + * Now check to see if the ring buffer is still empty. + * If it is not, we raced and we need to process new + * incoming messages. + */ + hv_get_ringbuffer_availbytes(rbi, &read, &write); + + return read; +} + /* * hv_get_next_write_location()