]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common/buffers: add function parameter to limit buffers size. 19047/head
authorJianpeng Ma <jianpeng.ma@intel.com>
Fri, 10 Nov 2017 14:47:41 +0000 (22:47 +0800)
committerShinobu Kinjo <shinobu@redhat.com>
Mon, 20 Nov 2017 19:51:55 +0000 (04:51 +0900)
Fixes: http://tracker.ceph.com/issues/21932
Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
(cherry picked from commit fba63cebba215b36ce850f47bd8e706edaa8023e)

src/common/buffer.cc
src/include/buffer.h
src/os/bluestore/KernelDevice.cc

index 18ae276cc6faccaf06cf8c6128b4358bb46a5a4d..5ad822f125ed14398f08c54d1284c33e501091f0 100644 (file)
@@ -1760,9 +1760,15 @@ static std::atomic_flag buffer_debug_lock = ATOMIC_FLAG_INIT;
   }
   
   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 226a60ff189480989436d1520fc8168aa1e10a46..596f15b9951a931b2081125e5087b7bfc28e65a6 100644 (file)
@@ -781,8 +781,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 420b59d55f936d83b72a67eeef757e684cc301f2..05e46311949a0894b0dcf6648f6966c07eb084c9 100644 (file)
@@ -580,7 +580,7 @@ int KernelDevice::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: ";
@@ -607,7 +607,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: ";