]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
blk/kerneldevice: notify_all only required when discard_drain wait for condition
authorYite Gu <yitegu0@gmail.com>
Fri, 30 Aug 2024 11:31:36 +0000 (19:31 +0800)
committerYuri Weinstein <yweinste@redhat.com>
Thu, 1 May 2025 14:05:33 +0000 (14:05 +0000)
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)
(cherry picked from commit 3a901add5236835f37480a205cc86e9ea24d161b)
(cherry picked from commit 9d6309c0088b080f87b60b2877aabb9170c5a7f0)

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

index 64be2466540ff61ddd83934ed80834e49621fde2..62e300ea1244227879692534ac875f966e89b5dc 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 e3ecaa036d0880dcc7ef2d0215a287d62050d263..13badbe2aef8fd6898fd750e26c371ad96b9647e 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;