summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorAnatoly Burakov <anatoly.burakov@intel.com>2020-10-02 13:07:09 +0100
committerDavid Marchand <david.marchand@redhat.com>2020-11-02 11:47:19 +0100
commit317a1da8d632ebc7141716698cb7018588629ae2 (patch)
tree10ad5e974f916c1909fc291a5d9bdc360c239680 /examples
parent79d69c6dcf0debea38ac258d230e2f8c93e5ad12 (diff)
examples/l3fwd-power: fix race on interrupt wakeup log
Currently, the interrupt status notification prevents log spam by remembering whether previous interrupt wakeup was due to traffic or due to timeout expiring. However, it is a single variable that can potentially be accessed from multiple threads, so it is not thread-safe. Fix it by having per-lcore interrupt status. Fixes: f4d1e19c293d ("examples/l3fwd-power: add Rx interrupt timeout") Cc: stable@dpdk.org Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Acked-by: David Hunt <david.hunt@intel.com> Tested-by: Xi Zhang <xix.zhang@intel.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/l3fwd-power/main.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index a48d75f68f..2874285c4e 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -821,20 +821,23 @@ power_freq_scaleup_heuristic(unsigned lcore_id,
* 0 on success
*/
static int
-sleep_until_rx_interrupt(int num)
+sleep_until_rx_interrupt(int num, int lcore)
{
/*
* we want to track when we are woken up by traffic so that we can go
- * back to sleep again without log spamming.
+ * back to sleep again without log spamming. Avoid cache line sharing
+ * to prevent threads stepping on each others' toes.
*/
- static bool timeout;
+ static struct {
+ bool wakeup;
+ } __rte_cache_aligned status[RTE_MAX_LCORE];
struct rte_epoll_event event[num];
int n, i;
uint16_t port_id;
uint8_t queue_id;
void *data;
- if (!timeout) {
+ if (status[lcore].wakeup) {
RTE_LOG(INFO, L3FWD_POWER,
"lcore %u sleeps until interrupt triggers\n",
rte_lcore_id());
@@ -851,7 +854,7 @@ sleep_until_rx_interrupt(int num)
" port %d queue %d\n",
rte_lcore_id(), port_id, queue_id);
}
- timeout = n == 0;
+ status[lcore].wakeup = n != 0;
return 0;
}
@@ -1050,7 +1053,8 @@ start_rx:
if (intr_en) {
turn_on_off_intr(qconf, 1);
sleep_until_rx_interrupt(
- qconf->n_rx_queue);
+ qconf->n_rx_queue,
+ lcore_id);
turn_on_off_intr(qconf, 0);
/**
* start receiving packets immediately
@@ -1473,7 +1477,8 @@ start_rx:
if (intr_en) {
turn_on_off_intr(qconf, 1);
sleep_until_rx_interrupt(
- qconf->n_rx_queue);
+ qconf->n_rx_queue,
+ lcore_id);
turn_on_off_intr(qconf, 0);
/**
* start receiving packets immediately