]> git.droids-corp.org - dpdk.git/commitdiff
examples/l3fwd-power: fix interrupt disable
authorXiao Wang <xiao.w.wang@intel.com>
Tue, 21 Jan 2020 03:06:57 +0000 (22:06 -0500)
committerDavid Marchand <david.marchand@redhat.com>
Fri, 14 Feb 2020 11:49:21 +0000 (12:49 +0100)
Since all related queues' interrupts are turned on before epoll, we need
to turn off all the interrupts after wakeup. This patch fixes the issue
of only turning off the interrupted queues.

Fixes: b736d64787fc ("examples/l3fwd-power: disable Rx interrupt when waking up")
Cc: stable@dpdk.org
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
Tested-by: Harman Kalra <hkalra@marvell.com>
Reviewed-by: Liang Ma <liang.j.ma@intel.com>
Tested-by: Liang Ma <liang.j.ma@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
examples/l3fwd-power/main.c

index e63abb1da86fd7d9adcdce09654b954484de73dd..c7fe0ec03495654c0c08660dcc980217e599ab73 100644 (file)
@@ -870,9 +870,6 @@ sleep_until_rx_interrupt(int num)
                port_id = ((uintptr_t)data) >> CHAR_BIT;
                queue_id = ((uintptr_t)data) &
                        RTE_LEN2MASK(CHAR_BIT, uint8_t);
-               rte_spinlock_lock(&(locks[port_id]));
-               rte_eth_dev_rx_intr_disable(port_id, queue_id);
-               rte_spinlock_unlock(&(locks[port_id]));
                RTE_LOG(INFO, L3FWD_POWER,
                        "lcore %u is waked up from rx interrupt on"
                        " port %d queue %d\n",
@@ -882,7 +879,7 @@ sleep_until_rx_interrupt(int num)
        return 0;
 }
 
-static void turn_on_intr(struct lcore_conf *qconf)
+static void turn_on_off_intr(struct lcore_conf *qconf, bool on)
 {
        int i;
        struct lcore_rx_queue *rx_queue;
@@ -895,7 +892,10 @@ static void turn_on_intr(struct lcore_conf *qconf)
                queue_id = rx_queue->queue_id;
 
                rte_spinlock_lock(&(locks[port_id]));
-               rte_eth_dev_rx_intr_enable(port_id, queue_id);
+               if (on)
+                       rte_eth_dev_rx_intr_enable(port_id, queue_id);
+               else
+                       rte_eth_dev_rx_intr_disable(port_id, queue_id);
                rte_spinlock_unlock(&(locks[port_id]));
        }
 }
@@ -1330,9 +1330,10 @@ start_rx:
                        else {
                                /* suspend until rx interrupt triggers */
                                if (intr_en) {
-                                       turn_on_intr(qconf);
+                                       turn_on_off_intr(qconf, 1);
                                        sleep_until_rx_interrupt(
                                                qconf->n_rx_queue);
+                                       turn_on_off_intr(qconf, 0);
                                        /**
                                         * start receiving packets immediately
                                         */