mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Drivers: hv: vmbus: Fix a Host signaling bug
Currently we have two policies for deciding when to signal the host: One based on the ring buffer state and the other based on what the VMBUS client driver wants to do. Consider the case when the client wants to explicitly control when to signal the host. In this case, if the client were to defer signaling, we will not be able to signal the host subsequently when the client does want to signal since the ring buffer state will prevent the signaling. Implement logic to have only one signaling policy in force for a given channel. Signed-off-by: K. Y. Srinivasan <[email protected]> Reviewed-by: Haiyang Zhang <[email protected]> Tested-by: Haiyang Zhang <[email protected]> Cc: <[email protected]> # v4.2+ Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
40f26f3168
commit
8599846d73
2 changed files with 36 additions and 0 deletions
|
|
@ -653,10 +653,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
|
|||
* on the ring. We will not signal if more data is
|
||||
* to be placed.
|
||||
*
|
||||
* Based on the channel signal state, we will decide
|
||||
* which signaling policy will be applied.
|
||||
*
|
||||
* If we cannot write to the ring-buffer; signal the host
|
||||
* even if we may not have written anything. This is a rare
|
||||
* enough condition that it should not matter.
|
||||
*/
|
||||
|
||||
if (channel->signal_policy)
|
||||
signal = true;
|
||||
else
|
||||
kick_q = true;
|
||||
|
||||
if (((ret == 0) && kick_q && signal) || (ret))
|
||||
vmbus_setevent(channel);
|
||||
|
||||
|
|
@ -756,10 +765,19 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
|
|||
* on the ring. We will not signal if more data is
|
||||
* to be placed.
|
||||
*
|
||||
* Based on the channel signal state, we will decide
|
||||
* which signaling policy will be applied.
|
||||
*
|
||||
* If we cannot write to the ring-buffer; signal the host
|
||||
* even if we may not have written anything. This is a rare
|
||||
* enough condition that it should not matter.
|
||||
*/
|
||||
|
||||
if (channel->signal_policy)
|
||||
signal = true;
|
||||
else
|
||||
kick_q = true;
|
||||
|
||||
if (((ret == 0) && kick_q && signal) || (ret))
|
||||
vmbus_setevent(channel);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue