* [net-next v2 0/2] rxfh with custom RSS fixes
@ 2023-07-25 20:56 Joe Damato
2023-07-25 20:56 ` [net-next v2 1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy Joe Damato
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Joe Damato @ 2023-07-25 20:56 UTC (permalink / raw)
To: netdev, saeedm, tariqt, ecree, andrew, kuba, davem, leon, pabeni, arnd
Cc: linux-kernel, Joe Damato
Greetings:
Welcome to v2, now via net-next. No functional changes; only style
changes (see the summary below).
While attempting to get the RX flow hash key for a custom RSS context on
my mlx5 NIC, I got an error:
$ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
Cannot get RX network flow hashing options: Invalid argument
I dug into this a bit and noticed two things:
1. ETHTOOL_GRXFH supports custom RSS contexts, but ETHTOOL_SRXFH does
not. I moved the copy logic out of ETHTOOL_GRXFH and into a helper so
that both ETHTOOL_{G,S}RXFH now call it, which fixes ETHTOOL_SRXFH. This
is patch 1/2.
2. mlx5 defaulted to RSS context 0 for both ETHTOOL_{G,S}RXFH paths. I
have modified the driver to support custom contexts for both paths. It
is now possible to get and set the flow hash key for custom RSS contexts
with mlx5. This is patch 2/2.
See commit messages for more details.
Thanks.
v2:
- Rebased on net-next
- Adjusted arguments of mlx5e_rx_res_rss_get_hash_fields and
mlx5e_rx_res_rss_set_hash_fields to move rss_idx next to the rss
argument
- Changed return value of both mlx5e_rx_res_rss_get_hash_fields and
mlx5e_rx_res_rss_set_hash_fields to -ENOENT when the rss entry is
NULL
- Changed order of local variables in mlx5e_get_rss_hash_opt and
mlx5e_set_rss_hash_opt
Joe Damato (2):
net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy
net/mlx5: Fix flowhash key set/get for custom RSS
.../ethernet/mellanox/mlx5/core/en/rx_res.c | 25 +++++--
.../ethernet/mellanox/mlx5/core/en/rx_res.h | 7 +-
.../mellanox/mlx5/core/en_fs_ethtool.c | 33 +++++---
net/ethtool/ioctl.c | 75 ++++++++++---------
4 files changed, 86 insertions(+), 54 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [net-next v2 1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy
2023-07-25 20:56 [net-next v2 0/2] rxfh with custom RSS fixes Joe Damato
@ 2023-07-25 20:56 ` Joe Damato
2023-07-25 20:56 ` [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS Joe Damato
2023-07-28 9:00 ` [net-next v2 0/2] rxfh with custom RSS fixes patchwork-bot+netdevbpf
2 siblings, 0 replies; 5+ messages in thread
From: Joe Damato @ 2023-07-25 20:56 UTC (permalink / raw)
To: netdev, saeedm, tariqt, ecree, andrew, kuba, davem, leon, pabeni, arnd
Cc: linux-kernel, Joe Damato, Edward Cree
ETHTOOL_GRXFH correctly copies in the full struct ethtool_rxnfc when
FLOW_RSS is set; ETHTOOL_SRXFH needs a similar code path to handle the
FLOW_RSS case so that ethtool can set the flow hash for custom RSS
contexts (if supported by the driver).
The copy code from ETHTOOL_GRXFH has been pulled out in to a helper so
that it can be called in both ETHTOOL_{G,S}RXFH code paths.
Acked-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: Joe Damato <jdamato@fastly.com>
---
net/ethtool/ioctl.c | 75 +++++++++++++++++++++++----------------------
1 file changed, 38 insertions(+), 37 deletions(-)
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 4a51e0ec295c..7d40e7913e76 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -907,6 +907,38 @@ static int ethtool_rxnfc_copy_to_compat(void __user *useraddr,
return 0;
}
+static int ethtool_rxnfc_copy_struct(u32 cmd, struct ethtool_rxnfc *info,
+ size_t *info_size, void __user *useraddr)
+{
+ /* struct ethtool_rxnfc was originally defined for
+ * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
+ * members. User-space might still be using that
+ * definition.
+ */
+ if (cmd == ETHTOOL_GRXFH || cmd == ETHTOOL_SRXFH)
+ *info_size = (offsetof(struct ethtool_rxnfc, data) +
+ sizeof(info->data));
+
+ if (ethtool_rxnfc_copy_from_user(info, useraddr, *info_size))
+ return -EFAULT;
+
+ if ((cmd == ETHTOOL_GRXFH || cmd == ETHTOOL_SRXFH) && info->flow_type & FLOW_RSS) {
+ *info_size = sizeof(*info);
+ if (ethtool_rxnfc_copy_from_user(info, useraddr, *info_size))
+ return -EFAULT;
+ /* Since malicious users may modify the original data,
+ * we need to check whether FLOW_RSS is still requested.
+ */
+ if (!(info->flow_type & FLOW_RSS))
+ return -EINVAL;
+ }
+
+ if (info->cmd != cmd)
+ return -EINVAL;
+
+ return 0;
+}
+
static int ethtool_rxnfc_copy_to_user(void __user *useraddr,
const struct ethtool_rxnfc *rxnfc,
size_t size, const u32 *rule_buf)
@@ -944,16 +976,9 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
if (!dev->ethtool_ops->set_rxnfc)
return -EOPNOTSUPP;
- /* struct ethtool_rxnfc was originally defined for
- * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
- * members. User-space might still be using that
- * definition. */
- if (cmd == ETHTOOL_SRXFH)
- info_size = (offsetof(struct ethtool_rxnfc, data) +
- sizeof(info.data));
-
- if (ethtool_rxnfc_copy_from_user(&info, useraddr, info_size))
- return -EFAULT;
+ rc = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
+ if (rc)
+ return rc;
rc = dev->ethtool_ops->set_rxnfc(dev, &info);
if (rc)
@@ -978,33 +1003,9 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
if (!ops->get_rxnfc)
return -EOPNOTSUPP;
- /* struct ethtool_rxnfc was originally defined for
- * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
- * members. User-space might still be using that
- * definition. */
- if (cmd == ETHTOOL_GRXFH)
- info_size = (offsetof(struct ethtool_rxnfc, data) +
- sizeof(info.data));
-
- if (ethtool_rxnfc_copy_from_user(&info, useraddr, info_size))
- return -EFAULT;
-
- /* If FLOW_RSS was requested then user-space must be using the
- * new definition, as FLOW_RSS is newer.
- */
- if (cmd == ETHTOOL_GRXFH && info.flow_type & FLOW_RSS) {
- info_size = sizeof(info);
- if (ethtool_rxnfc_copy_from_user(&info, useraddr, info_size))
- return -EFAULT;
- /* Since malicious users may modify the original data,
- * we need to check whether FLOW_RSS is still requested.
- */
- if (!(info.flow_type & FLOW_RSS))
- return -EINVAL;
- }
-
- if (info.cmd != cmd)
- return -EINVAL;
+ ret = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
+ if (ret)
+ return ret;
if (info.cmd == ETHTOOL_GRXCLSRLALL) {
if (info.rule_cnt > 0) {
--
2.25.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS
2023-07-25 20:56 [net-next v2 0/2] rxfh with custom RSS fixes Joe Damato
2023-07-25 20:56 ` [net-next v2 1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy Joe Damato
@ 2023-07-25 20:56 ` Joe Damato
2023-07-26 8:36 ` Tariq Toukan
2023-07-28 9:00 ` [net-next v2 0/2] rxfh with custom RSS fixes patchwork-bot+netdevbpf
2 siblings, 1 reply; 5+ messages in thread
From: Joe Damato @ 2023-07-25 20:56 UTC (permalink / raw)
To: netdev, saeedm, tariqt, ecree, andrew, kuba, davem, leon, pabeni, arnd
Cc: linux-kernel, Joe Damato
mlx5 flow hash field retrieval and set only worked on the default
RSS context as of commit f01cc58c18d6 ("net/mlx5e: Support multiple RSS
contexts"), not custom RSS contexts.
For example, before this patch attempting to retrieve the flow hash fields
for RSS context 1 fails:
$ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
Cannot get RX network flow hashing options: Invalid argument
This patch fixes getting and setting the flow hash fields for contexts
other than the default context.
Getting the flow hash fields for RSS context 1:
$ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
For RSS context 1:
TCP over IPV4 flows use these fields for computing Hash flow key:
IP DA
Now, setting the flash hash fields to a custom value:
$ sudo ethtool -U eth1 rx-flow-hash tcp4 sdfn context 1
And retrieving them again:
$ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
For RSS context 1:
TCP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA
L4 bytes 0 & 1 [TCP/UDP src port]
L4 bytes 2 & 3 [TCP/UDP dst port]
Signed-off-by: Joe Damato <jdamato@fastly.com>
---
.../ethernet/mellanox/mlx5/core/en/rx_res.c | 25 +++++++++++---
.../ethernet/mellanox/mlx5/core/en/rx_res.h | 7 ++--
.../mellanox/mlx5/core/en_fs_ethtool.c | 33 ++++++++++++++-----
3 files changed, 48 insertions(+), 17 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
index e1095bc36543..56e6b8c7501f 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
@@ -218,17 +218,32 @@ int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
return mlx5e_rss_set_rxfh(rss, indir, key, hfunc, res->rss_rqns, res->rss_nch);
}
-u8 mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt)
+int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
+ enum mlx5_traffic_types tt)
{
- struct mlx5e_rss *rss = res->rss[0];
+ struct mlx5e_rss *rss;
+
+ if (rss_idx >= MLX5E_MAX_NUM_RSS)
+ return -EINVAL;
+
+ rss = res->rss[rss_idx];
+ if (!rss)
+ return -ENOENT;
return mlx5e_rss_get_hash_fields(rss, tt);
}
-int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt,
- u8 rx_hash_fields)
+int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
+ enum mlx5_traffic_types tt, u8 rx_hash_fields)
{
- struct mlx5e_rss *rss = res->rss[0];
+ struct mlx5e_rss *rss;
+
+ if (rss_idx >= MLX5E_MAX_NUM_RSS)
+ return -EINVAL;
+
+ rss = res->rss[rss_idx];
+ if (!rss)
+ return -ENOENT;
return mlx5e_rss_set_hash_fields(rss, tt, rx_hash_fields);
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
index 5d5f64fab60f..580fe8bc3cd2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
@@ -48,9 +48,10 @@ int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
const u32 *indir, const u8 *key, const u8 *hfunc);
-u8 mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
-int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt,
- u8 rx_hash_fields);
+int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
+ enum mlx5_traffic_types tt);
+int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
+ enum mlx5_traffic_types tt, u8 rx_hash_fields);
int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
struct mlx5e_packet_merge_param *pkt_merge_param);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
index aac32e505c14..aed599db9d84 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
@@ -900,10 +900,16 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
struct ethtool_rxnfc *nfc)
{
u8 rx_hash_field = 0;
+ u32 flow_type = 0;
+ u32 rss_idx = 0;
int err;
int tt;
- tt = flow_type_to_traffic_type(nfc->flow_type);
+ if (nfc->flow_type & FLOW_RSS)
+ rss_idx = nfc->rss_context;
+
+ flow_type = flow_type_mask(nfc->flow_type);
+ tt = flow_type_to_traffic_type(flow_type);
if (tt < 0)
return tt;
@@ -911,10 +917,10 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
* on src IP, dest IP, TCP/UDP src port and TCP/UDP dest
* port.
*/
- if (nfc->flow_type != TCP_V4_FLOW &&
- nfc->flow_type != TCP_V6_FLOW &&
- nfc->flow_type != UDP_V4_FLOW &&
- nfc->flow_type != UDP_V6_FLOW)
+ if (flow_type != TCP_V4_FLOW &&
+ flow_type != TCP_V6_FLOW &&
+ flow_type != UDP_V4_FLOW &&
+ flow_type != UDP_V6_FLOW)
return -EOPNOTSUPP;
if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
@@ -931,7 +937,7 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
rx_hash_field |= MLX5_HASH_FIELD_SEL_L4_DPORT;
mutex_lock(&priv->state_lock);
- err = mlx5e_rx_res_rss_set_hash_fields(priv->rx_res, tt, rx_hash_field);
+ err = mlx5e_rx_res_rss_set_hash_fields(priv->rx_res, rss_idx, tt, rx_hash_field);
mutex_unlock(&priv->state_lock);
return err;
@@ -940,14 +946,23 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
static int mlx5e_get_rss_hash_opt(struct mlx5e_priv *priv,
struct ethtool_rxnfc *nfc)
{
- u32 hash_field = 0;
+ int hash_field = 0;
+ u32 flow_type = 0;
+ u32 rss_idx = 0;
int tt;
- tt = flow_type_to_traffic_type(nfc->flow_type);
+ if (nfc->flow_type & FLOW_RSS)
+ rss_idx = nfc->rss_context;
+
+ flow_type = flow_type_mask(nfc->flow_type);
+ tt = flow_type_to_traffic_type(flow_type);
if (tt < 0)
return tt;
- hash_field = mlx5e_rx_res_rss_get_hash_fields(priv->rx_res, tt);
+ hash_field = mlx5e_rx_res_rss_get_hash_fields(priv->rx_res, rss_idx, tt);
+ if (hash_field < 0)
+ return hash_field;
+
nfc->data = 0;
if (hash_field & MLX5_HASH_FIELD_SEL_SRC_IP)
--
2.25.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS
2023-07-25 20:56 ` [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS Joe Damato
@ 2023-07-26 8:36 ` Tariq Toukan
0 siblings, 0 replies; 5+ messages in thread
From: Tariq Toukan @ 2023-07-26 8:36 UTC (permalink / raw)
To: Joe Damato, netdev, saeedm, ecree, andrew, kuba, davem, leon,
pabeni, arnd
Cc: linux-kernel, Tariq Toukan
On 25/07/2023 23:56, Joe Damato wrote:
> mlx5 flow hash field retrieval and set only worked on the default
> RSS context as of commit f01cc58c18d6 ("net/mlx5e: Support multiple RSS
> contexts"), not custom RSS contexts.
>
> For example, before this patch attempting to retrieve the flow hash fields
> for RSS context 1 fails:
>
> $ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
> Cannot get RX network flow hashing options: Invalid argument
>
> This patch fixes getting and setting the flow hash fields for contexts
> other than the default context.
>
> Getting the flow hash fields for RSS context 1:
>
> $ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
> For RSS context 1:
> TCP over IPV4 flows use these fields for computing Hash flow key:
> IP DA
>
> Now, setting the flash hash fields to a custom value:
>
> $ sudo ethtool -U eth1 rx-flow-hash tcp4 sdfn context 1
>
> And retrieving them again:
>
> $ sudo ethtool -u eth1 rx-flow-hash tcp4 context 1
> For RSS context 1:
> TCP over IPV4 flows use these fields for computing Hash flow key:
> IP SA
> IP DA
> L4 bytes 0 & 1 [TCP/UDP src port]
> L4 bytes 2 & 3 [TCP/UDP dst port]
>
> Signed-off-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Thanks for your patch.
> ---
> .../ethernet/mellanox/mlx5/core/en/rx_res.c | 25 +++++++++++---
> .../ethernet/mellanox/mlx5/core/en/rx_res.h | 7 ++--
> .../mellanox/mlx5/core/en_fs_ethtool.c | 33 ++++++++++++++-----
> 3 files changed, 48 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
> index e1095bc36543..56e6b8c7501f 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.c
> @@ -218,17 +218,32 @@ int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
> return mlx5e_rss_set_rxfh(rss, indir, key, hfunc, res->rss_rqns, res->rss_nch);
> }
>
> -u8 mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt)
> +int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
> + enum mlx5_traffic_types tt)
> {
> - struct mlx5e_rss *rss = res->rss[0];
> + struct mlx5e_rss *rss;
> +
> + if (rss_idx >= MLX5E_MAX_NUM_RSS)
> + return -EINVAL;
> +
> + rss = res->rss[rss_idx];
> + if (!rss)
> + return -ENOENT;
>
> return mlx5e_rss_get_hash_fields(rss, tt);
> }
>
> -int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt,
> - u8 rx_hash_fields)
> +int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
> + enum mlx5_traffic_types tt, u8 rx_hash_fields)
> {
> - struct mlx5e_rss *rss = res->rss[0];
> + struct mlx5e_rss *rss;
> +
> + if (rss_idx >= MLX5E_MAX_NUM_RSS)
> + return -EINVAL;
> +
> + rss = res->rss[rss_idx];
> + if (!rss)
> + return -ENOENT;
>
> return mlx5e_rss_set_hash_fields(rss, tt, rx_hash_fields);
> }
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
> index 5d5f64fab60f..580fe8bc3cd2 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h
> @@ -48,9 +48,10 @@ int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
> int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
> const u32 *indir, const u8 *key, const u8 *hfunc);
>
> -u8 mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
> -int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt,
> - u8 rx_hash_fields);
> +int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
> + enum mlx5_traffic_types tt);
> +int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
> + enum mlx5_traffic_types tt, u8 rx_hash_fields);
> int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
> struct mlx5e_packet_merge_param *pkt_merge_param);
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> index aac32e505c14..aed599db9d84 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
> @@ -900,10 +900,16 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
> struct ethtool_rxnfc *nfc)
> {
> u8 rx_hash_field = 0;
> + u32 flow_type = 0;
> + u32 rss_idx = 0;
> int err;
> int tt;
>
> - tt = flow_type_to_traffic_type(nfc->flow_type);
> + if (nfc->flow_type & FLOW_RSS)
> + rss_idx = nfc->rss_context;
> +
> + flow_type = flow_type_mask(nfc->flow_type);
> + tt = flow_type_to_traffic_type(flow_type);
> if (tt < 0)
> return tt;
>
> @@ -911,10 +917,10 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
> * on src IP, dest IP, TCP/UDP src port and TCP/UDP dest
> * port.
> */
> - if (nfc->flow_type != TCP_V4_FLOW &&
> - nfc->flow_type != TCP_V6_FLOW &&
> - nfc->flow_type != UDP_V4_FLOW &&
> - nfc->flow_type != UDP_V6_FLOW)
> + if (flow_type != TCP_V4_FLOW &&
> + flow_type != TCP_V6_FLOW &&
> + flow_type != UDP_V4_FLOW &&
> + flow_type != UDP_V6_FLOW)
> return -EOPNOTSUPP;
>
> if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
> @@ -931,7 +937,7 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
> rx_hash_field |= MLX5_HASH_FIELD_SEL_L4_DPORT;
>
> mutex_lock(&priv->state_lock);
> - err = mlx5e_rx_res_rss_set_hash_fields(priv->rx_res, tt, rx_hash_field);
> + err = mlx5e_rx_res_rss_set_hash_fields(priv->rx_res, rss_idx, tt, rx_hash_field);
> mutex_unlock(&priv->state_lock);
>
> return err;
> @@ -940,14 +946,23 @@ static int mlx5e_set_rss_hash_opt(struct mlx5e_priv *priv,
> static int mlx5e_get_rss_hash_opt(struct mlx5e_priv *priv,
> struct ethtool_rxnfc *nfc)
> {
> - u32 hash_field = 0;
> + int hash_field = 0;
> + u32 flow_type = 0;
> + u32 rss_idx = 0;
> int tt;
>
> - tt = flow_type_to_traffic_type(nfc->flow_type);
> + if (nfc->flow_type & FLOW_RSS)
> + rss_idx = nfc->rss_context;
> +
> + flow_type = flow_type_mask(nfc->flow_type);
> + tt = flow_type_to_traffic_type(flow_type);
> if (tt < 0)
> return tt;
>
> - hash_field = mlx5e_rx_res_rss_get_hash_fields(priv->rx_res, tt);
> + hash_field = mlx5e_rx_res_rss_get_hash_fields(priv->rx_res, rss_idx, tt);
> + if (hash_field < 0)
> + return hash_field;
> +
> nfc->data = 0;
>
> if (hash_field & MLX5_HASH_FIELD_SEL_SRC_IP)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [net-next v2 0/2] rxfh with custom RSS fixes
2023-07-25 20:56 [net-next v2 0/2] rxfh with custom RSS fixes Joe Damato
2023-07-25 20:56 ` [net-next v2 1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy Joe Damato
2023-07-25 20:56 ` [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS Joe Damato
@ 2023-07-28 9:00 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-07-28 9:00 UTC (permalink / raw)
To: Joe Damato
Cc: netdev, saeedm, tariqt, ecree, andrew, kuba, davem, leon, pabeni,
arnd, linux-kernel
Hello:
This series was applied to netdev/net-next.git (main)
by David S. Miller <davem@davemloft.net>:
On Tue, 25 Jul 2023 20:56:53 +0000 you wrote:
> Greetings:
>
> Welcome to v2, now via net-next. No functional changes; only style
> changes (see the summary below).
>
> While attempting to get the RX flow hash key for a custom RSS context on
> my mlx5 NIC, I got an error:
>
> [...]
Here is the summary with links:
- [net-next,v2,1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy
https://git.kernel.org/netdev/net-next/c/801b27e88046
- [net-next,v2,2/2] net/mlx5: Fix flowhash key set/get for custom RSS
https://git.kernel.org/netdev/net-next/c/0212e5d915a2
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-07-28 9:00 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-25 20:56 [net-next v2 0/2] rxfh with custom RSS fixes Joe Damato
2023-07-25 20:56 ` [net-next v2 1/2] net: ethtool: Unify ETHTOOL_{G,S}RXFH rxnfc copy Joe Damato
2023-07-25 20:56 ` [net-next v2 2/2] net/mlx5: Fix flowhash key set/get for custom RSS Joe Damato
2023-07-26 8:36 ` Tariq Toukan
2023-07-28 9:00 ` [net-next v2 0/2] rxfh with custom RSS fixes patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome