diff --git a/include/spdk/env.h b/include/spdk/env.h index 5af2182cb..2d2c7faa5 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -510,6 +510,11 @@ uint64_t spdk_get_ticks_hz(void); */ void spdk_delay_us(unsigned int us); +/** + * Pause CPU execution for a short while + */ +void spdk_pause(void); + struct spdk_ring; enum spdk_ring_type { diff --git a/lib/bdev/ocf/env/ocf_env.c b/lib/bdev/ocf/env/ocf_env.c index c7b56c0d1..6fa9589d0 100644 --- a/lib/bdev/ocf/env/ocf_env.c +++ b/lib/bdev/ocf/env/ocf_env.c @@ -101,7 +101,9 @@ env_completion_init(env_completion *completion) void env_completion_wait(env_completion *completion) { - while (atomic_read(&completion->atom)); + while (atomic_read(&completion->atom)) { + spdk_pause(); + } } void diff --git a/lib/env_dpdk/env.c b/lib/env_dpdk/env.c index 2b6b03d49..13337f52a 100644 --- a/lib/env_dpdk/env.c +++ b/lib/env_dpdk/env.c @@ -307,6 +307,11 @@ void spdk_delay_us(unsigned int us) rte_delay_us(us); } +void spdk_pause(void) +{ + rte_pause(); +} + void spdk_unaffinitize_thread(void) {