diff options
author | Haiyang Zhang <haiyangz@microsoft.com> | 2015-03-27 12:10:14 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-04-03 10:18:02 -0400 |
commit | e1c0d82dab4a4605d3bd1968436f030dfed4a829 (patch) | |
tree | a56cd6795efdc91310c013a6bb4621947cb937c7 | |
parent | 0a1a86ac046091d7228c9f3a283dea5be96275dd (diff) |
hv_vmbus: Add gradually increased delay for retries in vmbus_post_msg()
Most of the retries can be done within a millisecond successfully, so we
sleep 1ms before the first retry, then gradually increase the retry
interval to 2^n with max value of 2048ms. Doing so, we will have shorter
overall delay time, because most of the cases succeed within 1-2 attempts.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/hv/connection.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 583d7d42b46d..b27220a425f4 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c | |||
@@ -422,6 +422,7 @@ int vmbus_post_msg(void *buffer, size_t buflen) | |||
422 | union hv_connection_id conn_id; | 422 | union hv_connection_id conn_id; |
423 | int ret = 0; | 423 | int ret = 0; |
424 | int retries = 0; | 424 | int retries = 0; |
425 | u32 msec = 1; | ||
425 | 426 | ||
426 | conn_id.asu32 = 0; | 427 | conn_id.asu32 = 0; |
427 | conn_id.u.id = VMBUS_MESSAGE_CONNECTION_ID; | 428 | conn_id.u.id = VMBUS_MESSAGE_CONNECTION_ID; |
@@ -431,7 +432,7 @@ int vmbus_post_msg(void *buffer, size_t buflen) | |||
431 | * insufficient resources. Retry the operation a couple of | 432 | * insufficient resources. Retry the operation a couple of |
432 | * times before giving up. | 433 | * times before giving up. |
433 | */ | 434 | */ |
434 | while (retries < 10) { | 435 | while (retries < 20) { |
435 | ret = hv_post_message(conn_id, 1, buffer, buflen); | 436 | ret = hv_post_message(conn_id, 1, buffer, buflen); |
436 | 437 | ||
437 | switch (ret) { | 438 | switch (ret) { |
@@ -454,7 +455,9 @@ int vmbus_post_msg(void *buffer, size_t buflen) | |||
454 | } | 455 | } |
455 | 456 | ||
456 | retries++; | 457 | retries++; |
457 | msleep(1000); | 458 | msleep(msec); |
459 | if (msec < 2048) | ||
460 | msec *= 2; | ||
458 | } | 461 | } |
459 | return ret; | 462 | return ret; |
460 | } | 463 | } |