get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/23801/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 23801,
    "url": "https://patches.dpdk.org/api/patches/23801/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1492768299-84016-4-git-send-email-harry.van.haaren@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1492768299-84016-4-git-send-email-harry.van.haaren@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1492768299-84016-4-git-send-email-harry.van.haaren@intel.com",
    "date": "2017-04-21T09:51:39",
    "name": "[dpdk-dev,3/3] doc: add eventdev library to programmers guide",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9cbf83b44ab2a6b8910fc11b73dad4441225f9eb",
    "submitter": {
        "id": 317,
        "url": "https://patches.dpdk.org/api/people/317/?format=api",
        "name": "Van Haaren, Harry",
        "email": "harry.van.haaren@intel.com"
    },
    "delegate": {
        "id": 310,
        "url": "https://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1492768299-84016-4-git-send-email-harry.van.haaren@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/23801/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/23801/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id F1D7858F6;\n\tFri, 21 Apr 2017 11:52:37 +0200 (CEST)",
            "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n\tby dpdk.org (Postfix) with ESMTP id EDACC58D1\n\tfor <dev@dpdk.org>; Fri, 21 Apr 2017 11:52:35 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t21 Apr 2017 02:52:34 -0700",
            "from silpixa00398672.ir.intel.com ([10.237.223.128])\n\tby orsmga005.jf.intel.com with ESMTP; 21 Apr 2017 02:52:33 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.37,229,1488873600\"; d=\"scan'208\";a=\"90572738\"",
        "From": "Harry van Haaren <harry.van.haaren@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "jerin.jacob@caviumnetworks.com,\n\tHarry van Haaren <harry.van.haaren@intel.com>",
        "Date": "Fri, 21 Apr 2017 10:51:39 +0100",
        "Message-Id": "<1492768299-84016-4-git-send-email-harry.van.haaren@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1492768299-84016-1-git-send-email-harry.van.haaren@intel.com>",
        "References": "<1492768299-84016-1-git-send-email-harry.van.haaren@intel.com>",
        "Subject": "[dpdk-dev] [PATCH 3/3] doc: add eventdev library to programmers\n\tguide",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This commit adds an entry in the programmers guide\nexplaining the eventdev library.\n\nThe rte_event struct, queues and ports are explained.\nAn API walktrough of a simple two stage atomic pipeline\nprovides the reader with a step by step overview of the\nexpected usage of the Eventdev API.\n\nSigned-off-by: Harry van Haaren <harry.van.haaren@intel.com>\n---\n doc/guides/prog_guide/eventdev.rst           | 365 ++++++++++\n doc/guides/prog_guide/img/eventdev_usage.svg | 994 +++++++++++++++++++++++++++\n doc/guides/prog_guide/index.rst              |   1 +\n 3 files changed, 1360 insertions(+)\n create mode 100644 doc/guides/prog_guide/eventdev.rst\n create mode 100644 doc/guides/prog_guide/img/eventdev_usage.svg",
    "diff": "diff --git a/doc/guides/prog_guide/eventdev.rst b/doc/guides/prog_guide/eventdev.rst\nnew file mode 100644\nindex 0000000..4f6088e\n--- /dev/null\n+++ b/doc/guides/prog_guide/eventdev.rst\n@@ -0,0 +1,365 @@\n+..  BSD LICENSE\n+    Copyright(c) 2017 Intel Corporation. All rights reserved.\n+\n+    Redistribution and use in source and binary forms, with or without\n+    modification, are permitted provided that the following conditions\n+    are met:\n+\n+    * Redistributions of source code must retain the above copyright\n+    notice, this list of conditions and the following disclaimer.\n+    * Redistributions in binary form must reproduce the above copyright\n+    notice, this list of conditions and the following disclaimer in\n+    the documentation and/or other materials provided with the\n+    distribution.\n+    * Neither the name of Intel Corporation nor the names of its\n+    contributors may be used to endorse or promote products derived\n+    from this software without specific prior written permission.\n+\n+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+    \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+Event Device Library\n+====================\n+\n+The DPDK Event device library is an abstraction that provides the application\n+with features to schedule events. This is achieved using the PMD architecture\n+similar to the ethdev or cryptodev APIs, which may already be familiar to the\n+reader. The eventdev framework is provided as a DPDK library, allowing\n+applications to use it if they wish, but not require its usage.\n+\n+The goal of this library is to enable applications to build processing\n+pipelines where the load balancing and scheduling is handled by the eventdev.\n+Step-by-step instructions of the eventdev design is available in the `API\n+Walktrough`_ section later in this document.\n+\n+Event struct\n+------------\n+\n+The eventdev API represents each event with a generic struct, which contains a\n+payload and metadata required for scheduling by an eventdev.  The\n+``rte_event`` struct is a 16 byte C structure, defined in\n+``libs/librte_eventdev/rte_eventdev.h``.\n+\n+Event Metadata\n+~~~~~~~~~~~~~~\n+\n+The rte_event structure contains the following metadata fields, which the\n+application fills in to have the event scheduled as required:\n+\n+* ``flow_id`` - The targeted flow identifier for the enq/deq operation.\n+* ``event_type`` - The source of this event, eg RTE_EVENT_TYPE_ETHDEV or CPU.\n+* ``sub_event_type`` - Distinguishes events inside the application, that have\n+  the same event_type (see above)\n+* ``op`` - This field takes one of the RTE_EVENT_OP_* values, and tells the\n+  eventdev about the status of the event - valid values are NEW, FORWARD or\n+  RELEASE.\n+* ``sched_type`` - Represents the type of scheduling that should be performed\n+  on this event, valid values are the RTE_SCHED_TYPE_ORDERED, ATOMIC and\n+  PARALLEL.\n+* ``queue_id`` - The identifier for the event queue that the event is sent to.\n+* ``priority`` - The priority of this event, see RTE_EVENT_DEV_PRIORITY.\n+\n+Event Payload\n+~~~~~~~~~~~~~\n+\n+The rte_event struct contains a union for payload, allowing flexibility in what\n+the actual event being scheduled is. The payload is a union of the following:\n+\n+* ``uint64_t u64``\n+* ``void *event_ptr``\n+* ``struct rte_mbuf *mbuf``\n+\n+These three items in a union occupy the same 64 bits at the end of the rte_event\n+structure. The application can utilize the 64 bits directly by accessing the\n+u64 variable, while the event_ptr and mbuf are provided as convenience\n+variables.  For example the mbuf pointer in the union can used to schedule a\n+DPDK packet.\n+\n+Queues\n+~~~~~~\n+\n+A queue is a logical \"stage\" of a packet processing graph, where each stage\n+has a specified scheduling type.  The application configures each queue for a\n+specific type of scheduling, and just enqueues all events to the eventdev.\n+The Eventdev API supports the following scheduling types per queue:\n+\n+*   Atomic\n+*   Ordered\n+*   Parallel\n+\n+Atomic, Ordered and Parallel are load-balanced scheduling types: the output\n+of the queue can be spread out over multiple CPU cores.\n+\n+Atomic scheduling on a queue ensures that a single flow is not present on two\n+different CPU cores at the same time. Ordered allows sending all flows to any\n+core, but the scheduler must ensure that on egress the packets are returned to\n+ingress order. Parallel allows sending all flows to all CPU cores, without any\n+re-ordering guarantees.\n+\n+Single Link Flag\n+^^^^^^^^^^^^^^^^\n+\n+There is a SINGLE_LINK flag which allows an application to indicate that only\n+one port will be connected to a queue.  Queues configured with the single-link\n+flag follow a FIFO like structure, maintaining ordering but it is only capable\n+of being linked to a single port (see below for port and queue linking details).\n+\n+\n+Ports\n+~~~~~\n+\n+Ports are the points of contact between worker cores and the eventdev. The\n+general use-case will see one CPU core using one port to enqueue and dequeue\n+events from an eventdev. Ports are linked to queues in order to retrieve events\n+from those queues (more details in `Linking Queues and Ports`_ below).\n+\n+\n+API Walktrough\n+--------------\n+\n+This section will introduce the reader to the eventdev API, showing how to\n+create and configure an eventdev and use it for a two-stage atomic pipeline\n+with a single core for TX. The diagram below shows the final state of the\n+application after this walktrough:\n+\n+.. _figure_eventdev-usage1:\n+\n+.. figure:: img/eventdev_usage.*\n+\n+   Sample eventdev usage, with RX, two atomic stages and a single-link to TX.\n+\n+\n+A high level overview of the setup steps are:\n+\n+* rte_event_dev_configure()\n+* rte_event_queue_setup()\n+* rte_event_port_setup()\n+* rte_event_port_link()\n+* rte_event_dev_start()\n+\n+\n+Init and Config\n+~~~~~~~~~~~~~~~\n+\n+The eventdev library uses vdev options to add devices to the DPDK application.\n+The ``--vdev`` EAL option allows adding eventdev instances to your DPDK\n+application, using the name of the eventdev PMD as an argument.\n+\n+For example, to create an instance of the software eventdev scheduler, the\n+following vdev arguments should be provided to the application EAL command line:\n+\n+.. code-block:: console\n+\n+   ./dpdk_application --vdev=\"event_sw0\"\n+\n+In the following code, we configure eventdev instance with 3 queues\n+and 6 ports as follows. The 3 queues consist of 2 Atomic and 1 Single-Link,\n+while the 6 ports consist of 4 workers, 1 RX and 1 TX.\n+\n+.. code-block:: c\n+\n+        const struct rte_event_dev_config config = {\n+                .nb_event_queues = 3,\n+                .nb_event_ports = 6,\n+                .nb_events_limit  = 4096,\n+                .nb_event_queue_flows = 1024,\n+                .nb_event_port_dequeue_depth = 128,\n+                .nb_event_port_enqueue_depth = 128,\n+        };\n+        int err = rte_event_dev_configure(dev_id, &config);\n+\n+The remainder of this walktrough assumes that dev_id is 0.\n+\n+Setting up Queues\n+~~~~~~~~~~~~~~~~~\n+\n+Once the eventdev itself is configured, the next step is to configure queues.\n+This is done by setting the appropriate values in a queue_conf structure, and\n+calling the setup function. Repeat this step for each queue, starting from\n+0 and ending at ``nb_event_queues - 1`` from the event_dev config above.\n+\n+.. code-block:: c\n+\n+        struct rte_event_queue_conf atomic_conf = {\n+                .event_queue_cfg = RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY,\n+                .priority = RTE_EVENT_DEV_PRIORITY_NORMAL,\n+                .nb_atomic_flows = 1024,\n+                .nb_atomic_order_sequences = 1024,\n+        };\n+        int dev_id = 0;\n+        int queue_id = 0;\n+        int err = rte_event_queue_setup(dev_id, queue_id, &atomic_conf);\n+\n+The remainder of this walktrough assumes that the queues are configured as\n+follows:\n+\n+ * id 0, atomic queue #1\n+ * id 1, atomic queue #2\n+ * id 2, single-link queue\n+\n+Setting up Ports\n+~~~~~~~~~~~~~~~~\n+\n+Once queues are set up successfully, create the ports as required. Each port\n+should be set up with its corresponding port_conf type, worker for worker cores,\n+rx and tx for the RX and TX cores:\n+\n+.. code-block:: c\n+\n+        struct rte_event_port_conf rx_conf = {\n+                .dequeue_depth = 128,\n+                .enqueue_depth = 128,\n+                .new_event_threshold = 1024,\n+        };\n+        struct rte_event_port_conf worker_conf = {\n+                .dequeue_depth = 16,\n+                .enqueue_depth = 64,\n+                .new_event_threshold = 4096,\n+        };\n+        struct rte_event_port_conf tx_conf = {\n+                .dequeue_depth = 128,\n+                .enqueue_depth = 128,\n+                .new_event_threshold = 4096,\n+        };\n+        int dev_id = 0;\n+        int port_id = 0;\n+        int err = rte_event_port_setup(dev_id, port_id, &CORE_FUNCTION_conf);\n+\n+It is now assumed that:\n+\n+ * port 0: RX core\n+ * ports 1,2,3,4: Workers\n+ * port 5: TX core\n+\n+Linking Queues and Ports\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The final step is to \"wire up\" the ports to the queues. After this, the\n+eventdev is capable of scheduling events, and when cores request work to do,\n+the correct events are provided to that core. Note that the RX core takes input\n+from eg: a NIC so it is not linked to any eventdev queues.\n+\n+Linking all workers to atomic queues, and the TX core to the single-link queue\n+can be achieved like this:\n+\n+.. code-block:: c\n+\n+        uint8_t port_id = 0;\n+        uint8_t atomic_qs[] = {0, 1};\n+        uint8_t single_link_q = 2;\n+        uint8_t tx_port_id = 5;\n+        uin8t_t priority = RTE_EVENT_DEV_PRIORITY_NORMAL;\n+\n+        for(int i = 0; i < 4; i++) {\n+                int worker_port = i + 1;\n+                int links_made = rte_event_port_link(dev_id, worker_port, atomic_qs, NULL, 2);\n+        }\n+        int links_made = rte_event_port_link(dev_id, tx_port_id, &single_link_q, &priority, 1);\n+\n+Starting the EventDev\n+~~~~~~~~~~~~~~~~~~~~~\n+\n+A single function call tells the eventdev instance to start processing\n+events. Note that all queues must be linked to for the instance to start, as\n+if any queue is not linked to, enqueuing to that queue will cause the\n+application to backpressure and eventually stall due to no space in the\n+eventdev.\n+\n+.. code-block:: c\n+\n+        int err = rte_event_dev_start(dev_id);\n+\n+Ingress of New Events\n+~~~~~~~~~~~~~~~~~~~~~\n+\n+Now that the eventdev is set up, and ready to receive events, the RX core must\n+enqueue some events into the system for it to schedule. The events to be\n+scheduled are ordinary DPDK packets, received from an eth_rx_burst() as normal.\n+The following code shows how those packets can be enqueued into the eventdev:\n+\n+.. code-block:: c\n+\n+        const uint16_t nb_rx = rte_eth_rx_burst(eth_port, 0, mbufs, BATCH_SIZE);\n+\n+        for (i = 0; i < nb_rx; i++) {\n+                ev[i].flow_id = mbufs[i]->hash.rss;\n+                ev[i].op = RTE_EVENT_OP_NEW;\n+                ev[i].sched_type = RTE_EVENT_QUEUE_CFG_ATOMIC_ONLY;\n+                ev[i].queue_id = 0;\n+                ev[i].event_type = RTE_EVENT_TYPE_CPU;\n+                ev[i].sub_event_type = 0;\n+                ev[i].priority = RTE_EVENT_DEV_PRIORITY_NORMAL;\n+                ev[i].mbuf = mbufs[i];\n+        }\n+\n+        const int nb_tx = rte_event_enqueue_burst(dev_id, port_id, ev, nb_rx);\n+        if (nb_tx != nb_rx) {\n+                for(i = nb_tx; i < nb_rx; i++)\n+                        rte_pktmbuf_free(mbufs[i]);\n+        }\n+\n+Forwarding of Events\n+~~~~~~~~~~~~~~~~~~~~\n+\n+Now that the RX core has injected events, there is work to be done by the\n+workers. Note that each worker will dequeue as many events as it can in a burst,\n+process each one individually, and then burst the packets back into the\n+eventdev.\n+\n+The worker can lookup the events source from ``event.queue_id``, which should\n+indicate to the worker what workload needs to be performed on the event.\n+Once done, the worker can update the ``event.queue_id`` to a new value, to send\n+the event to the next stage in the pipeline.\n+\n+.. code-block:: c\n+\n+        int timeout = 0;\n+        struct rte_event events[BATCH_SIZE];\n+        uint16_t nb_rx = rte_event_dequeue_burst(dev_id, worker_port_id, events, BATCH_SIZE, timeout);\n+\n+        for (i = 0; i < nb_rx; i++) {\n+                /* process mbuf using events[i].queue_id as pipeline stage */\n+                struct rte_mbuf *mbuf = events[i].mbuf;\n+                /* Send event to next stage in pipeline */\n+                events[i].queue_id++;\n+        }\n+\n+        uint16_t nb_tx = rte_event_enqueue_burst(dev_id, port_id, events, nb_rx);\n+\n+\n+Egress of Events\n+~~~~~~~~~~~~~~~~\n+\n+Finally, when the packet is ready for egress or needs to be dropped, we need\n+to inform the eventdev that the packet is no longer being handled by the\n+application. This can be done by calling dequeue() or dequeue_burst(), which\n+indicates that the previous burst of packets is no longer in use by the\n+application.\n+\n+.. code-block:: c\n+\n+        struct rte_event events[BATCH_SIZE];\n+        uint16_t n = rte_event_dequeue_burst(dev_id, port_id, events, BATCH_SIZE, 0);\n+        /* burst #1 : now tx or use the packets */\n+        n = rte_event_dequeue_burst(dev_id, port_id, events, BATCH_SIZE, 0);\n+        /* burst #1 is now no longer valid to use in the application, as\n+           the eventdev has dropped any locks or released re-ordered packets */\n+\n+Summary\n+-------\n+\n+The eventdev library allows an application to easily schedule events as it\n+requires, either using a run-to-completion or pipeline processing model.  The\n+queues and ports abstract the logical functionality of an eventdev, providing\n+the application with a generic method to schedule events.  With the flexible\n+PMD infrastructure applications benefit of improvements in existing eventdevs\n+and additions of new ones without modification.\ndiff --git a/doc/guides/prog_guide/img/eventdev_usage.svg b/doc/guides/prog_guide/img/eventdev_usage.svg\nnew file mode 100644\nindex 0000000..7765649\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/eventdev_usage.svg\n@@ -0,0 +1,994 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+\n+<svg\n+   xmlns:v=\"http://schemas.microsoft.com/visio/2003/SVGExtensions/\"\n+   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n+   xmlns:cc=\"http://creativecommons.org/ns#\"\n+   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n+   xmlns:svg=\"http://www.w3.org/2000/svg\"\n+   xmlns=\"http://www.w3.org/2000/svg\"\n+   xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n+   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\n+   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n+   width=\"683.12061\"\n+   height=\"184.672\"\n+   viewBox=\"0 0 546.49648 147.7376\"\n+   xml:space=\"preserve\"\n+   color-interpolation-filters=\"sRGB\"\n+   class=\"st9\"\n+   id=\"svg2\"\n+   version=\"1.1\"\n+   inkscape:version=\"0.48.4 r9939\"\n+   sodipodi:docname=\"eventdev_usage.svg\"\n+   style=\"font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible\"><metadata\n+   id=\"metadata214\"><rdf:RDF><cc:Work\n+       rdf:about=\"\"><dc:format>image/svg+xml</dc:format><dc:type\n+         rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview\n+   pagecolor=\"#ffffff\"\n+   bordercolor=\"#666666\"\n+   borderopacity=\"1\"\n+   objecttolerance=\"10\"\n+   gridtolerance=\"10\"\n+   guidetolerance=\"10\"\n+   inkscape:pageopacity=\"0\"\n+   inkscape:pageshadow=\"2\"\n+   inkscape:window-width=\"1920\"\n+   inkscape:window-height=\"1017\"\n+   id=\"namedview212\"\n+   showgrid=\"false\"\n+   fit-margin-top=\"2\"\n+   fit-margin-left=\"2\"\n+   fit-margin-right=\"2\"\n+   fit-margin-bottom=\"2\"\n+   inkscape:zoom=\"1.2339869\"\n+   inkscape:cx=\"501.15554\"\n+   inkscape:cy=\"164.17693\"\n+   inkscape:window-x=\"-8\"\n+   inkscape:window-y=\"406\"\n+   inkscape:window-maximized=\"1\"\n+   inkscape:current-layer=\"g17\" />\n+\t<v:documentProperties\n+   v:langID=\"1033\"\n+   v:viewMarkup=\"false\">\n+\t\t<v:userDefs>\n+\t\t\t<v:ud\n+   v:nameU=\"msvSubprocessMaster\"\n+   v:prompt=\"\"\n+   v:val=\"VT4(Rectangle)\" />\n+\t\t\t<v:ud\n+   v:nameU=\"msvNoAutoConnect\"\n+   v:val=\"VT0(1):26\" />\n+\t\t</v:userDefs>\n+\t</v:documentProperties>\n+\n+\t<style\n+   type=\"text/css\"\n+   id=\"style4\">\n+\n+\t\t.st1 {visibility:visible}\n+\t\t.st2 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}\n+\t\t.st3 {fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25}\n+\t\t.st4 {fill:#feffff;font-family:Calibri;font-size:0.833336em}\n+\t\t.st5 {font-size:1em}\n+\t\t.st6 {fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25}\n+\t\t.st7 {marker-end:url(#mrkr4-33);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}\n+\t\t.st8 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091}\n+\t\t.st9 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}\n+\n+\t</style>\n+\n+\t<defs\n+   id=\"Markers\">\n+\t\t<g\n+   id=\"lend4\">\n+\t\t\t<path\n+   d=\"M 2,1 0,0 2,-1 2,1\"\n+   style=\"stroke:none\"\n+   id=\"path8\"\n+   inkscape:connector-curvature=\"0\" />\n+\t\t</g>\n+\t\t<marker\n+   id=\"mrkr4-33\"\n+   class=\"st8\"\n+   v:arrowType=\"4\"\n+   v:arrowSize=\"2\"\n+   v:setback=\"7.04\"\n+   refX=\"-7.04\"\n+   orient=\"auto\"\n+   markerUnits=\"strokeWidth\"\n+   overflow=\"visible\"\n+   style=\"fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-width:0.28409091;stroke-opacity:1;overflow:visible\">\n+\t\t\t<use\n+   xlink:href=\"#lend4\"\n+   transform=\"scale(-3.52,-3.52)\"\n+   id=\"use11\"\n+   x=\"0\"\n+   y=\"0\"\n+   width=\"3\"\n+   height=\"3\" />\n+\t\t</marker>\n+\t<filter\n+   id=\"filter_2-7\"\n+   color-interpolation-filters=\"sRGB\"><feGaussianBlur\n+     stdDeviation=\"2\"\n+     id=\"feGaussianBlur15-1\" /></filter><marker\n+   id=\"mrkr4-33-2\"\n+   class=\"st8\"\n+   v:arrowType=\"4\"\n+   v:arrowSize=\"2\"\n+   v:setback=\"7.04\"\n+   refX=\"-7.04\"\n+   orient=\"auto\"\n+   markerUnits=\"strokeWidth\"\n+   overflow=\"visible\"\n+   style=\"fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-width:0.28409091;stroke-opacity:1;overflow:visible\"><use\n+     xlink:href=\"#lend4\"\n+     transform=\"scale(-3.52,-3.52)\"\n+     id=\"use11-3\"\n+     x=\"0\"\n+     y=\"0\"\n+     width=\"3\"\n+     height=\"3\" /></marker><marker\n+   id=\"mrkr4-33-6\"\n+   class=\"st8\"\n+   v:arrowType=\"4\"\n+   v:arrowSize=\"2\"\n+   v:setback=\"7.04\"\n+   refX=\"-7.04\"\n+   orient=\"auto\"\n+   markerUnits=\"strokeWidth\"\n+   overflow=\"visible\"\n+   style=\"fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-width:0.28409091;stroke-opacity:1;overflow:visible\"><use\n+     xlink:href=\"#lend4\"\n+     transform=\"scale(-3.52,-3.52)\"\n+     id=\"use11-8\"\n+     x=\"0\"\n+     y=\"0\"\n+     width=\"3\"\n+     height=\"3\" /></marker></defs>\n+\t<defs\n+   id=\"Filters\">\n+\t\t<filter\n+   id=\"filter_2\"\n+   color-interpolation-filters=\"sRGB\">\n+\t\t\t<feGaussianBlur\n+   stdDeviation=\"2\"\n+   id=\"feGaussianBlur15\" />\n+\t\t</filter>\n+\t</defs>\n+\t<g\n+   v:mID=\"0\"\n+   v:index=\"1\"\n+   v:groupContext=\"foregroundPage\"\n+   id=\"g17\"\n+   transform=\"translate(-47.323579,-90.784072)\">\n+\t\t<v:userDefs>\n+\t\t\t<v:ud\n+   v:nameU=\"msvThemeOrder\"\n+   v:val=\"VT0(0):26\" />\n+\t\t</v:userDefs>\n+\t\t<title\n+   id=\"title19\">Page-1</title>\n+\t\t<v:pageProperties\n+   v:drawingScale=\"1\"\n+   v:pageScale=\"1\"\n+   v:drawingUnits=\"0\"\n+   v:shadowOffsetX=\"9\"\n+   v:shadowOffsetY=\"-9\" />\n+\t\t<v:layer\n+   v:name=\"Connector\"\n+   v:index=\"0\" />\n+\t\t<g\n+   id=\"shape1-1\"\n+   v:mID=\"1\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,128.62352,-288.18843)\">\n+\t\t\t<title\n+   id=\"title22\">Square</title>\n+\t\t\t<desc\n+   id=\"desc24\">Atomic Queue #1</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"30.75\"\n+   cy=\"581.25\"\n+   width=\"61.5\"\n+   height=\"61.5\" />\n+\t\t\t<g\n+   id=\"shadow1-2\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st2\"\n+   id=\"rect27\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st3\"\n+   id=\"rect29\"\n+   style=\"fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25\" />\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape3-8\"\n+   v:mID=\"3\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,297.37175,-288.18843)\">\n+\t\t\t<title\n+   id=\"title36\">Square.3</title>\n+\t\t\t<desc\n+   id=\"desc38\">Atomic Queue #2</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"30.75\"\n+   cy=\"581.25\"\n+   width=\"61.5\"\n+   height=\"61.5\" />\n+\t\t\t<g\n+   id=\"shadow3-9\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st2\"\n+   id=\"rect41\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st3\"\n+   id=\"rect43\"\n+   style=\"fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25\" />\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape4-15\"\n+   v:mID=\"4\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,466.1192,-288.18843)\">\n+\t\t\t<title\n+   id=\"title50\">Square.4</title>\n+\t\t\t<desc\n+   id=\"desc52\">Single Link Queue # 1</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"30.75\"\n+   cy=\"581.25\"\n+   width=\"61.5\"\n+   height=\"61.5\" />\n+\t\t\t<g\n+   id=\"shadow4-16\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st2\"\n+   id=\"rect55\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<rect\n+   x=\"0\"\n+   y=\"550.5\"\n+   width=\"61.5\"\n+   height=\"61.5\"\n+   class=\"st3\"\n+   id=\"rect57\"\n+   style=\"fill:#5b9bd5;stroke:#c7c8c8;stroke-width:0.25\" />\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape5-22\"\n+   v:mID=\"5\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,52.208527,-296.14701)\">\n+\t\t\t<title\n+   id=\"title64\">Circle</title>\n+\t\t\t<desc\n+   id=\"desc66\">RX</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow5-23\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path69\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path71\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"15.19\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text73\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />RX</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape6-28\"\n+   v:mID=\"6\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,84.042834,-305.07614)\">\n+\t\t\t<title\n+   id=\"title76\">Dynamic connector</title>\n+\t\t\t<path\n+   d=\"m 0,603 50.38,0\"\n+   class=\"st7\"\n+   id=\"path78\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape7-34\"\n+   v:mID=\"7\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,220.95621,-296.14701)\">\n+\t\t\t<title\n+   id=\"title81\">Circle.7</title>\n+\t\t\t<desc\n+   id=\"desc83\">W ..</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow7-35\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path86\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path88\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"12.4\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text90\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W ..</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape9-40\"\n+   v:mID=\"9\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,220.95621,-243.34865)\">\n+\t\t\t<title\n+   id=\"title93\">Circle.9</title>\n+\t\t\t<desc\n+   id=\"desc95\">W N</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow9-41\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path98\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path100\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"11.69\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text102\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W N</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape10-46\"\n+   v:mID=\"10\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,220.95621,-348.94537)\">\n+\t\t\t<title\n+   id=\"title105\">Circle.10</title>\n+\t\t\t<desc\n+   id=\"desc107\">W 1</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow10-47\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path110\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path112\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"12.39\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text114\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W 1</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape11-52\"\n+   v:mID=\"11\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,195.91581,-312.06416)\">\n+\t\t\t<title\n+   id=\"title117\">Dynamic connector.11</title>\n+\t\t\t<path\n+   d=\"m 0,612 0,-68 25.21,0\"\n+   class=\"st7\"\n+   id=\"path119\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape12-57\"\n+   v:mID=\"12\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,176.37498,-305.07614)\">\n+\t\t\t<title\n+   id=\"title122\">Dynamic connector.12</title>\n+\t\t\t<path\n+   d=\"m 0,603 50.38,0\"\n+   class=\"st7\"\n+   id=\"path124\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape13-62\"\n+   v:mID=\"13\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,176.37498,-312.06416)\">\n+\t\t\t<title\n+   id=\"title127\">Dynamic connector.13</title>\n+\t\t\t<path\n+   d=\"m 0,612 25.17,0 0,68 25.21,0\"\n+   class=\"st7\"\n+   id=\"path129\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape14-67\"\n+   v:mID=\"14\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,252.79052,-259.2658)\">\n+\t\t\t<title\n+   id=\"title132\">Dynamic connector.14</title>\n+\t\t\t<path\n+   d=\"m 0,612 26.88,0 0,-68 23.5,0\"\n+   class=\"st7\"\n+   id=\"path134\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape15-72\"\n+   v:mID=\"15\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,252.79052,-305.07614)\">\n+\t\t\t<title\n+   id=\"title137\">Dynamic connector.15</title>\n+\t\t\t<path\n+   d=\"m 0,603 50.38,0\"\n+   class=\"st7\"\n+   id=\"path139\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape19-77\"\n+   v:mID=\"19\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,389.70366,-296.14701)\">\n+\t\t\t<title\n+   id=\"title142\">Circle.19</title>\n+\t\t\t<desc\n+   id=\"desc144\">W ..</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow19-78\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path147\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path149\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"12.4\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text151\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W ..</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape20-83\"\n+   v:mID=\"20\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,389.70366,-243.34865)\">\n+\t\t\t<title\n+   id=\"title154\">Circle.20</title>\n+\t\t\t<desc\n+   id=\"desc156\">W N</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow20-84\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path159\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path161\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"11.69\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text163\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W N</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape21-89\"\n+   v:mID=\"21\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,389.70366,-348.94537)\">\n+\t\t\t<title\n+   id=\"title166\">Circle.21</title>\n+\t\t\t<desc\n+   id=\"desc168\">W 1</desc>\n+\t\t\t<v:userDefs>\n+\t\t\t\t<v:ud\n+   v:nameU=\"visVersion\"\n+   v:val=\"VT0(15):26\" />\n+\t\t\t</v:userDefs>\n+\t\t\t<v:textBlock\n+   v:margins=\"rect(4,4,4,4)\" />\n+\t\t\t<v:textRect\n+   cx=\"20.5\"\n+   cy=\"591.5\"\n+   width=\"35.88\"\n+   height=\"30.75\" />\n+\t\t\t<g\n+   id=\"shadow21-90\"\n+   v:groupContext=\"shadow\"\n+   v:shadowOffsetX=\"0.345598\"\n+   v:shadowOffsetY=\"-1.97279\"\n+   v:shadowType=\"1\"\n+   transform=\"translate(0.345598,1.97279)\"\n+   class=\"st1\"\n+   style=\"visibility:visible\">\n+\t\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st2\"\n+   id=\"path171\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2)\" />\n+\t\t\t</g>\n+\t\t\t<path\n+   d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+   class=\"st6\"\n+   id=\"path173\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" />\n+\t\t\t<text\n+   x=\"12.39\"\n+   y=\"594.5\"\n+   class=\"st4\"\n+   v:langID=\"1033\"\n+   id=\"text175\"\n+   style=\"fill:#feffff;font-family:Calibri\"><v:paragraph\n+   v:horizAlign=\"1\" /><v:tabList />W 1</text>\n+\n+\t\t</g>\n+\t\t<g\n+   id=\"shape28-95\"\n+   v:mID=\"28\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,345.12321,-305.07614)\">\n+\t\t\t<title\n+   id=\"title178\">Dynamic connector.28</title>\n+\t\t\t<path\n+   d=\"m 0,603 50.38,0\"\n+   class=\"st7\"\n+   id=\"path180\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape29-100\"\n+   v:mID=\"29\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,345.12321,-312.06416)\">\n+\t\t\t<title\n+   id=\"title183\">Dynamic connector.29</title>\n+\t\t\t<path\n+   d=\"m 0,612 28.33,0 0,-68 22.05,0\"\n+   class=\"st7\"\n+   id=\"path185\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape30-105\"\n+   v:mID=\"30\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,345.12321,-312.06416)\">\n+\t\t\t<title\n+   id=\"title188\">Dynamic connector.30</title>\n+\t\t\t<path\n+   d=\"m 0,612 28.33,0 0,68 22.05,0\"\n+   class=\"st7\"\n+   id=\"path190\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape31-110\"\n+   v:mID=\"31\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,421.53797,-259.2658)\">\n+\t\t\t<title\n+   id=\"title193\">Dynamic connector.31</title>\n+\t\t\t<path\n+   d=\"m 0,612 24.42,0 0,-68 25.96,0\"\n+   class=\"st7\"\n+   id=\"path195\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape32-115\"\n+   v:mID=\"32\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,421.53797,-305.07614)\">\n+\t\t\t<title\n+   id=\"title198\">Dynamic connector.32</title>\n+\t\t\t<path\n+   d=\"m 0,603 50.38,0\"\n+   class=\"st7\"\n+   id=\"path200\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape33-120\"\n+   v:mID=\"33\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,421.53797,-364.86253)\">\n+\t\t\t<title\n+   id=\"title203\">Dynamic connector.33</title>\n+\t\t\t<path\n+   d=\"m 0,612 24.42,0 0,68 25.96,0\"\n+   class=\"st7\"\n+   id=\"path205\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t\t<g\n+   id=\"shape34-125\"\n+   v:mID=\"34\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,252.79052,-364.86253)\">\n+\t\t\t<title\n+   id=\"title208\">Dynamic connector.34</title>\n+\t\t\t<path\n+   d=\"m 0,612 26.88,0 0,68 23.5,0\"\n+   class=\"st7\"\n+   id=\"path210\"\n+   inkscape:connector-curvature=\"0\"\n+   style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" />\n+\t\t</g>\n+\t<text\n+   xml:space=\"preserve\"\n+   style=\"font-size:24.84628868px;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\"\n+   x=\"153.38116\"\n+   y=\"165.90149\"\n+   id=\"text3106\"\n+   sodipodi:linespacing=\"125%\"><tspan\n+     sodipodi:role=\"line\"\n+     x=\"153.38116\"\n+     y=\"165.90149\"\n+     id=\"tspan3110\"\n+     style=\"font-size:8.69620132px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans\">Atomic #1</tspan></text>\n+<text\n+   xml:space=\"preserve\"\n+   style=\"font-size:24.84628868px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;overflow:visible;font-family:Sans\"\n+   x=\"322.12939\"\n+   y=\"165.90149\"\n+   id=\"text3106-1\"\n+   sodipodi:linespacing=\"125%\"><tspan\n+     sodipodi:role=\"line\"\n+     x=\"322.12939\"\n+     y=\"165.90149\"\n+     id=\"tspan3110-4\"\n+     style=\"font-size:8.69620132px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans\">Atomic #2</tspan></text>\n+<text\n+   xml:space=\"preserve\"\n+   style=\"font-size:24.84628868px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;overflow:visible;font-family:Sans\"\n+   x=\"491.82089\"\n+   y=\"172.79289\"\n+   id=\"text3106-0\"\n+   sodipodi:linespacing=\"125%\"><tspan\n+     sodipodi:role=\"line\"\n+     x=\"491.82089\"\n+     y=\"172.79289\"\n+     style=\"font-size:8.69620132px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans\"\n+     id=\"tspan3923\" /></text>\n+<text\n+   xml:space=\"preserve\"\n+   style=\"font-size:24.84628868px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;overflow:visible;font-family:Sans\"\n+   x=\"491.02899\"\n+   y=\"165.03951\"\n+   id=\"text3106-8-5\"\n+   sodipodi:linespacing=\"125%\"><tspan\n+     sodipodi:role=\"line\"\n+     x=\"491.02899\"\n+     y=\"165.03951\"\n+     id=\"tspan3110-2-1\"\n+     style=\"font-size:8.69620132px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans\">Single Link</tspan></text>\n+<g\n+   style=\"font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible\"\n+   id=\"shape5-22-1\"\n+   v:mID=\"5\"\n+   v:groupContext=\"shape\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,556.00223,-296.89447)\"><title\n+     id=\"title64-5\">Circle</title><desc\n+     id=\"desc66-2\">RX</desc><v:userDefs><v:ud\n+       v:nameU=\"visVersion\"\n+       v:val=\"VT0(15):26\" /></v:userDefs><v:textBlock\n+     v:margins=\"rect(4,4,4,4)\" /><v:textRect\n+     cx=\"20.5\"\n+     cy=\"591.5\"\n+     width=\"35.88\"\n+     height=\"30.75\" /><g\n+     id=\"shadow5-23-7\"\n+     v:groupContext=\"shadow\"\n+     v:shadowOffsetX=\"0.345598\"\n+     v:shadowOffsetY=\"-1.97279\"\n+     v:shadowType=\"1\"\n+     transform=\"translate(0.345598,1.97279)\"\n+     class=\"st1\"\n+     style=\"visibility:visible\"><path\n+       d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+       class=\"st2\"\n+       id=\"path69-6\"\n+       inkscape:connector-curvature=\"0\"\n+       style=\"fill:#5b9bd5;fill-opacity:0.22000002;stroke:#5b9bd5;stroke-opacity:0.22000002;filter:url(#filter_2-7)\" /></g><path\n+     d=\"m 0,591.5 a 20.5,20.5 0 0 1 41,0 20.5,20.5 0 1 1 -41,0 z\"\n+     class=\"st6\"\n+     id=\"path71-1\"\n+     inkscape:connector-curvature=\"0\"\n+     style=\"fill:#ffd965;stroke:#c7c8c8;stroke-width:0.25\" /><text\n+     x=\"11.06866\"\n+     y=\"596.56067\"\n+     class=\"st4\"\n+     v:langID=\"1033\"\n+     id=\"text73-4\"\n+     style=\"fill:#feffff;font-family:Calibri\"> TX</text>\n+</g><g\n+   style=\"font-size:12px;fill:none;stroke-linecap:square;stroke-miterlimit:3;overflow:visible\"\n+   id=\"shape28-95-5\"\n+   v:mID=\"28\"\n+   v:groupContext=\"shape\"\n+   v:layerMember=\"0\"\n+   transform=\"matrix(0.77644652,0,0,0.77644652,512.00213,-305.42637)\"><title\n+     id=\"title178-7\">Dynamic connector.28</title><path\n+     d=\"m 0,603 50.38,0\"\n+     class=\"st7\"\n+     id=\"path180-6\"\n+     inkscape:connector-curvature=\"0\"\n+     style=\"stroke:#5b9bd5;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#mrkr4-33)\" /></g></g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex ef5a02a..7578395 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -57,6 +57,7 @@ Programmer's Guide\n     multi_proc_support\n     kernel_nic_interface\n     thread_safety_dpdk_functions\n+    eventdev\n     qos_framework\n     power_man\n     packet_classif_access_ctrl\n",
    "prefixes": [
        "dpdk-dev",
        "3/3"
    ]
}