]> git.hungrycats.org Git - linux/commit
Drivers: hv: vmbus: Raise retry/wait limits in vmbus_post_msg()
authorVitaly Kuznetsov <vkuznets@redhat.com>
Wed, 7 Dec 2016 09:16:24 +0000 (01:16 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 12 Mar 2017 05:44:14 +0000 (06:44 +0100)
commit0fd8c1cb80a1403aab4f36de85804c44666a486d
tree4b91bd7ec8c8a17e57e6d2095f51c32ea4e973a1
parent2c849a5c6a83721b4c64dfc1e6851c2c8042c54b
Drivers: hv: vmbus: Raise retry/wait limits in vmbus_post_msg()

commit c0bb03924f1a80e7f65900e36c8e6b3dc167c5f8 upstream.

DoS protection conditions were altered in WS2016 and now it's easy to get
-EAGAIN returned from vmbus_post_msg() (e.g. when we try changing MTU on a
netvsc device in a loop). All vmbus_post_msg() callers don't retry the
operation and we usually end up with a non-functional device or crash.

While host's DoS protection conditions are unknown to me my tests show that
it can take up to 10 seconds before the message is sent so doing udelay()
is not an option, we really need to sleep. Almost all vmbus_post_msg()
callers are ready to sleep but there is one special case:
vmbus_initiate_unload() which can be called from interrupt/NMI context and
we can't sleep there. I'm also not sure about the lonely
vmbus_send_tl_connect_request() which has no in-tree users but its external
users are most likely waiting for the host to reply so sleeping there is
also appropriate.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel.c
drivers/hv/channel_mgmt.c
drivers/hv/connection.c
drivers/hv/hyperv_vmbus.h