All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Dexuan Cui <decui@microsoft.com>
Cc: "gregkh\@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"linux-kernel\@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"driverdev-devel\@linuxdriverproject.org" 
	<driverdev-devel@linuxdriverproject.org>,
	"olaf\@aepfle.de" <olaf@aepfle.de>,
	"apw\@canonical.com" <apw@canonical.com>,
	"jasowang\@redhat.com" <jasowang@redhat.com>,
	KY Srinivasan <kys@microsoft.com>,
	Haiyang Zhang <haiyangz@microsoft.com>
Subject: Re: [PATCH 2/3] hv: vmbus_post_msg: retry the hypercall on HV_STATUS_INVALID_CONNECTION_ID
Date: Fri, 30 Jan 2015 18:29:00 +0100	[thread overview]
Message-ID: <8761boxjmr.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <F792CF86EFE20D4AB8064279AFBA51C61EA9B9D3@SIXPRD3002MB028.064d.mgd.msft.net> (Dexuan Cui's message of "Fri, 30 Jan 2015 05:30:06 +0000")

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

  reply	other threads:[~2015-01-30 17:29 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8761boxjmr.fsf@vitty.brq.redhat.com \
    --to=vkuznets@redhat.com \
    --cc=apw@canonical.com \
    --cc=decui@microsoft.com \
    --cc=driverdev-devel@linuxdriverproject.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=haiyangz@microsoft.com \
    --cc=jasowang@redhat.com \
    --cc=kys@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olaf@aepfle.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.