Web lists-archives.com

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




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