Received: by 2002:ac0:950c:0:0:0:0:0 with SMTP id f12csp2270689imc; Tue, 12 Mar 2019 10:17:45 -0700 (PDT) X-Google-Smtp-Source: APXvYqx1VDJB5Y3uzYDYBXykSDXlw4THuL3La6kJv2saO2DXo/0xzZNY8JKu3Hi6sJxNW6B3qXks X-Received: by 2002:a62:ea10:: with SMTP id t16mr38905468pfh.3.1552411065732; Tue, 12 Mar 2019 10:17:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552411065; cv=none; d=google.com; s=arc-20160816; b=NxYy09Oy00Emx5dyd8gpLskFqYERXA9rEv9bDOvSaNxIcojLberksg2zLw2bHqTRB7 np6pcREMSDqpXNC7SfVuptROr2csrxMO4A2Oy7cocGXfTCIp1IuwC7fAhMKn8SgJ6zdN OYaCxq0vzvMDT1hOcmYWBZHiEpZpChawOXB7Pr+15g6qlbMWDsKbXBlsnqmBLcfn63yJ MyB68MJfYlRmfPtPsePNJo83yjcwuQItrsn73zJLKsMOnl+g6+fA3JdxwtQcOCGKjMQf z5rbWGJNdqS1kScVyoHlTL/ii+QQxwz+TBMt7PwqrMS8w9/TxEfRnjjZrvm3JTMtsmo5 OVEw== 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=mVzJQJX2CFqawpA7ML8MzH9NnmXcAfmCOsIadBLTkCc=; b=jSSZqi3NBb9gw/7IQA8js64/9FxPviYIeVnDEGln8PHlbhCSo55wgZeyyNs6tyHSU3 BIrqPf/h7VcQjH2dc7UkyiK2TBPWFNsQ1S5OywK2rWKfyQX1Du5CISFVeZ2CcyEZQTcd r3ZFv1clj6ch80M1s73ik1HiF8SO56CqWSyQJUGA5xzuKw5w3Q3H5wDGTkNfnunWUMA0 MEe244CrjBP++z1rlfCll5kndt06hQHBpZ+R4ENoWx0pA+FnxH9B7NzWU0knJWpCkbA3 MFTBD2HQcSy4y/EbA8wwuv33kbXBKg9H7l5Zbi1IZ8yAFzZGhHktDLZWhocbtgB4eZ65 CNUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HzOiTb3M; 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 r16si7975445pfd.266.2019.03.12.10.17.30; Tue, 12 Mar 2019 10:17:45 -0700 (PDT) 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=HzOiTb3M; 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 S1728975AbfCLRQD (ORCPT + 99 others); Tue, 12 Mar 2019 13:16:03 -0400 Received: from mail.kernel.org ([198.145.29.99]:55012 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728621AbfCLRPH (ORCPT ); Tue, 12 Mar 2019 13:15:07 -0400 Received: from localhost (unknown [104.133.8.98]) (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 61A72206DF; Tue, 12 Mar 2019 17:15:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1552410906; bh=VPl6gZG/wfxTjwhfwztth/QLIaegHix6hLMXV9mC480=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HzOiTb3MdUe0IVYBU7zn+tmwDXcmUFNEKrUFTYniyrAloQyCJMTgd8G1E1g+89ZZd SpzNtWQYY0LLC49cV0qjEUyMgNWN0ilYDuvMG9TIVz0F/shayEpkp/lLTmVBRxXgsL 6By//bGsI4s5ct9GjUIbeyDO8k2xYOaSZ5BxrfxQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sudarsana Reddy Kalluru , Ariel Elior , "David S. Miller" , Sasha Levin Subject: [PATCH 4.19 120/149] qede: Fix system crash on configuring channels. Date: Tue, 12 Mar 2019 10:08:58 -0700 Message-Id: <20190312170359.509095211@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190312170349.421581206@linuxfoundation.org> References: <20190312170349.421581206@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit 0aa4febb420d91df5b56b1864a2465765da85f4b ] Under heavy traffic load, when changing number of channels via ethtool (ethtool -L) which will cause interface to be reloaded, it was observed that some packets gets transmitted on old TX channel/queue id which doesn't really exist after the channel configuration leads to system crash. Add a safeguard in the driver by validating queue id through ndo_select_queue() which is called before the ndo_start_xmit(). Signed-off-by: Sudarsana Reddy Kalluru Signed-off-by: Ariel Elior Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/qlogic/qede/qede.h | 3 +++ drivers/net/ethernet/qlogic/qede/qede_fp.c | 13 +++++++++++++ drivers/net/ethernet/qlogic/qede/qede_main.c | 3 +++ 3 files changed, 19 insertions(+) diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h index 6a4d266fb8e2..d242a5724069 100644 --- a/drivers/net/ethernet/qlogic/qede/qede.h +++ b/drivers/net/ethernet/qlogic/qede/qede.h @@ -489,6 +489,9 @@ struct qede_reload_args { /* Datapath functions definition */ netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev); +u16 qede_select_queue(struct net_device *dev, struct sk_buff *skb, + struct net_device *sb_dev, + select_queue_fallback_t fallback); netdev_features_t qede_features_check(struct sk_buff *skb, struct net_device *dev, netdev_features_t features); diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c index 1a78027de071..a96da16f3404 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_fp.c +++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c @@ -1695,6 +1695,19 @@ netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev) return NETDEV_TX_OK; } +u16 qede_select_queue(struct net_device *dev, struct sk_buff *skb, + struct net_device *sb_dev, + select_queue_fallback_t fallback) +{ + struct qede_dev *edev = netdev_priv(dev); + int total_txq; + + total_txq = QEDE_TSS_COUNT(edev) * edev->dev_info.num_tc; + + return QEDE_TSS_COUNT(edev) ? + fallback(dev, skb, NULL) % total_txq : 0; +} + /* 8B udp header + 8B base tunnel header + 32B option length */ #define QEDE_MAX_TUN_HDR_LEN 48 diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 46d0f2eaa0c0..f3d9c40c4115 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -631,6 +631,7 @@ static const struct net_device_ops qede_netdev_ops = { .ndo_open = qede_open, .ndo_stop = qede_close, .ndo_start_xmit = qede_start_xmit, + .ndo_select_queue = qede_select_queue, .ndo_set_rx_mode = qede_set_rx_mode, .ndo_set_mac_address = qede_set_mac_addr, .ndo_validate_addr = eth_validate_addr, @@ -666,6 +667,7 @@ static const struct net_device_ops qede_netdev_vf_ops = { .ndo_open = qede_open, .ndo_stop = qede_close, .ndo_start_xmit = qede_start_xmit, + .ndo_select_queue = qede_select_queue, .ndo_set_rx_mode = qede_set_rx_mode, .ndo_set_mac_address = qede_set_mac_addr, .ndo_validate_addr = eth_validate_addr, @@ -684,6 +686,7 @@ static const struct net_device_ops qede_netdev_vf_xdp_ops = { .ndo_open = qede_open, .ndo_stop = qede_close, .ndo_start_xmit = qede_start_xmit, + .ndo_select_queue = qede_select_queue, .ndo_set_rx_mode = qede_set_rx_mode, .ndo_set_mac_address = qede_set_mac_addr, .ndo_validate_addr = eth_validate_addr, -- 2.19.1