From: Haomai Wang Date: Wed, 6 Jan 2016 06:54:59 +0000 (+0800) Subject: NVMEDevice: make aio thread pause when idle X-Git-Tag: v10.0.4~81^2~24 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=19a3c7eb560b667e6b8ca47b08df1215cde388ef;p=ceph.git NVMEDevice: make aio thread pause when idle Signed-off-by: Haomai Wang --- diff --git a/src/os/bluestore/NVMEDevice.cc b/src/os/bluestore/NVMEDevice.cc index 0c2d2359cfac..2bfefc328e0b 100644 --- a/src/os/bluestore/NVMEDevice.cc +++ b/src/os/bluestore/NVMEDevice.cc @@ -21,6 +21,9 @@ #include #include #include +#ifdef HAVE_SSE +#include +#endif #include #include @@ -46,6 +49,7 @@ rte_mempool *task_pool = nullptr; static void io_complete(void *t, const struct nvme_completion *completion) { Task *task = static_cast(t); IOContext *ctx = task->ctx; + task->device->inflight_ops.dec(); if (task->command == IOCommand::WRITE_COMMAND) { auto left = ctx->num_running.dec(); assert(!nvme_completion_is_error(completion)); @@ -138,7 +142,6 @@ int SharedDriverData::_scan_nvme_device(const string &sn_tag, nvme_controller ** pci_device_iterator *iter = pci_id_match_iterator_create(&match); char serial_number[128]; - const struct nvme_controller_data *cdata; while ((pci_dev = pci_device_next(iter)) != NULL) { dout(10) << __func__ << " found device at "<< pci_dev->bus << ":" << pci_dev->dev << ":" << pci_dev->func << " vendor:0x" << pci_dev->vendor_id << " device:0x" << pci_dev->device_id @@ -286,6 +289,7 @@ NVMEDevice::NVMEDevice(aio_callback_t cb, void *cbpriv) aio_stop(false), queue_lock("NVMEDevice::queue_lock"), aio_thread(this), + inflight_ops(0), aio_callback(cb), aio_callback_priv(cbpriv) { @@ -376,6 +380,7 @@ void NVMEDevice::_aio_thread() derr << __func__ << " failed to do write command" << dendl; assert(0); } + inflight_ops.inc(); t = t->prev; } break; @@ -393,6 +398,7 @@ void NVMEDevice::_aio_thread() Mutex::Locker l(t->ctx->lock); t->ctx->cond.Signal(); } + inflight_ops.inc(); break; } case IOCommand::FLUSH_COMMAND: @@ -405,9 +411,17 @@ void NVMEDevice::_aio_thread() Mutex::Locker l(t->ctx->lock); t->ctx->cond.Signal(); } + inflight_ops.inc(); break; } } + } else if (!inflight_ops.read()) { + dout(20) << __func__ << " idle, have a pause" << dendl; +#ifdef HAVE_SSE + _mm_pause(); +#else + usleep(10); +#endif } nvme_ctrlr_process_io_completions(ctrlr, max); diff --git a/src/os/bluestore/NVMEDevice.h b/src/os/bluestore/NVMEDevice.h index b05cd13dba8b..af99999f1cba 100644 --- a/src/os/bluestore/NVMEDevice.h +++ b/src/os/bluestore/NVMEDevice.h @@ -90,6 +90,7 @@ class NVMEDevice : public BlockDevice { static void init(); public: + atomic_t inflight_ops; aio_callback_t aio_callback; void *aio_callback_priv;