The patch below doesn't apply to the .32 stable kernel. Can someone provide me a backport that I can use for that stable kernel release?
thanks, greg k-h On Thu, Apr 07, 2011 at 09:59:29AM -0700, Greg Kroah-Hartman wrote: > From: Olaf Hering <[email protected]> > > 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. > > Signed-off-by: Olaf Hering <[email protected]> > Cc: stable <[email protected]> > Acked-by: Haiyang Zhang <[email protected]> > Acked-by: Hank Janssen <[email protected]> > Signed-off-by: Greg Kroah-Hartman <[email protected]> > --- > 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(-) > > diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c > index 775a52a..f7ce7d2 100644 > --- a/drivers/staging/hv/channel.c > +++ b/drivers/staging/hv/channel.c > @@ -81,14 +81,14 @@ static void vmbus_setevent(struct vmbus_channel *channel) > > 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(struct vmbus_channel > *channel) > > if (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(struct vmbus_channel > *channel) > 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); > } > diff --git a/drivers/staging/hv/connection.c b/drivers/staging/hv/connection.c > index 44b203b..afc8116 100644 > --- a/drivers/staging/hv/connection.c > +++ b/drivers/staging/hv/connection.c > @@ -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_t buflen) > int 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)); > > diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c > index b473f46..79089f8 100644 > --- a/drivers/staging/hv/vmbus_drv.c > +++ b/drivers/staging/hv/vmbus_drv.c > @@ -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; > } > diff --git a/drivers/staging/hv/vmbus_private.h > b/drivers/staging/hv/vmbus_private.h > index ca050a4..6f0d8df 100644 > --- a/drivers/staging/hv/vmbus_private.h > +++ b/drivers/staging/hv/vmbus_private.h > @@ -31,6 +31,7 @@ > #include "channel_mgmt.h" > #include "ring_buffer.h" > #include <linux/list.h> > +#include <asm/sync_bitops.h> > > > /* > -- > 1.7.4.2 > > _______________________________________________ > stable mailing list > [email protected] > http://linux.kernel.org/mailman/listinfo/stable _______________________________________________ stable mailing list [email protected] http://linux.kernel.org/mailman/listinfo/stable
