diff mbox series

[ethtool-next,v2] rxclass: Make output for RSS context action explicit

Message ID 978e1192c07e970b8944c2a729ae42bf97667a53.1731107871.git.dxu@dxuuu.xyz (mailing list archive)
State Superseded
Delegated to: Michal Kubecek
Headers show
Series [ethtool-next,v2] rxclass: Make output for RSS context action explicit | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Daniel Xu Nov. 11, 2024, 7:05 p.m. UTC
Currently `ethtool -n` prints out misleading output if the action for an
ntuple rule is to redirect to an RSS context. For example:

    # ethtool -X eth0 hfunc toeplitz context new start 24 equal 8
    New RSS context is 1

    # ethtool -N eth0 flow-type ip6 dst-ip $IP6 context 1
    Added rule with ID 0

    # ethtool -n eth0 rule 0
    Filter: 0
            Rule Type: Raw IPv6
            Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
            Dest IP addr: <redacted> mask: ::
            Traffic Class: 0x0 mask: 0xff
            Protocol: 0 mask: 0xff
            L4 bytes: 0x0 mask: 0xffffffff
            RSS Context ID: 1
            Action: Direct to queue 0

The above output suggests that the HW will direct to queue 0 where in
reality queue 0 is just the base offset from which the redirection table
lookup in the RSS context is added to.

Fix by making output more clear. Also suppress base offset queue for the
common case of 0. Example of new output:

    # ./ethtool -n eth0 rule 0
    Filter: 0
            Rule Type: Raw IPv6
            Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
            Dest IP addr: <redacted> mask: ::
            Traffic Class: 0x0 mask: 0xff
            Protocol: 0 mask: 0xff
            L4 bytes: 0x0 mask: 0xffffffff
            Action: Direct to RSS context id 1

Signed-off-by: Daniel Xu <dxu@dxuuu.xyz>
---
Changes from v1:
* Reword to support queue base offset API
* Fix compile error
* Improve wording (also a transcription error)

 rxclass.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Joe Damato Nov. 11, 2024, 7:27 p.m. UTC | #1
On Mon, Nov 11, 2024 at 12:05:38PM -0700, Daniel Xu wrote:
> Currently `ethtool -n` prints out misleading output if the action for an
> ntuple rule is to redirect to an RSS context. For example:
> 
>     # ethtool -X eth0 hfunc toeplitz context new start 24 equal 8
>     New RSS context is 1
> 
>     # ethtool -N eth0 flow-type ip6 dst-ip $IP6 context 1
>     Added rule with ID 0
> 
>     # ethtool -n eth0 rule 0
>     Filter: 0
>             Rule Type: Raw IPv6
>             Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
>             Dest IP addr: <redacted> mask: ::
>             Traffic Class: 0x0 mask: 0xff
>             Protocol: 0 mask: 0xff
>             L4 bytes: 0x0 mask: 0xffffffff
>             RSS Context ID: 1
>             Action: Direct to queue 0
> 
> The above output suggests that the HW will direct to queue 0 where in
> reality queue 0 is just the base offset from which the redirection table
> lookup in the RSS context is added to.
> 
> Fix by making output more clear. Also suppress base offset queue for the
> common case of 0. Example of new output:
> 
>     # ./ethtool -n eth0 rule 0
>     Filter: 0
>             Rule Type: Raw IPv6
>             Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
>             Dest IP addr: <redacted> mask: ::
>             Traffic Class: 0x0 mask: 0xff
>             Protocol: 0 mask: 0xff
>             L4 bytes: 0x0 mask: 0xffffffff
>             Action: Direct to RSS context id 1
> 
> Signed-off-by: Daniel Xu <dxu@dxuuu.xyz>
> ---
> Changes from v1:
> * Reword to support queue base offset API
> * Fix compile error
> * Improve wording (also a transcription error)
> 
>  rxclass.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)

I tested this on a machine with an mlx5 NIC.

FWIW: I only learned about ring_cookie from this thread, so I don't
feel qualified to give an official "Reviewed-by", but:

Before the patch:

sudo ethtool -L eth2 combined 18
sudo ethtool -X eth2 weight 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 context new
sudo ethtool -U eth2 flow-type tcp4 dst-port 11211 context 1

$ ethtool -n eth2 rule 1023
Filter: 1023
	Rule Type: TCP over IPv4
	Src IP addr: 0.0.0.0 mask: 255.255.255.255
	Dest IP addr: 0.0.0.0 mask: 255.255.255.255
	TOS: 0x0 mask: 0xff
	Src port: 0 mask: 0xffff
	Dest port: 11211 mask: 0x0
	RSS Context ID: 1
	Action: Direct to queue 0

After the patch:

$ ./ethtool -n eth2 rule 1023
Filter: 1023
	Rule Type: TCP over IPv4
	Src IP addr: 0.0.0.0 mask: 255.255.255.255
	Dest IP addr: 0.0.0.0 mask: 255.255.255.255
	TOS: 0x0 mask: 0xff
	Src port: 0 mask: 0xffff
	Dest port: 11211 mask: 0x0
	Action: Direct to RSS context id 1

The results after the patch make more sense to me, personally. I
have NOT audited mlx5 at all, so no idea how (or if) it deals with
ring_cookie.

It'd be really great to add the bit about "queue base offset" to the
man page for ethtool.

All that said, since I tested it and it works and makes sense to me:

Tested-by: Joe Damato <jdamato@fastly.com>
Edward Cree Nov. 12, 2024, 10:03 a.m. UTC | #2
On 11/11/2024 19:05, Daniel Xu wrote:
> Currently `ethtool -n` prints out misleading output if the action for an
> ntuple rule is to redirect to an RSS context. For example:
> 
>     # ethtool -X eth0 hfunc toeplitz context new start 24 equal 8
>     New RSS context is 1
> 
>     # ethtool -N eth0 flow-type ip6 dst-ip $IP6 context 1
>     Added rule with ID 0
> 
>     # ethtool -n eth0 rule 0
>     Filter: 0
>             Rule Type: Raw IPv6
>             Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
>             Dest IP addr: <redacted> mask: ::
>             Traffic Class: 0x0 mask: 0xff
>             Protocol: 0 mask: 0xff
>             L4 bytes: 0x0 mask: 0xffffffff
>             RSS Context ID: 1
>             Action: Direct to queue 0
> 
> The above output suggests that the HW will direct to queue 0 where in
> reality queue 0 is just the base offset from which the redirection table
> lookup in the RSS context is added to.
> 
> Fix by making output more clear. Also suppress base offset queue for the
> common case of 0. Example of new output:
> 
>     # ./ethtool -n eth0 rule 0
>     Filter: 0
>             Rule Type: Raw IPv6
>             Src IP addr: :: mask: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
>             Dest IP addr: <redacted> mask: ::
>             Traffic Class: 0x0 mask: 0xff
>             Protocol: 0 mask: 0xff
>             L4 bytes: 0x0 mask: 0xffffffff
>             Action: Direct to RSS context id 1
> 
> Signed-off-by: Daniel Xu <dxu@dxuuu.xyz>

Reviewed-by: Edward Cree <ecree.xilinx@gmail.com>

but someone who understands ethtool_get_flow_spec_ring_vf() should
 look at this as well to check whether that information's needed too.

> ---
> Changes from v1:
> * Reword to support queue base offset API
> * Fix compile error
> * Improve wording (also a transcription error)
> 
>  rxclass.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/rxclass.c b/rxclass.c
> index f17e3a5..ac9b529 100644
> --- a/rxclass.c
> +++ b/rxclass.c
> @@ -248,13 +248,17 @@ static void rxclass_print_nfc_rule(struct ethtool_rx_flow_spec *fsp,
>  
>  	rxclass_print_nfc_spec_ext(fsp);
>  
> -	if (fsp->flow_type & FLOW_RSS)
> -		fprintf(stdout, "\tRSS Context ID: %u\n", rss_context);
> -
>  	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
>  		fprintf(stdout, "\tAction: Drop\n");
>  	} else if (fsp->ring_cookie == RX_CLS_FLOW_WAKE) {
>  		fprintf(stdout, "\tAction: Wake-on-LAN\n");
> +	} else if (fsp->flow_type & FLOW_RSS) {
> +		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);
> +
> +		fprintf(stdout, "\tAction: Direct to RSS context id %u", rss_context);
> +		if (queue)
> +			fprintf(stdout, " (queue base offset: %llu)", queue);
> +		fprintf(stdout, "\n");
>  	} else {
>  		u64 vf = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
>  		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);
>
Jakub Kicinski Nov. 12, 2024, 3:40 p.m. UTC | #3
On Mon, 11 Nov 2024 12:05:38 -0700 Daniel Xu wrote:
> -	if (fsp->flow_type & FLOW_RSS)
> -		fprintf(stdout, "\tRSS Context ID: %u\n", rss_context);
> -
>  	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
>  		fprintf(stdout, "\tAction: Drop\n");
>  	} else if (fsp->ring_cookie == RX_CLS_FLOW_WAKE) {
>  		fprintf(stdout, "\tAction: Wake-on-LAN\n");
> +	} else if (fsp->flow_type & FLOW_RSS) {
> +		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);
> +
> +		fprintf(stdout, "\tAction: Direct to RSS context id %u", rss_context);

Do you have strong feelings about the change in formatting?
Looking at Ed's comment on the new test made me wonder if the change 
in capitalization is for the better.

Action: Direct to RSS context id 1 (queue base offset: 2)

vs

Action: Direct to RSS Context ID: 1 (queue base offset: 2)

Given "id" is a word (: I like the ID format, the extra colon is
annoying but OTOH if we retain it your regexp in the other patch
would match before and after..

Actually the best formatting IMHO would be to skip the ID altogether:

Action: Direct to RSS Context 1 (queue base offset: 2)

So please respin this, either set the ID to upper case or skip it.
And depending on the decision here respin the test (feel free to
repost before 24h passes, if you do).
Daniel Xu Nov. 13, 2024, 1:31 a.m. UTC | #4
Hi Jakub,

On Tue, Nov 12, 2024, at 7:40 AM, Jakub Kicinski wrote:
> On Mon, 11 Nov 2024 12:05:38 -0700 Daniel Xu wrote:
>> -	if (fsp->flow_type & FLOW_RSS)
>> -		fprintf(stdout, "\tRSS Context ID: %u\n", rss_context);
>> -
>>  	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
>>  		fprintf(stdout, "\tAction: Drop\n");
>>  	} else if (fsp->ring_cookie == RX_CLS_FLOW_WAKE) {
>>  		fprintf(stdout, "\tAction: Wake-on-LAN\n");
>> +	} else if (fsp->flow_type & FLOW_RSS) {
>> +		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);
>> +
>> +		fprintf(stdout, "\tAction: Direct to RSS context id %u", rss_context);
>
> Do you have strong feelings about the change in formatting?
> Looking at Ed's comment on the new test made me wonder if the change 
> in capitalization is for the better.
>
> Action: Direct to RSS context id 1 (queue base offset: 2)
>
> vs
>
> Action: Direct to RSS Context ID: 1 (queue base offset: 2)
>
> Given "id" is a word (: I like the ID format, the extra colon is
> annoying but OTOH if we retain it your regexp in the other patch
> would match before and after..
>
> Actually the best formatting IMHO would be to skip the ID altogether:
>
> Action: Direct to RSS Context 1 (queue base offset: 2)

No strong opinions other than I agree second colon should be skipped.
Let's go with this one.
diff mbox series

Patch

diff --git a/rxclass.c b/rxclass.c
index f17e3a5..ac9b529 100644
--- a/rxclass.c
+++ b/rxclass.c
@@ -248,13 +248,17 @@  static void rxclass_print_nfc_rule(struct ethtool_rx_flow_spec *fsp,
 
 	rxclass_print_nfc_spec_ext(fsp);
 
-	if (fsp->flow_type & FLOW_RSS)
-		fprintf(stdout, "\tRSS Context ID: %u\n", rss_context);
-
 	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
 		fprintf(stdout, "\tAction: Drop\n");
 	} else if (fsp->ring_cookie == RX_CLS_FLOW_WAKE) {
 		fprintf(stdout, "\tAction: Wake-on-LAN\n");
+	} else if (fsp->flow_type & FLOW_RSS) {
+		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);
+
+		fprintf(stdout, "\tAction: Direct to RSS context id %u", rss_context);
+		if (queue)
+			fprintf(stdout, " (queue base offset: %llu)", queue);
+		fprintf(stdout, "\n");
 	} else {
 		u64 vf = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
 		u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie);