Re: [PATCH] HV: properly delay KVP packets when negotiation is in progress

From: Joshua R. Poulson
Date: Thu Mar 16 2017 - 16:06:41 EST


This should be submitted to stable, we're seeing KVP fail to start in
some tests of 4.10.

On Thu, Mar 16, 2017 at 12:51 PM, Long Li <longli@xxxxxxxxxxxxx> wrote:
> The host may send multiple KVP packets before the negotiation with daemon
> is finished. We need to keep those packets in ring buffer until the daemon
> is negotiated and connected.
>
> This patch is based on the work of Nick Meier <Nick.Meier@xxxxxxxxxxxxx>
>
> Signed-off-by: Long Li <longli@xxxxxxxxxxxxx>
> ---
> drivers/hv/hv_kvp.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c
> index de26371..b9f928d 100644
> --- a/drivers/hv/hv_kvp.c
> +++ b/drivers/hv/hv_kvp.c
> @@ -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)
> --
> 2.7.4