get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139874,
    "url": "http://patchwork.dpdk.org/api/patches/139874/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240506082721.120666-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": "<20240506082721.120666-3-mattias.ronnblom@ericsson.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240506082721.120666-3-mattias.ronnblom@ericsson.com",
    "date": "2024-05-06T08:27:17",
    "name": "[RFC,v6,2/6] eal: add lcore variable test suite",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "d109217b1e6496928f032800551d5a91aaad677c",
    "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/20240506082721.120666-3-mattias.ronnblom@ericsson.com/mbox/",
    "series": [
        {
            "id": 31884,
            "url": "http://patchwork.dpdk.org/api/series/31884/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31884",
            "date": "2024-05-06T08:27:15",
            "name": "Lcore variables",
            "version": 6,
            "mbox": "http://patchwork.dpdk.org/series/31884/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/139874/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/139874/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 1C9B343FC4;\n\tMon,  6 May 2024 10:38:29 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DE909402E3;\n\tMon,  6 May 2024 10:38:25 +0200 (CEST)",
            "from EUR03-AM7-obe.outbound.protection.outlook.com\n (mail-am7eur03on2042.outbound.protection.outlook.com [40.107.105.42])\n by mails.dpdk.org (Postfix) with ESMTP id 6D0D6402E1\n for <dev@dpdk.org>; Mon,  6 May 2024 10:38:24 +0200 (CEST)",
            "from DBBPR09CA0046.eurprd09.prod.outlook.com (2603:10a6:10:d4::34)\n by DBAPR07MB6967.eurprd07.prod.outlook.com (2603:10a6:10:192::11) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.41; Mon, 6 May\n 2024 08:38:22 +0000",
            "from DB1PEPF000509F7.eurprd02.prod.outlook.com\n (2603:10a6:10:d4:cafe::d4) by DBBPR09CA0046.outlook.office365.com\n (2603:10a6:10:d4::34) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.42 via Frontend\n Transport; Mon, 6 May 2024 08:38:22 +0000",
            "from oa.msg.ericsson.com (192.176.1.74) by\n DB1PEPF000509F7.mail.protection.outlook.com (10.167.242.153) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.7544.18 via Frontend Transport; Mon, 6 May 2024 08:38:22 +0000",
            "from seliicinfr00050.seli.gic.ericsson.se (153.88.142.248) by\n smtp-central.internal.ericsson.com (100.87.178.66) with Microsoft SMTP Server\n id 15.2.1544.9; Mon, 6 May 2024 10:38:22 +0200",
            "from breslau.. (seliicwb00002.seli.gic.ericsson.se [10.156.25.100])\n by seliicinfr00050.seli.gic.ericsson.se (Postfix) with ESMTP id\n E79E71C006A; Mon,  6 May 2024 10:38:21 +0200 (CEST)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=XiY2mhI9y5ohzDAhZWwU0SmWH9RLojptptD4z+J5AugywmlTnsirBK2hYu+gxwZ1NJAd/pd6ZtALsOWn/tAn22gO1acISP91d+KhYxMSw89q9Gegl+869X6Dj+7Twpxc8kCl7V+rQ6fR6Ymnuk5TVTvvmnUVdoLKfCszA7Y2ZLmNoaesyya0pNHBSJ2GfakKxPtFZ9hEwa9r7Spd7FTo3eqSEqEfqHYl/aXAdomr4sobLFNF7bdTTKr4HiVVCeBmQoVr0QPBVuorkiiX3ZUvfN4Q2byf7P8RcDUPCckdOVbGP8hBr1sURxDEs3mg/v0lvu2rLkxBsoPTxmpyC7G8Nw==",
        "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=wy88gM49EvoC9uWorDMfxcXWJxsryZubX8VaSUoVskY=;\n b=WMTXtMAzM0SAtPr5Myxp0za1QBTUC3ZOft85M/U5Y5hHFnqE8Z2w0YqpxdQNmHNm5IsBKk+tZaZmnPfIgcK/Qskeekzqvr4sR1kCTyGYv504l9Hv4DlYzkAzfg71VnTl6i8weggxfqp5kismCc+CqMml9XH9iNpxgcAqMMOKh+sCQDVnlwHBOVh/NModsHqN6gfmpDGMxIQgxT3+rkNTij1rC8vDl/GaqYwwLK33YBAjjdmE4xjFsZzjMO/1SOOdqowMuMW41p5QCBOnkAaejaRpVdX5kkMDYzJP07GbepZUox/i7fn9nw05OlZfohlFomS2ZfLDpO2IQjJIMce9UA==",
        "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=wy88gM49EvoC9uWorDMfxcXWJxsryZubX8VaSUoVskY=;\n b=R4ZN3wc7lQWWVFqFzsY+/HYsmnsrt0ywkHv6UWYd8UcVJNEsyoYp8bIkKBGHxFgVwYENdwJuTWOHJ5C+FqurjcBGWM/kqHlQwlo5iFc5LlIAEv+QHs6NWYuUsWeQA0STk8BH7i4FXcJ2QoAt3mi8UgG+lFZcAGZswsLqefzeQ9etJWznfso9HLQQYV735kGQhHPjMc87pjvgyymtiL2YcfO3wv8nQF6PeZCsArrepf+NDJMY4cznbMaIh+6ER7PCeT8qi7cxGRdI7U1oxYk+GBUbuhiG9wjZJnvh/lnUQj+pR9GBm8x/6ogr4aVeQr7UgrCTV28goMacobiDW0U4ug==",
        "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>,\n Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>, =?utf-8?q?Mattias_R?=\n\t=?utf-8?q?=C3=B6nnblom?= <mattias.ronnblom@ericsson.com>",
        "Subject": "[RFC v6 2/6] eal: add lcore variable test suite",
        "Date": "Mon, 6 May 2024 10:27:17 +0200",
        "Message-ID": "<20240506082721.120666-3-mattias.ronnblom@ericsson.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240506082721.120666-1-mattias.ronnblom@ericsson.com>",
        "References": "<20240228100928.524277-2-mattias.ronnblom@ericsson.com>\n <20240506082721.120666-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": "DB1PEPF000509F7:EE_|DBAPR07MB6967:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "93006c6e-65e8-4378-4bb2-08dc6da7e3ab",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230031|36860700004|82310400017|1800799015|376005;",
        "X-Microsoft-Antispam-Message-Info": "=?utf-8?q?/ycmqOksmucEsJ2HDghpO6CKHFcxpgM?=\n\t=?utf-8?q?Dz28DPRZdZdTxBkk5CHDZK/K7Hmc8nvJPNBy0alfW12aqWK/UGE3iNpBeUeIwKYIb?=\n\t=?utf-8?q?lYWKinZ37uzvlhr4za/w0/zjmcJH/r2yrujULaLfiH/dVdKNkQK5mUPlrC1mRAzBl?=\n\t=?utf-8?q?5q58k3bRViKu09slDXnjTlTGtJi+muFOftUyEFpU42vv6mb5b3GEDVBU+Ll+Z4Qzn?=\n\t=?utf-8?q?7VbmnpSv/1ygNZWjuy+W6D/vRkWeWCssiCV137rLq5QDXnHHtYfUy0qED35SEusTR?=\n\t=?utf-8?q?CkFseW5ooIaX0fes/5uJzzgJaaR1OUb8rQS/D90MwgEg2IvOdJPDq95xPq1ClRGmH?=\n\t=?utf-8?q?BQqxgW+z9xnONtMod8b0Z7optrBOc4x+u4lXNIEyOSriUOriczvj1wAnluo87euck?=\n\t=?utf-8?q?D7xgQjAZkXgqFDjjoAmK6IJ04LdWbQDtur/gXs5snGto8D2/4V4jZty2/UFWnLqSz?=\n\t=?utf-8?q?MlCOKvCqhVjDhE5ctGvjjBRVRpzZ6LDG/518aeFClsooB/oYF2mBvRwSLfko6XL83?=\n\t=?utf-8?q?Qpv+SSnpOUgfWqbirj1z439OeECGL76RgUcw24R1sl+TjnDsvo13bWKDshAJLwjdn?=\n\t=?utf-8?q?uiXGg07K5Dy3nOoJi+Pyo6LxTB/MxCNU3h5j5gbOspkyztTsLZfk8xZvB0hRc7ID/?=\n\t=?utf-8?q?ROapGO2atmVP3tyo6H2/BbYjZpkrYdNVXXJnF2ITtfI0H0LQvP7oNGnIkFOllMIZe?=\n\t=?utf-8?q?U6fAznK1hBP3QkwCf4K1rSRgJ6SkM/UnYYAuol/5EJmiSQ6FISqHwyRkTPOfcTmvl?=\n\t=?utf-8?q?qqLduoYk9c1HeTXJIfEz4/vZy+6KsceosBwmE/iQB+ANWOmYwC5JvD4Ob8mtn2OPB?=\n\t=?utf-8?q?mIRwyb1dQ29ubmMvW6dQ+jjpaKXGuIT+oFlHGUoLac+ELLYb1LnNGNirQMut0yvoI?=\n\t=?utf-8?q?V0leZxrRTMtS4rvMXlZjJ4chIRUUmCZmF7k0/oinsEvrFUBq3oaHODGyrkO1tj2X6?=\n\t=?utf-8?q?44u6s20YqD6XOwSbotvY1vwivV7LofEEVdnrZMcvUQGY6f/gdW/WdKZQGGAPSuab4?=\n\t=?utf-8?q?aoG1vuHi40xoiNYuEvj7sPv2OVUEbUQycEoz1JLcrngBScgJvlmBvn7wTZU3s9PhX?=\n\t=?utf-8?q?WHtwObm1QWV+69UBAnG7QbwIoScFpfzWFY+UZkfXlzutj+jrNyh/Y6ESUCQ+RJr6R?=\n\t=?utf-8?q?aj2AMMd0pe4FeUXw8zl+/Xo8Y/jyJzwm73b5mKhRjLMV6YZtmFDlEz5PbIZ3Iqodr?=\n\t=?utf-8?q?eoqBVJYUR9dEzwfCHwxzdduSbHRqw91JHVFUUdBW1BL0k9H4WCdl0B+qyq1elDE8H?=\n\t=?utf-8?q?khPEXoLKccD1CE1XT0NHyyTrhFCfXa+XC79oSYxg/dsXhfCYiSZ79WHE=3D?=",
        "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; SFS:(13230031)(36860700004)(82310400017)(1800799015)(376005);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "ericsson.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "06 May 2024 08:38:22.5606 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 93006c6e-65e8-4378-4bb2-08dc6da7e3ab",
        "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 DB1PEPF000509F7.eurprd02.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DBAPR07MB6967",
        "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": "Add test suite to exercise the <rte_lcore_var.h> API.\n\nRFC v5:\n * Adapt tests to reflect the removal of the GET() and SET() macros.\n\nRFC v4:\n * Check all lcore id's values for all variables in the many variables\n   test case.\n * Introduce test case for max-sized lcore variables.\n\nRFC v2:\n * Improve alignment-related test coverage.\n\nSigned-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\n---\n app/test/meson.build      |   1 +\n app/test/test_lcore_var.c | 432 ++++++++++++++++++++++++++++++++++++++\n 2 files changed, 433 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 7d909039ae..846affa98c 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -103,6 +103,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..e07d13460f\n--- /dev/null\n+++ b/app/test/test_lcore_var.c\n@@ -0,0 +1,432 @@\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+RTE_LCORE_VAR_HANDLE(char, test_char);\n+RTE_LCORE_VAR_HANDLE(long, test_long_sized);\n+RTE_LCORE_VAR_HANDLE(short, test_short);\n+RTE_LCORE_VAR_HANDLE(long, test_long_sized_aligned);\n+\n+struct int_checker_state {\n+\tint old_value;\n+\tint new_value;\n+\tbool success;\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 bool\n+is_ptr_aligned(const void *ptr, size_t align)\n+{\n+\treturn ptr != NULL ? (uintptr_t)ptr % align == 0 : false;\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_VALUE(test_int);\n+\n+\tbool naturally_aligned = is_ptr_aligned(ptr, sizeof(int));\n+\n+\tbool equal = *(RTE_LCORE_VAR_VALUE(test_int)) == state->old_value;\n+\n+\tstate->success = equal && naturally_aligned;\n+\n+\t*ptr = state->new_value;\n+\n+\treturn 0;\n+}\n+\n+RTE_LCORE_VAR_INIT(test_int);\n+RTE_LCORE_VAR_INIT(test_char);\n+RTE_LCORE_VAR_INIT_SIZE(test_long_sized, 32);\n+RTE_LCORE_VAR_INIT(test_short);\n+RTE_LCORE_VAR_INIT_SIZE_ALIGN(test_long_sized_aligned, sizeof(long),\n+\t\t\t      RTE_CACHE_LINE_SIZE);\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\t*RTE_LCORE_VAR_LCORE_VALUE(lcore_id, test_int) =\n+\t\t\tstate->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+\t\tint value;\n+\n+\t\tTEST_ASSERT(state->success, \"Unexpected value \"\n+\t\t\t    \"encountered on lcore %d\", lcore_id);\n+\n+\t\tvalue = *RTE_LCORE_VAR_LCORE_VALUE(lcore_id, test_int);\n+\t\tTEST_ASSERT_EQUAL(state->new_value, value,\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_VALUE(v, test_int) {\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+static int\n+test_sized_alignment(void)\n+{\n+\tlong *v;\n+\n+\tRTE_LCORE_VAR_FOREACH_VALUE(v, test_long_sized) {\n+\t\tTEST_ASSERT(is_ptr_aligned(v, alignof(long)),\n+\t\t\t    \"Type-derived alignment failed\");\n+\t}\n+\n+\tRTE_LCORE_VAR_FOREACH_VALUE(v, test_long_sized_aligned) {\n+\t\tTEST_ASSERT(is_ptr_aligned(v, RTE_CACHE_LINE_SIZE),\n+\t\t\t    \"Explicit alignment failed\");\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_VALUE(test_struct);\n+\n+\tbool properly_aligned =\n+\t\tis_ptr_aligned(test_struct, alignof(struct test_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_VALUE(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_VALUE(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 =\n+\t\t\t*RTE_LCORE_VAR_LCORE_VALUE(lcore_id, before_struct);\n+\t\tchar after =\n+\t\t\t*RTE_LCORE_VAR_LCORE_VALUE(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+\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_VALUE(test_array);\n+\n+\tbool properly_aligned =\n+\t\tis_ptr_aligned(lcore_array, alignof(test_array_t));\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_VALUE(lcore_id,\n+\t\t\t\t\t\t\t   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_VALUE(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 =\n+\t\t\t*RTE_LCORE_VAR_LCORE_VALUE(lcore_id, before_array);\n+\t\tchar after =\n+\t\t\t*RTE_LCORE_VAR_LCORE_VALUE(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 (2 * RTE_MAX_LCORE_VAR / sizeof(uint32_t))\n+\n+static int\n+test_many_lvars(void)\n+{\n+\tuint32_t **handlers = malloc(sizeof(uint32_t *) * MANY_LVARS);\n+\tunsigned int i;\n+\n+\tTEST_ASSERT(handlers != NULL, \"Unable to allocate memory\");\n+\n+\tfor (i = 0; i < MANY_LVARS; i++) {\n+\t\tunsigned int lcore_id;\n+\n+\t\tRTE_LCORE_VAR_ALLOC(handlers[i]);\n+\n+\t\tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n+\t\t\tuint32_t *v =\n+\t\t\t\tRTE_LCORE_VAR_LCORE_VALUE(lcore_id, handlers[i]);\n+\t\t\t*v = (uint32_t)(i * lcore_id);\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < MANY_LVARS; i++) {\n+\t\tunsigned int lcore_id;\n+\n+\t\tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n+\t\t\tuint32_t v = *RTE_LCORE_VAR_LCORE_VALUE(lcore_id,\n+\t\t\t\t\t\t\t\thandlers[i]);\n+\t\t\tTEST_ASSERT_EQUAL((uint32_t)(i * lcore_id), v,\n+\t\t\t\t\t  \"Unexpected lcore variable value on \"\n+\t\t\t\t\t  \"lcore %d\", lcore_id);\n+\t\t}\n+\t}\n+\n+\tfree(handlers);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_large_lvar(void)\n+{\n+\tRTE_LCORE_VAR_HANDLE(unsigned char, large);\n+\tunsigned int lcore_id;\n+\n+\tRTE_LCORE_VAR_ALLOC_SIZE(large, RTE_MAX_LCORE_VAR);\n+\n+\tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n+\t\tunsigned char *ptr = RTE_LCORE_VAR_LCORE_VALUE(lcore_id, large);\n+\n+\t\tmemset(ptr, (unsigned char)lcore_id, RTE_MAX_LCORE_VAR);\n+\t}\n+\n+\tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n+\t\tunsigned char *ptr = RTE_LCORE_VAR_LCORE_VALUE(lcore_id, large);\n+\t\tsize_t i;\n+\n+\t\tfor (i = 0; i < RTE_MAX_LCORE_VAR; i++)\n+\t\t\tTEST_ASSERT_EQUAL(ptr[i], (unsigned char)lcore_id,\n+\t\t\t\t\t  \"Large lcore variable value is \"\n+\t\t\t\t\t  \"corrupted on lcore %d.\",\n+\t\t\t\t\t  lcore_id);\n+\t}\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_sized_alignment),\n+\t\tTEST_CASE(test_struct_lvar),\n+\t\tTEST_CASE(test_array_lvar),\n+\t\tTEST_CASE(test_many_lvars),\n+\t\tTEST_CASE(test_large_lvar),\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",
        "v6",
        "2/6"
    ]
}