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

Reply via email to