From 49dcf7b98e87a5d2880693da4c09af11e58f3447 Mon Sep 17 00:00:00 2001 From: Xiao Wang Date: Mon, 20 Jan 2020 22:06:57 -0500 Subject: [PATCH] examples/l3fwd-power: fix interrupt disable 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 Tested-by: Harman Kalra Reviewed-by: Liang Ma Tested-by: Liang Ma Acked-by: David Hunt --- examples/l3fwd-power/main.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c index e63abb1da8..c7fe0ec034 100644 --- a/examples/l3fwd-power/main.c +++ b/examples/l3fwd-power/main.c @@ -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 @@ 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 */