aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2015-03-18 15:29:30 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-25 06:53:55 -0400
commit5f5cc81733baf7b67a039a931dae282e53bf97b9 (patch)
treea78bbd36307cbc869ad8d7ef2883f710b917d18f /drivers/hv
parentb3a19b36ad7450d4c8caeb7d9f623af3da32a578 (diff)
Drivers: hv: vmbus: Fix a siganlling host signalling issue
Handle the case when the write to the ringbuffer fails. In this case, unconditionally signal the host. Since we may have deferred signalling the host based on the kick_q parameter, signalling the host unconditionally in this case deals with the issue. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r--drivers/hv/channel.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index fddd3b5e59a9..54da66dc7d16 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -611,7 +611,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
611 611
612 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 612 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);
613 613
614 if ((ret == 0) && kick_q && signal) 614 /*
615 * Signalling the host is conditional on many factors:
616 * 1. The ring state changed from being empty to non-empty.
617 * This is tracked by the variable "signal".
618 * 2. The variable kick_q tracks if more data will be placed
619 * on the ring. We will not signal if more data is
620 * to be placed.
621 *
622 * If we cannot write to the ring-buffer; signal the host
623 * even if we may not have written anything. This is a rare
624 * enough condition that it should not matter.
625 */
626 if (((ret == 0) && kick_q && signal) || (ret))
615 vmbus_setevent(channel); 627 vmbus_setevent(channel);
616 628
617 return ret; 629 return ret;
@@ -702,7 +714,19 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
702 714
703 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal); 715 ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, &signal);
704 716
705 if ((ret == 0) && kick_q && signal) 717 /*
718 * Signalling the host is conditional on many factors:
719 * 1. The ring state changed from being empty to non-empty.
720 * This is tracked by the variable "signal".
721 * 2. The variable kick_q tracks if more data will be placed
722 * on the ring. We will not signal if more data is
723 * to be placed.
724 *
725 * If we cannot write to the ring-buffer; signal the host
726 * even if we may not have written anything. This is a rare
727 * enough condition that it should not matter.
728 */
729 if (((ret == 0) && kick_q && signal) || (ret))
706 vmbus_setevent(channel); 730 vmbus_setevent(channel);
707 731
708 return ret; 732 return ret;