get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136558,
    "url": "http://patchwork.dpdk.org/api/patches/136558/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240208181644.455233-3-mattias.ronnblom@ericsson.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": "<20240208181644.455233-3-mattias.ronnblom@ericsson.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240208181644.455233-3-mattias.ronnblom@ericsson.com",
    "date": "2024-02-08T18:16:41",
    "name": "[RFC,2/5] eal: add lcore variable test suite",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "dfb410fbda895515239d8ed21b6dcd23c35e97b0",
    "submitter": {
        "id": 1077,
        "url": "http://patchwork.dpdk.org/api/people/1077/?format=api",
        "name": "Mattias Rönnblom",
        "email": "mattias.ronnblom@ericsson.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240208181644.455233-3-mattias.ronnblom@ericsson.com/mbox/",
    "series": [
        {
            "id": 31057,
            "url": "http://patchwork.dpdk.org/api/series/31057/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31057",
            "date": "2024-02-08T18:16:39",
            "name": "Lcore variables",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/31057/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/136558/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/136558/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 C25E343AE1;\n\tThu,  8 Feb 2024 19:25:03 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 8A39242E5E;\n\tThu,  8 Feb 2024 19:24:52 +0100 (CET)",
            "from EUR05-VI1-obe.outbound.protection.outlook.com\n (mail-vi1eur05on2048.outbound.protection.outlook.com [40.107.21.48])\n by mails.dpdk.org (Postfix) with ESMTP id 81CCB402D1\n for <dev@dpdk.org>; Thu,  8 Feb 2024 19:24:49 +0100 (CET)",
            "from AM0PR03CA0016.eurprd03.prod.outlook.com (2603:10a6:208:14::29)\n by PAXPR07MB7968.eurprd07.prod.outlook.com (2603:10a6:102:13e::14)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.41; Thu, 8 Feb\n 2024 18:24:47 +0000",
            "from AM3PEPF0000A793.eurprd04.prod.outlook.com\n (2603:10a6:208:14:cafe::19) by AM0PR03CA0016.outlook.office365.com\n (2603:10a6:208:14::29) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7249.37 via Frontend\n Transport; Thu, 8 Feb 2024 18:24:47 +0000",
            "from oa.msg.ericsson.com (192.176.1.74) by\n AM3PEPF0000A793.mail.protection.outlook.com (10.167.16.122) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.7249.19 via Frontend Transport; Thu, 8 Feb 2024 18:24:47 +0000",
            "from seliicinfr00049.seli.gic.ericsson.se (153.88.142.248) by\n smtp-central.internal.ericsson.com (100.87.178.63) with Microsoft SMTP Server\n id 15.2.1258.12; Thu, 8 Feb 2024 19:24:46 +0100",
            "from breslau.. (seliicwb00002.seli.gic.ericsson.se [10.156.25.100])\n by seliicinfr00049.seli.gic.ericsson.se (Postfix) with ESMTP id\n C84DE380061; Thu,  8 Feb 2024 19:24:46 +0100 (CET)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=UsgGUnpdPei8Pbxzx9KX9xZff6lcaAkhn8qAGar9egPjp5lL9fL0mXHr8J9FDppPImr6ns+vePMAiJrJn0ulOi48yL/K1Ff5y2/LXVWg/XpeWJhTrM2ZCDnP/xUhDvYlByfhbPlILSNKYCY+xZDtJ4ASy+ISfTBA46dvTb/oQ/74vAMUvM/uzSpk7nacvXufDghMVox7ax28U6ZPdZ/Xi3QhwVggeoNkvYbhMIJWcwRJ6mblqwGxq1ng/+hbdb/aHSJwCPn8YRm7xhRMIyVqXhP3Joi60acJjmwg7G/y6peNhWUsshp8YTbn3wHNOWlY+AGC4ZPecX8VxBHr/YDVQQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=ZOMLdiBdVDZxM95hhq8RR8gJEdhE5xReFfNoLsshPc4=;\n b=GBEsj/pmff/+RSDKTDAnBnkrDTgKUxwU6QofUdHEyEsH1Ed5LyKb21L4jun73wDttZNzMtXIhzrF/e06FmaG5m5WAzaYk+oal6gbxSaZ8dZbXGPHu+so9lPdPQyj1h7AJzr8G1456X1eGlyLSU8gycFNxnk9JhJVgBQlHuKgxe63TMF9SAGTTje5XqIsgRF4alf8I1Sa+Qs1tCDswfojXEp1gp2TzDmwj4x8pGoXPZmUBz2EDy1S6ZwgFp+Uc4/9j2FcevqoFs2nXQMnEVAa1uh+CYIqPZa7nYGFlHFIdWZLAAGHKEgsQUaedqUvub+CC5GOFMBPiAk6fsLxj70evw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 192.176.1.74) smtp.rcpttodomain=dpdk.org smtp.mailfrom=ericsson.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ericsson.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=ZOMLdiBdVDZxM95hhq8RR8gJEdhE5xReFfNoLsshPc4=;\n b=BnCGTS1j7ReTF+GtOYGJjIoy2SrhNRrm72Bt2rBlV5t+p8eNmlwZtbAcvsZoZa60i23m3DOZUqbq2VMQmlcCqdLdkrs52brcJp/Qvt4BD4ohnT45V/z6RIpL7CK3n3SgEhMgAlYD5/wbkgAF0QLtM3eF92Q8iLBSxfuGVHdSr+r/nnTX+HuHnawciO1bnBOiLgOU5H+Pk/CAozeug1Soxv5vQNejZzjK2atAkvltWQiZ2QqgDAnJRq4KbyiFW+GVkrk38kQAMLhoXMjuSKgGKe4JM5mR1fRyYuJwn0t3qsbRbSvbg39+mvKKoCtWFPMrtAI3s8XOzicnbVRXZ+kNXA==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 192.176.1.74)\n smtp.mailfrom=ericsson.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=ericsson.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of ericsson.com designates\n 192.176.1.74 as permitted sender)\n receiver=protection.outlook.com;\n client-ip=192.176.1.74; helo=oa.msg.ericsson.com; pr=C",
        "From": "=?utf-8?q?Mattias_R=C3=B6nnblom?= <mattias.ronnblom@ericsson.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<hofors@lysator.liu.se>,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Stephen Hemminger <stephen@networkplumber.org>, =?utf-8?q?Mattias_R=C3=B6nn?=\n\t=?utf-8?q?blom?= <mattias.ronnblom@ericsson.com>",
        "Subject": "[RFC 2/5] eal: add lcore variable test suite",
        "Date": "Thu, 8 Feb 2024 19:16:41 +0100",
        "Message-ID": "<20240208181644.455233-3-mattias.ronnblom@ericsson.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240208181644.455233-1-mattias.ronnblom@ericsson.com>",
        "References": "<20240208181644.455233-1-mattias.ronnblom@ericsson.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"UTF-8\"",
        "Content-Transfer-Encoding": "8bit",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "AM3PEPF0000A793:EE_|PAXPR07MB7968:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "9b494fcf-19a3-41ac-fea3-08dc28d33b10",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n Ic/ViIC6RkmlQ3SpbLq8lhqUC5goZiktrZVfzvX4snDnQ2W/ElJzep5qkFD/0VnSTxnDrvkORYbnoXBl5qr3710VnVfN+qFc5JhwWJJkyD+7hsgaJ9P24FyQVOwiQVefnu+rlq9H+GYatVMuHg8i/lQN4uMK+BXrARfJDW7fAyarW6PPFHD5MUP3/6Bh66HbkWtVet4+SavEf6br6cOdcgs0JH+evZMs4f9M6nw8sCkK7CjQnepom1jvT3MX0ZfTc1J65KlKsTuK8lhWHR4SsZtHFJqZ6IDAS/dJHTVyFWjMg6jqaJiyuCiOKW8BkpRj7+FQFc2XoxrcI4ys6nmkGOypyVuBWFCjXkvotR/aFZRqaQxXmNr4KcmHFBs+Rov5UB+gw6s4SzlseCBpy03YfN2nwF2dXYcvFRyWfeXVwoDWYomxBUbLTJgUe+LH7i7Khpryl7NOFZ5BfRZC5IX4ZU4mubCFfYerFf2uGqUEx8qcdTUlt1iDpmtgYrQIiWFvgJXo57GvAMeWY/ijVPY2C5dR+ZWyWoHUFSQEPFFMR8y3lsxVBGjKvqj0KCI5IjAZP7tOvxg4OaUjNngSwcaROZ9skPdloHibd6aMak4s5k8=",
        "X-Forefront-Antispam-Report": "CIP:192.176.1.74; CTRY:SE; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:oa.msg.ericsson.com; PTR:office365.se.ericsson.net;\n CAT:NONE;\n SFS:(13230031)(4636009)(346002)(136003)(396003)(39860400002)(376002)(230922051799003)(82310400011)(186009)(64100799003)(1800799012)(451199024)(36840700001)(46966006)(40470700004)(2906002)(8936002)(30864003)(41300700001)(5660300002)(4326008)(8676002)(82960400001)(83380400001)(356005)(7636003)(86362001)(36756003)(26005)(1076003)(66574015)(70586007)(107886003)(336012)(6666004)(478600001)(6916009)(6266002)(54906003)(70206006)(2616005)(316002)(82740400003);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "ericsson.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 Feb 2024 18:24:47.3479 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 9b494fcf-19a3-41ac-fea3-08dc28d33b10",
        "X-MS-Exchange-CrossTenant-Id": "92e84ceb-fbfd-47ab-be52-080c6b87953f",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=92e84ceb-fbfd-47ab-be52-080c6b87953f; Ip=[192.176.1.74];\n Helo=[oa.msg.ericsson.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n AM3PEPF0000A793.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PAXPR07MB7968",
        "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"
    },
    "content": "Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>\n---\n app/test/meson.build      |   1 +\n app/test/test_lcore_var.c | 384 ++++++++++++++++++++++++++++++++++++++\n 2 files changed, 385 insertions(+)\n create mode 100644 app/test/test_lcore_var.c",
    "diff": "diff --git a/app/test/meson.build b/app/test/meson.build\nindex 6389ae83ee..93412cce51 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -101,6 +101,7 @@ source_file_deps = {\n     'test_ipsec_sad.c': ['ipsec'],\n     'test_kvargs.c': ['kvargs'],\n     'test_latencystats.c': ['ethdev', 'latencystats', 'metrics'] + sample_packet_forward_deps,\n+    'test_lcore_var.c': [],\n     'test_lcores.c': [],\n     'test_link_bonding.c': ['ethdev', 'net_bond',\n         'net'] + packet_burst_generator_deps + virtual_pmd_deps,\ndiff --git a/app/test/test_lcore_var.c b/app/test/test_lcore_var.c\nnew file mode 100644\nindex 0000000000..0229f90bf2\n--- /dev/null\n+++ b/app/test/test_lcore_var.c\n@@ -0,0 +1,384 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2024 Ericsson AB\n+ */\n+\n+#include <inttypes.h>\n+#include <stdio.h>\n+#include <string.h>\n+\n+#include <rte_launch.h>\n+#include <rte_lcore_var.h>\n+#include <rte_random.h>\n+\n+#include \"test.h\"\n+\n+#define MIN_LCORES 2\n+\n+RTE_LCORE_VAR_HANDLE(int, test_int);\n+\n+struct int_checker_state {\n+\tint old_value;\n+\tint new_value;\n+\tbool success;\n+};\n+\n+static bool\n+rand_bool(void)\n+{\n+\treturn rte_rand() & 1;\n+}\n+\n+static void\n+rand_blk(void *blk, size_t size)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < size; i++)\n+\t\t((unsigned char *)blk)[i] = (unsigned char)rte_rand();\n+}\n+\n+static int\n+check_int(void *arg)\n+{\n+\tstruct int_checker_state *state = arg;\n+\n+\tint *ptr = RTE_LCORE_VAR_PTR(test_int);\n+\n+\tbool naturally_aligned = RTE_PTR_ALIGN_CEIL(ptr, sizeof(int)) == ptr;\n+\n+\tbool equal;\n+\n+\tif (rand_bool())\n+\t\tequal = RTE_LCORE_VAR_GET(test_int) == state->old_value;\n+\telse\n+\t\tequal = *(RTE_LCORE_VAR_PTR(test_int)) == state->old_value;\n+\n+\tstate->success = equal && naturally_aligned;\n+\n+\tif (rand_bool())\n+\t\tRTE_LCORE_VAR_SET(test_int, state->new_value);\n+\telse\n+\t\t*ptr = state->new_value;\n+\n+\treturn 0;\n+}\n+\n+RTE_LCORE_VAR_INIT(test_int);\n+\n+static int\n+test_int_lvar(void)\n+{\n+\tunsigned int lcore_id;\n+\n+\tstruct int_checker_state states[RTE_MAX_LCORE] = {};\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct int_checker_state *state = &states[lcore_id];\n+\n+\t\tstate->old_value = (int)rte_rand();\n+\t\tstate->new_value = (int)rte_rand();\n+\n+\t\tRTE_LCORE_VAR_LCORE_SET(lcore_id, test_int, state->old_value);\n+\t}\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id)\n+\t\trte_eal_remote_launch(check_int, &states[lcore_id], lcore_id);\n+\n+\trte_eal_mp_wait_lcore();\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct int_checker_state *state = &states[lcore_id];\n+\n+\t\tTEST_ASSERT(state->success, \"Unexpected value \"\n+\t\t\t    \"encountered on lcore %d\", lcore_id);\n+\n+\t\tTEST_ASSERT_EQUAL(state->new_value,\n+\t\t\t\t  RTE_LCORE_VAR_LCORE_GET(lcore_id, test_int),\n+\t\t\t\t  \"Lcore %d failed to update int\", lcore_id);\n+\t}\n+\n+\t/* take the opportunity to test the foreach macro */\n+\tint *v;\n+\tlcore_id = 0;\n+\tRTE_LCORE_VAR_FOREACH(v, test_int) {\n+\t\tprintf(\"expected %d actual %d\\n\",\n+\t\t       states[lcore_id].new_value, *v);\n+\t\tTEST_ASSERT_EQUAL(states[lcore_id].new_value, *v,\n+\t\t\t\t  \"Unexpected value on lcore %d during \"\n+\t\t\t\t  \"iteration\", lcore_id);\n+\t\tlcore_id++;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+/* private, larger, struct */\n+#define TEST_STRUCT_DATA_SIZE 1234\n+\n+struct test_struct {\n+\tuint8_t data[TEST_STRUCT_DATA_SIZE];\n+};\n+\n+static RTE_LCORE_VAR_HANDLE(char, before_struct);\n+static RTE_LCORE_VAR_HANDLE(struct test_struct, test_struct);\n+static RTE_LCORE_VAR_HANDLE(char, after_struct);\n+\n+struct struct_checker_state {\n+\tstruct test_struct old_value;\n+\tstruct test_struct new_value;\n+\tbool success;\n+};\n+\n+static int check_struct(void *arg)\n+{\n+\tstruct struct_checker_state *state = arg;\n+\n+\tstruct test_struct *lcore_struct = RTE_LCORE_VAR_PTR(test_struct);\n+\n+\t/*\n+\t * Lcore variable alignment is based on object size, not any\n+\t * particular requirements on the struct's field.\n+\t */\n+\tbool properly_aligned =\n+\t\tRTE_PTR_ALIGN_CEIL(lcore_struct, 16) == lcore_struct;\n+\n+\tbool equal = memcmp(lcore_struct->data, state->old_value.data,\n+\t\t\t    TEST_STRUCT_DATA_SIZE) == 0;\n+\n+\tstate->success = equal && properly_aligned;\n+\n+\tmemcpy(lcore_struct->data, state->new_value.data,\n+\t       TEST_STRUCT_DATA_SIZE);\n+\n+\treturn 0;\n+}\n+\n+static int\n+test_struct_lvar(void)\n+{\n+\tunsigned int lcore_id;\n+\n+\tRTE_LCORE_VAR_ALLOC(before_struct);\n+\tRTE_LCORE_VAR_ALLOC(test_struct);\n+\tRTE_LCORE_VAR_ALLOC(after_struct);\n+\n+\tstruct struct_checker_state states[RTE_MAX_LCORE];\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct struct_checker_state *state = &states[lcore_id];\n+\n+\t\trand_blk(state->old_value.data, TEST_STRUCT_DATA_SIZE);\n+\t\trand_blk(state->new_value.data, TEST_STRUCT_DATA_SIZE);\n+\n+\t\tmemcpy(RTE_LCORE_VAR_LCORE_PTR(lcore_id, test_struct)->data,\n+\t\t       state->old_value.data, TEST_STRUCT_DATA_SIZE);\n+\t}\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id)\n+\t\trte_eal_remote_launch(check_struct, &states[lcore_id],\n+\t\t\t\t      lcore_id);\n+\n+\trte_eal_mp_wait_lcore();\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct struct_checker_state *state = &states[lcore_id];\n+\t\tstruct test_struct *lstruct =\n+\t\t\tRTE_LCORE_VAR_LCORE_PTR(lcore_id, test_struct);\n+\n+\t\tTEST_ASSERT(state->success, \"Unexpected value encountered on \"\n+\t\t\t    \"lcore %d\", lcore_id);\n+\n+\t\tbool equal = memcmp(lstruct->data, state->new_value.data,\n+\t\t\t\t    TEST_STRUCT_DATA_SIZE) == 0;\n+\n+\t\tTEST_ASSERT(equal, \"Lcore %d failed to update struct\",\n+\t\t\t    lcore_id);\n+\t}\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tchar before = RTE_LCORE_VAR_LCORE_GET(lcore_id, before_struct);\n+\t\tchar after = RTE_LCORE_VAR_LCORE_GET(lcore_id, after_struct);\n+\n+\t\tTEST_ASSERT_EQUAL(before, 0, \"Lcore variable before test \"\n+\t\t\t\t  \"struct was modified on lcore %d\", lcore_id);\n+\t\tTEST_ASSERT_EQUAL(after, 0, \"Lcore variable after test \"\n+\t\t\t\t  \"struct was modified on lcore %d\", lcore_id);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define TEST_ARRAY_SIZE 99\n+\n+typedef uint16_t test_array_t[TEST_ARRAY_SIZE];\n+\n+static void test_array_init_rand(test_array_t a)\n+{\n+\tsize_t i;\n+\tfor (i = 0; i < TEST_ARRAY_SIZE; i++)\n+\t\ta[i] = (uint16_t)rte_rand();\n+}\n+\n+static bool test_array_equal(test_array_t a, test_array_t b)\n+{\n+\tsize_t i;\n+\tfor (i = 0; i < TEST_ARRAY_SIZE; i++) {\n+\t\tif (a[i] != b[i])\n+\t\t\treturn false;\n+\t}\n+\treturn true;\n+}\n+\n+static void test_array_copy(test_array_t dst, const test_array_t src)\n+{\n+\tsize_t i;\n+\tfor (i = 0; i < TEST_ARRAY_SIZE; i++)\n+\t\tdst[i] = src[i];\n+}\n+\n+static RTE_LCORE_VAR_HANDLE(char, before_array);\n+static RTE_LCORE_VAR_HANDLE(test_array_t, test_array);\n+static RTE_LCORE_VAR_HANDLE(char, after_array);\n+\n+struct array_checker_state\n+{\n+\ttest_array_t old_value;\n+\ttest_array_t new_value;\n+\tbool success;\n+};\n+\n+static int check_array(void *arg)\n+{\n+\tstruct array_checker_state *state = arg;\n+\n+\ttest_array_t *lcore_array = RTE_LCORE_VAR_PTR(test_array);\n+\n+\t/*\n+\t * Lcore variable alignment is based on object size, not any\n+\t * particular requirements on the struct's field.\n+\t */\n+\tbool properly_aligned =\n+\t\tRTE_PTR_ALIGN_CEIL(lcore_array, 16) == lcore_array;\n+\n+\tbool equal = test_array_equal(*lcore_array, state->old_value);\n+\n+\tstate->success = equal && properly_aligned;\n+\n+\ttest_array_copy(*lcore_array, state->new_value);\n+\n+\treturn 0;\n+}\n+\n+static int\n+test_array_lvar(void)\n+{\n+\tunsigned int lcore_id;\n+\n+\tRTE_LCORE_VAR_ALLOC(before_array);\n+\tRTE_LCORE_VAR_ALLOC(test_array);\n+\tRTE_LCORE_VAR_ALLOC(after_array);\n+\n+\tstruct array_checker_state states[RTE_MAX_LCORE];\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct array_checker_state *state = &states[lcore_id];\n+\n+\t\ttest_array_init_rand(state->new_value);\n+\t\ttest_array_init_rand(state->old_value);\n+\n+\t\ttest_array_copy(RTE_LCORE_VAR_LCORE_GET(lcore_id, test_array),\n+\t\t\t\tstate->old_value);\n+\t}\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id)\n+\t\trte_eal_remote_launch(check_array, &states[lcore_id],\n+\t\t\t\t      lcore_id);\n+\n+\trte_eal_mp_wait_lcore();\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tstruct array_checker_state *state = &states[lcore_id];\n+\t\ttest_array_t *larray =\n+\t\t\tRTE_LCORE_VAR_LCORE_PTR(lcore_id, test_array);\n+\n+\t\tTEST_ASSERT(state->success, \"Unexpected value encountered on \"\n+\t\t\t    \"lcore %d\", lcore_id);\n+\n+\t\tbool equal = test_array_equal(*larray, state->new_value);\n+\n+\t\tTEST_ASSERT(equal, \"Lcore %d failed to update array\",\n+\t\t\t    lcore_id);\n+\t}\n+\n+\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\tchar before = RTE_LCORE_VAR_LCORE_GET(lcore_id, before_array);\n+\t\tchar after = RTE_LCORE_VAR_LCORE_GET(lcore_id, after_array);\n+\n+\t\tTEST_ASSERT_EQUAL(before, 0, \"Lcore variable before test \"\n+\t\t\t\t  \"array was modified on lcore %d\", lcore_id);\n+\t\tTEST_ASSERT_EQUAL(after, 0, \"Lcore variable after test \"\n+\t\t\t\t  \"array was modified on lcore %d\", lcore_id);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define MANY_LVARS (RTE_MAX_LCORE_VAR / 2)\n+\n+static int\n+test_many_lvars(void)\n+{\n+\tvoid **handlers = malloc(sizeof(void *) * MANY_LVARS);\n+\tint i;\n+\n+\tTEST_ASSERT(handlers != NULL, \"Unable to allocate memory\");\n+\n+\tfor (i = 0; i < MANY_LVARS; i++) {\n+\t\tvoid *handle = rte_lcore_var_alloc(1);\n+\n+\t\tuint8_t *b = __RTE_LCORE_VAR_LCORE_PTR(rte_lcore_id(), handle);\n+\n+\t\t*b = (uint8_t)i;\n+\n+\t\thandlers[i] = handle;\n+\t}\n+\n+\tfor (i = 0; i < MANY_LVARS; i++) {\n+\t\tunsigned int lcore_id;\n+\n+\t\tRTE_LCORE_FOREACH_WORKER(lcore_id) {\n+\t\t\tuint8_t *b = __RTE_LCORE_VAR_LCORE_PTR(rte_lcore_id(),\n+\t\t\t\t\t\t\t       handlers[i]);\n+\t\t\tTEST_ASSERT_EQUAL((uint8_t)i, *b,\n+\t\t\t\t\t  \"Unexpected lcore variable value.\");\n+\t\t}\n+\t}\n+\n+\tfree(handlers);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static struct unit_test_suite lcore_var_testsuite = {\n+\t.suite_name = \"lcore variable autotest\",\n+\t.unit_test_cases = {\n+\t\tTEST_CASE(test_int_lvar),\n+\t\tTEST_CASE(test_struct_lvar),\n+\t\tTEST_CASE(test_array_lvar),\n+\t\tTEST_CASE(test_many_lvars),\n+\t\tTEST_CASES_END()\n+\t},\n+};\n+\n+static int test_lcore_var(void)\n+{\n+\tif (rte_lcore_count() < MIN_LCORES) {\n+\t\tprintf(\"Not enough cores for lcore_var_autotest; expecting at \"\n+\t\t       \"least %d.\\n\", MIN_LCORES);\n+\t\treturn TEST_SKIPPED;\n+\t}\n+\n+\treturn unit_test_suite_runner(&lcore_var_testsuite);\n+}\n+\n+REGISTER_FAST_TEST(lcore_var_autotest, true, false, test_lcore_var);\n",
    "prefixes": [
        "RFC",
        "2/5"
    ]
}