DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem
@ 2018-05-25 13:41 Anatoly Burakov
  2018-05-25 13:41 ` [dpdk-dev] [PATCH 2/2] doc: update release notes with info about memory changes Anatoly Burakov
  2018-05-28  0:17 ` [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Thomas Monjalon
  0 siblings, 2 replies; 3+ messages in thread
From: Anatoly Burakov @ 2018-05-25 13:41 UTC (permalink / raw)
  To: dev; +Cc: John McNamara, Marko Kovacevic, thomas

Document new command-line switches and the principles behind the
new memory subsystem. Also, replace outdated malloc heap picture.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 doc/guides/linux_gsg/build_sample_apps.rst      |   12 +-
 doc/guides/prog_guide/env_abstraction_layer.rst |  221 +++-
 doc/guides/prog_guide/img/malloc_heap.svg       | 1348 ++++++-----------------
 doc/guides/prog_guide/multi_proc_support.rst    |   19 +-
 4 files changed, 543 insertions(+), 1057 deletions(-)

diff --git a/doc/guides/linux_gsg/build_sample_apps.rst b/doc/guides/linux_gsg/build_sample_apps.rst
index 39a47b7..3623ddf 100644
--- a/doc/guides/linux_gsg/build_sample_apps.rst
+++ b/doc/guides/linux_gsg/build_sample_apps.rst
@@ -110,7 +110,9 @@ The EAL options are as follows:
   ``[domain:]bus:devid.func`` values. Cannot be used with ``-b`` option.
 
 * ``--socket-mem``:
-  Memory to allocate from hugepages on specific sockets.
+  Memory to allocate from hugepages on specific sockets. In dynamic memory mode,
+  this memory will also be pinned (i.e. not released back to the system until
+  application closes).
 
 * ``-d``:
   Add a driver or driver directory to be loaded.
@@ -148,6 +150,14 @@ The EAL options are as follows:
 * ``--vfio-intr``:
   Specify interrupt type to be used by VFIO (has no effect if VFIO is not used).
 
+* ``--legacy-mem``:
+  Run DPDK in legacy memory mode (disable memory reserve/unreserve at runtime,
+  but provide more IOVA-contiguous memory).
+
+* ``--single-file-segments``:
+  Store memory segments in fewer files (dynamic memory mode only - does not
+  affect legacy memory mode).
+
 The ``-c`` or ``-l`` and option is mandatory; the others are optional.
 
 Copy the DPDK application binary to your target, then run the application as follows
diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst
index 559d0f8..a22640d 100644
--- a/doc/guides/prog_guide/env_abstraction_layer.rst
+++ b/doc/guides/prog_guide/env_abstraction_layer.rst
@@ -94,10 +94,121 @@ The allocation of large contiguous physical memory is done using the hugetlbfs k
 The EAL provides an API to reserve named memory zones in this contiguous memory.
 The physical address of the reserved memory for that memory zone is also returned to the user by the memory zone reservation API.
 
+There are two modes in which DPDK memory subsystem can operate: dynamic mode,
+and legacy mode. Both modes are explained below.
+
 .. note::
 
     Memory reservations done using the APIs provided by rte_malloc are also backed by pages from the hugetlbfs filesystem.
 
++ Dynamic memory mode
+
+Currently, this mode is only supported on Linux.
+
+In this mode, usage of hugepages by DPDK application will grow and shrink based
+on application's requests. Any memory allocation through ``rte_malloc()``,
+``rte_memzone_reserve()`` or other methods, can potentially result in more
+hugepages being reserved from the system. Similarly, any memory deallocation can
+potentially result in hugepages being released back to the system.
+
+Memory allocated in this mode is not guaranteed to be IOVA-contiguous. If large
+chunks of IOVA-contiguous are required (with "large" defined as "more than one
+page"), it is recommended to either use VFIO driver for all physical devices (so
+that IOVA and VA addresses can be the same, thereby bypassing physical addresses
+entirely), or use legacy memory mode.
+
+For chunks of memory which must be IOVA-contiguous, it is recommended to use
+``rte_memzone_reserve()`` function with ``RTE_MEMZONE_IOVA_CONTIG`` flag
+specified. This way, memory allocator will ensure that, whatever memory mode is
+in use, either reserved memory will satisfy the requirements, or the allocation
+will fail.
+
+There is no need to preallocate any memory at startup using ``-m`` or
+``--socket-mem`` command-line parameters, however it is still possible to do so,
+in which case preallocate memory will be "pinned" (i.e. will never be released
+by the application back to the system). It will be possible to allocate more
+hugepages, and deallocate those, but any preallocated pages will not be freed.
+If neither ``-m`` nor ``--socket-mem`` were specified, no memory will be
+preallocated, and all memory will be allocated at runtime, as needed.
+
+Another available option to use in dynamic memory mode is
+``--single-file-segments`` command-line option. This option will put pages in
+single files (per memseg list), as opposed to creating a file per page. This is
+normally not needed, but can be useful for use cases like userspace vhost, where
+there is limited number of page file descriptors that can be passed to VirtIO.
+
+If the application (or DPDK-internal code, such as device drivers) wishes to
+receive notifications about newly allocated memory, it is possible to register
+for memory event callbacks via ``rte_mem_event_callback_register()`` function.
+This will call a callback function any time DPDK's memory map has changed.
+
+If the application (or DPDK-internal code, such as device drivers) wishes to be
+notified about memory allocations above specified threshold (and have a chance
+to deny them), allocation validator callbacks are also available via
+``rte_mem_alloc_validator_callback_register()`` function.
+
+.. note::
+
+    In multiprocess scenario, all related processes (i.e. primary process, and
+    secondary processes running with the same prefix) must be in the same memory
+    modes. That is, if primary process is run in dynamic memory mode, all of its
+    secondary processes must be run in the same mode. The same is applicable to
+    ``--single-file-segments`` command-line option - both primary and secondary
+    processes must shared this mode.
+
++ Legacy memory mode
+
+This mode is enabled by specifying ``--legacy-mem`` command-line switch to the
+EAL. This switch will have no effect on FreeBSD as FreeBSD only supports
+legacy mode anyway.
+
+This mode mimics historical behavior of EAL. That is, EAL will reserve all
+memory at startup, sort all memory into large IOVA-contiguous chunks, and will
+not allow acquiring or releasing hugepages from the system at runtime.
+
+If neither ``-m`` nor ``--socket-mem`` were specified, the entire available
+hugepage memory will be preallocated.
+
++ 32-bit support
+
+Additional restrictions are present when running in 32-bit mode. In dynamic
+memory mode, by default maximum of 2 gigabytes of VA space will be preallocated,
+and all of it will be on master lcore NUMA node unless ``--socket-mem`` flag is
+used.
+
+In legacy mode, VA space will only be preallocated for segments that were
+requested (plus padding, to keep IOVA-contiguousness).
+
++ Maximum amount of memory
+
+All possible virtual memory space that can ever be used for hugepage mapping in
+a DPDK process is preallocated at startup, thereby placing an upper limit on how
+much memory a DPDK application can have. DPDK memory is stored in segment lists,
+each segment is strictly one physical page. It is possible to change the amount
+of virtual memory being preallocated at startup by editing the following config
+variables:
+
+* ``CONFIG_RTE_MAX_MEMSEG_LISTS`` controls how many segment lists can DPDK have
+* ``CONFIG_RTE_MAX_MEM_MB_PER_LIST`` controls how much megabytes of memory each
+  segment list can address
+* ``CONFIG_RTE_MAX_MEMSEG_PER_LIST`` controls how many segments each segment can
+  have
+* ``CONFIG_RTE_MAX_MEMSEG_PER_TYPE`` controls how many segments each memory type
+  can have (where "type" is defined as "page size + NUMA node" combination)
+* ``CONFIG_RTE_MAX_MEM_MB_PER_TYPE`` controls how much megabytes of memory each
+  memory type can address
+* ``CONFIG_RTE_MAX_MEM_MB`` places a global maximum on the amount of memory
+  DPDK can reserve
+
+Normally, these options do not need to be changed.
+
+.. note::
+
+    Preallocated virtual memory is not to be confused with preallocated hugepage
+    memory! All DPDK processes preallocate virtual memory at startup. Hugepages
+    can later be mapped into that preallocated VA space (if dynamic memory mode
+    is enabled), and can optionally be mapped into it at startup.
+
 PCI Access
 ~~~~~~~~~~
 
@@ -211,7 +322,7 @@ Memory Segments and Memory Zones (memzone)
 
 The mapping of physical memory is provided by this feature in the EAL.
 As physical memory can have gaps, the memory is described in a table of descriptors,
-and each descriptor (called rte_memseg ) describes a contiguous portion of memory.
+and each descriptor (called rte_memseg ) describes a physical page.
 
 On top of this, the memzone allocator's role is to reserve contiguous portions of physical memory.
 These zones are identified by a unique name when the memory is reserved.
@@ -225,6 +336,9 @@ Memory zones can be reserved with specific start address alignment by supplying
 The alignment value should be a power of two and not less than the cache line size (64 bytes).
 Memory zones can also be reserved from either 2 MB or 1 GB hugepages, provided that both are available on the system.
 
+Both memsegs and memzones are stored using ``rte_fbarray`` structures. Please
+refer to *DPDK API Reference* for more information.
+
 
 Multiple pthread
 ----------------
@@ -453,11 +567,9 @@ The key fields of the heap structure and their function are described below
 *   free_head - this points to the first element in the list of free nodes for
     this malloc heap.
 
-.. note::
+*   first - this points to the first element in the heap.
 
-    The malloc_heap structure does not keep track of in-use blocks of memory,
-    since these are never touched except when they are to be freed again -
-    at which point the pointer to the block is an input to the free() function.
+*   last - this points to the last element in the heap.
 
 .. _figure_malloc_heap:
 
@@ -473,16 +585,21 @@ Structure: malloc_elem
 
 The malloc_elem structure is used as a generic header structure for various
 blocks of memory.
-It is used in three different ways - all shown in the diagram above:
+It is used in two different ways - all shown in the diagram above:
 
 #.  As a header on a block of free or allocated memory - normal case
 
 #.  As a padding header inside a block of memory
 
-#.  As an end-of-memseg marker
-
 The most important fields in the structure and how they are used are described below.
 
+Malloc heap is a doubly-linked list, where each element keeps track of its
+previous and next elements. Due to the fact that hugepage memory can come and
+go, neighbouring malloc elements may not necessarily be adjacent in memory.
+Also, since a malloc element may span multiple pages, its contents may not
+necessarily be IOVA-contiguous either - each malloc element is only guaranteed
+to be virtually contiguous.
+
 .. note::
 
     If the usage of a particular field in one of the above three usages is not
@@ -495,13 +612,20 @@ The most important fields in the structure and how they are used are described b
     It is used for normal memory blocks when they are being freed, to add the
     newly-freed block to the heap's free-list.
 
-*   prev - this pointer points to the header element/block in the memseg
-    immediately behind the current one. When freeing a block, this pointer is
-    used to reference the previous block to check if that block is also free.
-    If so, then the two free blocks are merged to form a single larger block.
+*   prev - this pointer points to previous header element/block in memory. When
+    freeing a block, this pointer is used to reference the previous block to
+    check if that block is also free. If so, and the two blocks are immediately
+    adjacent to each other, then the two free blocks are merged to form a single
+    larger block.
 
-*   next_free - this pointer is used to chain the free-list of unallocated
-    memory blocks together.
+*   next - this pointer points to next header element/block in memory. When
+    freeing a block, this pointer is used to reference the next block to check
+    if that block is also free. If so, and the two blocks are immediately
+    adjacent to each other, then the two free blocks are merged to form a single
+    larger block.
+
+*   free_list - this is a structure pointing to previous and next elements in
+    this heap's free list.
     It is only used in normal memory blocks; on ``malloc()`` to find a suitable
     free block to allocate and on ``free()`` to add the newly freed element to
     the free-list.
@@ -515,9 +639,6 @@ The most important fields in the structure and how they are used are described b
     constraints.
     In that case, the pad header is used to locate the actual malloc element
     header for the block.
-    For the end-of-memseg structure, this is always a ``BUSY`` value, which
-    ensures that no element, on being freed, searches beyond the end of the
-    memseg for other blocks to merge with into a larger free area.
 
 *   pad - this holds the length of the padding present at the start of the block.
     In the case of a normal block header, it is added to the address of the end
@@ -528,22 +649,19 @@ The most important fields in the structure and how they are used are described b
     actual block header.
 
 *   size - the size of the data block, including the header itself.
-    For end-of-memseg structures, this size is given as zero, though it is never
-    actually checked.
-    For normal blocks which are being freed, this size value is used in place of
-    a "next" pointer to identify the location of the next block of memory that
-    in the case of being ``FREE``, the two free blocks can be merged into one.
 
 Memory Allocation
 ^^^^^^^^^^^^^^^^^
 
-On EAL initialization, all memsegs are setup as part of the malloc heap.
-This setup involves placing a dummy structure at the end with ``BUSY`` state,
-which may contain a sentinel value if ``CONFIG_RTE_MALLOC_DEBUG`` is enabled,
-and a proper :ref:`element header<malloc_elem>` with ``FREE`` at the start
-for each memseg.
+On EAL initialization, all preallocated memory segments are setup as part of the
+malloc heap. This setup involves placing an :ref:`element header<malloc_elem>`
+with ``FREE`` at the start of each virtually contiguous segment of memory.
 The ``FREE`` element is then added to the ``free_list`` for the malloc heap.
 
+This setup also happens whenever memory is allocated at runtime (if supported),
+in which case newly allocated pages are also added to the heap, merging with any
+adjacent free segments if there are any.
+
 When an application makes a call to a malloc-like function, the malloc function
 will first index the ``lcore_config`` structure for the calling thread, and
 determine the NUMA node of that thread.
@@ -574,8 +692,34 @@ the start and/or end of the element, resulting in the following behavior:
 
 The advantage of allocating the memory from the end of the existing element is
 that no adjustment of the free list needs to take place - the existing element
-on the free list just has its size pointer adjusted, and the following element
-has its "prev" pointer redirected to the newly created element.
+on the free list just has its size value adjusted, and the next/previous elements
+have their "prev"/"next" pointers redirected to the newly created element.
+
+In case when there is not enough memory in the heap to satisfy allocation
+request, EAL will attempt to allocate more memory from the system (if supported)
+and, following successful allocation, will retry reserving the memory again. In
+a multiprocessing scenario, all primary and secondary processes will synchronize
+their memory maps to ensure that any valid pointer to DPDK memory is guaranteed
+to be valid at all times in all currently running processes.
+
+Failure to synchronize memory maps in one of the processes will cause allocation
+to fail, even though some of the processes may have allocated the memory
+successfully. The memory is not added to the malloc heap unless primary process
+has ensured that all other processes have mapped this memory successfully.
+
+Any successful allocation event will trigger a callback, for which user
+applications and other DPDK subsystems can register. Additionally, validation
+callbacks will be triggered before allocation if the newly allocated memory will
+exceed threshold set by the user, giving a chance to allow or deny allocation.
+
+.. note::
+
+    Any allocation of new pages has to go through primary process. If the
+    primary process is not active, no memory will be allocated even if it was
+    theoretically possible to do so. This is because primary's process map acts
+    as an authority on what should or should not be mapped, while each secondary
+    process has its own, local memory map. Secondary processes do not update the
+    shared memory map, they only copy its contents to their local memory map.
 
 Freeing Memory
 ^^^^^^^^^^^^^^
@@ -589,8 +733,17 @@ the pointer to get the proper element header for the entire block.
 
 From this element header, we get pointers to the heap from which the block was
 allocated and to where it must be freed, as well as the pointer to the previous
-element, and via the size field, we can calculate the pointer to the next element.
-These next and previous elements are then checked to see if they are also
-``FREE``, and if so, they are merged with the current element.
-This means that we can never have two ``FREE`` memory blocks adjacent to one
-another, as they are always merged into a single block.
+and next elements. These next and previous elements are then checked to see if
+they are also ``FREE`` and are immediately adjacent to the current one, and if
+so, they are merged with the current element. This means that we can never have
+two ``FREE`` memory blocks adjacent to one another, as they are always merged
+into a single block.
+
+If deallocating pages at runtime is supported, and the free element encloses
+one or more pages, those pages can be deallocated and be removed from the heap.
+If DPDK was started with command-line parameters for preallocating memory
+(``-m`` or ``--socket-mem``), then those pages that were allocated at startup
+will not be deallocated.
+
+Any successful deallocation event will trigger a callback, for which user
+applications and other DPDK subsystems can register.
diff --git a/doc/guides/prog_guide/img/malloc_heap.svg b/doc/guides/prog_guide/img/malloc_heap.svg
index 14e5008..f70bd66 100644
--- a/doc/guides/prog_guide/img/malloc_heap.svg
+++ b/doc/guides/prog_guide/img/malloc_heap.svg
@@ -1,1021 +1,333 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export malloc_heap.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+		width="11in" height="8.5in" viewBox="0 0 792 612" xml:space="preserve" color-interpolation-filters="sRGB" class="st34">
+	<style type="text/css">
+	<![CDATA[
+		.st1 {visibility:visible}
+		.st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+		.st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25}
+		.st4 {fill:#deebf6;stroke:#c7c8c8;stroke-width:0.25}
+		.st5 {fill:#ed7d31;stroke:#c7c8c8;stroke-width:0.25}
+		.st6 {fill:#fbe5d5;stroke:#c7c8c8;stroke-width:0.25}
+		.st7 {fill:#e2efd9;stroke:#c7c8c8;stroke-width:0.25}
+		.st8 {fill:#a8d08d;stroke:#c7c8c8;stroke-width:0.25}
+		.st9 {fill:url(#ptrn2-71);shape-rendering:crispEdges;stroke:#c7c8c8;stroke-width:0.25}
+		.st10 {fill:#5b9bd5;stroke:#2e75b5;stroke-width:0.25}
+		.st11 {fill:none;stroke:none;stroke-width:0.25}
+		.st12 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+		.st13 {fill:#ed7d31;stroke:#2e75b5;stroke-width:0.25}
+		.st14 {fill:#deebf6;stroke:#2e75b5;stroke-width:0.25}
+		.st15 {fill:#fbe5d5;stroke:#2e75b5;stroke-width:0.25}
+		.st16 {fill:#a8d08d;stroke:#2e75b5;stroke-width:0.25}
+		.st17 {fill:#e2efd9;stroke:#2e75b5;stroke-width:0.25}
+		.st18 {fill:url(#ptrn2-71);shape-rendering:crispEdges;stroke:#2e75b5;stroke-width:0.25}
+		.st19 {fill:#f4b183;stroke:#4f87bb;stroke-width:0.75}
+		.st20 {fill:#305497;font-family:Calibri;font-size:0.833336em}
+		.st21 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25}
+		.st22 {fill:#538135;stroke:#40709c;stroke-width:0.75}
+		.st23 {fill:#e2efd9;font-family:Calibri;font-size:0.833336em}
+		.st24 {marker-end:url(#mrkr10-146);marker-start:url(#mrkr10-144);stroke:#70ad47;stroke-width:0.75}
+		.st25 {fill:#70ad47;fill-opacity:1;stroke:#70ad47;stroke-opacity:1;stroke-width:0.22935779816514}
+		.st26 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
+		.st27 {fill:#538135;font-family:Calibri;font-size:1.00001em}
+		.st28 {fill:#ffffff;stroke:none;stroke-linecap:butt}
+		.st29 {fill:#bdd7ee;stroke:#40709c;stroke-width:0.75}
+		.st30 {fill:#1e4e79;font-family:Calibri;font-size:0.833336em}
+		.st31 {marker-end:url(#mrkr5-171);stroke:#4f87bb;stroke-dasharray:11.25,6.75;stroke-width:0.75}
+		.st32 {fill:#4f87bb;fill-opacity:1;stroke:#4f87bb;stroke-opacity:1;stroke-width:0.22935779816514}
+		.st33 {fill:#1e4e79;font-family:Calibri;font-size:1.00001em}
+		.st34 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+	]]>
+	</style>
 
-<!-- SPDX-License-Identifier: BSD-3-Clause -->
-<!-- Copyright(c) 2015 Intel Corporation -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   id="svg2985"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   width="983.76233"
-   height="643.91644"
-   sodipodi:docname="malloc_heap_svg.svg">
-  <metadata
-     id="metadata2991">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs2989">
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart"
-       style="overflow:visible">
-      <path
-         id="path4265"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lstart"
-       style="overflow:visible">
-      <path
-         id="path4259"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(1.1,0,0,1.1,1.1,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible">
-      <path
-         id="path4268"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend"
-       style="overflow:visible">
-      <path
-         id="path4262"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path4244"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1-1"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4-8"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1-9"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4-6"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart-7"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4265-8"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1-8"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4-2"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1-2"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4-0"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mstart-5"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4265-7"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(0.6,0.6)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend-1-5"
-       style="overflow:visible">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4268-4-4"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#30ff00"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1920"
-     inkscape:window-height="1139"
-     id="namedview2987"
-     showgrid="false"
-     inkscape:zoom="0.8"
-     inkscape:cx="346.31962"
-     inkscape:cy="474.02351"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="layer4"
-     borderlayer="false"
-     fit-margin-top="-100.6"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     showborder="true"
-     inkscape:showpageshadow="false" />
-  <g
-     inkscape:groupmode="layer"
-     id="layer4"
-     inkscape:label="bg"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#d1d1d1;fill-opacity:1;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
-       id="rect13505-6"
-       width="98.575218"
-       height="70.808708"
-       x="328.8374"
-       y="317.09564" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="boxes"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       id="rect2996-1"
-       width="187.88171"
-       height="52.881706"
-       x="75.764778"
-       y="5.5253706" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7"
-       width="634.0592"
-       height="73.027374"
-       x="60.830574"
-       y="130.24477" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.02648067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-4"
-       width="635.80048"
-       height="74.768661"
-       x="62.169655"
-       y="315.43158" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.85834479;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-0"
-       width="886.87543"
-       height="106.64049"
-       x="-48.78373"
-       y="540.24988" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.13159013;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6.26318017, 3.13159009;stroke-dashoffset:0;display:inline"
-       id="rect2996-1-5"
-       width="223.0157"
-       height="109.20289"
-       x="409.68008"
-       y="420.63235" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.90856051;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:5.81712091, 2.90856046;stroke-dashoffset:0;display:inline"
-       id="rect2996-1-5-4"
-       width="191.98872"
-       height="109.42592"
-       x="644.63062"
-       y="419.66205" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.08755708;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.17511403, 2.08755702;stroke-dashoffset:0;display:inline"
-       id="rect2996-1-5-4-6"
-       width="154.05972"
-       height="70.246925"
-       x="678.59509"
-       y="214.87654" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="blue headers"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#749aba;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.85091281;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9"
-       width="16.994427"
-       height="73.79715"
-       x="59.561817"
-       y="129.601" />
-    <rect
-       style="fill:#749aba;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.83000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-4"
-       width="17.015339"
-       height="72.050293"
-       x="384.61731"
-       y="130.22485" />
-    <rect
-       style="fill:#749aba;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.86642051;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-8"
-       width="16.978918"
-       height="75.107468"
-       x="261.76944"
-       y="315.16946" />
-    <rect
-       style="fill:#749aba;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.36914372;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-82"
-       width="48.412117"
-       height="14.17484"
-       x="-42.956367"
-       y="549.14984" />
-    <rect
-       style="fill:#97ffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.83000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-4-1"
-       width="17.015339"
-       height="72.050293"
-       x="241.39912"
-       y="131.17525" />
-    <rect
-       style="fill:#97ffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.36399999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-4-1-3"
-       width="16.981569"
-       height="74.882637"
-       x="568.40881"
-       y="315.33447" />
-    <rect
-       style="fill:#97ffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.95599997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-4-1-3-7"
-       width="49.319912"
-       height="12.752681"
-       x="-43.016232"
-       y="595.7439" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer5"
-     inkscape:label="red headers"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.83000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45"
-       width="17.015339"
-       height="72.050293"
-       x="501.49307"
-       y="130.29137" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.84049058;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-5"
-       width="17.004848"
-       height="72.923683"
-       x="678.04279"
-       y="130.29662" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.85091281;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-1"
-       width="16.994427"
-       height="73.79715"
-       x="681.8158"
-       y="316.14957" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.86126781;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-7"
-       width="16.984072"
-       height="74.670677"
-       x="500.62485"
-       y="315.92252" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.82472873;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-11"
-       width="17.020611"
-       height="71.613625"
-       x="175.33748"
-       y="131.40486" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.86642051;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-52"
-       width="16.978918"
-       height="75.107468"
-       x="62.221222"
-       y="315.0412" />
-    <rect
-       style="fill:#ff7b6d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.39574718;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-76"
-       width="48.805244"
-       height="14.612387"
-       x="-42.996674"
-       y="572.61749" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer9"
-     inkscape:label="unused space"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#dddddd;fill-opacity:1;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
-       id="rect13505"
-       width="98.575218"
-       height="70.808708"
-       x="402.22061"
-       y="131.06841" />
-    <rect
-       style="fill:#dddddd;fill-opacity:1;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
-       id="rect13505-8"
-       width="96.700218"
-       height="70.808708"
-       x="77.587402"
-       y="131.47064" />
-    <rect
-       style="fill:#dddddd;fill-opacity:1;stroke-width:1.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
-       id="rect13505-5"
-       width="220.21585"
-       height="72.839958"
-       x="279.26709"
-       y="316.08002" />
-    <rect
-       style="fill:#dddddd;fill-opacity:1;stroke:#000000;stroke-width:1.12016988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
-       id="rect13505-59"
-       width="51.879829"
-       height="15.10388"
-       x="445.6301"
-       y="550.76691" />
-    <rect
-       style="fill:none;stroke:#000000;stroke-width:1.12016988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
-       id="rect13505-59-3"
-       width="51.879829"
-       height="15.10388"
-       x="445.62964"
-       y="574.00262" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer8"
-     inkscape:label="pad headers"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <rect
-       style="fill:#fffec5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-7-3"
-       width="49.88493"
-       height="73.447571"
-       x="518.21405"
-       y="316.16635" />
-    <rect
-       style="fill:#fffec5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.86126781;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-7-3-2"
-       width="16.98407"
-       height="74.670677"
-       x="245.17551"
-       y="315.48059" />
-    <rect
-       style="fill:#fffec5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.02099991;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-7-3-4"
-       width="49.474121"
-       height="72.084908"
-       x="193.07074"
-       y="130.93698" />
-    <rect
-       style="fill:#fffec5;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
-       id="rect2996-1-7-9-45-7-3-6"
-       width="51.75993"
-       height="14.072571"
-       x="445.05756"
-       y="596.40125" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer6"
-     inkscape:label="arrows"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:9, 9;stroke-dashoffset:0;marker-mid:none;marker-end:url(#Arrow2Mend)"
-       d="m 262.87951,51.152779 c 0,0 148.12631,-3.276651 187.01718,76.272861"
-       id="path3973"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 681.9161,128.72302 c -22.09709,-49.497478 -148.13393,-45.873109 -179.42835,0"
-       id="path3988"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="M 386.69903,129.58525 C 361.95029,80.971668 231.48641,62.20327 177.21864,130.46914"
-       id="path3990"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 60.546017,172.89554 c 0,0 -32.703692,23.86486 -60.10407166,-3.53553"
-       id="path3992"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="m 176.82896,203.22242 c -47.24941,74.32926 -107.438064,49.90804 -116.0476,3.53553"
-       id="path4035"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="m 502.04581,203.43962 c -25.63262,33.58757 -82.31601,45.11485 -116.67261,2.65165"
-       id="path4037"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="M 763.23339,214.04621 C 748.83403,184.37018 738.54555,166.795 699.15183,161.8971"
-       id="path4039"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-mid:none;marker-end:url(#Arrow2Mend-1)"
-       d="m 769.42057,285.19885 c -0.88389,83.96892 -68.50098,75.57203 -68.50098,75.57203"
-       id="path4041"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="M 682.35804,313.04117 C 652.306,280.33749 539.16892,270.61477 501.16193,313.92506"
-       id="path4043"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:9, 9;stroke-dashoffset:0;marker-end:url(#Arrow2Mend)"
-       d="m 415.42523,202.55574 c 0,36.23922 -4.41941,88.38835 -35.35533,109.60155"
-       id="path4045"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:9, 9;stroke-dashoffset:0;marker-end:url(#Arrow2Mend)"
-       d="M 375.65048,315.69282 C 336.75961,232.60777 166.1701,311.27341 143.18912,205.20739"
-       id="path4047"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="M 263.39727,315.69282 C 245.7196,288.29244 86.62058,275.91807 62.755726,313.04117"
-       id="path4051"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 61.790091,352.05822 c -25.819377,20.1091 -49.573204,20.1091 -61.96650422,1.43636"
-       id="path4053"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:2.54999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:7.65, 7.65;stroke-dashoffset:0;marker-end:url(#Arrow2Mend)"
-       d="m 448.12892,630.25126 48.61359,0"
-       id="path5241"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:2.09116507px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
-       d="m -39.741559,626.33548 c 10.599699,-0.12345 25.528414,-0.12564 43.719789,-0.81161"
-       id="path4053-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1)"
-       d="m 499.39416,389.93904 c -46.84583,17.67767 -206.82873,31.8198 -238.64854,1.76776"
-       id="path13236"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1);display:inline"
-       d="m 502.12201,419.58783 c 2.37436,-10.40132 1.73096,-5.65101 4.38262,-26.86421"
-       id="path4043-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend-1);display:inline"
-       d="m 517.94842,353.38466 c 19.7099,0 43.91577,-0.61421 66.57012,-0.61421"
-       id="path4043-4-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend-1);display:inline"
-       d="m 501.71494,363.4321 c 19.7099,0 157.04077,-0.61421 179.69512,-0.61421"
-       id="path4043-4-3-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend-1);display:inline"
-       d="M 728.67747,419.79091 C 702.92683,395.63959 592.90843,427.2649 577.43509,389.1767"
-       id="path4043-4-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend-1);display:inline"
-       d="m 60.975741,169.05711 c 19.709901,0 90.307569,-0.61421 112.961919,-0.61421"
-       id="path4043-4-3-9-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer7"
-     inkscape:label="text"
-     style="display:inline"
-     transform="translate(79.549515,-4.4031235)">
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="90.732231"
-       y="36.767765"
-       id="text10506"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508"
-         x="90.732231"
-         y="36.767765"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">struct malloc_heap</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="580.66718"
-       y="107.47876"
-       id="text10506-2"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1"
-         x="580.66718"
-         y="107.47876"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="438.12686"
-       y="223.50792"
-       id="text10506-2-5"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-7"
-         x="438.12686"
-         y="223.50792"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="581.31598"
-       y="298.638"
-       id="text10506-2-61"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-89"
-         x="581.31598"
-         y="298.638"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="274.6084"
-       y="99.764236"
-       id="text10506-2-2"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-79"
-         x="274.6084"
-         y="99.764236"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="301.12491"
-       y="423.26556"
-       id="text10506-2-54"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-3"
-         x="301.12491"
-         y="423.26556"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="133.18704"
-       y="303.94128"
-       id="text10506-2-1"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-2"
-         x="133.18704"
-         y="303.94128"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="16.340637"
-       y="561.27954"
-       id="text10506-2-3"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34"
-         x="16.340637"
-         y="561.27954"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Free element header(struct malloc_elem, state = FREE)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="16.996887"
-       y="583.24792"
-       id="text10506-2-3-1"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1"
-         x="16.996887"
-         y="583.24792"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Used element header(struct malloc_elem, state = BUSY)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="108.84206"
-       y="161.39597"
-       id="text10506-2-6-8"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-7"
-         x="108.84206"
-         y="161.39597"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">size</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="62.299515"
-       y="119.27286"
-       id="text10506-2-6-4"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-2"
-         x="62.299515"
-         y="119.27286"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Memseg 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="63.905106"
-       y="406.73242"
-       id="text10506-2-6-4-7"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-2-7"
-         x="63.905106"
-         y="406.73242"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Memseg 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="-25.028084"
-       y="192.57199"
-       id="text10506-2-9"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-31"
-         x="-25.028084"
-         y="192.57199"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="-26.795866"
-       y="379.95526"
-       id="text10506-2-98"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-6"
-         x="-26.795866"
-         y="379.95526"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="416.73682"
-       y="269.53305"
-       id="text10506-2-6-5"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-0"
-         x="416.73682"
-         y="269.53305"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">next_free</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="228.00418"
-       y="259.55359"
-       id="text10506-2-6-5-2"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-0-8"
-         x="228.00418"
-         y="259.55359"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">next_free</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="356.16727"
-       y="55.376503"
-       id="text10506-2-6-5-6"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-0-0"
-         x="356.16727"
-         y="55.376503"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">free_head</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="49.218113"
-       y="254.00189"
-       id="text10506-2-9-0"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-31-9"
-         x="49.218113"
-         y="254.00189"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">prev</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="690.51538"
-       y="236.82936"
-       id="text10506-2-6-0"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-06"
-         x="690.51538"
-         y="236.82936"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Dummy Elements:</tspan><tspan
-         sodipodi:role="line"
-         x="690.51538"
-         y="256.02936"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13581">Size = 0</tspan><tspan
-         sodipodi:role="line"
-         x="690.51538"
-         y="275.22937"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13583">State = BUSY</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="541.03906"
-       y="347.20566"
-       id="text10506-2-6-8-8"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-7-9"
-         x="541.03906"
-         y="347.20566"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">pad</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="16.661926"
-       y="605.21631"
-       id="text10506-2-3-1-4"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1-4"
-         x="16.661926"
-         y="605.21631"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Pad element header(struct malloc_elem, state = PAD)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="17.290833"
-       y="627.77881"
-       id="text10506-2-3-1-6"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1-0"
-         x="17.290833"
-         y="627.77881"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Generic element pointers</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="429.11118"
-       y="449.84528"
-       id="text10506-2-6-6"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         x="429.11118"
-         y="449.84528"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13711">Malloc element header:</tspan><tspan
-         sodipodi:role="line"
-         x="429.11118"
-         y="469.04529"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13713">state = BUSY</tspan><tspan
-         sodipodi:role="line"
-         x="429.11118"
-         y="488.24527"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13715">size = &lt;size&gt;</tspan><tspan
-         sodipodi:role="line"
-         x="429.11118"
-         y="507.44528"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan13717">pad = &lt;padsize&gt;</tspan></text>
-    <flowRoot
-       xml:space="preserve"
-       id="flowRoot13719"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><flowRegion
-         id="flowRegion13721"><rect
-           id="rect13723"
-           width="968.73627"
-           height="188.26718"
-           x="-81.317276"
-           y="460.64972" /></flowRegion><flowPara
-         id="flowPara13725"></flowPara></flowRoot>    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="594.30859"
-       y="378.91797"
-       id="text10506-2-6-8-8-1"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-8-7-9-3"
-         x="594.30859"
-         y="378.91797"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">size</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="505.86865"
-       y="563.34613"
-       id="text10506-2-3-1-6-8"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1-0-4"
-         x="505.86865"
-         y="563.34613"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Free / Unallocated data space</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="660.39099"
-       y="449.92532"
-       id="text10506-2-6-6-0"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         x="660.39099"
-         y="449.92532"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan14527">Pad element header:</tspan><tspan
-         sodipodi:role="line"
-         x="660.39099"
-         y="469.12534"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan14531">state = PAD</tspan><tspan
-         sodipodi:role="line"
-         x="660.39099"
-         y="488.32532"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas"
-         id="tspan14533">pad = padsize</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="506.5249"
-       y="584.28369"
-       id="text10506-2-3-1-6-8-7"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1-0-4-2"
-         x="506.5249"
-         y="584.28369"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Used / allocated data space</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:40px;font-style:normal;font-weight:normal;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
-       x="506.18994"
-       y="605.30322"
-       id="text10506-2-3-1-6-8-7-0"
-       sodipodi:linespacing="120%"><tspan
-         sodipodi:role="line"
-         id="tspan10508-1-34-1-0-4-2-1"
-         x="506.18994"
-         y="605.30322"
-         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:120.00000477%;writing-mode:lr-tb;text-anchor:start;font-family:Consolas;-inkscape-font-specification:Consolas">Padding / unavailable space</tspan></text>
-  </g>
+	<defs id="Patterns_And_Gradients">
+		<pattern id="ptrn2-71" patternUnits="userSpaceOnUse" width="6" height="6" viewBox="0 0 64 64">
+			<image x="0" y="0" width="64" height="64" image-rendering="optimizeSpeed"
+					xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA7SURBVChTY/i3f7/Pv3//MDFIXETEhwGfJIjGVIAkCeKjKkCTRFWARRKhAIckRAEeSYgCPJL/9u/3AQC1aLsBz7wFUwAAAABJRU5ErkJggg=="/>
+		</pattern>
+		<linearGradient id="grad0-168" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)">
+			<stop offset="0" stop-color="#e9eff7" stop-opacity="1"/>
+			<stop offset="0.24" stop-color="#f4f7fb" stop-opacity="1"/>
+			<stop offset="0.54" stop-color="#feffff" stop-opacity="1"/>
+		</linearGradient>
+	</defs>
+	<defs id="Markers">
+		<g id="lend10">
+			<path
+					d="M 0 0.75 C -0.414214 0.75 -0.75 0.414214 -0.75 0 -0.75 -0.414214 -0.414214 -0.75 0 -0.75 0.414214 -0.75 0.75 -0.414214 0.75 0 0.75 0.414214 0.414214 0.75 0 0.75 Z "
+					style="stroke:none"/>
+		</g>
+		<marker id="mrkr10-144" class="st25" refX="2.79" orient="auto" markerUnits="strokeWidth" overflow="visible">
+			<use xlink:href="#lend10" transform="scale(4.36) "/>
+		</marker>
+		<marker id="mrkr10-146" class="st25" refX="-2.79" orient="auto" markerUnits="strokeWidth" overflow="visible">
+			<use xlink:href="#lend10" transform="scale(-4.36,-4.36) "/>
+		</marker>
+		<g id="lend5">
+			<path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"/>
+		</g>
+		<marker id="mrkr5-171" class="st32" refX="-7.15" orient="auto" markerUnits="strokeWidth" overflow="visible">
+			<use xlink:href="#lend5" transform="scale(-4.36,-4.36) "/>
+		</marker>
+	</defs>
+	<defs id="Filters">
+		<filter id="filter_2">
+			<feGaussianBlur stdDeviation="2"/>
+		</filter>
+	</defs>
+	<g>
+		<title>Page-1</title>
+		<g id="group14-1" transform="translate(45,-360)">
+			<title>Sheet.14</title>
+			<g id="shape3-2">
+				<title>Sheet.3</title>
+				<g id="shadow3-3" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="18" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="18" height="81" class="st3"/>
+			</g>
+			<g id="shape4-7" transform="translate(18,0)">
+				<title>Sheet.4</title>
+				<g id="shadow4-8" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="117" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="117" height="81" class="st4"/>
+			</g>
+		</g>
+		<g id="group15-12" transform="translate(180,-360)">
+			<title>Sheet.15</title>
+			<g id="shape5-13">
+				<title>Sheet.5</title>
+				<g id="shadow5-14" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="18" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="18" height="81" class="st5"/>
+			</g>
+			<g id="shape6-18" transform="translate(18,0)">
+				<title>Sheet.6</title>
+				<g id="shadow6-19" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="117" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="117" height="81" class="st6"/>
+			</g>
+		</g>
+		<g id="shape7-23" transform="translate(612,-360)">
+			<title>Sheet.7</title>
+			<g id="shadow7-24" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="531" width="18" height="81" class="st2"/>
+			</g>
+			<rect x="0" y="531" width="18" height="81" class="st5"/>
+		</g>
+		<g id="shape10-28" transform="translate(630,-360)">
+			<title>Sheet.10</title>
+			<g id="shadow10-29" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="531" width="51.75" height="81" class="st2"/>
+			</g>
+			<rect x="0" y="531" width="51.75" height="81" class="st7"/>
+		</g>
+		<g id="shape12-33" transform="translate(681.75,-360)">
+			<title>Sheet.12</title>
+			<g id="shadow12-34" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="531" width="18" height="81" class="st2"/>
+			</g>
+			<rect x="0" y="531" width="18" height="81" class="st8"/>
+		</g>
+		<g id="shape13-38" transform="translate(699.75,-360)">
+			<title>Sheet.13</title>
+			<g id="shadow13-39" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="531" width="47.25" height="81" class="st2"/>
+			</g>
+			<rect x="0" y="531" width="47.25" height="81" class="st6"/>
+		</g>
+		<g id="group29-43" transform="translate(315,-360)">
+			<title>Sheet.29</title>
+			<g id="shape23-44">
+				<title>Sheet.23</title>
+				<g id="shadow23-45" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="18" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="18" height="81" class="st3"/>
+			</g>
+			<g id="shape24-49" transform="translate(18,0)">
+				<title>Sheet.24</title>
+				<g id="shadow24-50" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="36" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="36" height="81" class="st4"/>
+			</g>
+		</g>
+		<g id="group30-54" transform="translate(477,-360)">
+			<title>Sheet.30</title>
+			<g id="shape27-55">
+				<title>Sheet.27</title>
+				<g id="shadow27-56" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="18" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="18" height="81" class="st3"/>
+			</g>
+			<g id="shape28-60" transform="translate(18,0)">
+				<title>Sheet.28</title>
+				<g id="shadow28-61" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+					<rect x="0" y="531" width="117" height="81" class="st2"/>
+				</g>
+				<rect x="0" y="531" width="117" height="81" class="st4"/>
+			</g>
+		</g>
+		<g id="shape31-65" transform="translate(369,-360)">
+			<title>Sheet.31</title>
+			<g id="shadow31-66" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="531" width="108" height="81" class="st2"/>
+			</g>
+			<rect x="0" y="531" width="108" height="81" class="st9"/>
+		</g>
+		<g id="shape32-72" transform="translate(184.5,-260)">
+			<title>Sheet.32</title>
+			<g id="shadow32-73" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st10"/>
+		</g>
+		<g id="shape39-77" transform="translate(252,-259)">
+			<title>Sheet.39</title>
+			<desc>Free element header</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Free element header</text>		</g>
+		<g id="shape43-80" transform="translate(184.5,-232)">
+			<title>Sheet.43</title>
+			<g id="shadow43-81" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st13"/>
+		</g>
+		<g id="shape44-85" transform="translate(252,-231)">
+			<title>Sheet.44</title>
+			<desc>Used element header</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Used element header</text>		</g>
+		<g id="shape46-88" transform="translate(409.5,-260)">
+			<title>Sheet.46</title>
+			<g id="shadow46-89" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st14"/>
+		</g>
+		<g id="shape47-93" transform="translate(477,-259)">
+			<title>Sheet.47</title>
+			<desc>Free space</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Free space</text>		</g>
+		<g id="shape49-96" transform="translate(409.5,-232)">
+			<title>Sheet.49</title>
+			<g id="shadow49-97" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st15"/>
+		</g>
+		<g id="shape50-101" transform="translate(477,-231)">
+			<title>Sheet.50</title>
+			<desc>Allocated data</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Allocated data</text>		</g>
+		<g id="shape52-104" transform="translate(184.5,-204)">
+			<title>Sheet.52</title>
+			<g id="shadow52-105" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st16"/>
+		</g>
+		<g id="shape53-109" transform="translate(252,-203)">
+			<title>Sheet.53</title>
+			<desc>Pad element header</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Pad element header</text>		</g>
+		<g id="shape62-112" transform="translate(409.5,-204)">
+			<title>Sheet.62</title>
+			<g id="shadow62-113" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st17"/>
+		</g>
+		<g id="shape63-117" transform="translate(477,-203)">
+			<title>Sheet.63</title>
+			<desc>Padding</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Padding</text>		</g>
+		<g id="shape65-120" transform="translate(184.5,-176)">
+			<title>Sheet.65</title>
+			<g id="shadow65-121" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<rect x="0" y="594" width="63" height="18" class="st2"/>
+			</g>
+			<rect x="0" y="594" width="63" height="18" class="st18"/>
+		</g>
+		<g id="shape66-126" transform="translate(252,-175)">
+			<title>Sheet.66</title>
+			<desc>Unavailable space</desc>
+			<rect x="0" y="592" width="135" height="20" class="st11"/>
+			<text x="4" y="605.6" class="st12">Unavailable space</text>		</g>
+		<g id="shape97-129" transform="translate(612,-375.75)">
+			<title>Simple Double Arrow</title>
+			<desc>size</desc>
+			<path d="M0 612 L18 598.5 L18 605.25 L117 605.25 L117 598.5 L135 612 L117 625.5 L117 618.75 L18 618.75 L18 625.5 L0 612
+						 Z" class="st19"/>
+			<text x="59.93" y="615" class="st20">size</text>		</g>
+		<g id="shape99-132" transform="translate(630,-400.5)">
+			<title>Simple Double Arrow.99</title>
+			<desc>pad</desc>
+			<g id="shadow99-133" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<path d="M0 612 L12 600 L12 606 L57.75 606 L57.75 600 L69.75 612 L57.75 624 L57.75 618 L12 618 L12 624 L0 612 Z"
+						class="st21"/>
+			</g>
+			<path d="M0 612 L12 600 L12 606 L57.75 606 L57.75 600 L69.75 612 L57.75 624 L57.75 618 L12 618 L12 624 L0 612 Z"
+					class="st22"/>
+			<text x="27.23" y="615" class="st23">pad</text>		</g>
+		<g id="shape113-138" transform="translate(54,-337.5)">
+			<title>Sheet.113</title>
+			<desc>prev/next</desc>
+			<path d="M134.64 591.56 L134.58 591.92 A72 22.5 0 0 1 63 612 A63 22.5 0 0 1 0.37 591.92 L0.31 591.57" class="st24"/>
+			<rect x="43.4968" y="593.55" width="48.0064" height="14.4001" class="st26"/>
+			<text x="43.5" y="604.35" class="st27">prev/next</text>		</g>
+		<g id="shape115-149" transform="translate(324,-337.5)">
+			<title>Sheet.115</title>
+			<desc>prev/next</desc>
+			<path d="M0.44 591.55 L0.51 591.9 A90 22.5 -180 0 0 90 612 A72 22.5 -180 0 0 161.58 591.92 L161.64 591.56" class="st24"/>
+			<rect x="56.9968" y="593.55" width="48.0064" height="14.4001" class="st28"/>
+			<text x="57" y="604.35" class="st27">prev/next</text>		</g>
+		<g id="shape118-158" transform="translate(315,-390.375)">
+			<title>Simple Double Arrow.118</title>
+			<desc>size</desc>
+			<g id="shadow118-159" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+				<path d="M0 612 L12 600 L12 606 L42 606 L42 600 L54 612 L42 624 L42 618 L12 618 L12 624 L0 612 Z" class="st21"/>
+			</g>
+			<path d="M0 612 L12 600 L12 606 L42 606 L42 600 L54 612 L42 624 L42 618 L12 618 L12 624 L0 612 Z" class="st29"/>
+			<text x="19.43" y="615" class="st30">size</text>		</g>
+		<g id="shape119-164" transform="translate(54,-441)">
+			<title>Sheet.119</title>
+			<desc>next free</desc>
+			<path d="M-0 612 A135 22.5 0 0 1 135 589.5 A134.606 21.534 0 0 1 266.35 606.33 L266.56 606.62" class="st31"/>
+			<rect x="112.807" y="593.55" width="43.9926" height="14.4001" class="st26"/>
+			<text x="112.81" y="604.35" class="st33">next free</text>		</g>
+		<g id="shape120-174" transform="translate(323.739,-441.34)">
+			<title>Sheet.120</title>
+			<desc>next free</desc>
+			<path d="M0.24 612 A78.4445 18.5592 178.15 0 1 72.26 589.84 A81.2523 26.5101 179.07 0 1 159.23 607.01 L159.43 607.31"
+					class="st31"/>
+			<rect x="59.193" y="593.55" width="43.9926" height="14.4001" class="st28"/>
+			<text x="59.19" y="604.35" class="st33">next free</text>		</g>
+		<g id="shape122-182" transform="translate(189,-337.5)">
+			<title>Sheet.122</title>
+			<desc>prev/next</desc>
+			<path d="M0.33 591.57 L0.39 591.92 A67.5 22.5 -180 0 0 67.5 612 A69.1875 22.5 -180 0 0 136.29 591.92 L136.35 591.56"
+					class="st24"/>
+			<rect x="44.3405" y="593.55" width="48.0064" height="14.4001" class="st26"/>
+			<text x="44.34" y="604.35" class="st27">prev/next</text>		</g>
+		<g id="shape123-191" transform="translate(486.563,-337.5)">
+			<title>Sheet.123</title>
+			<desc>prev/next</desc>
+			<path d="M0.35 591.56 L0.41 591.92 A71.4375 22.5 -180 0 0 71.44 612 A63 22.5 -180 0 0 134.07 591.92 L134.12 591.57"
+					class="st24"/>
+			<rect x="43.2155" y="593.55" width="48.0064" height="14.4001" class="st26"/>
+			<text x="43.22" y="604.35" class="st27">prev/next</text>		</g>
+	</g>
 </svg>
diff --git a/doc/guides/prog_guide/multi_proc_support.rst b/doc/guides/prog_guide/multi_proc_support.rst
index e9ebeeb..db5d694 100644
--- a/doc/guides/prog_guide/multi_proc_support.rst
+++ b/doc/guides/prog_guide/multi_proc_support.rst
@@ -63,6 +63,10 @@ and point to the same objects, in both processes.
     Refer to `Multi-process Limitations`_ for details of
     how Linux kernel Address-Space Layout Randomization (ASLR) can affect memory sharing.
 
+    If the primary process was run with ``--legacy-mem`` or
+    ``--single-file-segments`` switch, secondary processes must be run with the
+    same switch specified. Otherwise, memory corruption may occur.
+
 .. _figure_multi_process_memory:
 
 .. figure:: img/multi_process_memory.*
@@ -116,8 +120,13 @@ The rte part of the filenames of each of the above is configurable using the fil
 
 In addition to specifying the file-prefix parameter,
 any DPDK applications that are to be run side-by-side must explicitly limit their memory use.
-This is done by passing the -m flag to each process to specify how much hugepage memory, in megabytes,
-each process can use (or passing ``--socket-mem`` to specify how much hugepage memory on each socket each process can use).
+This is less of a problem on Linux, as by default, applications will not
+allocate more memory than they need. However if ``--legacy-mem`` is used, DPDK
+will attempt to preallocate all memory it can get to, and memory use must be
+explicitly limited. This is done by passing the ``-m`` flag to each process to
+specify how much hugepage memory, in megabytes, each process can use (or passing
+``--socket-mem`` to specify how much hugepage memory on each socket each process
+can use).
 
 .. note::
 
@@ -144,8 +153,10 @@ There are a number of limitations to what can be done when running DPDK multi-pr
 Some of these are documented below:
 
 *   The multi-process feature requires that the exact same hugepage memory mappings be present in all applications.
-    The Linux security feature - Address-Space Layout Randomization (ASLR) can interfere with this mapping,
-    so it may be necessary to disable this feature in order to reliably run multi-process applications.
+    This makes secondary process startup process generally unreliable. Disabling
+    Linux security feature - Address-Space Layout Randomization (ASLR) may
+    help getting more consistent mappings, but not necessarily more reliable -
+    if the mappings are wrong, they will be consistently wrong!
 
 .. warning::
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [dpdk-dev] [PATCH 2/2] doc: update release notes with info about memory changes
  2018-05-25 13:41 [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Anatoly Burakov
@ 2018-05-25 13:41 ` Anatoly Burakov
  2018-05-28  0:17 ` [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Thomas Monjalon
  1 sibling, 0 replies; 3+ messages in thread
From: Anatoly Burakov @ 2018-05-25 13:41 UTC (permalink / raw)
  To: dev; +Cc: John McNamara, Marko Kovacevic, thomas

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 doc/guides/rel_notes/release_18_05.rst | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst
index 40eec3a..84b7434 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -41,6 +41,40 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Reworked memory subsystem.**
+
+  Memory subsystem has been reworked to support new functionality.
+
+  On Linux, support for reserving/unreserving hugepage memory at runtime was
+  added, so applications no longer need to pre-reserve memory at startup. Due to
+  reorganized internal workings of memory subsystem, any memory allocated
+  through ``rte_malloc()`` or ``rte_memzone_reserve()`` is no longer guaranteed
+  to be IOVA-contiguous.
+
+  This functionality has introduced the following changes:
+
+  * ``rte_eal_get_physmem_layout()`` was removed
+  * A new flag for memzone reservation (``RTE_MEMZONE_IOVA_CONTIG``) was added
+    to ensure reserved memory will be IOVA-contiguous, for use with device
+    drivers and other cases requiring such memory
+  * New callbacks for memory allocation/deallocation events, allowing user (or
+    drivers) to be notified of new memory being allocated or deallocated
+  * New callbacks for validating memory allocations above specified limit,
+    allowing user to permit or deny memory allocations
+  * A new command-line switch ``--legacy-mem`` to enable EAL behavior similar to
+    how older versions of DPDK worked (memory segments that are IOVA-contiguous,
+    but hugepages are reserved at startup only, and can never be released)
+  * A new command-line switch ``--single-file-segments`` to put all memory
+    segments within a segment list in a single file
+  * A set of convenience function calls to look up and iterate over allocated
+    memory segments
+  * ``-m`` and ``--socket-mem`` command-line arguments now carry an additional
+    meaning and mark pre-reserved hugepages as "unfree-able", thereby acting as
+    a mechanism guaranteeing minimum availability of hugepage memory to the
+    application
+
+  Reserving/unreserving memory at runtime is not currently supported on FreeBSD.
+
 * **Added bucket mempool driver.**
 
   Added bucket mempool driver which provides a way to allocate contiguous
-- 
2.7.4

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem
  2018-05-25 13:41 [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Anatoly Burakov
  2018-05-25 13:41 ` [dpdk-dev] [PATCH 2/2] doc: update release notes with info about memory changes Anatoly Burakov
@ 2018-05-28  0:17 ` Thomas Monjalon
  1 sibling, 0 replies; 3+ messages in thread
From: Thomas Monjalon @ 2018-05-28  0:17 UTC (permalink / raw)
  To: Anatoly Burakov; +Cc: dev, John McNamara, Marko Kovacevic

25/05/2018 15:41, Anatoly Burakov:
> Document new command-line switches and the principles behind the
> new memory subsystem. Also, replace outdated malloc heap picture.
> 
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>

Series applied, thanks

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-05-28  0:17 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-25 13:41 [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Anatoly Burakov
2018-05-25 13:41 ` [dpdk-dev] [PATCH 2/2] doc: update release notes with info about memory changes Anatoly Burakov
2018-05-28  0:17 ` [dpdk-dev] [PATCH 1/2] doc: update documentation for memory subsystem Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).