Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp3799641pxb; Mon, 4 Oct 2021 09:51:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzQl4bM7EwwkE/xdXvnY5czaGROrWmvVU1tw+OsIdYYvKLblsaBHDhB48sIYlO2iWO47CRI X-Received: by 2002:a17:90a:14c4:: with SMTP id k62mr31230116pja.154.1633366291215; Mon, 04 Oct 2021 09:51:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633366291; cv=none; d=google.com; s=arc-20160816; b=J9u+yOkBERgHhWfb7fG4MH1avkPHufq4vVKHUyp0XM8H4dYLq3NJQf8k/RE2mOO0NV ssJVnEno1p1MBOx4aR1rSqQ5w7RXnbwyh0GJh/RGgHOKDPjVYans6gdELgCBQiyw//iI 4vKf03cPZxwTup7/qr/PCJv/M2rVoa061mT2aDXF+mNpZhQtg+wqsnDEwRt7SipMOymS gFzjGZeL/B1dbFv4ctHCyGTRAJLqBL9GNVEm6ZNTVSZ8zYveK4Vw0PHwHUUlX2sHLBKQ hQuBYiuFjapjbNNgQaSmice/mcXJYWvdv2oiKd/u4H0TP9UBYPv4M3XSYqxlntK+JL8h hRQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=zKp62i8GtYOoB6Htch5S/s9f+MIX+euWQCGtqzdywyg=; b=uhY7zqiVh9dcEjH62Hvmic8ejsvfa0tzj6HwCgHJppT3CdfqUMqgvlWqxvBQLF+sY8 yWs017Bb98QUmCnMGu56qYRcrYYFay7JMfVpERqvcgO/8U1omlFwD8Wz7PB5XUFfNv3Q Jt94WOdLgZLplLRaaWle0TAPvNntgDrj3n0lW5l0ykwoI4aML1owYw7JoNPuIIxyJINT a61Csoh/U3gIaK02w+HnAF/CNZT0K8IfWfU6FQDxk6odiqn8H/jVC29SRvqubXWwyuil AD5K6zJMm8AYE5jvmmL9wR59ZADAbXQsw/FyBWGgPFKY+5zc8jnFaAXSaG+hqKtRyl5j dJfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=VLuZHHBy; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t63si17047218pgd.638.2021.10.04.09.51.18; Mon, 04 Oct 2021 09:51:31 -0700 (PDT) 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=@linuxfoundation.org header.s=korg header.b=VLuZHHBy; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238177AbhJDNkC (ORCPT + 99 others); Mon, 4 Oct 2021 09:40:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:48738 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238233AbhJDNhf (ORCPT ); Mon, 4 Oct 2021 09:37:35 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3644A61381; Mon, 4 Oct 2021 13:17:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1633353428; bh=o1woYyxAb4jdYyvX4H/ZpVBQrw1/liLQJM+goEOTvlY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VLuZHHBy/7tQcWmEk3aPg4OF5OqJO2/zd4e109xra1AbaH3MvztNZrcFtKzexePg8 5/o2HzhzOnvw3gdQ0yk6+nPBM33LFmxL8vxkUf7a5saJ1CFMylISoAUeCu5ADAHGSi KqhBWqC9zZ/ZMTXAZ8uwQSukIE2Du0YopKVbj5rc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Feng Zhou , Sandeep Penigalapati , Tony Nguyen , "David S. Miller" , Sasha Levin Subject: [PATCH 5.14 123/172] ixgbe: Fix NULL pointer dereference in ixgbe_xdp_setup Date: Mon, 4 Oct 2021 14:52:53 +0200 Message-Id: <20211004125048.950525466@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211004125044.945314266@linuxfoundation.org> References: <20211004125044.945314266@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Feng Zhou [ Upstream commit 513e605d7a9ce136886cb42ebb2c40e9a6eb6333 ] The ixgbe driver currently generates a NULL pointer dereference with some machine (online cpus < 63). This is due to the fact that the maximum value of num_xdp_queues is nr_cpu_ids. Code is in "ixgbe_set_rss_queues"". Here's how the problem repeats itself: Some machine (online cpus < 63), And user set num_queues to 63 through ethtool. Code is in the "ixgbe_set_channels", adapter->ring_feature[RING_F_FDIR].limit = count; It becomes 63. When user use xdp, "ixgbe_set_rss_queues" will set queues num. adapter->num_rx_queues = rss_i; adapter->num_tx_queues = rss_i; adapter->num_xdp_queues = ixgbe_xdp_queues(adapter); And rss_i's value is from f = &adapter->ring_feature[RING_F_FDIR]; rss_i = f->indices = f->limit; So "num_rx_queues" > "num_xdp_queues", when run to "ixgbe_xdp_setup", for (i = 0; i < adapter->num_rx_queues; i++) if (adapter->xdp_ring[i]->xsk_umem) It leads to panic. Call trace: [exception RIP: ixgbe_xdp+368] RIP: ffffffffc02a76a0 RSP: ffff9fe16202f8d0 RFLAGS: 00010297 RAX: 0000000000000000 RBX: 0000000000000020 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 000000000000001c RDI: ffffffffa94ead90 RBP: ffff92f8f24c0c18 R8: 0000000000000000 R9: 0000000000000000 R10: ffff9fe16202f830 R11: 0000000000000000 R12: ffff92f8f24c0000 R13: ffff9fe16202fc01 R14: 000000000000000a R15: ffffffffc02a7530 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 7 [ffff9fe16202f8f0] dev_xdp_install at ffffffffa89fbbcc 8 [ffff9fe16202f920] dev_change_xdp_fd at ffffffffa8a08808 9 [ffff9fe16202f960] do_setlink at ffffffffa8a20235 10 [ffff9fe16202fa88] rtnl_setlink at ffffffffa8a20384 11 [ffff9fe16202fc78] rtnetlink_rcv_msg at ffffffffa8a1a8dd 12 [ffff9fe16202fcf0] netlink_rcv_skb at ffffffffa8a717eb 13 [ffff9fe16202fd40] netlink_unicast at ffffffffa8a70f88 14 [ffff9fe16202fd80] netlink_sendmsg at ffffffffa8a71319 15 [ffff9fe16202fdf0] sock_sendmsg at ffffffffa89df290 16 [ffff9fe16202fe08] __sys_sendto at ffffffffa89e19c8 17 [ffff9fe16202ff30] __x64_sys_sendto at ffffffffa89e1a64 18 [ffff9fe16202ff38] do_syscall_64 at ffffffffa84042b9 19 [ffff9fe16202ff50] entry_SYSCALL_64_after_hwframe at ffffffffa8c0008c So I fix ixgbe_max_channels so that it will not allow a setting of queues to be higher than the num_online_cpus(). And when run to ixgbe_xdp_setup, take the smaller value of num_rx_queues and num_xdp_queues. Fixes: 4a9b32f30f80 ("ixgbe: fix potential RX buffer starvation for AF_XDP") Signed-off-by: Feng Zhou Tested-by: Sandeep Penigalapati Signed-off-by: Tony Nguyen Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index 4ceaca0f6ce3..21321d164708 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c @@ -3204,7 +3204,7 @@ static unsigned int ixgbe_max_channels(struct ixgbe_adapter *adapter) max_combined = ixgbe_max_rss_indices(adapter); } - return max_combined; + return min_t(int, max_combined, num_online_cpus()); } static void ixgbe_get_channels(struct net_device *dev, diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 14aea40da50f..77350e5fdf97 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -10112,6 +10112,7 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) struct ixgbe_adapter *adapter = netdev_priv(dev); struct bpf_prog *old_prog; bool need_reset; + int num_queues; if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) return -EINVAL; @@ -10161,11 +10162,14 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) /* Kick start the NAPI context if there is an AF_XDP socket open * on that queue id. This so that receiving will start. */ - if (need_reset && prog) - for (i = 0; i < adapter->num_rx_queues; i++) + if (need_reset && prog) { + num_queues = min_t(int, adapter->num_rx_queues, + adapter->num_xdp_queues); + for (i = 0; i < num_queues; i++) if (adapter->xdp_ring[i]->xsk_pool) (void)ixgbe_xsk_wakeup(adapter->netdev, i, XDP_WAKEUP_RX); + } return 0; } -- 2.33.0