Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1775702ybl; Sat, 11 Jan 2020 02:35:00 -0800 (PST) X-Google-Smtp-Source: APXvYqzHx+5dRm4MoFgXTZE0BBL51tm1Pm+CT1aNn8VGPZ9BMO97GJjQWBOxuRO3f86LgtId+tpi X-Received: by 2002:a9d:7f11:: with SMTP id j17mr6651108otq.281.1578738900791; Sat, 11 Jan 2020 02:35:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578738900; cv=none; d=google.com; s=arc-20160816; b=pCk63dZkvqc2RtMiRyURLAnFoDQ5TRVEUmW64MR9hHtv9xLnOAliWmsG4HC7jjifTr GOx3z1JJGR+AJ0TSaDe2DodzYlNNnlsNFhqFXu02+dRUCLAl9ZT+gb8kn94ncCiTtPTU cXzrbg0A/LTskMhNxn3XaiwMepvL0S//vHOqZBzVe1moxlvTz9jfwAcZrWq7MRFabblR pf72wqtoNn5zWyGr9bq2iL02NFbR0ysYL8/8dRQU2ZaIo705+616TP95iPJzEB5K9vvj im/+AhkonXPRsDgOfetg8E9ucOvL5CFxjf/S3lCvyRBGeEr/kB7nC0oo9QYM2nOCVLzo S9dQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5WMIjpK0yibfGWJ7g2q3lsSKGS+sxczAN3MdKOJT2pU=; b=M9QDZqjRQ9vF0WjAE5MNLdYNLJ5RVM9ODPKt0w9lhF2U9sLce5qLHleMMf1upY39hA VPwcB8cDlQPQmb4sOXRwbAZNSz5O8sPz/tO3plhd4ROw7taM+CZUqtDKKA5VvI7wMcgW mEQH/6PxSfMv89JkxG7JdpuXVY/bEpvG5HwnpD1oBdaZYbmfdqAEzEj6wXnaphNTr/AV yRh85OwK75npbOX1ob7RZL45wO5abVDJwMTGza4pYE6HLwKZKkz+Ft3akr2kWAaGDmaC xyOi5SlVsygpXPeXBAhllUTVIO/pX2AuLU61NttTSymvQko7xXROyhbTSiJd1E10cXe9 /VCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1s3kCIwD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v26si3514344otj.0.2020.01.11.02.34.49; Sat, 11 Jan 2020 02:35:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1s3kCIwD; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731564AbgAKKcz (ORCPT + 99 others); Sat, 11 Jan 2020 05:32:55 -0500 Received: from mail.kernel.org ([198.145.29.99]:46634 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729256AbgAKKcy (ORCPT ); Sat, 11 Jan 2020 05:32:54 -0500 Received: from localhost (unknown [62.119.166.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C9DD620842; Sat, 11 Jan 2020 10:32:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578738773; bh=QOcdDaWnWLLs1wtbgqB4q+1P23t6Kamg/vmjCzaWMqY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1s3kCIwD1wPx+KB1Ir8ewrUp88yZakPTmL+B7jxFXCjLk6iVmHDDFbtf29yKirEjW NPSC02QT5sA25158EVLzxsw4mexF6DaftlxkwCfvpcpQ16Pi1XaJ6MlvK5jpqtosQI gCjiL3FNdEx78tFV121vEs4nXera7JbGGNaRvQN4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Haiyang Zhang , "David S. Miller" , Sasha Levin Subject: [PATCH 5.4 135/165] hv_netvsc: Fix unwanted rx_table reset Date: Sat, 11 Jan 2020 10:50:54 +0100 Message-Id: <20200111094936.961024266@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200111094921.347491861@linuxfoundation.org> References: <20200111094921.347491861@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Haiyang Zhang [ Upstream commit b0689faa8efc5a3391402d7ae93bd373b7248e51 ] In existing code, the receive indirection table, rx_table, is in struct rndis_device, which will be reset when changing MTU, ringparam, etc. User configured receive indirection table values will be lost. To fix this, move rx_table to struct net_device_context, and check netif_is_rxfh_configured(), so rx_table will be set to default only if no user configured value. Fixes: ff4a44199012 ("netvsc: allow get/set of RSS indirection table") Signed-off-by: Haiyang Zhang Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/hyperv/hyperv_net.h | 3 ++- drivers/net/hyperv/netvsc_drv.c | 4 ++-- drivers/net/hyperv/rndis_filter.c | 10 +++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index fb547f37af1e..e74f2d1def80 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -169,7 +169,6 @@ struct rndis_device { u8 hw_mac_adr[ETH_ALEN]; u8 rss_key[NETVSC_HASH_KEYLEN]; - u16 rx_table[ITAB_NUM]; }; @@ -938,6 +937,8 @@ struct net_device_context { u32 tx_table[VRSS_SEND_TAB_SIZE]; + u16 rx_table[ITAB_NUM]; + /* Ethtool settings */ u8 duplex; u32 speed; diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 963509add611..78e3e689a733 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -1659,7 +1659,7 @@ static int netvsc_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, rndis_dev = ndev->extension; if (indir) { for (i = 0; i < ITAB_NUM; i++) - indir[i] = rndis_dev->rx_table[i]; + indir[i] = ndc->rx_table[i]; } if (key) @@ -1689,7 +1689,7 @@ static int netvsc_set_rxfh(struct net_device *dev, const u32 *indir, return -EINVAL; for (i = 0; i < ITAB_NUM; i++) - rndis_dev->rx_table[i] = indir[i]; + ndc->rx_table[i] = indir[i]; } if (!key) { diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index e3d3c9097ff1..f81e58267a6e 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -767,6 +767,7 @@ static int rndis_set_rss_param_msg(struct rndis_device *rdev, const u8 *rss_key, u16 flag) { struct net_device *ndev = rdev->ndev; + struct net_device_context *ndc = netdev_priv(ndev); struct rndis_request *request; struct rndis_set_request *set; struct rndis_set_complete *set_complete; @@ -806,7 +807,7 @@ static int rndis_set_rss_param_msg(struct rndis_device *rdev, /* Set indirection table entries */ itab = (u32 *)(rssp + 1); for (i = 0; i < ITAB_NUM; i++) - itab[i] = rdev->rx_table[i]; + itab[i] = ndc->rx_table[i]; /* Set hask key values */ keyp = (u8 *)((unsigned long)rssp + rssp->hashkey_offset); @@ -1305,6 +1306,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, struct netvsc_device_info *device_info) { struct net_device *net = hv_get_drvdata(dev); + struct net_device_context *ndc = netdev_priv(net); struct netvsc_device *net_device; struct rndis_device *rndis_device; struct ndis_recv_scale_cap rsscap; @@ -1391,9 +1393,11 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, /* We will use the given number of channels if available. */ net_device->num_chn = min(net_device->max_chn, device_info->num_chn); - for (i = 0; i < ITAB_NUM; i++) - rndis_device->rx_table[i] = ethtool_rxfh_indir_default( + if (!netif_is_rxfh_configured(net)) { + for (i = 0; i < ITAB_NUM; i++) + ndc->rx_table[i] = ethtool_rxfh_indir_default( i, net_device->num_chn); + } atomic_set(&net_device->open_chn, 1); vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open); -- 2.20.1