Messages in this thread | | | Date | Mon, 02 Feb 2015 09:49:16 +0008 | From | Jason Wang <> | Subject | Re: [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors |
| |
On Mon, Feb 2, 2015 at 12:36 PM, Dexuan Cui <decui@microsoft.com> wrote: > I got HV_STATUS_INVALID_CONNECTION_ID on Hyper-V 2008 R2 when keeping > running > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe > hv_utils" > in a Linux guest. Looks the host has some kind of throttling > mechanism if > some kinds of hypercalls are sent too frequently.
Better to clarify this kind of throttling. Looks like it only affects HVCALL_POST_MESSAGE. Other looks good.
Reviewed-by: Jason Wang <jasowang@redhat.com> > > Without the patch, the driver can occasionally fail to load. > > Also let's retry HV_STATUS_INSUFFICIENT_MEMORY, though we didn't get > it > before. > > Removed 'case -ENOMEM', since the hypervisor doesn't return this. > > CC: "K. Y. Srinivasan" <kys@microsoft.com> > Signed-off-by: Dexuan Cui <decui@microsoft.com> > --- > > v2: > updated the subject and changelog > on HV_STATUS_INVALID_CONNECTION_ID: ret = -EAGAIN; > added HV_STATUS_INSUFFICIENT_MEMORY > removed unreachable -ENOMEM > changed the delay from 100ms to 1000ms > > arch/x86/include/uapi/asm/hyperv.h | 2 ++ > drivers/hv/connection.c | 11 +++++++++-- > 2 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/uapi/asm/hyperv.h > b/arch/x86/include/uapi/asm/hyperv.h > index 90c458e..ce6068d 100644 > --- a/arch/x86/include/uapi/asm/hyperv.h > +++ b/arch/x86/include/uapi/asm/hyperv.h > @@ -225,6 +225,8 @@ > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > #define HV_STATUS_INVALID_ALIGNMENT 4 > +#define HV_STATUS_INSUFFICIENT_MEMORY 11 > +#define HV_STATUS_INVALID_CONNECTION_ID 18 > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 > > typedef struct _HV_REFERENCE_TSC_PAGE { > diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c > index c4acd1c..af2388f 100644 > --- a/drivers/hv/connection.c > +++ b/drivers/hv/connection.c > @@ -440,9 +440,16 @@ int vmbus_post_msg(void *buffer, size_t buflen) > ret = hv_post_message(conn_id, 1, buffer, buflen); > > switch (ret) { > + case HV_STATUS_INVALID_CONNECTION_ID: > + /* > + * 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; > - case -ENOMEM: > break; > case HV_STATUS_SUCCESS: > return ret; > @@ -452,7 +459,7 @@ int vmbus_post_msg(void *buffer, size_t buflen) > } > > retries++; > - msleep(100); > + msleep(1000); > } > return ret; > } > -- > 1.9.1 >
| |