]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/buffers: add function parameter to limit buffers size. 18828/head
authorJianpeng Ma <jianpeng.ma@intel.com>
Fri, 10 Nov 2017 14:47:41 +0000 (22:47 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Fri, 10 Nov 2017 14:47:41 +0000 (22:47 +0800)
Fixes: http://tracker.ceph.com/issues/21932
Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/common/buffer.cc
src/include/buffer.h
src/os/bluestore/KernelDevice.cc

index f7d8b17fcdcf87d0350b81d520d69259802f26ad..e2f140a00558c79f4329d14b4a69b5b1bab795f2 100644 (file)
@@ -1756,9 +1756,15 @@ public:
   }
   
   bool buffer::list::rebuild_aligned_size_and_memory(unsigned align_size,
-                                                  unsigned align_memory)
+                                                   unsigned align_memory,
+                                                   unsigned max_buffers)
   {
     unsigned old_memcopy_count = _memcopy_count;
+
+    if (max_buffers && _buffers.size() > max_buffers
+       && _len > (max_buffers * align_size)) {
+      align_size = ROUND_UP_TO(ROUND_UP_TO(_len, max_buffers) / max_buffers, align_size);
+    }
     std::list<ptr>::iterator p = _buffers.begin();
     while (p != _buffers.end()) {
       // keep anything that's already align and sized aligned
index fa8689cc6b7d310b5d4d91c2a44d8492142a6146..0d4bc0adf5f621c280de2aaf80b15973e07a5c8c 100644 (file)
@@ -780,8 +780,11 @@ namespace buffer CEPH_BUFFER_API {
     void rebuild();
     void rebuild(ptr& nb);
     bool rebuild_aligned(unsigned align);
+    // max_buffers = 0 mean don't care _buffers.size(), other
+    // must make _buffers.size() <= max_buffers after rebuilding.
     bool rebuild_aligned_size_and_memory(unsigned align_size,
-                                        unsigned align_memory);
+                                        unsigned align_memory,
+                                        unsigned max_buffers = 0);
     bool rebuild_page_aligned();
 
     void reserve(size_t prealloc);
index cfa626d493e8c11a10ee50f655416870abc0e587..58814ee78bf8cbc84d1e794698d56328e337f183 100644 (file)
@@ -593,7 +593,7 @@ int KernelDevice::write(
   assert(is_valid_io(off, len));
 
   if ((!buffered || bl.get_num_buffers() >= IOV_MAX) &&
-      bl.rebuild_aligned_size_and_memory(block_size, block_size)) {
+      bl.rebuild_aligned_size_and_memory(block_size, block_size, IOV_MAX)) {
     dout(20) << __func__ << " rebuilding buffer to be aligned" << dendl;
   }
   dout(40) << "data: ";
@@ -620,7 +620,7 @@ int KernelDevice::aio_write(
   assert(off + len <= size);
 
   if ((!buffered || bl.get_num_buffers() >= IOV_MAX) &&
-      bl.rebuild_aligned_size_and_memory(block_size, block_size)) {
+      bl.rebuild_aligned_size_and_memory(block_size, block_size, IOV_MAX)) {
     dout(20) << __func__ << " rebuilding buffer to be aligned" << dendl;
   }
   dout(40) << "data: ";