diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
commit | e6918187568dbd01842d8d1d2c808ce16a894239 (patch) | |
tree | 64f88b554b444a49f656b6c656111a145cbbaa28 /src/spdk/ocf/doc | |
parent | Initial commit. (diff) | |
download | ceph-e6918187568dbd01842d8d1d2c808ce16a894239.tar.xz ceph-e6918187568dbd01842d8d1d2c808ce16a894239.zip |
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/spdk/ocf/doc')
-rw-r--r-- | src/spdk/ocf/doc/.gitignore | 1 | ||||
-rw-r--r-- | src/spdk/ocf/doc/HOME.md | 292 | ||||
-rw-r--r-- | src/spdk/ocf/doc/doxygen.cfg | 329 | ||||
-rw-r--r-- | src/spdk/ocf/doc/img/deployment-1.png | bin | 0 -> 18524 bytes | |||
-rw-r--r-- | src/spdk/ocf/doc/img/deployment-2.png | bin | 0 -> 19038 bytes | |||
-rw-r--r-- | src/spdk/ocf/doc/img/io-path.png | bin | 0 -> 66489 bytes |
6 files changed, 622 insertions, 0 deletions
diff --git a/src/spdk/ocf/doc/.gitignore b/src/spdk/ocf/doc/.gitignore new file mode 100644 index 000000000..5ccff1a6b --- /dev/null +++ b/src/spdk/ocf/doc/.gitignore @@ -0,0 +1 @@ +html/ diff --git a/src/spdk/ocf/doc/HOME.md b/src/spdk/ocf/doc/HOME.md new file mode 100644 index 000000000..caad48211 --- /dev/null +++ b/src/spdk/ocf/doc/HOME.md @@ -0,0 +1,292 @@ +# Open CAS Framework + +# Content: +- [Architecture overview](#architecture-overview) +- [Management interface](#library-management) +- [IO path](#reading-and-writing-data) + +# Architecture overview + +Intel(R) Cache Acceleration Software (CAS) consists of: +- Platform independent library called Open CAS Framework (OCF) +- Platform dependent adaptation layers enabling OCF to work in different +environments such as Linux kernel + +An example usage for OCF is Linux kernel (see picture below). +In this case OCF operates as block level cache for block devices. +For this usage model OCF comes with following adaptation layers: +- <b>Library client (top adapter)</b> - its main responsibility is creating +cache volume representing primary storage device. Application can +read/write from/to the cache volume block device as to regular primary +storage device. +- <b>Block device volume (bottom adapter)</b> - is responsible for issuing +IO operations to underlying block device. + +A system administrator can manage cache instances via Intel CAS CLI management +utility called "casadm". + +![OCF Linux deployment view](img/deployment-1.png) + +Another example of OCF usage is user space block level cache for QEMU +(see picture below). In this example following adaptation layers may exist: +- <b>CAS virtIO-blk driver for QEMU (top adapter)</b> - it exposes +primary storage device (another virtIO driver) to guest OS via OCF library +- <b>virtIO-blk volume (bottom adapter)</b> - enables OCF to access +data on primary storage device or cache device via original virtIO driver + +Please note that actual adapters depend on the environment where OCF is +meant to be run. There can be different bottom adapters delivered for cache device +and primary storage device. For example bottom adapter for caching device may +be implemented using kernel bypass techniques, providing low-latency access to +cache media. + +![OCF deployment in QEMU example](img/deployment-2.png) + +# Management interface +Management interface delivered with Intel OCF enables system administrator to: + - Configure OCF caching library to target environment, which includes installation +of required platform dependent adapters. + - Starting/stopping and managing existing cache instances. + - Performing observability functions (e.g. retrieving performance counters) + +For more details please see below examples: + +## Library initialization example + +OCF enables possibility use it simultaneously from two independent libraries linked +into the same executable by means of concept of contexts. Each context has its own +set of operations which allow to handle specific data types used by volumes +within this context. + +```c +#include "ocf.h" + +/* Handle to library context */ +ocf_ctx_t ctx; + +/* Your context interface */ +const struct ocf_ctx_ops ctx_ops = { +/* Fill your interface functions */ +}; + +/* Your unique volume type IDs */ +enum my_volume_type { + my_volume_type_1, + my_volume_type_2 +}; + +/* Your volumes interface declaration */ +const struct ocf_volume_ops my_volume_ops1 = { + .name = "My volume 1", + /* Fill your volume interface functions */ +}; + +const struct ocf_volume_ops my_volume_ops2 = { + .name = "My volume 2" + /* Fill your volume interface functions */ +}; + +int my_cache_init(void) +{ + int result; + + result = ocf_ctx_create(&ctx, &ctx_ops) + if (result) { + /* Cannot initialze context of OCF library */ + return result; + } + /* Initialization successful */ + + /* Now we can register volumes */ + result |= ocf_ctx_register_volume_ops(ctx, &my_volume_ops1, + my_volume_type_1); + if (result) { + /* Cannot register volume interface */ + goto err; + } + + result |= ocf_ctx_register_volume_ops(ctx, &my_volume_ops2, + my_volume_type_2); + if (result) { + /* Cannot register volume interface */ + goto err; + } + + return 0; + +err: + /* In case of failure we destroy context and propagate error code */ + ocf_ctx_put(ctx); + return result; +} + +``` + +## Cache management +OCF library API provides management functions (@ref ocf_mngt.h). This +interface enables user to manage cache instances. Examples: +- Start cache +```c +int result; +ocf_cache_t cache; /* Handle to your cache */ +struct ocf_mngt_cache_config cfg; /* Your cache configuration */ + +/* Prepare your cache configuration */ + +/* Configure cache mode */ +cfg.cache_mode = ocf_cache_mode_wt; + +/* Now tell how your cache will be initialzed. Selech warm or cold cache */ +cfg.init_mode = ocf_init_mode_init; + +cfg.uuid.data = "/path/to/your/cache/or/unique/id"; + +/* Specify cache volume type */ +cfg.volume_type = my_volume_type_1; + +/* Other cache configuration */ +... + +/* Start cache. */ +result = ocf_mngt_cache_start(cas, &cache, cfg); +if (!result) { + /* Your cache was created successfully */ +} +``` + +- Add core (primary storage device) to cache +```c +int result; +ocf_core_t core; /* Handle to your core */ +struct ocf_mngt_core_config cfg; /* Your core configuration */ + +/* Prepare core configuration */ + +/* Select core volume type */ +cfg.volume_type = my_volume_type_2; +/* Set UUID or path of your core */ +cfg.uuid.data = "/path/to/your/core/or/unique/id"; + +result = ocf_mngt_cache_add_core(cache, &core, &cfg); +if (!result) { + /* Your core was added successfully */ +} + +``` + +## Management interface considerations +Each device (cache or core) is assigned with ID, either automatically by OCF or +explicitly specified by user. It is possible to retrieve handle to cache +instance via @ref ocf_cache_get_id. To get handle to core instance please +use @ref ocf_core_get_id. + +Cache management operations are thread safe - it is possible to perform +cache management from many threads at a time. There is a possiblity to "batch" +several cache management operations and execute them under cache management +lock. To do this user needs to first obtain cache management lock, perform management +operations and finally release the lock. For reference see example below. + +```c +int my_complex_work(ocf_cache_id_t cache_id, + ocf_core_id_t core_id) +{ + int result; + ocf_cache_t cache; /* Handle to your cache */ + ocf_core_t core; /* Handle to your core */ + + /* Get cache handle */ + result = ocf_mngt_cache_get(cas, cache_id, &cache); + if (result) + return result; + + /* Lock cache */ + result = ocf_mngt_cache_lock(cache); + if (result) { + ocf_mngt_cache_put(cache); + return result; + } + + /* Get core handle */ + result = ocf_core_get(cache, core_id, &core); + if (result) { + result = -1; + goto END; + } + + /* Cache is locked, you can perform your activities */ + + /* 1. Flush your core */ + result = ocf_mngt_core_flush(cache, core_id, true); + if (result) { + goto END; + } + + /* 2. Your others operations including internal actions */ + + /* 3. Removing core form cache */ + result = ocf_mngt_cache_remove_core(cache, core_id, true); + +END: + ocf_mngt_cache_unlock(cache); /* Remember to unlock cache */ + ocf_mngt_cache_put(cache); /* Release cache referance */ + + return result; +} +``` + +# IO path +Please refer to below sequence diagram for detailed IO flow. Typical IO +path includes: + - <b>IO allocation</b> - creating new IO instance that will be submitted to OCF +for processing + - <b>IO configuration</b> - specifying address and length, IO class, flags and +completion function + - <b>IO submission</b> - actual IO submission to OCF. OCF will perform cache +lookup and based on its results will return data from cache or primary +storage device + - <b>IO completion</b> - is signalled by calling completion function specified +in IO configuration phase + +![An example of IO flow](img/io-path.png) + +## IO submission example +```c +#include "ocf.h" + +void read_end(struct ocf_io *io, int error) +{ + /* Your IO has been finished. Check the result and inform upper + * layers. + */ + + /* Release IO */ + ocf_io_put(io); +} + +int read(ocf_core_t core, ocf_queue_t queue, void *data, addr, uint32_t length) +{ + /* Allocate IO */ + struct ocf_io *io; + + io = ocf_core_new_io(core, queue, addr, length, OCF_READ, 0, 0); + if (!io) { + /* Cannot allocate IO */ + return -ENOMEM; + } + + /* Set completion context and function */ + ocf_io_set_cmpl(io, NULL, NULL, read_end); + + /* Set data */ + if (ocf_io_set_data(io, data, 0)) { + ocf_io_put(io); + return -EINVAL; + } + + /* Send IO requests to the cache */ + ocf_core_submit_io(io); + + /* Just it */ + return 0; +} +``` diff --git a/src/spdk/ocf/doc/doxygen.cfg b/src/spdk/ocf/doc/doxygen.cfg new file mode 100644 index 000000000..2a8f10652 --- /dev/null +++ b/src/spdk/ocf/doc/doxygen.cfg @@ -0,0 +1,329 @@ +# Doxyfile 1.8.6 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "Open CAS Framework" +PROJECT_NUMBER = +PROJECT_BRIEF = "Open source framework of Cache Acceleration Software" +PROJECT_LOGO = +OUTPUT_DIRECTORY = . +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +TCL_SUBST = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = NO +HIDE_SCOPE_NAMES = YES +HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = ../inc HOME.md +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.c \ + *.h \ + *.md +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = ./img/ +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = HOME.md +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +#HTML_HEADER = header.html +#HTML_FOOTER = footer.html +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 4 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain +LATEX_TIMESTAMP = NO +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_SOURCE_CODE = NO +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +DOCBOOK_PROGRAMLISTING = NO +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +DIA_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_INCLUDE_PATH = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES diff --git a/src/spdk/ocf/doc/img/deployment-1.png b/src/spdk/ocf/doc/img/deployment-1.png Binary files differnew file mode 100644 index 000000000..ccf6769f7 --- /dev/null +++ b/src/spdk/ocf/doc/img/deployment-1.png diff --git a/src/spdk/ocf/doc/img/deployment-2.png b/src/spdk/ocf/doc/img/deployment-2.png Binary files differnew file mode 100644 index 000000000..f31df9e24 --- /dev/null +++ b/src/spdk/ocf/doc/img/deployment-2.png diff --git a/src/spdk/ocf/doc/img/io-path.png b/src/spdk/ocf/doc/img/io-path.png Binary files differnew file mode 100644 index 000000000..8c43fdca4 --- /dev/null +++ b/src/spdk/ocf/doc/img/io-path.png |