Skip to content

Commit

Permalink
Merge pull request #18828 from majianpeng/fix-21932
Browse files Browse the repository at this point in the history
os/bluestore: enlarege aligned_size avoid too many vector(> IOV_MAX)

Reviewed-by: Kefu Chai <kchai@redhat.com>
Reviewed-by: Sage Weil <sage@redhat.com>
  • Loading branch information
tchaikov committed Nov 13, 2017
2 parents 3eeb632 + fba63ce commit fa340f6
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 4 deletions.
8 changes: 7 additions & 1 deletion src/common/buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1756,9 +1756,15 @@ using namespace ceph;
}

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
Expand Down
5 changes: 4 additions & 1 deletion src/include/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/os/bluestore/KernelDevice.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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: ";
Expand All @@ -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: ";
Expand Down

0 comments on commit fa340f6

Please sign in to comment.