public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Long Li <longli@microsoft.com>
Cc: KY Srinivasan <kys@microsoft.com>,
	Haiyang Zhang <haiyangz@microsoft.com>,
	Stephen Hemminger <sthemmin@microsoft.com>,
	"devel\@linuxdriverproject.org" <devel@linuxdriverproject.org>,
	"linux-kernel\@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"stable\@vger.kernel.org" <stable@vger.kernel.org>
Subject: Re: [PATCH v2] HV: properly delay KVP packets when negotiation is in progress
Date: Thu, 23 Mar 2017 17:03:36 +0100	[thread overview]
Message-ID: <87bmssyo87.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <BN3PR03MB22273ED5C24BAD92879B6818CE3C0@BN3PR03MB2227.namprd03.prod.outlook.com> (Long Li's message of "Wed, 22 Mar 2017 18:48:14 +0000")

Long Li <longli@microsoft.com> writes:

> The host may send multiple negotiation packets (due to timeout) before 
> the KVP user-mode daemon is connected. We need to defer processing  
> those packets until the daemon is negotiated and connected. It's okay
> for guest to respond to all negotiation packets.
>
> In addition, the host may send multiple staged KVP requests as soon as
> negotiation is done. We need to properly process those packets using 
> one tasklet for exclusive access to ring buffer.
>
> This patch is based on the work of Nick Meier 
> <Nick.Meier@microsoft.com>
>
> The patch v2 has incorporated suggestion from Vitaly Kuznetsov 
> <vkuznets@redhat.com>.
>
> Signed-off-by: Long Li <longli@microsoft.com>
> ---
>  drivers/hv/hv_kvp.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c
> index de26371..845b70b 100644
> --- a/drivers/hv/hv_kvp.c
> +++ b/drivers/hv/hv_kvp.c
> @@ -113,7 +113,7 @@ static void kvp_poll_wrapper(void *channel)
>  {
>  	/* Transaction is finished, reset the state here to avoid races. */
>  	kvp_transaction.state = HVUTIL_READY;
> -	hv_kvp_onchannelcallback(channel);
> +	tasklet_schedule(&((struct vmbus_channel*)channel)->callback_event);
>  }

There is one more function in the code which calls
hv_kvp_onchannelcallback():

static void kvp_host_handshake_func(struct work_struct *dummy)
{
	hv_poll_channel(kvp_transaction.recv_channel, hv_kvp_onchannelcallback);
}

we can't replace hv_kvp_onchannelcallback with kvp_poll_wrapper here as
we don't want to reset kvp_transaction.state but it seems this should
also get updated, e.g. hv_poll_channel() here can be replaced with the 
direct 

 tasklet_schedule(&((struct vmbus_channel*)channel)->callback_event);

call. This will ensure hv_kvp_onchannelcallback() calls are always
serialized.

>
>  static void kvp_register_done(void)
> @@ -628,16 +628,17 @@ void hv_kvp_onchannelcallback(void *context)
>  		     NEGO_IN_PROGRESS,
>  		     NEGO_FINISHED} host_negotiatied = NEGO_NOT_STARTED;
>
> -	if (host_negotiatied == NEGO_NOT_STARTED &&
> -	    kvp_transaction.state < HVUTIL_READY) {
> +	if (kvp_transaction.state < HVUTIL_READY) {
>  		/*
>  		 * If userspace daemon is not connected and host is asking
>  		 * us to negotiate we need to delay to not lose messages.
>  		 * This is important for Failover IP setting.
>  		 */
> -		host_negotiatied = NEGO_IN_PROGRESS;
> -		schedule_delayed_work(&kvp_host_handshake_work,
> +		if (host_negotiatied == NEGO_NOT_STARTED) {
> +			host_negotiatied = NEGO_IN_PROGRESS;
> +			schedule_delayed_work(&kvp_host_handshake_work,
>  				      HV_UTIL_NEGO_TIMEOUT * HZ);
> +		}
>  		return;
>  	}
>  	if (kvp_transaction.state > HVUTIL_READY)
> @@ -705,6 +706,7 @@ void hv_kvp_onchannelcallback(void *context)
>  				       VM_PKT_DATA_INBAND, 0);
>
>  		host_negotiatied = NEGO_FINISHED;
> +		hv_poll_channel(kvp_transaction.recv_channel, kvp_poll_wrapper);
>  	}
>
>  }

-- 
  Vitaly

  reply	other threads:[~2017-03-23 16:03 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-22 18:48 [PATCH v2] HV: properly delay KVP packets when negotiation is in progress Long Li
2017-03-23 16:03 ` Vitaly Kuznetsov [this message]
2017-03-23 17:47   ` Long Li

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=87bmssyo87.fsf@vitty.brq.redhat.com \
    --to=vkuznets@redhat.com \
    --cc=devel@linuxdriverproject.org \
    --cc=haiyangz@microsoft.com \
    --cc=kys@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longli@microsoft.com \
    --cc=stable@vger.kernel.org \
    --cc=sthemmin@microsoft.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox