Patch "igc: Do not enable taprio offload for invalid arguments" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    igc: Do not enable taprio offload for invalid arguments

to the 6.4-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:
     igc-do-not-enable-taprio-offload-for-invalid-argumen.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2c4ff73ed926e50f603809bb4611a7f59b76753e
Author: Florian Kauer <florian.kauer@xxxxxxxxxxxxx>
Date:   Wed Jun 14 16:07:10 2023 +0200

    igc: Do not enable taprio offload for invalid arguments
    
    [ Upstream commit 82ff5f29b7377d614f0c01fd74b5d0cb225f0adc ]
    
    Only set adapter->taprio_offload_enable after validating the arguments.
    Otherwise, it stays set even if the offload was not enabled.
    Since the subsequent code does not get executed in case of invalid
    arguments, it will not be read at first.
    However, by activating and then deactivating another offload
    (e.g. ETF/TX launchtime offload), taprio_offload_enable is read
    and erroneously keeps the offload feature of the NIC enabled.
    
    This can be reproduced as follows:
    
        # TAPRIO offload (flags == 0x2) and negative base-time leading to expected -ERANGE
        sudo tc qdisc replace dev enp1s0 parent root handle 100 stab overhead 24 taprio \
                num_tc 1 \
                map 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \
                queues 1@0 \
                base-time -1000 \
                sched-entry S 01 300000 \
                flags 0x2
    
        # IGC_TQAVCTRL is 0x0 as expected (iomem=relaxed for reading register)
        sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1
    
        # Activate ETF offload
        sudo tc qdisc replace dev enp1s0 parent root handle 6666 mqprio \
                num_tc 3 \
                map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
                queues 1@0 1@1 2@2 \
                hw 0
        sudo tc qdisc add dev enp1s0 parent 6666:1 etf \
                clockid CLOCK_TAI \
                delta 500000 \
                offload
    
        # IGC_TQAVCTRL is 0x9 as expected
        sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1
    
        # Deactivate ETF offload again
        sudo tc qdisc delete dev enp1s0 parent 6666:1
    
        # IGC_TQAVCTRL should now be 0x0 again, but is observed as 0x9
        sudo pcimem /sys/bus/pci/devices/0000:01:00.0/resource0 0x3570 w*1
    
    Fixes: e17090eb2494 ("igc: allow BaseTime 0 enrollment for Qbv")
    Signed-off-by: Florian Kauer <florian.kauer@xxxxxxxxxxxxx>
    Reviewed-by: Kurt Kanzenbach <kurt@xxxxxxxxxxxxx>
    Tested-by: Naama Meir <naamax.meir@xxxxxxxxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 6bed12224120f..f051ca733af1b 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -6090,6 +6090,7 @@ static int igc_tsn_clear_schedule(struct igc_adapter *adapter)
 
 	adapter->base_time = 0;
 	adapter->cycle_time = NSEC_PER_SEC;
+	adapter->taprio_offload_enable = false;
 	adapter->qbv_config_change_errors = 0;
 	adapter->qbv_transition = false;
 	adapter->qbv_count = 0;
@@ -6117,20 +6118,12 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
 	size_t n;
 	int i;
 
-	switch (qopt->cmd) {
-	case TAPRIO_CMD_REPLACE:
-		adapter->taprio_offload_enable = true;
-		break;
-	case TAPRIO_CMD_DESTROY:
-		adapter->taprio_offload_enable = false;
-		break;
-	default:
-		return -EOPNOTSUPP;
-	}
-
-	if (!adapter->taprio_offload_enable)
+	if (qopt->cmd == TAPRIO_CMD_DESTROY)
 		return igc_tsn_clear_schedule(adapter);
 
+	if (qopt->cmd != TAPRIO_CMD_REPLACE)
+		return -EOPNOTSUPP;
+
 	if (qopt->base_time < 0)
 		return -ERANGE;
 
@@ -6142,6 +6135,7 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
 
 	adapter->cycle_time = qopt->cycle_time;
 	adapter->base_time = qopt->base_time;
+	adapter->taprio_offload_enable = true;
 
 	igc_ptp_read(adapter, &now);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux