get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 94492,
    "url": "http://patches.dpdk.org/api/patches/94492/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210618134032.1922012-12-andrew.rybchenko@oktetlabs.ru/",
    "project": {
        "id": 1,
        "url": "http://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": "<20210618134032.1922012-12-andrew.rybchenko@oktetlabs.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210618134032.1922012-12-andrew.rybchenko@oktetlabs.ru",
    "date": "2021-06-18T13:40:23",
    "name": "[v3,11/20] net/sfc: add NUMA-aware registry of service logical cores",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "be0dec83354769e8c2ee146bde949629aa5d48c6",
    "submitter": {
        "id": 2013,
        "url": "http://patches.dpdk.org/api/people/2013/?format=api",
        "name": "Andrew Rybchenko",
        "email": "Andrew.Rybchenko@oktetlabs.ru"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210618134032.1922012-12-andrew.rybchenko@oktetlabs.ru/mbox/",
    "series": [
        {
            "id": 17397,
            "url": "http://patches.dpdk.org/api/series/17397/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=17397",
            "date": "2021-06-18T13:40:12",
            "name": "net/sfc: support flow API COUNT action",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/17397/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/94492/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/94492/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 8FBF5A0C46;\n\tFri, 18 Jun 2021 15:42:09 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5E35741157;\n\tFri, 18 Jun 2021 15:41:09 +0200 (CEST)",
            "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id 6670B41153\n for <dev@dpdk.org>; Fri, 18 Jun 2021 15:41:07 +0200 (CEST)",
            "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id 4113A7F693; Fri, 18 Jun 2021 16:41:07 +0300 (MSK)",
            "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id 4627C7F699;\n Fri, 18 Jun 2021 16:40:35 +0300 (MSK)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 4627C7F699",
        "Authentication-Results": "shelob.oktetlabs.ru/4627C7F699; dkim=none;\n dkim-atps=neutral",
        "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "To": "dev@dpdk.org",
        "Cc": "David Marchand <david.marchand@redhat.com>,\n Andy Moreton <amoreton@xilinx.com>, Ivan Malov <ivan.malov@oktetlabs.ru>",
        "Date": "Fri, 18 Jun 2021 16:40:23 +0300",
        "Message-Id": "<20210618134032.1922012-12-andrew.rybchenko@oktetlabs.ru>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20210618134032.1922012-1-andrew.rybchenko@oktetlabs.ru>",
        "References": "<20210527152510.1551026-1-andrew.rybchenko@oktetlabs.ru>\n <20210618134032.1922012-1-andrew.rybchenko@oktetlabs.ru>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3 11/20] net/sfc: add NUMA-aware registry of\n service logical cores",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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": "The driver requires service cores for housekeeping. Share these\ncores for many adapters and various purposes to avoid extra CPU\noverhead.\n\nSince housekeeping services will talk to NIC, it should be possible\nto choose logical core on matching NUMA node.\n\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\nReviewed-by: Andy Moreton <amoreton@xilinx.com>\nReviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>\n---\n drivers/net/sfc/meson.build   |  1 +\n drivers/net/sfc/sfc_service.c | 99 +++++++++++++++++++++++++++++++++++\n drivers/net/sfc/sfc_service.h | 20 +++++++\n 3 files changed, 120 insertions(+)\n create mode 100644 drivers/net/sfc/sfc_service.c\n create mode 100644 drivers/net/sfc/sfc_service.h",
    "diff": "diff --git a/drivers/net/sfc/meson.build b/drivers/net/sfc/meson.build\nindex ccf5984d87..4ac97e8d43 100644\n--- a/drivers/net/sfc/meson.build\n+++ b/drivers/net/sfc/meson.build\n@@ -62,4 +62,5 @@ sources = files(\n         'sfc_ef10_tx.c',\n         'sfc_ef100_rx.c',\n         'sfc_ef100_tx.c',\n+        'sfc_service.c',\n )\ndiff --git a/drivers/net/sfc/sfc_service.c b/drivers/net/sfc/sfc_service.c\nnew file mode 100644\nindex 0000000000..9c89484406\n--- /dev/null\n+++ b/drivers/net/sfc/sfc_service.c\n@@ -0,0 +1,99 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ *\n+ * Copyright(c) 2020-2021 Xilinx, Inc.\n+ */\n+\n+#include <stdint.h>\n+\n+#include <rte_common.h>\n+#include <rte_spinlock.h>\n+#include <rte_lcore.h>\n+#include <rte_service.h>\n+#include <rte_memory.h>\n+\n+#include \"sfc_log.h\"\n+#include \"sfc_service.h\"\n+#include \"sfc_debug.h\"\n+\n+static uint32_t sfc_service_lcore[RTE_MAX_NUMA_NODES];\n+static rte_spinlock_t sfc_service_lcore_lock = RTE_SPINLOCK_INITIALIZER;\n+\n+RTE_INIT(sfc_service_lcore_init)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RTE_DIM(sfc_service_lcore); ++i)\n+\t\tsfc_service_lcore[i] = RTE_MAX_LCORE;\n+}\n+\n+static uint32_t\n+sfc_find_service_lcore(int *socket_id)\n+{\n+\tuint32_t service_core_list[RTE_MAX_LCORE];\n+\tuint32_t lcore_id;\n+\tint num;\n+\tint i;\n+\n+\tSFC_ASSERT(rte_spinlock_is_locked(&sfc_service_lcore_lock));\n+\n+\tnum = rte_service_lcore_list(service_core_list,\n+\t\t\t\t    RTE_DIM(service_core_list));\n+\tif (num == 0) {\n+\t\tSFC_GENERIC_LOG(WARNING, \"No service cores available\");\n+\t\treturn RTE_MAX_LCORE;\n+\t}\n+\tif (num < 0) {\n+\t\tSFC_GENERIC_LOG(ERR, \"Failed to get service core list\");\n+\t\treturn RTE_MAX_LCORE;\n+\t}\n+\n+\tfor (i = 0; i < num; ++i) {\n+\t\tlcore_id = service_core_list[i];\n+\n+\t\tif (*socket_id == SOCKET_ID_ANY) {\n+\t\t\t*socket_id = rte_lcore_to_socket_id(lcore_id);\n+\t\t\tbreak;\n+\t\t} else if (rte_lcore_to_socket_id(lcore_id) ==\n+\t\t\t   (unsigned int)*socket_id) {\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (i == num) {\n+\t\tSFC_GENERIC_LOG(WARNING,\n+\t\t\t\"No service cores reserved at socket %d\", *socket_id);\n+\t\treturn RTE_MAX_LCORE;\n+\t}\n+\n+\treturn lcore_id;\n+}\n+\n+uint32_t\n+sfc_get_service_lcore(int socket_id)\n+{\n+\tuint32_t lcore_id = RTE_MAX_LCORE;\n+\n+\trte_spinlock_lock(&sfc_service_lcore_lock);\n+\n+\tif (socket_id != SOCKET_ID_ANY) {\n+\t\tlcore_id = sfc_service_lcore[socket_id];\n+\t} else {\n+\t\tsize_t i;\n+\n+\t\tfor (i = 0; i < RTE_DIM(sfc_service_lcore); ++i) {\n+\t\t\tif (sfc_service_lcore[i] != RTE_MAX_LCORE) {\n+\t\t\t\tlcore_id = sfc_service_lcore[i];\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tif (lcore_id == RTE_MAX_LCORE) {\n+\t\tlcore_id = sfc_find_service_lcore(&socket_id);\n+\t\tif (lcore_id != RTE_MAX_LCORE)\n+\t\t\tsfc_service_lcore[socket_id] = lcore_id;\n+\t}\n+\n+\trte_spinlock_unlock(&sfc_service_lcore_lock);\n+\treturn lcore_id;\n+}\ndiff --git a/drivers/net/sfc/sfc_service.h b/drivers/net/sfc/sfc_service.h\nnew file mode 100644\nindex 0000000000..bbcce28479\n--- /dev/null\n+++ b/drivers/net/sfc/sfc_service.h\n@@ -0,0 +1,20 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ *\n+ * Copyright(c) 2020-2021 Xilinx, Inc.\n+ */\n+\n+#ifndef _SFC_SERVICE_H\n+#define _SFC_SERVICE_H\n+\n+#include <stdint.h>\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+uint32_t sfc_get_service_lcore(int socket_id);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+#endif  /* _SFC_SERVICE_H */\n",
    "prefixes": [
        "v3",
        "11/20"
    ]
}