Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp482017pxu; Tue, 5 Jan 2021 17:19:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJxucD16pAxtYJKDkHi3TIdVJh5uvvp07+aXrf8JpCvd+Gw/CFQCLxYaIosCMz8079IjV7g/ X-Received: by 2002:a17:906:e206:: with SMTP id gf6mr1349558ejb.342.1609895968480; Tue, 05 Jan 2021 17:19:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609895968; cv=none; d=google.com; s=arc-20160816; b=yVQQ8zPbn2DJDg0LE/96cHJGOwupaw6s3WbrQqJekN+OrfkAzM67XDYI5ypeH5hO8Z SyFfeGasuSl5KVbFrmy7lgMZfkWHwaVNlfSnnihBOpq+5R+jR+N/NVGXBgA6wC1ew04p ghCchJC5iUVq9ZPSjSS5+oAENmaQ1y6TsscTuVZFxDx/nPxr3pUZ1wwlUkJ1TblNyVgS sXE4V2ZEQVz+uBuMVbOVGzF4k2IjXfEBVeu76AmEvz8IHeI86q3OBuDHZdYL2mFxUx6a FQwt83JohMQAx/IRsdUooBnfGCyWQEhKekgy0h7NKmiRCbXX3fPszt/y59w8nifkiDPa ixIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature:dkim-filter; bh=J27Hds4U/M4ptj2TT0oSpKhTx9p3VcyEZL2xvX1ifrA=; b=WR1YLYqmfQGXCE4wOqENs6rQ9IYz4IevKsrUS83qgLsDzBsGllqKo71iAS4nXdRtai cLLnnGSuaL8VlvCeT/oFILIqrZWhxJR+30bDtixlQEldD74WLnIJ8KqJkQZMFCVvjPhR R0huZmfsVGHpWw3POT8/0LzbiE4r2nmYRKlfwWxp0CtGL9txksnNOlarXVtjBxCAtnfQ WAp4ZUoH3NydS60EjfS9/MVXN4HyOI59MobSrhoJeSSpJBlmFrR8hTd6XdcxKomaCO2d vtnq232JclpyRIrL6IYsS1vrRGTbu2S4QjS/dmobiE806Cn9+flQha/+QZR0QknEAb+O LETQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxonhyperv.com header.s=default header.b=O24FFHKE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxonhyperv.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y21si329015eju.347.2021.01.05.17.19.05; Tue, 05 Jan 2021 17:19:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxonhyperv.com header.s=default header.b=O24FFHKE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxonhyperv.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726469AbhAFBRM (ORCPT + 99 others); Tue, 5 Jan 2021 20:17:12 -0500 Received: from linux.microsoft.com ([13.77.154.182]:54220 "EHLO linux.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725939AbhAFBRM (ORCPT ); Tue, 5 Jan 2021 20:17:12 -0500 Received: by linux.microsoft.com (Postfix, from userid 1004) id 362A720B6C40; Tue, 5 Jan 2021 17:16:31 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 362A720B6C40 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1609895791; bh=J27Hds4U/M4ptj2TT0oSpKhTx9p3VcyEZL2xvX1ifrA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O24FFHKEK6sKAgdhBHr67UGKExbVKQsvQU8Spjq7IbWyKO2gyfDe4YRUJrYYSm92/ VbMoF+FI2WLNigHV4yg1kGw/+QhE8WE9BFSHvyhR5bPfUyU7PgZ4rOOrW8y0mCKyqu I/uGCLE/j5zJa8hiW4r+u6U7JBUKqtC42i4iJ5rM= From: Long Li To: "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , Wei Liu , "David S. Miller" , Jakub Kicinski , linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Long Li Subject: [PATCH 2/3] hv_netvsc: Wait for completion on request NVSP_MSG4_TYPE_SWITCH_DATA_PATH Date: Tue, 5 Jan 2021 17:15:52 -0800 Message-Id: <1609895753-30445-2-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1609895753-30445-1-git-send-email-longli@linuxonhyperv.com> References: <1609895753-30445-1-git-send-email-longli@linuxonhyperv.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Long Li The completion indicates if NVSP_MSG4_TYPE_SWITCH_DATA_PATH has been processed by the VSP. The traffic is steered to VF or synthetic after we receive this completion. Signed-off-by: Long Li --- drivers/net/hyperv/netvsc.c | 34 +++++++++++++++++++++++++++++++-- drivers/net/hyperv/netvsc_drv.c | 1 - 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 2350342b961f..237e998d21d1 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -37,6 +37,10 @@ void netvsc_switch_datapath(struct net_device *ndev, bool vf) struct netvsc_device *nv_dev = rtnl_dereference(net_device_ctx->nvdev); struct nvsp_message *init_pkt = &nv_dev->channel_init_pkt; + /* Block sending traffic to VF if it's about to be gone */ + if (!vf) + net_device_ctx->data_path_is_vf = vf; + memset(init_pkt, 0, sizeof(struct nvsp_message)); init_pkt->hdr.msg_type = NVSP_MSG4_TYPE_SWITCH_DATA_PATH; if (vf) @@ -50,8 +54,11 @@ void netvsc_switch_datapath(struct net_device *ndev, bool vf) vmbus_sendpacket(dev->channel, init_pkt, sizeof(struct nvsp_message), - VMBUS_RQST_ID_NO_RESPONSE, - VM_PKT_DATA_INBAND, 0); + (unsigned long)init_pkt, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + wait_for_completion(&nv_dev->channel_init_wait); + net_device_ctx->data_path_is_vf = vf; } /* Worker to setup sub channels on initial setup @@ -756,6 +763,29 @@ static void netvsc_send_completion(struct net_device *ndev, { const struct nvsp_message *nvsp_packet = hv_pkt_data(desc); u32 msglen = hv_pkt_datalen(desc); + struct nvsp_message *pkt_rqst; + u64 cmd_rqst; + + /* First check if this is a VMBUS completion without data payload */ + if (!msglen) { + cmd_rqst = vmbus_request_addr(&incoming_channel->requestor, + (u64)desc->trans_id); + if (cmd_rqst == VMBUS_RQST_ERROR) { + netdev_err(ndev, "Invalid transaction id\n"); + return; + } + + pkt_rqst = (struct nvsp_message *)cmd_rqst; + switch (pkt_rqst->hdr.msg_type) { + case NVSP_MSG4_TYPE_SWITCH_DATA_PATH: + complete(&net_device->channel_init_wait); + break; + + default: + netdev_err(ndev, "Unexpected VMBUS completion!!\n"); + } + return; + } /* Ensure packet is big enough to read header fields */ if (msglen < sizeof(struct nvsp_message_header)) { diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 5dd4f37afa3d..64ae5f4e974e 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2400,7 +2400,6 @@ static int netvsc_vf_changed(struct net_device *vf_netdev) if (net_device_ctx->data_path_is_vf == vf_is_up) return NOTIFY_OK; - net_device_ctx->data_path_is_vf = vf_is_up; netvsc_switch_datapath(ndev, vf_is_up); netdev_info(ndev, "Data path switched %s VF: %s\n", -- 2.27.0