l3fwd-power: fix intr disable
Checks
Commit Message
Since all related queues' intr is turned on before epoll, we need to turn
off all the queues' intr after wake up.
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>
---
examples/l3fwd-power/main.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
@@ -880,9 +880,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",
@@ -892,7 +889,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;
@@ -905,7 +902,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]));
}
}
@@ -1340,9 +1340,10 @@ main_loop(__attribute__((unused)) void *dummy)
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
*/