]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlockDevice: std::atomic_int 7568/head
authorSage Weil <sage@redhat.com>
Fri, 5 Feb 2016 16:45:23 +0000 (11:45 -0500)
committerSage Weil <sage@redhat.com>
Mon, 8 Feb 2016 14:53:19 +0000 (09:53 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlockDevice.cc
src/os/bluestore/BlockDevice.h
src/os/bluestore/BlueFS.cc
src/os/bluestore/KernelDevice.cc

index f683f6fa60585e83853627a76991b8c1a8197b0d..8286070bb11fd384ff6fbe90f0cb0011b2995e2d 100644 (file)
@@ -31,14 +31,14 @@ void IOContext::aio_wait()
 {
   std::unique_lock<std::mutex> l(lock);
   // see _aio_thread for waker logic
-  num_waiting.inc();
-  while (num_running.read() > 0 || num_reading.read() > 0) {
+  ++num_waiting;
+  while (num_running.load() > 0 || num_reading.load() > 0) {
     dout(10) << __func__ << " " << this
-            << " waiting for " << num_running.read() << " aios and/or "
-            << num_reading.read() << " readers to complete" << dendl;
+            << " waiting for " << num_running.load() << " aios and/or "
+            << num_reading.load() << " readers to complete" << dendl;
     cond.wait(l);
   }
-  num_waiting.dec();
+  --num_waiting;
   dout(20) << __func__ << " " << this << " done" << dendl;
 }
 
@@ -69,20 +69,20 @@ BlockDevice *BlockDevice::create(const string& path, aio_callback_t cb, void *cb
 void BlockDevice::queue_reap_ioc(IOContext *ioc)
 {
   std::lock_guard<std::mutex> l(ioc_reap_lock);
-  if (ioc_reap_count.read() == 0)
-    ioc_reap_count.inc();
+  if (ioc_reap_count.load() == 0)
+    ++ioc_reap_count;
   ioc_reap_queue.push_back(ioc);
 }
 
 void BlockDevice::reap_ioc()
 {
-  if (ioc_reap_count.read()) {
+  if (ioc_reap_count.load()) {
     std::lock_guard<std::mutex> l(ioc_reap_lock);
     for (auto p : ioc_reap_queue) {
       dout(20) << __func__ << " reap ioc " << p << dendl;
       delete p;
     }
     ioc_reap_queue.clear();
-    ioc_reap_count.dec();
+    --ioc_reap_count;
   }
 }
index 897c2d01bc6c84ee88c65e695302d8606d2661fb..5815d4000fa11a96a7d7dee0100e4776a3d9a0fe 100644 (file)
@@ -17,8 +17,9 @@
 #ifndef CEPH_OS_BLUESTORE_BLOCKDEVICE_H
 #define CEPH_OS_BLUESTORE_BLOCKDEVICE_H
 
-#include <mutex>
+#include <atomic>
 #include <condition_variable>
+#include <mutex>
 
 #include "acconfig.h"
 #include "os/fs/FS.h"
@@ -38,10 +39,10 @@ struct IOContext {
 
   list<FS::aio_t> pending_aios;    ///< not yet submitted
   list<FS::aio_t> running_aios;    ///< submitting or submitted
-  atomic_t num_pending;
-  atomic_t num_running;
-  atomic_t num_reading;
-  atomic_t num_waiting;
+  std::atomic_int num_pending = {0};
+  std::atomic_int num_running = {0};
+  std::atomic_int num_reading = {0};
+  std::atomic_int num_waiting = {0};
 
   explicit IOContext(void *p)
     : priv(p)
@@ -53,13 +54,13 @@ struct IOContext {
 
   bool has_aios() {
     std::lock_guard<std::mutex> l(lock);
-    return num_pending.read() || num_running.read();
+    return num_pending.load() || num_running.load();
   }
 
   void aio_wait();
 
   void aio_wake() {
-    if (num_waiting.read()) {
+    if (num_waiting.load()) {
       std::lock_guard<std::mutex> l(lock);
       cond.notify_all();
     }
@@ -70,7 +71,7 @@ struct IOContext {
 class BlockDevice {
   std::mutex ioc_reap_lock;
   vector<IOContext*> ioc_reap_queue;
-  atomic_t ioc_reap_count;
+  std::atomic_int ioc_reap_count = {0};
 
 public:
   BlockDevice() = default;
index a79af94bcf5e02390fd9e30e8cde419bf52f2b50..0fbc8c97d0cb1bb21028789823908912e05a5a97 100644 (file)
@@ -1045,7 +1045,7 @@ int BlueFS::_flush_range(FileWriter *h, uint64_t offset, uint64_t length)
     x_off = 0;
   }
   for (unsigned i = 0; i < bdev.size(); ++i) {
-    if (h->iocv[i]->num_pending.read()) {
+    if (h->iocv[i]->has_aios()) {
       bdev[i]->aio_submit(h->iocv[i]);
     }
   }
index 98b71e2b73930a39481f3adf4d897ac6f654c954..ae2d612ef41f73afbdafb962936b50d939e501a7 100644 (file)
@@ -240,7 +240,7 @@ void KernelDevice::_aio_thread()
       for (int i = 0; i < r; ++i) {
        IOContext *ioc = static_cast<IOContext*>(aio[i]->priv);
        _aio_log_finish(ioc, aio[i]->offset, aio[i]->length);
-       int left = ioc->num_running.dec();
+       int left = --ioc->num_running;
        int r = aio[i]->get_return_value();
        dout(10) << __func__ << " finished aio " << aio[i] << " r " << r
                 << " ioc " << ioc
@@ -304,8 +304,8 @@ void KernelDevice::_aio_log_finish(
 void KernelDevice::aio_submit(IOContext *ioc)
 {
   dout(20) << __func__ << " ioc " << ioc
-          << " pending " << ioc->num_pending.read()
-          << " running " << ioc->num_running.read()
+          << " pending " << ioc->num_pending.load()
+          << " running " << ioc->num_running.load()
           << dendl;
   // move these aside, and get our end iterator position now, as the
   // aios might complete as soon as they are submitted and queue more
@@ -314,10 +314,10 @@ void KernelDevice::aio_submit(IOContext *ioc)
   ioc->running_aios.splice(e, ioc->pending_aios);
   list<FS::aio_t>::iterator p = ioc->running_aios.begin();
 
-  int pending = ioc->num_pending.read();
-  ioc->num_running.add(pending);
-  ioc->num_pending.sub(pending);
-  assert(ioc->num_pending.read() == 0);  // we should be only thread doing this
+  int pending = ioc->num_pending.load();
+  ioc->num_running += pending;
+  ioc->num_pending -= pending;
+  assert(ioc->num_pending.load() == 0);  // we should be only thread doing this
 
   bool done = false;
   while (!done) {
@@ -377,7 +377,7 @@ int KernelDevice::aio_write(
 #ifdef HAVE_LIBAIO
   if (aio && dio && !buffered) {
     ioc->pending_aios.push_back(FS::aio_t(ioc, fd_direct));
-    ioc->num_pending.inc();
+    ++ioc->num_pending;
     FS::aio_t& aio = ioc->pending_aios.back();
     if (g_conf->bdev_inject_crash &&
        rand() % g_conf->bdev_inject_crash == 0) {
@@ -469,7 +469,7 @@ int KernelDevice::read(uint64_t off, uint64_t len, bufferlist *pbl,
   assert(off + len <= size);
 
   _aio_log_start(ioc, off, len);
-  ioc->num_reading.inc();;
+  ++ioc->num_reading;
 
   bufferptr p = buffer::create_page_aligned(len);
   int r = ::pread(buffered ? fd_buffered : fd_direct,
@@ -488,7 +488,7 @@ int KernelDevice::read(uint64_t off, uint64_t len, bufferlist *pbl,
 
  out:
   _aio_log_finish(ioc, off, len);
-  ioc->num_reading.dec();
+  --ioc->num_reading;
   ioc->aio_wake();
   return r < 0 ? r : 0;
 }