]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
igc: add preemptible queue support in mqprio
authorFaizal Rahim <faizal.abdul.rahim@linux.intel.com>
Mon, 19 May 2025 07:19:11 +0000 (03:19 -0400)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Wed, 11 Jun 2025 17:06:24 +0000 (10:06 -0700)
igc already supports enabling MAC Merge for FPE. This patch adds
support for preemptible queues in mqprio.

Tested preemption with mqprio by:
1. Enable FPE:
   ethtool --set-mm enp1s0 pmac-enabled on tx-enabled on verify-enabled on
2. Enable preemptible queue in mqprio:
   mqprio num_tc 4 map 0 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 \
   queues 1@0 1@1 1@2 1@3 \
   fp P P P E

Signed-off-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Tested-by: Mor Bar-Gabay <morx.bar.gabay@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/igc/igc_main.c
drivers/net/ethernet/intel/igc/igc_tsn.c
drivers/net/ethernet/intel/igc/igc_tsn.h

index 23cbe02ee238a47af98ce9e556187f7de59636a1..515b9610b9074c520f53b34d74ecc1aafb8b8a4d 100644 (file)
@@ -6765,6 +6765,7 @@ static int igc_tsn_enable_mqprio(struct igc_adapter *adapter,
 
        if (!mqprio->qopt.num_tc) {
                adapter->strict_priority_enable = false;
+               igc_fpe_clear_preempt_queue(adapter);
                netdev_reset_tc(adapter->netdev);
                goto apply;
        }
@@ -6792,13 +6793,6 @@ static int igc_tsn_enable_mqprio(struct igc_adapter *adapter,
                return -EOPNOTSUPP;
        }
 
-       /* Preemption is not supported yet. */
-       if (mqprio->preemptible_tcs) {
-               NL_SET_ERR_MSG_MOD(mqprio->extack,
-                                  "Preemption is not supported yet");
-               return -EOPNOTSUPP;
-       }
-
        igc_save_mqprio_params(adapter, mqprio->qopt.num_tc,
                               mqprio->qopt.offset);
 
@@ -6818,6 +6812,7 @@ static int igc_tsn_enable_mqprio(struct igc_adapter *adapter,
                adapter->queue_per_tc[i] = i;
 
        mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS;
+       igc_fpe_save_preempt_queue(adapter, mqprio);
 
 apply:
        return igc_tsn_offload_apply(adapter);
index 811856d665717a6372c6ba308c711b7c0e65b740..b23b9ca451a79780a2e8cd577691a000d7684796 100644 (file)
@@ -160,6 +160,15 @@ void igc_fpe_init(struct igc_adapter *adapter)
        ethtool_mmsv_init(&adapter->fpe.mmsv, adapter->netdev, &igc_mmsv_ops);
 }
 
+void igc_fpe_clear_preempt_queue(struct igc_adapter *adapter)
+{
+       for (int i = 0; i < adapter->num_tx_queues; i++) {
+               struct igc_ring *tx_ring = adapter->tx_ring[i];
+
+               tx_ring->preemptible = false;
+       }
+}
+
 static u32 igc_fpe_map_preempt_tc_to_queue(const struct igc_adapter *adapter,
                                           unsigned long preemptible_tcs)
 {
index f2e8bfef48711817cbdd24ab0aaa1cadd55066f3..a95b893459d736a92ce34b4f68ed11f6dbdeb58c 100644 (file)
@@ -17,6 +17,7 @@ enum igc_txd_popts_type {
 DECLARE_STATIC_KEY_FALSE(igc_fpe_enabled);
 
 void igc_fpe_init(struct igc_adapter *adapter);
+void igc_fpe_clear_preempt_queue(struct igc_adapter *adapter);
 void igc_fpe_save_preempt_queue(struct igc_adapter *adapter,
                                const struct tc_mqprio_qopt_offload *mqprio);
 u32 igc_fpe_get_supported_frag_size(u32 frag_size);