Erik Gabriel Carrillo
7079e29f7f
timer: fix race condition
rte_timer_manage() adds expired timers to a "run list", and walks the list, transitioning each timer from the PENDING to the RUNNING state. If another lcore resets or stops the timer at precisely this moment, the timer state would instead be set to CONFIG by that other lcore, which would cause timer_manage() to skip over it. This is expected behavior. However, if a timer expires quickly enough, there exists the following race condition that causes the timer_manage() routine to misinterpret a timer in CONFIG state, resulting in lost timers: - Thread A: - starts a timer with rte_timer_reset() - the timer is moved to CONFIG state - the spinlock associated with the appropriate skiplist is acquired - timer is inserted into the skiplist - the spinlock is released - Thread B: - executes rte_timer_manage() - find above timer as expired, add it to run list - walk run list, see above timer still in CONFIG state, unlink it from run list and continue on - Thread A: - move timer to PENDING state - return from rte_timer_reset() - timer is now in PENDING state, but not actually linked into a pending list or a run list and will never get processed further by rte_timer_manage() This commit fixes this race condition by only releasing the spinlock after the timer state has been transitioned from CONFIG to PENDING, which prevents rte_timer_manage() from seeing an incorrect state. Fixes: 9b15ba895b9f ("timer: use a skip list") Cc: stable@dpdk.org Signed-off-by: Erik Gabriel Carrillo <erik.g.carrillo@intel.com> Reviewed-by: Gavin Hu <gavin.hu@arm.com>
DPDK is a set of libraries and drivers for fast packet processing. It supports many processor architectures and both FreeBSD and Linux. The DPDK uses the Open Source BSD-3-Clause license for the core libraries and drivers. The kernel components are GPL-2.0 licensed. Please check the doc directory for release notes, API documentation, and sample application information. For questions and usage discussions, subscribe to: users@dpdk.org Report bugs and issues to the development mailing list: dev@dpdk.org
Description
Languages
C
99.1%
Meson
0.5%
Python
0.2%
Shell
0.1%