Patch "net/mlx4: Fix the check in attaching steering rules" has been added to the 4.9-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
net/mlx4: Fix the check in attaching steering rules
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-mlx4-fix-the-check-in-attaching-steering-rules.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Mon Apr 9 17:09:24 CEST 2018
From: Talat Batheesh <[email protected]>
Date: Sun, 4 Jun 2017 14:30:07 +0300
Subject: net/mlx4: Fix the check in attaching steering rules
From: Talat Batheesh <[email protected]>
[ Upstream commit 6dc06c08bef1c746ff8da33dab677cfbacdcad32 ]
Our previous patch (cited below) introduced a regression for RAW Eth QPs.
Fix it by checking if the QP number provided by user-space exists, hence allowing steering rules to be added for valid QPs only.
--- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 5 ----- drivers/net/ethernet/mellanox/mlx4/mcg.c | 15 +++++++++++---- drivers/net/ethernet/mellanox/mlx4/qp.c | 13 +++++++++++++ include/linux/mlx4/qp.h | 1 + 4 files changed, 25 insertions(+), 9 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +0 -5
@@ -1520,11 +1520,6 @@ static int mlx4_en_flow_replace(struct n qpn = priv->drop_qp.qpn; else if (cmd->fs.ring_cookie & EN_ETHTOOL_QP_ATTACH) { qpn = cmd->fs.ring_cookie & (EN_ETHTOOL_QP_ATTACH -1 ); -if (qpn < priv->rss_map.base_qpn || - qpn >= priv->rss_map.base_qpn + priv->rx_ring_num) { -en_warn (priv,"rxnfc: QP (0x%x) doesn't exist\n" , qpn); -return -EINVAL ; - } } else {if (cmd->fs.ring_cookie >= priv->rx_ring_num) { en_warn(priv, "rxnfc: RX ring (%llu) doesn't exist\n",
drivers/net/ethernet/mellanox/mlx4/mcg.c +11 -4
@@ -35,6 +35,7 @@#include <linux/etherdevice.h> #include <linux/mlx4/cmd.h> +#include <linux/mlx4/qp.h> #include <linux/export.h> #include "mlx4.h"
@@ -985,16 +986,21 @@ int mlx4_flow_attach(struct mlx4_dev *deif (IS_ERR (mailbox))return PTR_ERR (mailbox); +if (!mlx4_qp_lookup (dev, rule->qpn)) { +mlx4_err_rule (dev,"QP doesn't exist\n" , rule); + ret = -EINVAL ; + goto out; + } +trans_rule_ctrl_to_hw (rule, mailbox->buf); size +=sizeof (struct mlx4_net_trans_rule_hw_ctrl );list_for_each_entry (cur, &rule->list, list) { ret =parse_trans_rule (dev, cur, mailbox->buf + size); -if (ret <0 ) { -mlx4_free_cmd_mailbox (dev, mailbox); -return ret; - } +if (ret <0 ) + goto out; + size += ret; }
@@ -1021,6 +1027,7 @@ int mlx4_flow_attach(struct mlx4_dev *de } } +out:mlx4_free_cmd_mailbox (dev, mailbox);return ret;
drivers/net/ethernet/mellanox/mlx4/qp.c +13 -0
@@ -387,6 +387,19 @@ static void mlx4_qp_free_icm(struct mlx4__mlx4_qp_free_icm (dev, qpn); } +struct mlx4_qp *mlx4_qp_lookup (struct mlx4_dev *dev,u32 qpn) +{ +struct mlx4_qp_table *qp_table = &mlx4_priv (dev)->qp_table; +struct mlx4_qp *qp; + +spin_lock (&qp_table->lock); + + qp =__mlx4_qp_lookup (dev, qpn); + +spin_unlock (&qp_table->lock); +return qp; +} +int mlx4_qp_alloc (struct mlx4_dev *dev,int qpn,struct mlx4_qp *qp,gfp_t gfp) {struct mlx4_priv *priv =mlx4_priv (dev);
include/linux/mlx4/qp.h +1 -0
@@ -470,6 +470,7 @@ struct mlx4_update_qp_params {u16 rate_val; }; +struct mlx4_qp *mlx4_qp_lookup (struct mlx4_dev *dev,u32 qpn);int mlx4_update_qp (struct mlx4_dev *dev,u32 qpn,enum mlx4_update_qp_attr attr,struct mlx4_update_qp_params *params);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-mlx4_en-avoid-adding-steering-rules-with-invalid-ring.patch queue-4.9/net-mlx4-fix-the-check-in-attaching-steering-rules.patch