mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Drivers: hv: vmbus: finally fix hv_need_to_signal_on_read()
Commita389fcfd2c
("Drivers: hv: vmbus: Fix signaling logic in hv_need_to_signal_on_read()") added the proper mb(), but removed the test "prev_write_sz < pending_sz" when making the signal decision. As a result, the guest can signal the host unnecessarily, and then the host can throttle the guest because the host thinks the guest is buggy or malicious; finally the user running stress test can perceive intermittent freeze of the guest. This patch brings back the test, and properly handles the in-place consumption APIs used by NetVSC (see get_next_pkt_raw(), put_pkt_raw() and commit_rd_index()). Fixes:a389fcfd2c
("Drivers: hv: vmbus: Fix signaling logic in hv_need_to_signal_on_read()") Signed-off-by: Dexuan Cui <decui@microsoft.com> Reported-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Tested-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: <stable@vger.kernel.org> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
191e885a2e
commit
433e19cf33
3 changed files with 37 additions and 2 deletions
|
@ -1295,6 +1295,9 @@ void netvsc_channel_cb(void *context)
|
|||
ndev = hv_get_drvdata(device);
|
||||
buffer = get_per_channel_state(channel);
|
||||
|
||||
/* commit_rd_index() -> hv_signal_on_read() needs this. */
|
||||
init_cached_read_index(channel);
|
||||
|
||||
do {
|
||||
desc = get_next_pkt_raw(channel);
|
||||
if (desc != NULL) {
|
||||
|
@ -1347,6 +1350,9 @@ void netvsc_channel_cb(void *context)
|
|||
|
||||
bufferlen = bytes_recvd;
|
||||
}
|
||||
|
||||
init_cached_read_index(channel);
|
||||
|
||||
} while (1);
|
||||
|
||||
if (bufferlen > NETVSC_PACKET_SIZE)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue