Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp330541pxb; Mon, 16 Aug 2021 06:28:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy7Zz2o/SbHgojcnpIpgHqoTwYS2BeRPhhrlhRUo4LXewpDZQzpRv2AUx7TLOwWKKkx/Kex X-Received: by 2002:a17:906:3983:: with SMTP id h3mr15654507eje.249.1629120535289; Mon, 16 Aug 2021 06:28:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629120535; cv=none; d=google.com; s=arc-20160816; b=x8BnDpNqrjUmTr+0VcSFgIpmIMgJMe7p4G5TCqF+7vtV5RnzJXK3+3jvfkB2I6XzSA 1Bm+a9Cy/FIojn6oS6GWwum7l48eoCyUWabrPaxWaPj8aJ+rjFKbU8BP3CP0WIxt312j 2pgIYAk8QvQmuO8+ljHkOo4qci2wSlG0qtHPbcFs7UIKVNpj3iAgwypNLmGnxy8cFF1f Gb14CD8AlXkeDaLqC1mezWuAlNM93Su+jHw58a2KIRquE1lcMAhVf5W76DZkeMd1t/zk LyZOJTpDRaOns8E/tIp8AM1H3FOUjQHv5u/aETfes22q7PqM8+9VISPp0gy1niuOIgbt vGTg== 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=9mf0KcEBtTaDOwjC0FtvDa8nBnNNgDwnvvyprf9UZNk=; b=kiJeU7wOKzRWFuxSrZD3rIMwKwUadjzYN9v5yxymJ5bvJm9bg5Squmbr/7xFw0ZdGU h9tDbKZwy5IhX3VBkkPueMr9WDMs9dr5tr79JpL4bIvCob6vzRNXHlrDu+Y6dvWyOHD8 ecQRIY8H/r8MuAVos1gKYZBxzjkLddCC5GjKRU24qpgGWpsnVyU+nLCd4rCePMwg3O63 3oRm/35nAYViwJorMapbFlcQye9hT/bdg9foif+jSPfGIF1E/lhTj0UrcOlJZxtAbR/t 1hEN7/IcMt6N8BmoV6EYz03QKEp14+Xo3nagyOGPlUy2Phrzg6JdcAbGP4c5RgGDUeT4 cYzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=bjyVBeK3; 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 c16si11090772edv.249.2021.08.16.06.28.32; Mon, 16 Aug 2021 06:28:55 -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=bjyVBeK3; 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 S240498AbhHPN0c (ORCPT + 99 others); Mon, 16 Aug 2021 09:26:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:43050 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239125AbhHPNQd (ORCPT ); Mon, 16 Aug 2021 09:16:33 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 38302632D6; Mon, 16 Aug 2021 13:13:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1629119586; bh=a5NxpVOs8tEEVyWD+DqEBIFKvfNhI2V3ZCzYtKsfI4Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bjyVBeK3ibyEb/ln8z5YRZ5xdNuKPfLMZehxGJLEAa6Z9KJA+Q9A40nVvkvEJuojS BL6iOqmT0sGW/hDAb4lxeiNDgAXxl+cA109G+HqhRS85SwKh6iyMFxajl60amCpj/S TnUqz/PBMQCSacrM7cBLRhkzwuuDKm3JMxRUGmSw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Maxim Mikityanskiy , Tariq Toukan , Saeed Mahameed , Sasha Levin Subject: [PATCH 5.13 083/151] net/mlx5e: Destroy page pool after XDP SQ to fix use-after-free Date: Mon, 16 Aug 2021 15:01:53 +0200 Message-Id: <20210816125446.809987670@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210816125444.082226187@linuxfoundation.org> References: <20210816125444.082226187@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: Maxim Mikityanskiy [ Upstream commit 8ba3e4c85825c8801a2c298dcadac650a40d7137 ] mlx5e_close_xdpsq does the cleanup: it calls mlx5e_free_xdpsq_descs to free the outstanding descriptors, which relies on mlx5e_page_release_dynamic and page_pool_release_page. However, page_pool_destroy is already called by this point, because mlx5e_close_rq runs before mlx5e_close_xdpsq. This commit fixes the use-after-free by swapping mlx5e_close_xdpsq and mlx5e_close_rq. The commit cited below started calling page_pool_destroy directly from the driver. Previously, the page pool was destroyed under a call_rcu from xdp_rxq_info_unreg_mem_model, which would defer the deallocation until after the XDPSQ is cleaned up. Fixes: 1da4bbeffe41 ("net: core: page_pool: add user refcnt and reintroduce page_pool_destroy") Signed-off-by: Maxim Mikityanskiy Reviewed-by: Tariq Toukan Signed-off-by: Saeed Mahameed Signed-off-by: Sasha Levin --- .../net/ethernet/mellanox/mlx5/core/en_main.c | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index d0d9acb17253..3221a6a2f221 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -1887,30 +1887,30 @@ static int mlx5e_open_queues(struct mlx5e_channel *c, if (err) goto err_close_icosq; + err = mlx5e_open_rxq_rq(c, params, &cparam->rq); + if (err) + goto err_close_sqs; + if (c->xdp) { err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL, &c->rq_xdpsq, false); if (err) - goto err_close_sqs; + goto err_close_rq; } - err = mlx5e_open_rxq_rq(c, params, &cparam->rq); - if (err) - goto err_close_xdp_sq; - err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL, &c->xdpsq, true); if (err) - goto err_close_rq; + goto err_close_xdp_sq; return 0; -err_close_rq: - mlx5e_close_rq(&c->rq); - err_close_xdp_sq: if (c->xdp) mlx5e_close_xdpsq(&c->rq_xdpsq); +err_close_rq: + mlx5e_close_rq(&c->rq); + err_close_sqs: mlx5e_close_sqs(c); @@ -1945,9 +1945,9 @@ err_close_async_icosq_cq: static void mlx5e_close_queues(struct mlx5e_channel *c) { mlx5e_close_xdpsq(&c->xdpsq); - mlx5e_close_rq(&c->rq); if (c->xdp) mlx5e_close_xdpsq(&c->rq_xdpsq); + mlx5e_close_rq(&c->rq); mlx5e_close_sqs(c); mlx5e_close_icosq(&c->icosq); mlx5e_close_icosq(&c->async_icosq); -- 2.30.2