From 13cba3986885d87123647382137d6d97a3b4dc6e Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 3 Nov 2017 19:06:31 -0400 Subject: [PATCH] buffer: move buffer::raw to new header this allows new raw buffer types to live outside of buffer.cc, and potentially outside of libcommon entirely Signed-off-by: Casey Bodley --- src/common/buffer.cc | 104 +------------------------------ src/include/buffer_raw.h | 130 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 103 deletions(-) create mode 100644 src/include/buffer_raw.h diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 5220130a5dcc9..b60fbe99ff50b 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -18,6 +18,7 @@ #include +#include "include/buffer_raw.h" #include "include/compat.h" #include "include/mempool.h" #include "armor.h" @@ -166,109 +167,6 @@ using namespace ceph; buffer::error_code::error_code(int error) : buffer::malformed_input(cpp_strerror(error).c_str()), code(error) {} - class buffer::raw { - public: - char *data; - unsigned len; - std::atomic nref { 0 }; - int mempool; - - std::pair last_crc_offset {std::numeric_limits::max(), std::numeric_limits::max()}; - std::pair last_crc_val; - - mutable ceph::spinlock crc_spinlock; - - explicit raw(unsigned l, int mempool=mempool::mempool_buffer_anon) - : data(NULL), len(l), nref(0), mempool(mempool) { - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); - } - raw(char *c, unsigned l, int mempool=mempool::mempool_buffer_anon) - : data(c), len(l), nref(0), mempool(mempool) { - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); - } - virtual ~raw() { - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( - -1, -(int)len); - } - - void _set_len(unsigned l) { - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( - -1, -(int)len); - len = l; - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); - } - - void reassign_to_mempool(int pool) { - if (pool == mempool) { - return; - } - mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( - -1, -(int)len); - mempool = pool; - mempool::get_pool(mempool::pool_index_t(pool)).adjust_count(1, len); - } - - void try_assign_to_mempool(int pool) { - if (mempool == mempool::mempool_buffer_anon) { - reassign_to_mempool(pool); - } - } - -private: - // no copying. - // cppcheck-suppress noExplicitConstructor - raw(const raw &other) = delete; - const raw& operator=(const raw &other) = delete; -public: - virtual char *get_data() { - return data; - } - virtual raw* clone_empty() = 0; - raw *clone() { - raw *c = clone_empty(); - memcpy(c->data, data, len); - return c; - } - virtual bool can_zero_copy() const { - return false; - } - virtual int zero_copy_to_fd(int fd, loff_t *offset) { - return -ENOTSUP; - } - virtual bool is_page_aligned() { - return ((long)data & ~CEPH_PAGE_MASK) == 0; - } - bool is_n_page_sized() { - return (len & ~CEPH_PAGE_MASK) == 0; - } - virtual bool is_shareable() { - // true if safe to reference/share the existing buffer copy - // false if it is not safe to share the buffer, e.g., due to special - // and/or registered memory that is scarce - return true; - } - bool get_crc(const pair &fromto, - pair *crc) const { - std::lock_guard lg(crc_spinlock); - if (last_crc_offset == fromto) { - *crc = last_crc_val; - return true; - } - return false; - } - void set_crc(const pair &fromto, - const pair &crc) { - std::lock_guard lg(crc_spinlock); - last_crc_offset = fromto; - last_crc_val = crc; - } - void invalidate_crc() { - std::lock_guard lg(crc_spinlock); - last_crc_offset.first = std::numeric_limits::max(); - last_crc_offset.second = std::numeric_limits::max(); - } - }; - /* * raw_combined is always placed within a single allocation along * with the data buffer. the data goes at the beginning, and diff --git a/src/include/buffer_raw.h b/src/include/buffer_raw.h new file mode 100644 index 0000000000000..0c6513c8036ed --- /dev/null +++ b/src/include/buffer_raw.h @@ -0,0 +1,130 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 20127 Red Hat, Inc. + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef CEPH_BUFFER_RAW_H +#define CEPH_BUFFER_RAW_H + +#include +#include +#include +#include "include/buffer.h" +#include "include/mempool.h" +#include "include/spinlock.h" + +namespace ceph::buffer { + class raw { + public: + char *data; + unsigned len; + std::atomic nref { 0 }; + int mempool; + + std::pair last_crc_offset {std::numeric_limits::max(), std::numeric_limits::max()}; + std::pair last_crc_val; + + mutable ceph::spinlock crc_spinlock; + + explicit raw(unsigned l, int mempool=mempool::mempool_buffer_anon) + : data(NULL), len(l), nref(0), mempool(mempool) { + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); + } + raw(char *c, unsigned l, int mempool=mempool::mempool_buffer_anon) + : data(c), len(l), nref(0), mempool(mempool) { + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); + } + virtual ~raw() { + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( + -1, -(int)len); + } + + void _set_len(unsigned l) { + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( + -1, -(int)len); + len = l; + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count(1, len); + } + + void reassign_to_mempool(int pool) { + if (pool == mempool) { + return; + } + mempool::get_pool(mempool::pool_index_t(mempool)).adjust_count( + -1, -(int)len); + mempool = pool; + mempool::get_pool(mempool::pool_index_t(pool)).adjust_count(1, len); + } + + void try_assign_to_mempool(int pool) { + if (mempool == mempool::mempool_buffer_anon) { + reassign_to_mempool(pool); + } + } + +private: + // no copying. + // cppcheck-suppress noExplicitConstructor + raw(const raw &other) = delete; + const raw& operator=(const raw &other) = delete; +public: + virtual char *get_data() { + return data; + } + virtual raw* clone_empty() = 0; + raw *clone() { + raw *c = clone_empty(); + memcpy(c->data, data, len); + return c; + } + virtual bool can_zero_copy() const { + return false; + } + virtual int zero_copy_to_fd(int fd, loff_t *offset) { + return -ENOTSUP; + } + virtual bool is_page_aligned() { + return ((long)data & ~CEPH_PAGE_MASK) == 0; + } + bool is_n_page_sized() { + return (len & ~CEPH_PAGE_MASK) == 0; + } + virtual bool is_shareable() { + // true if safe to reference/share the existing buffer copy + // false if it is not safe to share the buffer, e.g., due to special + // and/or registered memory that is scarce + return true; + } + bool get_crc(const std::pair &fromto, + std::pair *crc) const { + std::lock_guard lg(crc_spinlock); + if (last_crc_offset == fromto) { + *crc = last_crc_val; + return true; + } + return false; + } + void set_crc(const std::pair &fromto, + const std::pair &crc) { + std::lock_guard lg(crc_spinlock); + last_crc_offset = fromto; + last_crc_val = crc; + } + void invalidate_crc() { + std::lock_guard lg(crc_spinlock); + last_crc_offset.first = std::numeric_limits::max(); + last_crc_offset.second = std::numeric_limits::max(); + } + }; +} // namespace ceph::buffer + +#endif // CEPH_BUFFER_RAW_H -- 2.39.5