From: Long Li <longli@xxxxxxxxxxxxx> Hyper-v host guarantees that a hypercall will succeed. Retry infinitely to avoid returning transient failures to upper layer. Signed-off-by: Long Li <longli@xxxxxxxxxxxxx> --- drivers/hv/connection.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 6ce8b87..4bcb099 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -439,7 +439,6 @@ int vmbus_post_msg(void *buffer, size_t buflen) { union hv_connection_id conn_id; int ret = 0; - int retries = 0; u32 usec = 1; conn_id.asu32 = 0; @@ -447,10 +446,10 @@ int vmbus_post_msg(void *buffer, size_t buflen) /* * hv_post_message() can have transient failures because of - * insufficient resources. Retry the operation a couple of - * times before giving up. + * insufficient resources. We retry infinitely on these failures + * because host guarantees hypercall will eventually succeed. */ - while (retries < 20) { + while (1) { ret = hv_post_message(conn_id, 1, buffer, buflen); switch (ret) { @@ -459,11 +458,11 @@ int vmbus_post_msg(void *buffer, size_t buflen) * We could get this if we send messages too * frequently. */ - ret = -EAGAIN; - break; case HV_STATUS_INSUFFICIENT_MEMORY: case HV_STATUS_INSUFFICIENT_BUFFERS: - ret = -ENOMEM; + /* + * Temporary failure out of resources + */ break; case HV_STATUS_SUCCESS: return ret; @@ -472,12 +471,12 @@ int vmbus_post_msg(void *buffer, size_t buflen) return -EINVAL; } - retries++; udelay(usec); if (usec < 2048) usec *= 2; } - return ret; + /* Impossible to get here */ + BUG_ON(1); } /* -- 2.7.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel