}
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
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);
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: ";
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: ";