From 997716c62d96467216031d7c0a770ffa81d8484d Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 7 Jan 2016 22:11:00 +0800 Subject: [PATCH] NVMEDevice: don't try to acquire lock always Signed-off-by: Haomai Wang --- src/os/bluestore/NVMEDevice.cc | 32 ++++++++++++++++++++++++++++---- src/os/bluestore/NVMEDevice.h | 1 + 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/os/bluestore/NVMEDevice.cc b/src/os/bluestore/NVMEDevice.cc index 2bfefc328e0b0..7873a2f46b18d 100644 --- a/src/os/bluestore/NVMEDevice.cc +++ b/src/os/bluestore/NVMEDevice.cc @@ -287,6 +287,7 @@ NVMEDevice::NVMEDevice(aio_callback_t cb, void *cbpriv) : ctrlr(nullptr), ns(nullptr), aio_stop(false), + queue_empty(1), queue_lock("NVMEDevice::queue_lock"), aio_thread(this), inflight_ops(0), @@ -334,7 +335,11 @@ void NVMEDevice::close() { dout(1) << __func__ << dendl; - aio_stop = true; + { + Mutex::Locker l(queue_lock); + aio_stop = true; + queue_cond.Signal(); + } aio_thread.join(); aio_stop = false; name.clear(); @@ -356,12 +361,17 @@ void NVMEDevice::_aio_thread() while (!aio_stop) { dout(40) << __func__ << " polling" << dendl; t = nullptr; - { + if (!queue_empty.read()) { Mutex::Locker l(queue_lock); if (!task_queue.empty()) { t = task_queue.front(); task_queue.pop(); } + queue_empty.inc(); + } else if (!inflight_ops.read()) { + Mutex::Locker l(queue_lock); + if (queue_empty.read()) + queue_cond.Wait(); } if (t) { @@ -397,8 +407,9 @@ void NVMEDevice::_aio_thread() t->return_code = r; Mutex::Locker l(t->ctx->lock); t->ctx->cond.Signal(); + } else { + inflight_ops.inc(); } - inflight_ops.inc(); break; } case IOCommand::FLUSH_COMMAND: @@ -410,8 +421,9 @@ void NVMEDevice::_aio_thread() t->return_code = r; Mutex::Locker l(t->ctx->lock); t->ctx->cond.Signal(); + } else { + inflight_ops.inc(); } - inflight_ops.inc(); break; } } @@ -452,6 +464,10 @@ int NVMEDevice::flush() { Mutex::Locker l(queue_lock); task_queue.push(t); + if (queue_empty.read()) { + queue_empty.dec(); + queue_cond.Signal(); + } } { Mutex::Locker l(ioc.lock); @@ -476,6 +492,10 @@ void NVMEDevice::aio_submit(IOContext *ioc) Mutex::Locker l(queue_lock); // Only need to push the first entry task_queue.push(t); + if (queue_empty.read()) { + queue_empty.dec(); + queue_cond.Signal(); + } } int NVMEDevice::aio_write( @@ -587,6 +607,10 @@ int NVMEDevice::read(uint64_t off, uint64_t len, bufferlist *pbl, { Mutex::Locker l(queue_lock); task_queue.push(t); + if (queue_empty.read()) { + queue_empty.dec(); + queue_cond.Signal(); + } } { diff --git a/src/os/bluestore/NVMEDevice.h b/src/os/bluestore/NVMEDevice.h index af99999f1cba1..c83fbaec8e0b5 100644 --- a/src/os/bluestore/NVMEDevice.h +++ b/src/os/bluestore/NVMEDevice.h @@ -72,6 +72,7 @@ class NVMEDevice : public BlockDevice { bool aio_stop; bufferptr zeros; + atomic_t queue_empty; Mutex queue_lock; Cond queue_cond; std::queue task_queue; -- 2.39.5