Received: by 2002:ac0:b08d:0:0:0:0:0 with SMTP id l13csp4919873imc; Mon, 25 Feb 2019 13:39:09 -0800 (PST) X-Google-Smtp-Source: AHgI3Iarx4cKA55JjAo2HHgAYeoGJn02EylrYhcaMuKBanHCgp3WFe7VMheDuBB3JTWEivILTOfv X-Received: by 2002:a65:614f:: with SMTP id o15mr11561531pgv.383.1551130749269; Mon, 25 Feb 2019 13:39:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551130749; cv=none; d=google.com; s=arc-20160816; b=HOnL+PWAd/bcpGoQ2aRLpZhVGd8zf1mvrHUbkcv2FmBy8DoattEU5D/sCSAznZpdJC S3iqmMYheQHA7GcXthF/40kXEuhlobKzU3/uuB+L3UiIxiBTIZDOJeszi2eaynVq5kqs bAu3ChilXFICALwzmFWcccAVwS6ysvB8CxWK6y01fjEdMRijaKCljT0hs5OrZJTjth56 kLDL2cuKN3o0/lZ2Dl++bZyHIMSFbxKxLGd+LK5k+I0XM5COeBF1ZPjQIKpsEClG6mMp 1Nd5zemFjDN0EV5H9edrsF0Xw3kDLGZfsQV1zeBwrrwIqEbS9G7iP5MAf5g/aTNKVy5/ iltg== 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=hVtzpmQjglqykwl9XCG1DS5XJ2Fv1Uy+0z+UtS39gmM=; b=CFGmCvJ43Yo2s7nKe7yQvhUpMuP1hvEetjvJT6kP5EHtTR7GfdZXO3FWYplxiSn4hV CiHFAKDdoDp2yPp3IWIynK6WBZz/oYZ5wB2bfmHNlkhBIZrJvgK9jroYwcn4H8bU8Y+0 QP0ytRY8qI9UmzCZpUnu8bYKSzLpums3JVYV/AWuB9FsSzEwAe++azmVsfhuBphSHXsJ Dv8HUZMZRdGFmPw6gYF/I/eEc/NcsjFwvpNPs8RxSSWLpldeRT42RZYFkVQkVuioiGWB 85qKi4R5uLMBstyTnPpPRuA1VeciOxCEkVYOjK3YMrb4jQ+ytCNHTF3BohJXp0qcx1D4 vM9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jbDBDGkE; 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 1si10833029pgu.300.2019.02.25.13.38.54; Mon, 25 Feb 2019 13:39:09 -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=jbDBDGkE; 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 S2387411AbfBYVhK (ORCPT + 99 others); Mon, 25 Feb 2019 16:37:10 -0500 Received: from mail.kernel.org ([198.145.29.99]:44286 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732428AbfBYVhI (ORCPT ); Mon, 25 Feb 2019 16:37:08 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (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 BF9CD217F5; Mon, 25 Feb 2019 21:37:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1551130628; bh=u25FUZk6VEy7TIP+B8vDg6j5taP8xKOB03A/gfl97Jk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jbDBDGkE6vSFXockwvVuw7WZVA33iI9v54u5VCcV1ocgpwNt3DqLF0M5Yvda4EjUF A3JWncF3I1OtEf1RgkxT30JFpYsh/lHAZo7bfPzDbT87lXPR8Vgl0wCNfu8Zy2djsB PHHDXxJKMea83jZAitRTEqaw1qlmVwndxR4iE7EI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , Tariq Toukan , Saeed Mahameed Subject: [PATCH 4.20 144/183] net/mlx5e: XDP, fix redirect resources availability check Date: Mon, 25 Feb 2019 22:11:57 +0100 Message-Id: <20190225195119.168347948@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190225195054.748060397@linuxfoundation.org> References: <20190225195054.748060397@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.20-stable review patch. If anyone has any objections, please let me know. ------------------ From: Saeed Mahameed [ Upstream commit 407e17b1a69a51ba9a512a04342da56c1f931df4 ] Currently mlx5 driver creates xdp redirect hw queues unconditionally on netdevice open, This is great until someone starts redirecting XDP traffic via ndo_xdp_xmit on mlx5 device and changes the device configuration at the same time, this might cause crashes, since the other device's napi is not aware of the mlx5 state change (resources un-availability). To fix this we must synchronize with other devices napi's on the system. Added a new flag under mlx5e_priv to determine XDP TX resources are available, set/clear it up when necessary and use synchronize_rcu() when the flag is turned off, so other napi's are in-sync with it, before we actually cleanup the hw resources. The flag is tested prior to committing to transmit on mlx5e_xdp_xmit, and it is sufficient to determine if it safe to transmit or not. The other two internal flags (MLX5E_STATE_OPENED and MLX5E_SQ_STATE_ENABLED) become unnecessary. Thus, they are removed from data path. Fixes: 58b99ee3e3eb ("net/mlx5e: Add support for XDP_REDIRECT in device-out side") Reported-by: Toke Høiland-Jørgensen Reviewed-by: Tariq Toukan Signed-off-by: Saeed Mahameed Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 1 + drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 6 ++---- drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h | 17 +++++++++++++++++ drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -636,6 +636,7 @@ enum { MLX5E_STATE_ASYNC_EVENTS_ENABLED, MLX5E_STATE_OPENED, MLX5E_STATE_DESTROYING, + MLX5E_STATE_XDP_TX_ENABLED, }; struct mlx5e_rqt { --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c @@ -262,7 +262,8 @@ int mlx5e_xdp_xmit(struct net_device *de int sq_num; int i; - if (unlikely(!test_bit(MLX5E_STATE_OPENED, &priv->state))) + /* this flag is sufficient, no need to test internal sq state */ + if (unlikely(!mlx5e_xdp_tx_is_enabled(priv))) return -ENETDOWN; if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) @@ -275,9 +276,6 @@ int mlx5e_xdp_xmit(struct net_device *de sq = &priv->channels.c[sq_num]->xdpsq; - if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state))) - return -ENETDOWN; - for (i = 0; i < n; i++) { struct xdp_frame *xdpf = frames[i]; struct mlx5e_xdp_info xdpi; --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h @@ -49,6 +49,23 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_x int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames, u32 flags); +static inline void mlx5e_xdp_tx_enable(struct mlx5e_priv *priv) +{ + set_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); +} + +static inline void mlx5e_xdp_tx_disable(struct mlx5e_priv *priv) +{ + clear_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); + /* let other device's napi(s) see our new state */ + synchronize_rcu(); +} + +static inline bool mlx5e_xdp_tx_is_enabled(struct mlx5e_priv *priv) +{ + return test_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); +} + static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_xdpsq *sq) { struct mlx5_wq_cyc *wq = &sq->wq; --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -2903,6 +2903,7 @@ void mlx5e_activate_priv_channels(struct mlx5e_build_tx2sq_maps(priv); mlx5e_activate_channels(&priv->channels); + mlx5e_xdp_tx_enable(priv); netif_tx_start_all_queues(priv->netdev); if (MLX5_ESWITCH_MANAGER(priv->mdev)) @@ -2924,6 +2925,7 @@ void mlx5e_deactivate_priv_channels(stru */ netif_tx_stop_all_queues(priv->netdev); netif_tx_disable(priv->netdev); + mlx5e_xdp_tx_disable(priv); mlx5e_deactivate_channels(&priv->channels); }