linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors
@ 2015-02-02  4:36 Dexuan Cui
  2015-02-02  9:41 ` Jason Wang
  0 siblings, 1 reply; 3+ messages in thread
From: Dexuan Cui @ 2015-02-02  4:36 UTC (permalink / raw)
  To: gregkh, linux-kernel, driverdev-devel, olaf, apw, jasowang, kys,
	vkuznets
  Cc: haiyangz

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.
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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors
  2015-02-02  4:36 [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors Dexuan Cui
@ 2015-02-02  9:41 ` Jason Wang
  2015-02-02 10:13   ` Dexuan Cui
  0 siblings, 1 reply; 3+ messages in thread
From: Jason Wang @ 2015-02-02  9:41 UTC (permalink / raw)
  To: Dexuan Cui
  Cc: gregkh, linux-kernel, driverdev-devel, olaf, apw, kys, vkuznets,
	haiyangz



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
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors
  2015-02-02  9:41 ` Jason Wang
@ 2015-02-02 10:13   ` Dexuan Cui
  0 siblings, 0 replies; 3+ messages in thread
From: Dexuan Cui @ 2015-02-02 10:13 UTC (permalink / raw)
  To: Jason Wang
  Cc: gregkh, linux-kernel, driverdev-devel, olaf, apw, KY Srinivasan,
	vkuznets, Haiyang Zhang

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 3534 bytes --]

> -----Original Message-----
> From: Jason Wang [mailto:jasowang@redhat.com]
> Sent: Monday, February 2, 2015 17:41 PM
> To: Dexuan Cui
> Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev-
> devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; KY
> Srinivasan; vkuznets@redhat.com; Haiyang Zhang
> 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.
I'm not sure about the details either.
And it may be pretty host-specific, e.g., I can only get the error code on 
Hyper-V 2008 R2, but can't get it on 2012 R2. 

> Reviewed-by: Jason Wang <jasowang@redhat.com>
Thanks!

> >
> > 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
> >

ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-02-02 10:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-02  4:36 [PATCH v2 2/3] hv: vmbus_post_msg: retry the hypercall on some transient errors Dexuan Cui
2015-02-02  9:41 ` Jason Wang
2015-02-02 10:13   ` Dexuan Cui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).