List comments

GET /api/covers/52731/comments/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 95024,
        "web_url": "http://patches.dpdk.org/comment/95024/",
        "msgid": "<2601191342CEEE43887BDE71AB9772580148A98052@irsmsx105.ger.corp.intel.com>",
        "date": "2019-04-15T17:29:57",
        "subject": "Re: [dpdk-dev] [PATCH v5 0/3] lib/rcu: add RCU library supporting\n\tQSBR mechanism",
        "submitter": {
            "id": 33,
            "url": "http://patches.dpdk.org/api/people/33/",
            "name": "Ananyev, Konstantin",
            "email": "konstantin.ananyev@intel.com"
        },
        "content": "Hi quys,\n\n> -----Original Message-----\n> From: Honnappa Nagarahalli [mailto:honnappa.nagarahalli@arm.com]\n> Sent: Friday, April 12, 2019 9:21 PM\n> To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; stephen@networkplumber.org; paulmck@linux.ibm.com; Kovacevic, Marko\n> <marko.kovacevic@intel.com>; dev@dpdk.org\n> Cc: honnappa.nagarahalli@arm.com; gavin.hu@arm.com; dharmik.thakkar@arm.com; malvika.gupta@arm.com\n> Subject: [PATCH v5 0/3] lib/rcu: add RCU library supporting QSBR mechanism\n> \n> Lock-less data structures provide scalability and determinism.\n> They enable use cases where locking may not be allowed\n> (for ex: real-time applications).\n> \n> In the following paras, the term 'memory' refers to memory allocated\n> by typical APIs like malloc or anything that is representative of\n> memory, for ex: an index of a free element array.\n> \n> Since these data structures are lock less, the writers and readers\n> are accessing the data structures concurrently. Hence, while removing\n> an element from a data structure, the writers cannot return the memory\n> to the allocator, without knowing that the readers are not\n> referencing that element/memory anymore. Hence, it is required to\n> separate the operation of removing an element into 2 steps:\n> \n> Delete: in this step, the writer removes the reference to the element from\n> the data structure but does not return the associated memory to the\n> allocator. This will ensure that new readers will not get a reference to\n> the removed element. Removing the reference is an atomic operation.\n> \n> Free(Reclaim): in this step, the writer returns the memory to the\n> memory allocator, only after knowing that all the readers have stopped\n> referencing the deleted element.\n> \n> This library helps the writer determine when it is safe to free the\n> memory.\n> \n> This library makes use of thread Quiescent State (QS). QS can be\n> defined as 'any point in the thread execution where the thread does\n> not hold a reference to shared memory'. It is upto the application to\n> determine its quiescent state. Let us consider the following diagram:\n> \n>     Time -------------------------------------------------->\n> \n>                                 |     |\n>   RT1   $++++****D1****+++***D2*|**+++|+++**D3*****++++$\n>                                 |     |\n>   RT2          $++++****D1****++|+**D2|***++++++**D3*****++++$\n>                                 |     |\n>   RT3      $++++****D1****+++***|D2***|++++++**D2*****++++$\n>                                 |     |\n>                                 |<--->|\n>                                Del | Free\n>                                    |\n>                               Cannot free memory\n>                               during this period\n>                               (Grace Period)\n> \n> RTx - Reader thread\n> < and > - Start and end of while(1) loop\n> ***Dx*** - Reader thread is accessing the shared data structure Dx.\n>            i.e. critical section.\n> +++ - Reader thread is not accessing any shared data structure.\n>       i.e. non critical section or quiescent state.\n> Del - Point in time when the reference to the entry is removed using\n>       atomic operation.\n> Free - Point in time when the writer can free the entry.\n> Grace Period - Time duration between Del and Free, during which memory cannot\n>                be freed.\n> \n> As shown, thread RT1 accesses data structures D1, D2 and D3. When it is\n> accessing D2, if the writer has to remove an element from D2, the\n> writer cannot free the memory associated with that element immediately.\n> The writer can return the memory to the allocator only after the reader\n> stops referencing D2. In other words, reader thread RT1 has to enter\n> a quiescent state.\n> \n> Similarly, since thread RT3 is also accessing D2, writer has to wait till\n> RT3 enters quiescent state as well.\n> \n> However, the writer does not need to wait for RT2 to enter quiescent state.\n> Thread RT2 was not accessing D2 when the delete operation happened.\n> So, RT2 will not get a reference to the deleted entry.\n> \n> It can be noted that, the critical sections for D2 and D3 are quiescent states\n> for D1. i.e. for a given data structure Dx, any point in the thread execution\n> that does not reference Dx is a quiescent state.\n> \n> Since memory is not freed immediately, there might be a need for\n> provisioning of additional memory, depending on the application requirements.\n> \n> It is important to make sure that this library keeps the overhead of\n> identifying the end of grace period and subsequent freeing of memory,\n> to a minimum. The following paras explain how grace period and critical\n> section affect this overhead.\n> \n> The writer has to poll the readers to identify the end of grace period.\n> Polling introduces memory accesses and wastes CPU cycles. The memory\n> is not available for reuse during grace period. Longer grace periods\n> exasperate these conditions.\n> \n> The length of the critical section and the number of reader threads\n> is proportional to the duration of the grace period. Keeping the critical\n> sections smaller will keep the grace period smaller. However, keeping the\n> critical sections smaller requires additional CPU cycles(due to additional\n> reporting) in the readers.\n> \n> Hence, we need the characteristics of small grace period and large critical\n> section. This library addresses this by allowing the writer to do\n> other work without having to block till the readers report their quiescent\n> state.\n> \n> For DPDK applications, the start and end of while(1) loop (where no\n> references to shared data structures are kept) act as perfect quiescent\n> states. This will combine all the shared data structure accesses into a\n> single, large critical section which helps keep the overhead on the\n> reader side to a minimum.\n> \n> DPDK supports pipeline model of packet processing and service cores.\n> In these use cases, a given data structure may not be used by all the\n> workers in the application. The writer does not have to wait for all\n> the workers to report their quiescent state. To provide the required\n> flexibility, this library has a concept of QS variable. The application\n> can create one QS variable per data structure to help it track the\n> end of grace period for each data structure. This helps keep the grace\n> period to a minimum.\n> \n> The application has to allocate memory and initialize a QS variable.\n> \n> Application can call rte_rcu_qsbr_get_memsize to calculate the size\n> of memory to allocate. This API takes maximum number of reader threads,\n> using this variable, as a parameter. Currently, a maximum of 1024 threads\n> are supported.\n> \n> Further, the application can initialize a QS variable using the API\n> rte_rcu_qsbr_init.\n> \n> Each reader thread is assumed to have a unique thread ID. Currently, the\n> management of the thread ID (for ex: allocation/free) is left to the\n> application. The thread ID should be in the range of 0 to\n> maximum number of threads provided while creating the QS variable.\n> The application could also use lcore_id as the thread ID where applicable.\n> \n> rte_rcu_qsbr_thread_register API will register a reader thread\n> to report its quiescent state. This can be called from a reader thread.\n> A control plane thread can also call this on behalf of a reader thread.\n> The reader thread must call rte_rcu_qsbr_thread_online API to start reporting\n> its quiescent state.\n> \n> Some of the use cases might require the reader threads to make\n> blocking API calls (for ex: while using eventdev APIs). The writer thread\n> should not wait for such reader threads to enter quiescent state.\n> The reader thread must call rte_rcu_qsbr_thread_offline API, before calling\n> blocking APIs. It can call rte_rcu_qsbr_thread_online API once the blocking\n> API call returns.\n> \n> The writer thread can trigger the reader threads to report their quiescent\n> state by calling the API rte_rcu_qsbr_start. It is possible for multiple\n> writer threads to query the quiescent state status simultaneously. Hence,\n> rte_rcu_qsbr_start returns a token to each caller.\n> \n> The writer thread has to call rte_rcu_qsbr_check API with the token to get the\n> current quiescent state status. Option to block till all the reader threads\n> enter the quiescent state is provided. If this API indicates that all the\n> reader threads have entered the quiescent state, the application can free the\n> deleted entry.\n> \n> The APIs rte_rcu_qsbr_start and rte_rcu_qsbr_check are lock free. Hence, they\n> can be called concurrently from multiple writers even while running\n> as worker threads.\n> \n> The separation of triggering the reporting from querying the status provides\n> the writer threads flexibility to do useful work instead of blocking for the\n> reader threads to enter the quiescent state or go offline. This reduces the\n> memory accesses due to continuous polling for the status.\n> \n> rte_rcu_qsbr_synchronize API combines the functionality of rte_rcu_qsbr_start\n> and blocking rte_rcu_qsbr_check into a single API. This API triggers the reader\n> threads to report their quiescent state and polls till all the readers enter\n> the quiescent state or go offline. This API does not allow the writer to\n> do useful work while waiting and also introduces additional memory accesses\n> due to continuous polling.\n> \n> The reader thread must call rte_rcu_qsbr_thread_offline and\n> rte_rcu_qsbr_thread_unregister APIs to remove itself from reporting its\n> quiescent state. The rte_rcu_qsbr_check API will not wait for this reader\n> thread to report the quiescent state status anymore.\n> \n> The reader threads should call rte_rcu_qsbr_update API to indicate that they\n> entered a quiescent state. This API checks if a writer has triggered a\n> quiescent state query and update the state accordingly.\n> \n> Patch v5:\n> 1) Library changes\n>    a) Removed extra alignment in rte_rcu_qsbr_get_memsize API (Paul)\n>    b) Added rte_rcu_qsbr_lock/rte_rcu_qsbr_unlock APIs (Paul)\n>    c) Clarified the need for 64b counters (Paul)\n> 2) Test cases\n>    a) Added additional performance test cases to benchmark\n>       __rcu_qsbr_check_all\n>    b) Added rte_rcu_qsbr_lock/rte_rcu_qsbr_unlock calls in various test cases\n> 3) Documentation\n>    a) Added rte_rcu_qsbr_lock/rte_rcu_qsbr_unlock usage description\n> \n> Patch v4:\n> 1) Library changes\n>    a) Fixed the compilation issue on x86 (Konstantin)\n>    b) Rebased with latest master\n> \n> Patch v3:\n> 1) Library changes\n>    a) Moved the registered thread ID array to the end of the\n>       structure (Konstantin)\n>    b) Removed the compile time constant RTE_RCU_MAX_THREADS\n>    c) Added code to keep track of registered number of threads\n> \n> Patch v2:\n> 1) Library changes\n>    a) Corrected the RTE_ASSERT checks (Konstantin)\n>    b) Replaced RTE_ASSERT with 'if' checks for non-datapath APIs (Konstantin)\n>    c) Made rte_rcu_qsbr_thread_register/unregister non-datapath critical APIs\n>    d) Renamed rte_rcu_qsbr_update to rte_rcu_qsbr_quiescent (Ola)\n>    e) Used rte_smp_mb() in rte_rcu_qsbr_thread_online API for x86 (Konstantin)\n>    f) Removed the macro to access the thread QS counters (Konstantin)\n> 2) Test cases\n>    a) Added additional test cases for removing RTE_ASSERT\n> 3) Documentation\n>    a) Changed the figure to make it bigger (Marko)\n>    b) Spelling and format corrections (Marko)\n> \n> Patch v1:\n> 1) Library changes\n>    a) Changed the maximum number of reader threads to 1024\n>    b) Renamed rte_rcu_qsbr_register/unregister_thread to\n>       rte_rcu_qsbr_thread_register/unregister\n>    c) Added rte_rcu_qsbr_thread_online/offline API. These are optimized\n>       version of rte_rcu_qsbr_thread_register/unregister API. These\n>       also provide the flexibility for performance when the requested\n>       maximum number of threads is higher than the current number of\n>       threads.\n>    d) Corrected memory orderings in rte_rcu_qsbr_update\n>    e) Changed the signature of rte_rcu_qsbr_start API to return the token\n>    f) Changed the signature of rte_rcu_qsbr_start API to not take the\n>       expected number of QS states to wait.\n>    g) Added debug logs\n>    h) Added API and programmer guide documentation.\n> \n> RFC v3:\n> 1) Library changes\n>    a) Rebased to latest master\n>    b) Added new API rte_rcu_qsbr_get_memsize\n>    c) Add support for memory allocation for QSBR variable (Konstantin)\n>    d) Fixed a bug in rte_rcu_qsbr_check (Konstantin)\n> 2) Testcase changes\n>    a) Separated stress tests into a performance test case file\n>    b) Added performance statistics\n> \n> RFC v2:\n> 1) Cover letter changes\n>    a) Explian the parameters that affect the overhead of using RCU\n>       and their effect\n>    b) Explain how this library addresses these effects to keep\n>       the overhead to minimum\n> 2) Library changes\n>    a) Rename the library to avoid confusion (Matias, Bruce, Konstantin)\n>    b) Simplify the code/remove APIs to keep this library inline with\n>       other synchronisation mechanisms like locks (Konstantin)\n>    c) Change the design to support more than 64 threads (Konstantin)\n>    d) Fixed version map to remove static inline functions\n> 3) Testcase changes\n>    a) Add boundary and additional functional test cases\n>    b) Add stress test cases (Paul E. McKenney)\n> \n> Dharmik Thakkar (1):\n>   test/rcu_qsbr: add API and functional tests\n> \n> Honnappa Nagarahalli (2):\n>   rcu: add RCU library supporting QSBR mechanism\n>   doc/rcu: add lib_rcu documentation\n> \n>  MAINTAINERS                                   |    5 +\n>  app/test/Makefile                             |    2 +\n>  app/test/autotest_data.py                     |   12 +\n>  app/test/meson.build                          |    5 +\n>  app/test/test_rcu_qsbr.c                      | 1014 +++++++++++++++++\n>  app/test/test_rcu_qsbr_perf.c                 |  703 ++++++++++++\n>  config/common_base                            |    6 +\n>  doc/api/doxy-api-index.md                     |    3 +-\n>  doc/api/doxy-api.conf.in                      |    1 +\n>  .../prog_guide/img/rcu_general_info.svg       |  509 +++++++++\n>  doc/guides/prog_guide/index.rst               |    1 +\n>  doc/guides/prog_guide/rcu_lib.rst             |  185 +++\n>  lib/Makefile                                  |    2 +\n>  lib/librte_rcu/Makefile                       |   23 +\n>  lib/librte_rcu/meson.build                    |    5 +\n>  lib/librte_rcu/rte_rcu_qsbr.c                 |  237 ++++\n>  lib/librte_rcu/rte_rcu_qsbr.h                 |  645 +++++++++++\n>  lib/librte_rcu/rte_rcu_version.map            |   11 +\n>  lib/meson.build                               |    2 +-\n>  mk/rte.app.mk                                 |    1 +\n>  20 files changed, 3370 insertions(+), 2 deletions(-)\n>  create mode 100644 app/test/test_rcu_qsbr.c\n>  create mode 100644 app/test/test_rcu_qsbr_perf.c\n>  create mode 100644 doc/guides/prog_guide/img/rcu_general_info.svg\n>  create mode 100644 doc/guides/prog_guide/rcu_lib.rst\n>  create mode 100644 lib/librte_rcu/Makefile\n>  create mode 100644 lib/librte_rcu/meson.build\n>  create mode 100644 lib/librte_rcu/rte_rcu_qsbr.c\n>  create mode 100644 lib/librte_rcu/rte_rcu_qsbr.h\n>  create mode 100644 lib/librte_rcu/rte_rcu_version.map\n> \n> --\n> 2.17.1\n\n\nJust to let you know - observed some failures with it for meson.\nFixed it locally by:\n\ndiff --git a/app/test/meson.build b/app/test/meson.build\nindex 1a2ee18a5..e3e566bce 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -138,7 +138,7 @@ test_deps = ['acl',\n        'reorder',\n        'ring',\n        'stack',\n-       'timer'\n+       'timer',\n        'rcu'\n ]\n\ndiff --git a/lib/librte_rcu/meson.build b/lib/librte_rcu/meson.build\nindex c009ae4b7..0c2d5a2e0 100644\n--- a/lib/librte_rcu/meson.build\n+++ b/lib/librte_rcu/meson.build\n@@ -1,5 +1,7 @@\n # SPDX-License-Identifier: BSD-3-Clause\n # Copyright(c) 2018 Arm Limited\n\n+allow_experimental_apis = true\n+\n sources = files('rte_rcu_qsbr.c')\n headers = files('rte_rcu_qsbr.h')",
        "headers": {
            "dlp-version": "11.0.600.7",
            "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
            "From": "\"Ananyev, Konstantin\" <konstantin.ananyev@intel.com>",
            "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
            "Date": "Mon, 15 Apr 2019 17:29:57 +0000",
            "X-Mailman-Version": "2.1.15",
            "x-ctpclassification": "CTP_NT",
            "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
            "Delivered-To": "patchwork@dpdk.org",
            "Content-Type": "text/plain; charset=\"us-ascii\"",
            "X-MS-Has-Attach": "",
            "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
            "CC": "\"gavin.hu@arm.com\" <gavin.hu@arm.com>, \"dharmik.thakkar@arm.com\"\n\t<dharmik.thakkar@arm.com>,\n\t\"malvika.gupta@arm.com\" <malvika.gupta@arm.com>",
            "X-Amp-Result": "SKIPPED(no attachment in message)",
            "To": "Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>,\n\t\"stephen@networkplumber.org\" <stephen@networkplumber.org>,\n\t\"paulmck@linux.ibm.com\" <paulmck@linux.ibm.com>, \"Kovacevic, Marko\"\n\t<marko.kovacevic@intel.com>, \"dev@dpdk.org\" <dev@dpdk.org>",
            "dlp-reaction": "no-action",
            "Errors-To": "dev-bounces@dpdk.org",
            "References": "<20181122033055.3431-1-honnappa.nagarahalli@arm.com>\n\t<20190412202039.46902-1-honnappa.nagarahalli@arm.com>",
            "Precedence": "list",
            "Sender": "\"dev\" <dev-bounces@dpdk.org>",
            "Return-Path": "<dev-bounces@dpdk.org>",
            "X-IronPort-AV": "E=Sophos;i=\"5.60,354,1549958400\"; d=\"scan'208\";a=\"142937319\"",
            "List-Post": "<mailto:dev@dpdk.org>",
            "Received": [
                "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D5BB21B3A3;\n\tMon, 15 Apr 2019 19:30:10 +0200 (CEST)",
                "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n\tby dpdk.org (Postfix) with ESMTP id 863921B39F\n\tfor <dev@dpdk.org>; Mon, 15 Apr 2019 19:30:08 +0200 (CEST)",
                "from orsmga003.jf.intel.com ([10.7.209.27])\n\tby orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t15 Apr 2019 10:30:02 -0700",
                "from irsmsx110.ger.corp.intel.com ([163.33.3.25])\n\tby orsmga003.jf.intel.com with ESMTP; 15 Apr 2019 10:29:59 -0700",
                "from irsmsx105.ger.corp.intel.com ([169.254.7.31]) by\n\tirsmsx110.ger.corp.intel.com ([169.254.15.173]) with mapi id\n\t14.03.0415.000; Mon, 15 Apr 2019 18:29:58 +0100"
            ],
            "Thread-Index": "AQHU8W0/CTaHCxzhokGIB1RLKZWD5qY9fohQ",
            "dlp-product": "dlpe-windows",
            "Accept-Language": "en-IE, en-US",
            "X-Amp-File-Uploaded": "False",
            "Subject": "Re: [dpdk-dev] [PATCH v5 0/3] lib/rcu: add RCU library supporting\n\tQSBR mechanism",
            "In-Reply-To": "<20190412202039.46902-1-honnappa.nagarahalli@arm.com>",
            "MIME-Version": "1.0",
            "Message-ID": "<2601191342CEEE43887BDE71AB9772580148A98052@irsmsx105.ger.corp.intel.com>",
            "X-ExtLoop1": "1",
            "Content-Language": "en-US",
            "x-originating-ip": "[163.33.239.182]",
            "X-MS-TNEF-Correlator": "",
            "Content-Transfer-Encoding": "quoted-printable",
            "X-BeenThere": "dev@dpdk.org",
            "x-titus-metadata-40": "eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMTJmNTExNDctNjFkNi00ZjY3LTgzYTAtNzYwOTA2MGIxZTZiIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiOVpjNjFmYjQwXC9pUlpwb1wvTnFcLzAxXC9aWWZWdE1VbXZ4VlNQcTZGU1NXV280MG9tb0ZacjBEQkRqUWo1WHRUVGcifQ==",
            "X-Original-To": "patchwork@dpdk.org",
            "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
            "Thread-Topic": "[PATCH v5 0/3] lib/rcu: add RCU library supporting QSBR\n\tmechanism"
        }
    },
    {
        "id": 95050,
        "web_url": "http://patches.dpdk.org/comment/95050/",
        "msgid": "<VE1PR08MB514927DFC9740547A842F40298240@VE1PR08MB5149.eurprd08.prod.outlook.com>",
        "date": "2019-04-16T05:10:19",
        "subject": "Re: [dpdk-dev] [PATCH v5 0/3] lib/rcu: add RCU library supporting\n\tQSBR mechanism",
        "submitter": {
            "id": 1045,
            "url": "http://patches.dpdk.org/api/people/1045/",
            "name": "Honnappa Nagarahalli",
            "email": "honnappa.nagarahalli@arm.com"
        },
        "content": "<snip>\n\n> \n> \n> Just to let you know - observed some failures with it for meson.\n> Fixed it locally by:\n> \n> diff --git a/app/test/meson.build b/app/test/meson.build index\n> 1a2ee18a5..e3e566bce 100644\n> --- a/app/test/meson.build\n> +++ b/app/test/meson.build\n> @@ -138,7 +138,7 @@ test_deps = ['acl',\n>         'reorder',\n>         'ring',\n>         'stack',\n> -       'timer'\n> +       'timer',\n>         'rcu'\n>  ]\n> \n> diff --git a/lib/librte_rcu/meson.build b/lib/librte_rcu/meson.build index\n> c009ae4b7..0c2d5a2e0 100644\n> --- a/lib/librte_rcu/meson.build\n> +++ b/lib/librte_rcu/meson.build\n> @@ -1,5 +1,7 @@\n>  # SPDX-License-Identifier: BSD-3-Clause  # Copyright(c) 2018 Arm Limited\n> \n> +allow_experimental_apis = true\n> +\n>  sources = files('rte_rcu_qsbr.c')\n>  headers = files('rte_rcu_qsbr.h')\n\nThank you. I was able to produce the error and these changes fix them, will include in next version.",
        "headers": {
            "x-ms-office365-filtering-ht": "Tenant",
            "x-microsoft-antispam-message-info": "w9cb7AOL9nX1ITZOruxn6kIE+Lj+5ltcqYaPWgcBNXtH6RaysBHac/5XXUKS0QrKZJQy38YQhzYe9B/pfahXfamsmO/NP4NCVD3i8tED/DJz+qmof2RrA++Sf30kTCf9zjPA987Q55D2gSn+UFR4GNUL6VhSWAxjABAgbTarR4VKJa6fzS9r0JFzWM58wlOwOLajgQEaN62O/48JbCx+F5cEd8cP7kqWKmTo4pPGZirHUGGrlRWOfmCo4x35Lh73gfdFEI2QAc/J/+ww7sCfWC6t97U5GJA+IGMaAuvxhxMqOI+PCrS/ye6n3ESlZ4EPzRNn9oG8uMwRliHd8s5dLN8OJjoNI7Hkt5rhgVwcsThkt9zElYVVkNNitUXCbz+rxtjcljHgcWjEJvhcddC06RsXcaKa+j6JqvU7M9aIs88=",
            "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com;\n\ts=selector1-arm-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=DgjnyH9x6HJrZ9BQzKtL87RauXbXZAfig+yoEhyZlDQ=;\n\tb=it0ZgU1Iw5tBbWij3xTryRNS19vK4ot4RIaDMnaBFEy4M64P8Oa2vAxj2Zr60CpEMfg1foNC7ce8bPsR1/cjm9/mvz8mSzDRsqGQ0i1KXRorweDoV+Fxspkbk56iRzqliHlr7Ntkq3GAqV0yVVdtjDxea4rlWRFdlRly0nufWIc=",
            "X-Mailman-Version": "2.1.15",
            "Message-ID": "<VE1PR08MB514927DFC9740547A842F40298240@VE1PR08MB5149.eurprd08.prod.outlook.com>",
            "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
            "x-ms-traffictypediagnostic": "VE1PR08MB4928:",
            "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
            "X-MS-Has-Attach": "",
            "x-forefront-prvs": "000947967F",
            "CC": "\"Gavin Hu (Arm Technology China)\" <Gavin.Hu@arm.com>, Dharmik Thakkar\n\t<Dharmik.Thakkar@arm.com>, Malvika Gupta <Malvika.Gupta@arm.com>, nd\n\t<nd@arm.com>",
            "X-MS-TNEF-Correlator": "",
            "References": "<20181122033055.3431-1-honnappa.nagarahalli@arm.com>\n\t<20190412202039.46902-1-honnappa.nagarahalli@arm.com>\n\t<2601191342CEEE43887BDE71AB9772580148A98052@irsmsx105.ger.corp.intel.com>",
            "Return-Path": "<dev-bounces@dpdk.org>",
            "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
            "List-Post": "<mailto:dev@dpdk.org>",
            "Date": "Tue, 16 Apr 2019 05:10:19 +0000",
            "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Honnappa.Nagarahalli@arm.com; ",
            "X-MS-Exchange-CrossTenant-originalarrivaltime": "16 Apr 2019 05:10:19.8526\n\t(UTC)",
            "nodisclaimer": "True",
            "Subject": "Re: [dpdk-dev] [PATCH v5 0/3] lib/rcu: add RCU library supporting\n\tQSBR mechanism",
            "In-Reply-To": "<2601191342CEEE43887BDE71AB9772580148A98052@irsmsx105.ger.corp.intel.com>",
            "MIME-Version": "1.0",
            "X-BeenThere": "dev@dpdk.org",
            "X-MS-Exchange-CrossTenant-id": "f34e5979-57d9-4aaa-ad4d-b122a662184d",
            "X-MS-Exchange-CrossTenant-Network-Message-Id": "b9202234-c1b0-4188-52ac-08d6c229d279",
            "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
            "From": "Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>",
            "x-ms-exchange-senderadcheck": "1",
            "x-microsoft-antispam-prvs": "<VE1PR08MB49280AD8B8819B0C288ABEAC98240@VE1PR08MB4928.eurprd08.prod.outlook.com>",
            "x-ms-publictraffictype": "Email",
            "Delivered-To": "patchwork@dpdk.org",
            "x-originating-ip": "[217.140.111.135]",
            "Accept-Language": "en-US",
            "X-MS-Exchange-CrossTenant-mailboxtype": "HOSTED",
            "To": "\"Ananyev, Konstantin\" <konstantin.ananyev@intel.com>,\n\t\"stephen@networkplumber.org\" <stephen@networkplumber.org>,\n\t\"paulmck@linux.ibm.com\" <paulmck@linux.ibm.com>, \"Kovacevic, Marko\"\n\t<marko.kovacevic@intel.com>, \"dev@dpdk.org\" <dev@dpdk.org>",
            "Errors-To": "dev-bounces@dpdk.org",
            "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
            "Sender": "\"dev\" <dev-bounces@dpdk.org>",
            "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(366004)(396003)(136003)(39860400002)(376002)(346002)(199004)(189003)(256004)(4744005)(26005)(71200400001)(14454004)(316002)(33656002)(74316002)(305945005)(71190400001)(2201001)(110136005)(4326008)(99286004)(2906002)(7696005)(2501003)(6436002)(229853002)(25786009)(11346002)(53936002)(76176011)(446003)(105586002)(6246003)(9686003)(3846002)(6506007)(52536014)(81166006)(8936002)(478600001)(66066001)(486006)(102836004)(97736004)(68736007)(476003)(54906003)(7736002)(186003)(86362001)(106356001)(6116002)(55016002)(81156014)(5660300002)(8676002)(72206003);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VE1PR08MB4928;\n\tH:VE1PR08MB5149.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; A:1; MX:1; ",
            "x-ms-office365-filtering-correlation-id": "b9202234-c1b0-4188-52ac-08d6c229d279",
            "Received": [
                "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 6BCEA1B45D;\n\tTue, 16 Apr 2019 07:10:23 +0200 (CEST)",
                "from EUR03-VE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr50083.outbound.protection.outlook.com [40.107.5.83])\n\tby dpdk.org (Postfix) with ESMTP id 395091B45A\n\tfor <dev@dpdk.org>; Tue, 16 Apr 2019 07:10:22 +0200 (CEST)",
                "from VE1PR08MB5149.eurprd08.prod.outlook.com (20.179.30.152) by\n\tVE1PR08MB4928.eurprd08.prod.outlook.com (10.255.114.74) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1792.19; Tue, 16 Apr 2019 05:10:20 +0000",
                "from VE1PR08MB5149.eurprd08.prod.outlook.com\n\t([fe80::e0ae:ecad:ec5:8177]) by\n\tVE1PR08MB5149.eurprd08.prod.outlook.com\n\t([fe80::e0ae:ecad:ec5:8177%2]) with mapi id 15.20.1792.018;\n\tTue, 16 Apr 2019 05:10:20 +0000"
            ],
            "Thread-Index": "AQHU8W0/CTaHCxzhokGIB1RLKZWD5qY9fohQgADDr/A=",
            "received-spf": "None (protection.outlook.com: arm.com does not designate\n\tpermitted sender hosts)",
            "Content-Type": "text/plain; charset=\"us-ascii\"",
            "X-Original-To": "patchwork@dpdk.org",
            "X-OriginatorOrg": "arm.com",
            "Thread-Topic": "[PATCH v5 0/3] lib/rcu: add RCU library supporting QSBR\n\tmechanism",
            "Precedence": "list",
            "Content-Language": "en-US",
            "x-microsoft-antispam": "BCL:0; PCL:0;\n\tRULEID:(2390118)(7020095)(4652040)(8989299)(5600140)(711020)(4605104)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7193020);\n\tSRVR:VE1PR08MB4928; ",
            "Content-Transfer-Encoding": "quoted-printable",
            "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
            "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VE1PR08MB4928"
        }
    }
]