get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 67801,
    "url": "http://patchwork.dpdk.org/api/patches/67801/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20200403174235.23308-1-konstantin.ananyev@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20200403174235.23308-1-konstantin.ananyev@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200403174235.23308-1-konstantin.ananyev@intel.com",
    "date": "2020-04-03T17:42:26",
    "name": "[v3,0/9] New sync modes for ring",
    "commit_ref": null,
    "pull_url": null,
    "state": null,
    "archived": false,
    "hash": null,
    "submitter": {
        "id": 33,
        "url": "http://patchwork.dpdk.org/api/people/33/?format=api",
        "name": "Ananyev, Konstantin",
        "email": "konstantin.ananyev@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20200403174235.23308-1-konstantin.ananyev@intel.com/mbox/",
    "series": [],
    "comments": "http://patchwork.dpdk.org/api/patches/67801/comments/",
    "check": "pending",
    "checks": "http://patchwork.dpdk.org/api/patches/67801/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 924FDA0562;\n\tFri,  3 Apr 2020 19:42:50 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 24CA71C1B8;\n\tFri,  3 Apr 2020 19:42:50 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n by dpdk.org (Postfix) with ESMTP id CCE781C1AF\n for <dev@dpdk.org>; Fri,  3 Apr 2020 19:42:47 +0200 (CEST)",
            "from fmsmga003.fm.intel.com ([10.253.24.29])\n by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 03 Apr 2020 10:42:46 -0700",
            "from sivswdev08.ir.intel.com ([10.237.217.47])\n by FMSMGA003.fm.intel.com with ESMTP; 03 Apr 2020 10:42:44 -0700"
        ],
        "IronPort-SDR": [
            "\n ObB200CpUH/HQU5jsphVV9zI9WZfQvoM/PnBysDNlS666FQ+FYBRWT6/6+Y2Yz6lH+uao57Jbv\n cdJObfc4Bb5w==",
            "\n n4pkIM08FZVzUZ4L1Ix3/Q5oc0FHfmhiRhCJRCgXxI3pwitDLH7J0RSwuxlYJ2etD82kvI3Z5Z\n ZXdQntR9hcCA=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.72,340,1580803200\"; d=\"scan'208\";a=\"296048548\"",
        "From": "Konstantin Ananyev <konstantin.ananyev@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "honnappa.nagarahalli@arm.com, david.marchand@redhat.com,\n jielong.zjl@antfin.com, Konstantin Ananyev <konstantin.ananyev@intel.com>",
        "Date": "Fri,  3 Apr 2020 18:42:26 +0100",
        "Message-Id": "<20200403174235.23308-1-konstantin.ananyev@intel.com>",
        "X-Mailer": "git-send-email 2.18.0",
        "In-Reply-To": "<20200402220959.29885-1-konstantin.ananyev@intel.com>",
        "References": "<20200402220959.29885-1-konstantin.ananyev@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v3 0/9] New sync modes for ring",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "V2 - V3\n1. Few more compilation fixes (for gcc 4.8.X)\n2. Extra update devtools/libabigail.abignore (workaround) \n\nV1 - v2 changes:\n1. Fix compilation issues\n2. Add C11 atomics support\n3. Updates devtools/libabigail.abignore (workaround)\n\nRFC - V1 changes:\n1. remove ABI brekage (at least I hope I did)\n2. Add support for ring_elem\n3. Rework peek related API a bit\n4. Rework test to make it less verbose and unite all test-cases\n   in one command\n5. Add new test-case for MT peek API\n\nTODO list:\n1. Update docs\n\nThese days more and more customers use(/try to use) DPDK based apps within\novercommitted systems (multiple acttive threads over same pysical cores):\nVM, container deployments, etc.\nOne quite common problem they hit:\nLock-Holder-Preemption/Lock-Waiter-Preemption with rte_ring.\nLHP is quite a common problem for spin-based sync primitives\n(spin-locks, etc.) on overcommitted systems.\nThe situation gets much worse when some sort of\nfair-locking technique is used (ticket-lock, etc.).\nAs now not only lock-owner but also lock-waiters scheduling\norder matters a lot (LWP).\nThese two problems are well-known for kernel within VMs:\nhttp://www-archive.xenproject.org/files/xensummitboston08/LHP.pdf\nhttps://www.cs.hs-rm.de/~kaiser/events/wamos2017/Slides/selcuk.pdf\nThe problem with rte_ring is that while head accusion is sort of\nun-fair locking, waiting on tail is very similar to ticket lock schema -\ntail has to be updated in particular order.\nThat makes current rte_ring implementation to perform\nreally pure on some overcommited scenarios.\nIt is probably not possible to completely resolve LHP problem in\nuserspace only (without some kernel communication/intervention).\nBut removing fairness at tail update helps to avoid LWP and\ncan mitigate the situation significantly.\nThis patch proposes two new optional ring synchronization modes:\n1) Head/Tail Sync (HTS) mode\nIn that mode enqueue/dequeue operation is fully serialized:\n    only one thread at a time is allowed to perform given op.\n    As another enhancement provide ability to split enqueue/dequeue\n    operation into two phases:\n      - enqueue/dequeue start\n      - enqueue/dequeue finish\n    That allows user to inspect objects in the ring without removing\n    them from it (aka MT safe peek).\n2) Relaxed Tail Sync (RTS)\nThe main difference from original MP/MC algorithm is that\ntail value is increased not by every thread that finished enqueue/dequeue,\nbut only by the last one.\nThat allows threads to avoid spinning on ring tail value,\nleaving actual tail value change to the last thread in the update queue.\n\nNote that these new sync modes are optional.\nFor current rte_ring users nothing should change\n(both in terms of API/ABI and performance).\nExisting sync modes MP/MC,SP/SC kept untouched, set up in the same\nway (via flags and _init_), and MP/MC remains as default one.\nThe only thing that changed:\nFormat of prod/cons now could differ depending on mode selected at _init_.\nSo user has to stick with one sync model through whole ring lifetime.\nIn other words, user can't create a ring for let say SP mode and then\nin the middle of data-path change his mind and start using MP_RTS mode.\nFor existing modes (SP/MP, SC/MC) format remains the same and\nuser can still use them interchangeably, though of course it is an\nerror prone practice.\n\nTest results on IA (see below) show significant improvements\nfor average enqueue/dequeue op times on overcommitted systems.\nFor 'classic' DPDK deployments (one thread per core) original MP/MC\nalgorithm still shows best numbers, though for 64-bit target\nRTS numbers are not that far away.\nNumbers were produced by new UT test-case: ring_stress_autotest, i.e.:\necho ring_stress_autotest | ./dpdk-test -n 4 --lcores='...'\n\nX86_64 @ Intel(R) Xeon(R) Platinum 8160 CPU @ 2.10GHz\nDEQ+ENQ average cycles/obj\n\n                                                MP/MC      HTS     RTS\n1thread@1core(--lcores=6-7)                     8.00       8.15    8.99\n2thread@2core(--lcores=6-8)                     19.14      19.61   20.35\n4thread@4core(--lcores=6-10)                    29.43      29.79   31.82\n8thread@8core(--lcores=6-14)                    110.59     192.81  119.50\n16thread@16core(--lcores=6-22)                  461.03     813.12  495.59\n32thread/@32core(--lcores='6-22,55-70')         982.90     1972.38 1160.51\n\n2thread@1core(--lcores='6,(10-11)@7'            20140.50   23.58   25.14\n4thread@2core(--lcores='6,(10-11)@7,(20-21)@8'  153680.60  76.88   80.05\n8thread@2core(--lcores='6,(10-13)@7,(20-23)@8'  280314.32  294.72  318.79\n16thread@2core(--lcores='6,(10-17)@7,(20-27)@8' 643176.59  1144.02 1175.14\n32thread@2core(--lcores='6,(10-25)@7,(30-45)@8' 4264238.80 4627.48 4892.68\n\n8thread@2core(--lcores='6,(10-17)@(7,8))'       321085.98  298.59  307.47\n16thread@4core(--lcores='6,(20-35)@(7-10))'     1900705.61 575.35  678.29\n32thread@4core(--lcores='6,(20-51)@(7-10))'     5510445.85 2164.36 2714.12\n\ni686 @ Intel(R) Xeon(R) Platinum 8160 CPU @ 2.10GHz\nDEQ+ENQ average cycles/obj\n\n                                                MP/MC      HTS     RTS\n1thread@1core(--lcores=6-7)                     7.85       12.13   11.31\n2thread@2core(--lcores=6-8)                     17.89      24.52   21.86\n8thread@8core(--lcores=6-14)                    32.58      354.20  54.58\n32thread/@32core(--lcores='6-22,55-70')         813.77     6072.41 2169.91\n\n2thread@1core(--lcores='6,(10-11)@7'            16095.00   36.06   34.74\n8thread@2core(--lcores='6,(10-13)@7,(20-23)@8'  1140354.54 346.61  361.57\n16thread@2core(--lcores='6,(10-17)@7,(20-27)@8' 1920417.86 1314.90 1416.65\n\n8thread@2core(--lcores='6,(10-17)@(7,8))'       594358.61  332.70  357.74\n32thread@4core(--lcores='6,(20-51)@(7-10))'     5319896.86 2836.44 3028.87\n\nKonstantin Ananyev (9):\n  test/ring: add contention stress test\n  ring: prepare ring to allow new sync schemes\n  ring: introduce RTS ring mode\n  test/ring: add contention stress test for RTS ring\n  ring: introduce HTS ring mode\n  test/ring: add contention stress test for HTS ring\n  ring: introduce peek style API\n  test/ring: add stress test for MT peek API\n  ring: add C11 memory model for new sync modes\n\n app/test/Makefile                      |   5 +\n app/test/meson.build                   |   5 +\n app/test/test_pdump.c                  |   6 +-\n app/test/test_ring_hts_stress.c        |  32 ++\n app/test/test_ring_mpmc_stress.c       |  31 ++\n app/test/test_ring_peek_stress.c       |  43 +++\n app/test/test_ring_rts_stress.c        |  32 ++\n app/test/test_ring_stress.c            |  57 ++++\n app/test/test_ring_stress.h            |  38 +++\n app/test/test_ring_stress_impl.h       | 444 +++++++++++++++++++++++++\n devtools/libabigail.abignore           |   7 +\n lib/librte_pdump/rte_pdump.c           |   2 +-\n lib/librte_port/rte_port_ring.c        |  12 +-\n lib/librte_ring/Makefile               |  11 +-\n lib/librte_ring/meson.build            |  11 +-\n lib/librte_ring/rte_ring.c             | 114 ++++++-\n lib/librte_ring/rte_ring.h             | 244 ++++++++++++--\n lib/librte_ring/rte_ring_c11_mem.h     |  44 +++\n lib/librte_ring/rte_ring_elem.h        | 105 +++++-\n lib/librte_ring/rte_ring_generic.h     |  48 +++\n lib/librte_ring/rte_ring_hts.h         | 214 ++++++++++++\n lib/librte_ring/rte_ring_hts_c11_mem.h | 222 +++++++++++++\n lib/librte_ring/rte_ring_hts_elem.h    | 209 ++++++++++++\n lib/librte_ring/rte_ring_hts_generic.h | 235 +++++++++++++\n lib/librte_ring/rte_ring_peek.h        | 379 +++++++++++++++++++++\n lib/librte_ring/rte_ring_rts.h         | 320 ++++++++++++++++++\n lib/librte_ring/rte_ring_rts_c11_mem.h | 198 +++++++++++\n lib/librte_ring/rte_ring_rts_elem.h    | 209 ++++++++++++\n lib/librte_ring/rte_ring_rts_generic.h | 210 ++++++++++++\n 29 files changed, 3431 insertions(+), 56 deletions(-)\n create mode 100644 app/test/test_ring_hts_stress.c\n create mode 100644 app/test/test_ring_mpmc_stress.c\n create mode 100644 app/test/test_ring_peek_stress.c\n create mode 100644 app/test/test_ring_rts_stress.c\n create mode 100644 app/test/test_ring_stress.c\n create mode 100644 app/test/test_ring_stress.h\n create mode 100644 app/test/test_ring_stress_impl.h\n create mode 100644 lib/librte_ring/rte_ring_hts.h\n create mode 100644 lib/librte_ring/rte_ring_hts_c11_mem.h\n create mode 100644 lib/librte_ring/rte_ring_hts_elem.h\n create mode 100644 lib/librte_ring/rte_ring_hts_generic.h\n create mode 100644 lib/librte_ring/rte_ring_peek.h\n create mode 100644 lib/librte_ring/rte_ring_rts.h\n create mode 100644 lib/librte_ring/rte_ring_rts_c11_mem.h\n create mode 100644 lib/librte_ring/rte_ring_rts_elem.h\n create mode 100644 lib/librte_ring/rte_ring_rts_generic.h",
    "diff": null,
    "prefixes": [
        "v3",
        "0/9"
    ]
}