hv: use sync_bitops when interacting with the hypervisor
PATCH 1/1 hv: use sync_bitops when interacting with the hypervisor
Locking is required when tweaking bits located in a shared page, use the sync_ version of bitops. Without this change vmbus_on_event() will miss events and as a result, vmbus_isr() will not schedule the receive tasklet.
--- drivers/staging/hv/channel.c | 8 ++++---- drivers/staging/hv/connection.c | 4 ++-- drivers/staging/hv/vmbus_drv.c | 2 +- drivers/staging/hv/vmbus_private.h | 1 + 4 files changed, 8 insertions(+), 7 deletions(-)
drivers/staging/hv/channel.c +4 -4
@@ -81,14 +81,14 @@ static void vmbus_setevent(struct vmbus_if (channel->offermsg.monitor_allocated) {/* Each u32 represents 32 channels */ -set_bit (channel->offermsg.child_relid &31 , +sync_set_bit (channel->offermsg.child_relid &31 , (unsigned long *) vmbus_connection.send_int_page + (channel->offermsg.child_relid >>5 )); monitorpage = vmbus_connection.monitor_pages; monitorpage++;/* Get the child to parent monitor page */ -set_bit (channel->monitor_bit, +sync_set_bit (channel->monitor_bit, (unsigned long *)&monitorpage->trigger_group [channel->monitor_grp].pending);
@@ -104,7 +104,7 @@ static void VmbusChannelClearEvent(strucif (Channel->offermsg.monitor_allocated) {/* Each u32 represents 32 channels */ -clear_bit (Channel->offermsg.child_relid &31 , +sync_clear_bit (Channel->offermsg.child_relid &31 , (unsigned long *)vmbus_connection.send_int_page + (Channel->offermsg.child_relid >>5 ));
@@ -112,7 +112,7 @@ static void VmbusChannelClearEvent(struc vmbus_connection.monitor_pages; monitorPage++;/* Get the child to parent monitor page */ -clear_bit (Channel->monitor_bit, +sync_clear_bit (Channel->monitor_bit, (unsigned long *)&monitorPage->trigger_group [Channel->monitor_grp].Pending); }
drivers/staging/hv/connection.c +2 -2
@@ -296,7 +296,7 @@ void vmbus_on_event(unsigned long data)for (dword =0 ; dword < maxdword; dword++) {if (recv_int_page[dword]) {for (bit =0 ; bit <32 ; bit++) { -if (test_and_clear_bit (bit, +if (sync_test_and_clear_bit (bit, (unsigned long *) &recv_int_page[dword])) { relid = (dword <<5 ) + bit;
@@ -338,7 +338,7 @@ int vmbus_post_msg(void *buffer, size_tint vmbus_set_event (u32 child_relid) {/* Each u32 represents 32 channels */ -set_bit (child_relid &31 , +sync_set_bit (child_relid &31 , (unsigned long *)vmbus_connection.send_int_page + (child_relid >>5 ));
drivers/staging/hv/vmbus_drv.c +1 -1
@@ -254,7 +254,7 @@ static int vmbus_on_isr(void) event = (union hv_synic_event_flags *)page_addr +VMBUS_MESSAGE_SINT ;/* Since we are a child, we only need to check bit 0 */ -if (test_and_clear_bit (0 , (unsigned long *) &event->flags32[0 ])) { +if (sync_test_and_clear_bit (0 , (unsigned long *) &event->flags32[0 ])) {DPRINT_DBG (VMBUS ,"received event %d" , event->flags32[0 ]); ret |=0x2 ; }
drivers/staging/hv/vmbus_private.h +1 -0
@@ -31,6 +31,7 @@#include "channel_mgmt.h" #include "ring_buffer.h" #include <linux/list.h> +#include <asm/sync_bitops.h> /*
Quoted 5 lines · Olaf Hering
Locking is required when tweaking bits located in a shared page, use the
sync_version of bitops. Without this changevmbus_on_event()will miss events and as a result,vmbus_isr()will not schedule the receive tasklet.Signed-off-by Olaf Hering <[email protected]>
Great! Can I get an Acked-by from Hank or Haiyang on this as well before I apply it?
thanks,
greg k-h
Quoted 7 lines
-----Original Message-----
From: Greg KH [mailto:[email protected]]Great! Can I get an Acked-by from Hank or Haiyang on this as well before I apply it?
Our testing team has verified Olaf's fix.
Thanks,
- Haiyang
Quoted 9 lines
-----Original Message-----
From: Haiyang Zhang
Sent: Monday, March 21, 2011 7:17 AM
To: Greg KH; Olaf Hering
Cc: Hank Janssen; [email protected]
Subject: RE: [PATCH] hv: usesync_bitopswhen interacting with the hypervisor
Quoted 8 lines
Quoted 4 lines
From: Greg KH [mailto:[email protected]]
Great! Can I get an Acked-by from Hank or Haiyang on this as well before I apply it?
Our testing team has verified Olaf's fix. Thanks,
Yep, it worked great. Thank you Olaf for doing this!
Hank.