* [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID @ 2015-01-29 11:02 Dexuan Cui 2015-01-29 13:30 ` Vitaly Kuznetsov 2015-01-30 2:47 ` Jason Wang 0 siblings, 2 replies; 8+ messages in thread From: Dexuan Cui @ 2015-01-29 11:02 UTC (permalink / raw) To: gregkh, linux-kernel, driverdev-devel, olaf, apw, jasowang, kys; +Cc: haiyangz I got the hypercall error code on Hyper-V 2008 R2 when keeping running "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe hv_utils" in a Linux guest. Without the patch, the driver can occasionally fail to load. CC: "K. Y. Srinivasan" <kys@microsoft.com> Signed-off-by: Dexuan Cui <decui@microsoft.com> --- arch/x86/include/uapi/asm/hyperv.h | 1 + drivers/hv/connection.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h index 90c458e..b9daffb 100644 --- a/arch/x86/include/uapi/asm/hyperv.h +++ b/arch/x86/include/uapi/asm/hyperv.h @@ -225,6 +225,7 @@ #define HV_STATUS_INVALID_HYPERCALL_CODE 2 #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 #define HV_STATUS_INVALID_ALIGNMENT 4 +#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..8bd05f3 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -440,6 +440,15 @@ 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 or the host is under low resource + * conditions: let's wait 1 more second before + * retrying the hypercall. + */ + msleep(1000); + break; case HV_STATUS_INSUFFICIENT_BUFFERS: ret = -ENOMEM; case -ENOMEM: -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-29 11:02 [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID Dexuan Cui @ 2015-01-29 13:30 ` Vitaly Kuznetsov 2015-01-30 5:30 ` Dexuan Cui 2015-01-30 2:47 ` Jason Wang 1 sibling, 1 reply; 8+ messages in thread From: Vitaly Kuznetsov @ 2015-01-29 13:30 UTC (permalink / raw) To: Dexuan Cui Cc: gregkh, linux-kernel, driverdev-devel, olaf, apw, jasowang, kys, haiyangz Dexuan Cui <decui@microsoft.com> writes: > I got the hypercall error code on Hyper-V 2008 R2 when keeping running > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe hv_utils" > in a Linux guest. > > Without the patch, the driver can occasionally fail to load. > > CC: "K. Y. Srinivasan" <kys@microsoft.com> > Signed-off-by: Dexuan Cui <decui@microsoft.com> > --- > arch/x86/include/uapi/asm/hyperv.h | 1 + > drivers/hv/connection.c | 9 +++++++++ > 2 files changed, 10 insertions(+) > > diff --git a/arch/x86/include/uapi/asm/hyperv.h b/arch/x86/include/uapi/asm/hyperv.h > index 90c458e..b9daffb 100644 > --- a/arch/x86/include/uapi/asm/hyperv.h > +++ b/arch/x86/include/uapi/asm/hyperv.h > @@ -225,6 +225,7 @@ > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > #define HV_STATUS_INVALID_ALIGNMENT 4 > +#define HV_STATUS_INVALID_CONNECTION_ID 18 > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 The gap beween 4 and 18 tells me there are other codes here ;-) Are they all 'permanent failures'? > > typedef struct _HV_REFERENCE_TSC_PAGE { > diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c > index c4acd1c..8bd05f3 100644 > --- a/drivers/hv/connection.c > +++ b/drivers/hv/connection.c > @@ -440,6 +440,15 @@ 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 or the host is under low resource > + * conditions: let's wait 1 more second before > + * retrying the hypercall. > + */ > + msleep(1000); > + break; In case it is our last try (No. 10) we will return '18' from the function. I suggest we set ret = -ENOMEM here as well. > case HV_STATUS_INSUFFICIENT_BUFFERS: > ret = -ENOMEM; Or should we treat these two equally? There is a smaller (100ms) sleep between tries already, we can consider changing it instead. > case -ENOMEM: -- Vitaly ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-29 13:30 ` Vitaly Kuznetsov @ 2015-01-30 5:30 ` Dexuan Cui 2015-01-30 17:29 ` Vitaly Kuznetsov 0 siblings, 1 reply; 8+ messages in thread From: Dexuan Cui @ 2015-01-30 5:30 UTC (permalink / raw) To: Vitaly Kuznetsov Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com, KY Srinivasan, Haiyang Zhang > -----Original Message----- > From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] > Sent: Thursday, January 29, 2015 21:31 PM > To: Dexuan Cui > Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- > devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; > jasowang@redhat.com; KY Srinivasan; Haiyang Zhang > Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > HV_STATUS_INVALID_CONNECTION_ID > > Dexuan Cui <decui@microsoft.com> writes: > > > I got the hypercall error code on Hyper-V 2008 R2 when keeping running > > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe hv_utils" > > in a Linux guest. > > > > Without the patch, the driver can occasionally fail to load. > > > > CC: "K. Y. Srinivasan" <kys@microsoft.com> > > Signed-off-by: Dexuan Cui <decui@microsoft.com> > > --- > > arch/x86/include/uapi/asm/hyperv.h | 1 + > > drivers/hv/connection.c | 9 +++++++++ > > 2 files changed, 10 insertions(+) > > > > diff --git a/arch/x86/include/uapi/asm/hyperv.h > b/arch/x86/include/uapi/asm/hyperv.h > > index 90c458e..b9daffb 100644 > > --- a/arch/x86/include/uapi/asm/hyperv.h > > +++ b/arch/x86/include/uapi/asm/hyperv.h > > @@ -225,6 +225,7 @@ > > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > > #define HV_STATUS_INVALID_ALIGNMENT 4 > > +#define HV_STATUS_INVALID_CONNECTION_ID 18 > > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 > > The gap beween 4 and 18 tells me there are other codes here ;-) Are they > all 'permanent failures'? It looks we only need to care about these error codes here. BTW, you can get all the hypercall error codes in the top level functional spec: http://blogs.msdn.com/b/virtual_pc_guy/archive/2014/02/17/updated-hypervisor-top-level-functional-specification.aspx For this hypercall (0x005c), see "14.9.7 HvPostMessage". > > > > typedef struct _HV_REFERENCE_TSC_PAGE { > > diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c > > index c4acd1c..8bd05f3 100644 > > --- a/drivers/hv/connection.c > > +++ b/drivers/hv/connection.c > > @@ -440,6 +440,15 @@ 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 or the host is under low resource > > + * conditions: let's wait 1 more second before > > + * retrying the hypercall. > > + */ > > + msleep(1000); > > + break; > > In case it is our last try (No. 10) we will return '18' from the > function. I suggest we set ret = -ENOMEM here as well. Thanks for the suggestion! I think it would be better to add this to the case HV_STATUS_INVALID_CONNECTION_ID: ret = -EAGAIN; ? > > case HV_STATUS_INSUFFICIENT_BUFFERS: > > ret = -ENOMEM; > > Or should we treat these two equally? There is a smaller (100ms) sleep > between tries already, we can consider changing it instead. > > > case -ENOMEM: > > -- > Vitaly In my experiments, in the HV_STATUS_INVALID_CONNECTION_ID case, waiting 100ms is not enough sometimes, so I'd like to wait more time. I agree with you both cases can wait 1000ms. I'll update my patch. BTW, the " case -ENOMEM:" is not reachable(the hypervisor itself doesn't return -ENOMEM), I think. I can remove it. Thanks, -- Dexuan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-30 5:30 ` Dexuan Cui @ 2015-01-30 17:29 ` Vitaly Kuznetsov 2015-02-01 3:37 ` Dexuan Cui 0 siblings, 1 reply; 8+ messages in thread From: Vitaly Kuznetsov @ 2015-01-30 17:29 UTC (permalink / raw) To: Dexuan Cui Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com, KY Srinivasan, Haiyang Zhang Dexuan Cui <decui@microsoft.com> writes: >> -----Original Message----- >> From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] >> Sent: Thursday, January 29, 2015 21:31 PM >> To: Dexuan Cui >> Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- >> devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; >> jasowang@redhat.com; KY Srinivasan; Haiyang Zhang >> Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on >> HV_STATUS_INVALID_CONNECTION_ID >> >> Dexuan Cui <decui@microsoft.com> writes: >> >> > I got the hypercall error code on Hyper-V 2008 R2 when keeping running >> > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe hv_utils" >> > in a Linux guest. >> > >> > Without the patch, the driver can occasionally fail to load. >> > >> > CC: "K. Y. Srinivasan" <kys@microsoft.com> >> > Signed-off-by: Dexuan Cui <decui@microsoft.com> >> > --- >> > arch/x86/include/uapi/asm/hyperv.h | 1 + >> > drivers/hv/connection.c | 9 +++++++++ >> > 2 files changed, 10 insertions(+) >> > >> > diff --git a/arch/x86/include/uapi/asm/hyperv.h >> b/arch/x86/include/uapi/asm/hyperv.h >> > index 90c458e..b9daffb 100644 >> > --- a/arch/x86/include/uapi/asm/hyperv.h >> > +++ b/arch/x86/include/uapi/asm/hyperv.h >> > @@ -225,6 +225,7 @@ >> > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 >> > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 >> > #define HV_STATUS_INVALID_ALIGNMENT 4 >> > +#define HV_STATUS_INVALID_CONNECTION_ID 18 >> > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 >> >> The gap beween 4 and 18 tells me there are other codes here ;-) Are they >> all 'permanent failures'? > It looks we only need to care about these error codes here. > > BTW, you can get all the hypercall error codes in the top level functional spec: > http://blogs.msdn.com/b/virtual_pc_guy/archive/2014/02/17/updated-hypervisor-top-level-functional-specification.aspx > For this hypercall (0x005c), see "14.9.7 HvPostMessage". Thanks, interesting! Btw, HV_STATUS_INSUFFICIENT_MEMORY looks suspicious, looks like we can hit it as well... I suggest we split all failures here in 2 classes: 1) permanent 2) worth retrying and treat them accordingly (no big changes, just maybe group them within hv_post_message() together as it is the only place where these codes are being used). > >> > >> > typedef struct _HV_REFERENCE_TSC_PAGE { >> > diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c >> > index c4acd1c..8bd05f3 100644 >> > --- a/drivers/hv/connection.c >> > +++ b/drivers/hv/connection.c >> > @@ -440,6 +440,15 @@ 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 or the host is under low resource >> > + * conditions: let's wait 1 more second before >> > + * retrying the hypercall. >> > + */ >> > + msleep(1000); >> > + break; >> >> In case it is our last try (No. 10) we will return '18' from the >> function. I suggest we set ret = -ENOMEM here as well. > Thanks for the suggestion! > > I think it would be better to add this to the case > HV_STATUS_INVALID_CONNECTION_ID: > ret = -EAGAIN; > ? Yes, like fallthrough > >> > case HV_STATUS_INSUFFICIENT_BUFFERS: >> > ret = -ENOMEM; >> >> Or should we treat these two equally? There is a smaller (100ms) sleep >> between tries already, we can consider changing it instead. >> >> > case -ENOMEM: >> >> -- >> Vitaly > In my experiments, in the HV_STATUS_INVALID_CONNECTION_ID case, > waiting 100ms is not enough sometimes, so I'd like to wait more time. > I agree with you both cases can wait 1000ms. I'll update my patch. > > BTW, the " case -ENOMEM:" is not reachable(the hypervisor itself doesn't > return -ENOMEM), I think. I can remove it. hv_post_message() can return -EMSGSIZE or do_hypercall() return value (which becomes u16 in hv_post_message()). So yes, I agree, -ENOMEM is not possible. > > Thanks, > -- Dexuan -- Vitaly ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-30 17:29 ` Vitaly Kuznetsov @ 2015-02-01 3:37 ` Dexuan Cui 2015-02-01 19:48 ` KY Srinivasan 0 siblings, 1 reply; 8+ messages in thread From: Dexuan Cui @ 2015-02-01 3:37 UTC (permalink / raw) To: Vitaly Kuznetsov Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com, KY Srinivasan, Haiyang Zhang > -----Original Message----- > From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] > Sent: Saturday, January 31, 2015 1:29 AM > To: Dexuan Cui > Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- > devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; > jasowang@redhat.com; KY Srinivasan; Haiyang Zhang > Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > HV_STATUS_INVALID_CONNECTION_ID > > Dexuan Cui <decui@microsoft.com> writes: > > >> -----Original Message----- > >> From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] > >> Sent: Thursday, January 29, 2015 21:31 PM > >> To: Dexuan Cui > >> Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- > >> devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; > >> jasowang@redhat.com; KY Srinivasan; Haiyang Zhang > >> Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > >> HV_STATUS_INVALID_CONNECTION_ID > >> > >> Dexuan Cui <decui@microsoft.com> writes: > >> > >> > I got the hypercall error code on Hyper-V 2008 R2 when keeping running > >> > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe > hv_utils" > >> > in a Linux guest. > >> > > >> > Without the patch, the driver can occasionally fail to load. > >> > > >> > CC: "K. Y. Srinivasan" <kys@microsoft.com> > >> > Signed-off-by: Dexuan Cui <decui@microsoft.com> > >> > --- > >> > arch/x86/include/uapi/asm/hyperv.h | 1 + > >> > drivers/hv/connection.c | 9 +++++++++ > >> > 2 files changed, 10 insertions(+) > >> > > >> > diff --git a/arch/x86/include/uapi/asm/hyperv.h > >> b/arch/x86/include/uapi/asm/hyperv.h > >> > index 90c458e..b9daffb 100644 > >> > --- a/arch/x86/include/uapi/asm/hyperv.h > >> > +++ b/arch/x86/include/uapi/asm/hyperv.h > >> > @@ -225,6 +225,7 @@ > >> > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > >> > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > >> > #define HV_STATUS_INVALID_ALIGNMENT 4 > >> > +#define HV_STATUS_INVALID_CONNECTION_ID 18 > >> > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 > >> > >> The gap beween 4 and 18 tells me there are other codes here ;-) Are they > >> all 'permanent failures'? > > It looks we only need to care about these error codes here. > > > > BTW, you can get all the hypercall error codes in the top level functional spec: > > http://blogs.msdn.com/b/virtual_pc_guy/archive/2014/02/17/updated- > hypervisor-top-level-functional-specification.aspx > > For this hypercall (0x005c), see "14.9.7 HvPostMessage". > > Thanks, interesting! > > Btw, HV_STATUS_INSUFFICIENT_MEMORY looks suspicious, looks like we can > hit it as well... > > I suggest we split all failures here in 2 classes: > 1) permanent > 2) worth retrying > > and treat them accordingly (no big changes, just maybe group them within > hv_post_message() together as it is the only place where these codes are > being used). Thanks for the suggestion, Vitaly! I'll send out v2. -- Dexuan > > > >> > > >> > typedef struct _HV_REFERENCE_TSC_PAGE { > >> > diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c > >> > index c4acd1c..8bd05f3 100644 > >> > --- a/drivers/hv/connection.c > >> > +++ b/drivers/hv/connection.c > >> > @@ -440,6 +440,15 @@ 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 or the host is under low resource > >> > + * conditions: let's wait 1 more second before > >> > + * retrying the hypercall. > >> > + */ > >> > + msleep(1000); > >> > + break; > >> > >> In case it is our last try (No. 10) we will return '18' from the > >> function. I suggest we set ret = -ENOMEM here as well. > > Thanks for the suggestion! > > > > I think it would be better to add this to the case > > HV_STATUS_INVALID_CONNECTION_ID: > > ret = -EAGAIN; > > ? > > Yes, like fallthrough > > > > >> > case HV_STATUS_INSUFFICIENT_BUFFERS: > >> > ret = -ENOMEM; > >> > >> Or should we treat these two equally? There is a smaller (100ms) sleep > >> between tries already, we can consider changing it instead. > >> > >> > case -ENOMEM: > >> > >> -- > >> Vitaly > > In my experiments, in the HV_STATUS_INVALID_CONNECTION_ID case, > > waiting 100ms is not enough sometimes, so I'd like to wait more time. > > I agree with you both cases can wait 1000ms. I'll update my patch. > > > > BTW, the " case -ENOMEM:" is not reachable(the hypervisor itself doesn't > > return -ENOMEM), I think. I can remove it. > > hv_post_message() can return -EMSGSIZE or do_hypercall() return value > (which becomes u16 in hv_post_message()). So yes, I agree, -ENOMEM is > not possible. > > > > > Thanks, > > -- Dexuan > > -- > Vitaly ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-02-01 3:37 ` Dexuan Cui @ 2015-02-01 19:48 ` KY Srinivasan 0 siblings, 0 replies; 8+ messages in thread From: KY Srinivasan @ 2015-02-01 19:48 UTC (permalink / raw) To: Dexuan Cui, Vitaly Kuznetsov Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com, Haiyang Zhang > -----Original Message----- > From: Dexuan Cui > Sent: Saturday, January 31, 2015 7:38 PM > To: Vitaly Kuznetsov > Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- > devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; > jasowang@redhat.com; KY Srinivasan; Haiyang Zhang > Subject: RE: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > HV_STATUS_INVALID_CONNECTION_ID > > > -----Original Message----- > > From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] > > Sent: Saturday, January 31, 2015 1:29 AM > > To: Dexuan Cui > > Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; > > driverdev- devel@linuxdriverproject.org; olaf@aepfle.de; > > apw@canonical.com; jasowang@redhat.com; KY Srinivasan; Haiyang Zhang > > Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > > HV_STATUS_INVALID_CONNECTION_ID > > > > Dexuan Cui <decui@microsoft.com> writes: > > > > >> -----Original Message----- > > >> From: Vitaly Kuznetsov [mailto:vkuznets@redhat.com] > > >> Sent: Thursday, January 29, 2015 21:31 PM > > >> To: Dexuan Cui > > >> Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; > > >> driverdev- devel@linuxdriverproject.org; olaf@aepfle.de; > > >> apw@canonical.com; jasowang@redhat.com; KY Srinivasan; Haiyang > > >> Zhang > > >> Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > > >> HV_STATUS_INVALID_CONNECTION_ID > > >> > > >> Dexuan Cui <decui@microsoft.com> writes: > > >> > > >> > I got the hypercall error code on Hyper-V 2008 R2 when keeping > > >> > running "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; > > >> > modprobe > > hv_utils" > > >> > in a Linux guest. > > >> > > > >> > Without the patch, the driver can occasionally fail to load. > > >> > > > >> > CC: "K. Y. Srinivasan" <kys@microsoft.com> > > >> > Signed-off-by: Dexuan Cui <decui@microsoft.com> > > >> > --- > > >> > arch/x86/include/uapi/asm/hyperv.h | 1 + > > >> > drivers/hv/connection.c | 9 +++++++++ > > >> > 2 files changed, 10 insertions(+) > > >> > > > >> > diff --git a/arch/x86/include/uapi/asm/hyperv.h > > >> b/arch/x86/include/uapi/asm/hyperv.h > > >> > index 90c458e..b9daffb 100644 > > >> > --- a/arch/x86/include/uapi/asm/hyperv.h > > >> > +++ b/arch/x86/include/uapi/asm/hyperv.h > > >> > @@ -225,6 +225,7 @@ > > >> > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > > >> > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > > >> > #define HV_STATUS_INVALID_ALIGNMENT 4 > > >> > +#define HV_STATUS_INVALID_CONNECTION_ID 18 > > >> > #define HV_STATUS_INSUFFICIENT_BUFFERS 19 > > >> > > >> The gap beween 4 and 18 tells me there are other codes here ;-) Are > > >> they all 'permanent failures'? > > > It looks we only need to care about these error codes here. > > > > > > BTW, you can get all the hypercall error codes in the top level functional > spec: > > > http://blogs.msdn.com/b/virtual_pc_guy/archive/2014/02/17/updated- > > hypervisor-top-level-functional-specification.aspx > > > For this hypercall (0x005c), see "14.9.7 HvPostMessage". > > > > Thanks, interesting! > > > > Btw, HV_STATUS_INSUFFICIENT_MEMORY looks suspicious, looks like we > can > > hit it as well... > > > > I suggest we split all failures here in 2 classes: > > 1) permanent > > 2) worth retrying > > > > and treat them accordingly (no big changes, just maybe group them > > within > > hv_post_message() together as it is the only place where these codes > > are being used). > Thanks for the suggestion, Vitaly! > I'll send out v2. Thanks Dexuan. K. Y ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-29 11:02 [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID Dexuan Cui 2015-01-29 13:30 ` Vitaly Kuznetsov @ 2015-01-30 2:47 ` Jason Wang 2015-01-30 5:34 ` Dexuan Cui 1 sibling, 1 reply; 8+ messages in thread From: Jason Wang @ 2015-01-30 2:47 UTC (permalink / raw) To: Dexuan Cui Cc: gregkh, linux-kernel, driverdev-devel, olaf, apw, kys, haiyangz On Thu, Jan 29, 2015 at 7:02 PM, Dexuan Cui <decui@microsoft.com> wrote: > I got the hypercall error code on Hyper-V 2008 R2 when keeping running > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe > hv_utils" > in a Linux guest. > > Without the patch, the driver can occasionally fail to load. > > CC: "K. Y. Srinivasan" <kys@microsoft.com> > Signed-off-by: Dexuan Cui <decui@microsoft.com> > --- > arch/x86/include/uapi/asm/hyperv.h | 1 + > drivers/hv/connection.c | 9 +++++++++ > 2 files changed, 10 insertions(+) > > diff --git a/arch/x86/include/uapi/asm/hyperv.h > b/arch/x86/include/uapi/asm/hyperv.h > index 90c458e..b9daffb 100644 > --- a/arch/x86/include/uapi/asm/hyperv.h > +++ b/arch/x86/include/uapi/asm/hyperv.h > @@ -225,6 +225,7 @@ > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > #define HV_STATUS_INVALID_ALIGNMENT 4 > +#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..8bd05f3 100644 > --- a/drivers/hv/connection.c > +++ b/drivers/hv/connection.c > @@ -440,6 +440,15 @@ 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 or the host is under low resource > + * conditions: let's wait 1 more second before > + * retrying the hypercall. > + */ The name HV_STATUS_INVALID_CONNECTION_ID is really confusing in this case. Since it does not show any meaning of lacking resources. > + msleep(1000); > + break; > case HV_STATUS_INSUFFICIENT_BUFFERS: > ret = -ENOMEM; I thought host should return this error value when lacking resources? > > case -ENOMEM: > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe > linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID 2015-01-30 2:47 ` Jason Wang @ 2015-01-30 5:34 ` Dexuan Cui 0 siblings, 0 replies; 8+ messages in thread From: Dexuan Cui @ 2015-01-30 5:34 UTC (permalink / raw) To: Jason Wang Cc: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, KY Srinivasan, Haiyang Zhang [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2776 bytes --] > -----Original Message----- > From: Jason Wang [mailto:jasowang@redhat.com] > Sent: Friday, January 30, 2015 10:47 AM > To: Dexuan Cui > Cc: gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; driverdev- > devel@linuxdriverproject.org; olaf@aepfle.de; apw@canonical.com; KY > Srinivasan; Haiyang Zhang > Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on > HV_STATUS_INVALID_CONNECTION_ID > > > > On Thu, Jan 29, 2015 at 7:02 PM, Dexuan Cui <decui@microsoft.com> wrote: > > I got the hypercall error code on Hyper-V 2008 R2 when keeping running > > "rmmod hv_netvsc; modprobe hv_netvsc; rmmod hv_utils; modprobe > > hv_utils" > > in a Linux guest. > > > > Without the patch, the driver can occasionally fail to load. > > > > CC: "K. Y. Srinivasan" <kys@microsoft.com> > > Signed-off-by: Dexuan Cui <decui@microsoft.com> > > --- > > arch/x86/include/uapi/asm/hyperv.h | 1 + > > drivers/hv/connection.c | 9 +++++++++ > > 2 files changed, 10 insertions(+) > > > > diff --git a/arch/x86/include/uapi/asm/hyperv.h > > b/arch/x86/include/uapi/asm/hyperv.h > > index 90c458e..b9daffb 100644 > > --- a/arch/x86/include/uapi/asm/hyperv.h > > +++ b/arch/x86/include/uapi/asm/hyperv.h > > @@ -225,6 +225,7 @@ > > #define HV_STATUS_INVALID_HYPERCALL_CODE 2 > > #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 > > #define HV_STATUS_INVALID_ALIGNMENT 4 > > +#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..8bd05f3 100644 > > --- a/drivers/hv/connection.c > > +++ b/drivers/hv/connection.c > > @@ -440,6 +440,15 @@ 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 or the host is under low resource > > + * conditions: let's wait 1 more second before > > + * retrying the hypercall. > > + */ > > The name HV_STATUS_INVALID_CONNECTION_ID is really confusing in this > case. Since it does not show any meaning of lacking resources. The description about the 'low host resource condition' might be not accurate. I'll remove this part. > > + msleep(1000); > > + break; > > case HV_STATUS_INSUFFICIENT_BUFFERS: > > ret = -ENOMEM; > > I thought host should return this error value when lacking resources? This should be correct. > > > > case -ENOMEM: > > -- Thanks, -- Dexuan ÿôèº{.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] 8+ messages in thread
end of thread, other threads:[~2015-02-01 19:48 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-01-29 11:02 [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID Dexuan Cui 2015-01-29 13:30 ` Vitaly Kuznetsov 2015-01-30 5:30 ` Dexuan Cui 2015-01-30 17:29 ` Vitaly Kuznetsov 2015-02-01 3:37 ` Dexuan Cui 2015-02-01 19:48 ` KY Srinivasan 2015-01-30 2:47 ` Jason Wang 2015-01-30 5:34 ` Dexuan Cui
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox