]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
blk/kerneldevice: notify_all only required when discard_drain wait for condition 62151/head
authorYite Gu <yitegu0@gmail.com>
Fri, 30 Aug 2024 11:31:36 +0000 (19:31 +0800)
committerYite Gu <yitegu0@gmail.com>
Wed, 9 Apr 2025 08:13:47 +0000 (16:13 +0800)
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 <yitegu0@gmail.com>
(cherry picked from commit cec2e4550fe520fa60445678934c04ba605913be)

src/blk/kernel/KernelDevice.cc
src/blk/kernel/KernelDevice.h

index e0ca14f2731e07e961d1d7e191594a517810504e..2ab53dc94e4b50030809330596305f4b1d3b0442 100644 (file)
@@ -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 {
index ede56d140d3385cc1235026cdf556747bb7c79e0..d5ac958e3515fb0f8807d1024bfabc8941dd35b6 100644 (file)
@@ -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;