From ce3906e16b8cca87c4f445a0fd451d55bb4e3b6a Mon Sep 17 00:00:00 2001 From: Yite Gu Date: Fri, 30 Aug 2024 19:31:36 +0800 Subject: [PATCH] blk/kerneldevice: notify_all only required when discard_drain wait for condition This will cause discard threads to wake up each other if bdev_async_discard_threads >= 2. Fixes: https://tracker.ceph.com/issues/67835 Signed-off-by: Yite Gu (cherry picked from commit cec2e4550fe520fa60445678934c04ba605913be) --- src/blk/kernel/KernelDevice.cc | 6 +++++- src/blk/kernel/KernelDevice.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index e0ca14f2731e0..2ab53dc94e4b5 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -589,6 +589,7 @@ void KernelDevice::discard_drain() dout(10) << __func__ << dendl; std::unique_lock l(discard_lock); while (!discard_queued.empty() || (discard_running > 0)) { + need_notify = true; discard_cond.wait(l); } } @@ -754,7 +755,10 @@ void KernelDevice::_discard_thread(uint64_t tid) if (thr->stop) break; dout(20) << __func__ << " sleep" << dendl; - discard_cond.notify_all(); // for the thread trying to drain... + if (need_notify) { + discard_cond.notify_all(); // for the thread trying to drain... + need_notify = false; + } discard_cond.wait(l); dout(20) << __func__ << " wake" << dendl; } else { diff --git a/src/blk/kernel/KernelDevice.h b/src/blk/kernel/KernelDevice.h index ede56d140d338..d5ac958e3515f 100644 --- a/src/blk/kernel/KernelDevice.h +++ b/src/blk/kernel/KernelDevice.h @@ -52,6 +52,7 @@ private: aio_callback_t discard_callback; void *discard_callback_priv; bool aio_stop; + bool need_notify = false; ceph::mutex discard_lock = ceph::make_mutex("KernelDevice::discard_lock"); ceph::condition_variable discard_cond; -- 2.39.5