get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 55369,
    "url": "http://patches.dpdk.org/api/patches/55369/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/e3b7f2a3f6602c1addcf1507243e3b389f5a3e3b.1561478388.git.anatoly.burakov@intel.com/",
    "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": "<e3b7f2a3f6602c1addcf1507243e3b389f5a3e3b.1561478388.git.anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/e3b7f2a3f6602c1addcf1507243e3b389f5a3e3b.1561478388.git.anatoly.burakov@intel.com",
    "date": "2019-06-25T16:05:26",
    "name": "[v2,14/14] eal: prevent different primary/secondary process versions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2debacf4ac1a728da4131499899e60b411a4d0c2",
    "submitter": {
        "id": 4,
        "url": "http://patches.dpdk.org/api/people/4/?format=api",
        "name": "Anatoly Burakov",
        "email": "anatoly.burakov@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/e3b7f2a3f6602c1addcf1507243e3b389f5a3e3b.1561478388.git.anatoly.burakov@intel.com/mbox/",
    "series": [
        {
            "id": 5162,
            "url": "http://patches.dpdk.org/api/series/5162/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=5162",
            "date": "2019-06-25T16:05:12",
            "name": "Make shared memory config non-public",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/5162/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/55369/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/55369/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 779EB1BB83;\n\tTue, 25 Jun 2019 18:06:17 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 15D411BAC7\n\tfor <dev@dpdk.org>; Tue, 25 Jun 2019 18:05:58 +0200 (CEST)",
            "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t25 Jun 2019 09:05:58 -0700",
            "from silpixa00399498.ir.intel.com (HELO\n\tsilpixa00399498.ger.corp.intel.com) ([10.237.223.125])\n\tby orsmga005.jf.intel.com with ESMTP; 25 Jun 2019 09:05:55 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.63,416,1557212400\"; d=\"scan'208\";a=\"336894870\"",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "Bruce Richardson <bruce.richardson@intel.com>, david.marchand@redhat.com,\n\tthomas@monjalon.net, stephen@networkplumber.org",
        "Date": "Tue, 25 Jun 2019 17:05:26 +0100",
        "Message-Id": "<e3b7f2a3f6602c1addcf1507243e3b389f5a3e3b.1561478388.git.anatoly.burakov@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": [
            "<cover.1561478388.git.anatoly.burakov@intel.com>",
            "<cover.1561478388.git.anatoly.burakov@intel.com>"
        ],
        "References": [
            "<cover.1561478388.git.anatoly.burakov@intel.com>",
            "<cover.1559147228.git.anatoly.burakov@intel.com>\n\t<cover.1561478388.git.anatoly.burakov@intel.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH v2 14/14] eal: prevent different\n\tprimary/secondary process versions",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Currently, nothing stops DPDK to attempt to run primary and\nsecondary processes while having different versions. This\ncan lead to all sorts of weird behavior and makes it harder\nto maintain compatibility without breaking ABI every once\nin a while.\n\nFix it by explicitly disallowing running different DPDK\nversions as primary and secondary processes.\n\nSigned-off-by: Anatoly Burakov <anatoly.burakov@intel.com>\n---\n lib/librte_eal/common/eal_common_mcfg.c | 15 +++++++++++++++\n lib/librte_eal/common/eal_memcfg.h      |  6 ++++++\n lib/librte_eal/freebsd/eal/eal.c        | 14 ++++++++++++--\n lib/librte_eal/linux/eal/eal.c          | 14 ++++++++++++--\n 4 files changed, 45 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_mcfg.c b/lib/librte_eal/common/eal_common_mcfg.c\nindex fe8d2b726..1825d9083 100644\n--- a/lib/librte_eal/common/eal_common_mcfg.c\n+++ b/lib/librte_eal/common/eal_common_mcfg.c\n@@ -4,6 +4,7 @@\n \n #include <rte_config.h>\n #include <rte_eal_memconfig.h>\n+#include <rte_version.h>\n \n #include \"eal_internal_cfg.h\"\n #include \"eal_memcfg.h\"\n@@ -31,6 +32,18 @@ eal_mcfg_wait_complete(void)\n \t\trte_pause();\n }\n \n+int\n+eal_mcfg_check_version(void)\n+{\n+\tstruct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;\n+\n+\t/* check if version from memconfig matches compiled in macro */\n+\tif (mcfg->version != RTE_VERSION)\n+\t\treturn -1;\n+\n+\treturn 0;\n+}\n+\n void\n eal_mcfg_update_internal(void)\n {\n@@ -47,6 +60,8 @@ eal_mcfg_update_from_internal(void)\n \n \tmcfg->legacy_mem = internal_config.legacy_mem;\n \tmcfg->single_file_segments = internal_config.single_file_segments;\n+\t/* record current DPDK version */\n+\tmcfg->version = RTE_VERSION;\n }\n \n void\ndiff --git a/lib/librte_eal/common/eal_memcfg.h b/lib/librte_eal/common/eal_memcfg.h\nindex 908542e18..e1aae32df 100644\n--- a/lib/librte_eal/common/eal_memcfg.h\n+++ b/lib/librte_eal/common/eal_memcfg.h\n@@ -21,6 +21,8 @@\n  */\n struct rte_mem_config {\n \tvolatile uint32_t magic;   /**< Magic number - Sanity check. */\n+\tuint32_t version;\n+\t/**< Prevent secondary processes using different DPDK versions. */\n \n \t/* memory topology */\n \tuint32_t nchannel;    /**< Number of channels (0 if unknown). */\n@@ -80,6 +82,10 @@ eal_mcfg_update_from_internal(void);\n void\n eal_mcfg_wait_complete(void);\n \n+/* check if DPDK version of current process matches one stored in the config */\n+int\n+eal_mcfg_check_version(void);\n+\n /* set mem config as complete */\n void\n eal_mcfg_complete(void);\ndiff --git a/lib/librte_eal/freebsd/eal/eal.c b/lib/librte_eal/freebsd/eal/eal.c\nindex 81eb44670..ab06d9c6f 100644\n--- a/lib/librte_eal/freebsd/eal/eal.c\n+++ b/lib/librte_eal/freebsd/eal/eal.c\n@@ -342,7 +342,7 @@ eal_proc_type_detect(void)\n }\n \n /* Sets up rte_config structure with the pointer to shared memory config.*/\n-static void\n+static int\n rte_config_init(void)\n {\n \trte_config.process_type = internal_config.process_type;\n@@ -355,6 +355,10 @@ rte_config_init(void)\n \tcase RTE_PROC_SECONDARY:\n \t\trte_eal_config_attach();\n \t\teal_mcfg_wait_complete();\n+\t\tif (eal_mcfg_check_version() < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Primary and secondary process DPDK version mismatch\\n\");\n+\t\t\treturn -1;\n+\t\t}\n \t\trte_eal_config_reattach();\n \t\teal_mcfg_update_from_internal();\n \t\tbreak;\n@@ -362,6 +366,7 @@ rte_config_init(void)\n \tcase RTE_PROC_INVALID:\n \t\trte_panic(\"Invalid process type\\n\");\n \t}\n+\treturn 0;\n }\n \n /* display usage */\n@@ -686,7 +691,12 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n-\trte_config_init();\n+\tif (rte_config_init() < 0) {\n+\t\trte_eal_init_alert(\"Cannot init config\");\n+\t\trte_errno = EINVAL;\n+\t\trte_atomic32_clear(&run_once);\n+\t\treturn -1;\n+\t}\n \n \tif (rte_eal_intr_init() < 0) {\n \t\trte_eal_init_alert(\"Cannot init interrupt-handling thread\");\ndiff --git a/lib/librte_eal/linux/eal/eal.c b/lib/librte_eal/linux/eal/eal.c\nindex e2be87e23..4a38718aa 100644\n--- a/lib/librte_eal/linux/eal/eal.c\n+++ b/lib/librte_eal/linux/eal/eal.c\n@@ -444,7 +444,7 @@ eal_proc_type_detect(void)\n }\n \n /* Sets up rte_config structure with the pointer to shared memory config.*/\n-static void\n+static int\n rte_config_init(void)\n {\n \trte_config.process_type = internal_config.process_type;\n@@ -457,6 +457,10 @@ rte_config_init(void)\n \tcase RTE_PROC_SECONDARY:\n \t\trte_eal_config_attach();\n \t\teal_mcfg_wait_complete();\n+\t\tif (eal_mcfg_check_version() < 0) {\n+\t\t\tRTE_LOG(ERR, EAL, \"Primary and secondary process DPDK version mismatch\\n\");\n+\t\t\treturn -1;\n+\t\t}\n \t\trte_eal_config_reattach();\n \t\teal_mcfg_update_internal();\n \t\tbreak;\n@@ -464,6 +468,7 @@ rte_config_init(void)\n \tcase RTE_PROC_INVALID:\n \t\trte_panic(\"Invalid process type\\n\");\n \t}\n+\treturn 0;\n }\n \n /* Unlocks hugepage directories that were locked by eal_hugepage_info_init */\n@@ -971,7 +976,12 @@ rte_eal_init(int argc, char **argv)\n \t\treturn -1;\n \t}\n \n-\trte_config_init();\n+\tif (rte_config_init() < 0) {\n+\t\trte_eal_init_alert(\"Cannot init config\");\n+\t\trte_errno = EINVAL;\n+\t\trte_atomic32_clear(&run_once);\n+\t\treturn -1;\n+\t}\n \n \tif (rte_eal_intr_init() < 0) {\n \t\trte_eal_init_alert(\"Cannot init interrupt-handling thread\");\n",
    "prefixes": [
        "v2",
        "14/14"
    ]
}