On 2024-11-25 12:01 p.m., Ahmed Zaki wrote:
On 2024-11-25 7:42 a.m., Edward Cree wrote:
On 25/11/2024 14:20, Ahmed Zaki wrote:
On 2024-11-25 7:10 a.m., Gal Pressman wrote:
On 25/11/2024 15:21, Edward Cree wrote:
Also, the check below it, dealing with sym-xor, looks like it's only relevant to ETHTOOL_SRXFH, since info.data is garbage for other commands. Ahmed, is my understanding correct there?
Speaking of the below check, the sanity check depends on the order of operations, for example:
- Enable symmetric xor
- Request hash on src only
= Error as expected, however:
Correct. The check below is to make sure that no ntuple that does not cover symmetric fields is added if symm-xor is enabled.
But symm-xor is about hashing, and is only relevant to traffic being directed by RSS. The user should still be allowed to, and the NIC should be able to handle, setting an ntuple filter (SRXCLSRLINS) that is asymmetric, to override the symmetric hashing for selected traffic.
I agree, and in its first version, the sym-xor series was setting sym- xor per ntuple, not per netdev. So the NIC can support different RSS functions for different filters. Unfortunately, this was then changed to be per-netdev during review. At that point, these checks were added in nxfc path.
symm-xor should only constrain RXFH settings. And in fact even if you wanted to block asymm ntuple filters, the current code does not do that, since the info.data fields it looks at aren't populated for ntuple filters (whose filter fields are defined by info.fs). So the xfrm check should be under `if (info.cmd == ETHTOOL_SRXFH)`.
If it is not, then it is a bug. I will try to test later this week and send a fix if needed.
Sorry, I misunderstood your original question. The check was actually intended for "rx-flow-hash":
# ethtool -X eth0 xfrm symmetric-xor # ethtool -N eth0 rx-flow-hash udp4 sdf Cannot change RX network flow hashing options: Invalid argument
and the NICs that support symm-xor do not use RSS on ntuple filters. So you are right, we should:
--- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -997,7 +997,7 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev, ethtool_get_flow_spec_ring(info.fs.ring_cookie)) return -EINVAL;
- if (ops->get_rxfh) { + if (info.cmd == ETHTOOL_SRXFH && ops->get_rxfh) { struct ethtool_rxfh_param rxfh = {};
rc = ops->get_rxfh(dev, &rxfh);
Let me know if you want me to send this.
Thanks.