From: Yite Gu Date: Fri, 30 Aug 2024 11:31:36 +0000 (+0800) Subject: blk/kerneldevice: notify_all only required when discard_drain wait for condition X-Git-Tag: testing/wip-pdonnell-testing-20250429.182310-reef-debug~22^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3a901add5236835f37480a205cc86e9ea24d161b;p=ceph-ci.git 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) --- diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index cb2b06a3de4..b6e637a6b21 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -591,6 +591,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); } } @@ -756,7 +757,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 99098d7fe40..c7d55d73edc 100644 --- a/src/blk/kernel/KernelDevice.h +++ b/src/blk/kernel/KernelDevice.h @@ -53,6 +53,7 @@ private: void *discard_callback_priv; bool aio_stop; bool discard_stop; + bool need_notify = false; ceph::mutex discard_lock = ceph::make_mutex("KernelDevice::discard_lock"); ceph::condition_variable discard_cond;