List patch comments

GET /api/patches/73450/comments/?format=api&order=-date
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Link: 
<https://patches.dpdk.org/api/patches/73450/comments/?format=api&order=-date&page=1>; rel="first",
<https://patches.dpdk.org/api/patches/73450/comments/?format=api&order=-date&page=1>; rel="last"
Vary: Accept
[ { "id": 115528, "web_url": "https://patches.dpdk.org/comment/115528/", "msgid": "<HE1PR0801MB20258C304AE23716F6CE67999E670@HE1PR0801MB2025.eurprd08.prod.outlook.com>", "list_archive_url": "https://inbox.dpdk.org/dev/HE1PR0801MB20258C304AE23716F6CE67999E670@HE1PR0801MB2025.eurprd08.prod.outlook.com", "date": "2020-07-08T14:00:57", "subject": "Re: [dpdk-dev] [PATCH v7 2/3] test/lpm: add LPM RCU integration\n\tfunctional tests", "submitter": { "id": 1198, "url": "https://patches.dpdk.org/api/people/1198/?format=api", "name": "Ruifeng Wang", "email": "ruifeng.wang@arm.com" }, "content": "From: Medvedkin, Vladimir <vladimir.medvedkin@intel.com>\nSent: Wednesday, July 8, 2020 8:37 PM\nTo: Ruifeng Wang <Ruifeng.Wang@arm.com>; Bruce Richardson <bruce.richardson@intel.com>\nCc: dev@dpdk.org; mdr@ashroe.eu; konstantin.ananyev@intel.com; Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>; nd <nd@arm.com>\nSubject: Re: [PATCH v7 2/3] test/lpm: add LPM RCU integration functional tests\n\n\nHi Ruifeng,\n\nJust a few nits\n\n[Ruifeng] Thank you for reviewing this patch.\nOn 07/07/2020 16:15, Ruifeng Wang wrote:\n\nAdd positive and negative tests for API rte_lpm_rcu_qsbr_add.\n\nAlso test LPM library behavior when RCU QSBR is enabled.\n\n\n\nSigned-off-by: Ruifeng Wang <ruifeng.wang@arm.com><mailto:ruifeng.wang@arm.com>\n\nReviewed-by: Gavin Hu <gavin.hu@arm.com><mailto:gavin.hu@arm.com>\n\nReviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com><mailto:honnappa.nagarahalli@arm.com>\n\n---\n\n app/test/test_lpm.c | 291 +++++++++++++++++++++++++++++++++++++++++++-\n\n 1 file changed, 290 insertions(+), 1 deletion(-)\n\n\n\ndiff --git a/app/test/test_lpm.c b/app/test/test_lpm.c\n\nindex 3a3fd097f..93742e3c7 100644\n\n--- a/app/test/test_lpm.c\n\n+++ b/app/test/test_lpm.c\n\n@@ -8,6 +8,7 @@\n\n\n\n #include <rte_ip.h>\n\n #include <rte_lpm.h>\n\n+#include <rte_malloc.h>\n\n\n\n #include \"test.h\"\n\n #include \"test_xmmt_ops.h\"\n\n@@ -40,6 +41,9 @@ static int32_t test15(void);\n\n static int32_t test16(void);\n\n static int32_t test17(void);\n\n static int32_t test18(void);\n\n+static int32_t test19(void);\n\n+static int32_t test20(void);\n\n+static int32_t test21(void);\n\n\n\n rte_lpm_test tests[] = {\n\n /* Test Cases */\n\n@@ -61,7 +65,10 @@ rte_lpm_test tests[] = {\n\n test15,\n\n test16,\n\n test17,\n\n- test18\n\n+ test18,\n\n+ test19,\n\n+ test20,\n\n+ test21\n\n };\n\n\n\n #define MAX_DEPTH 32\n\n@@ -1265,6 +1272,288 @@ test18(void)\n\n return PASS;\n\n }\n\n\n\n+/*\n\n+ * rte_lpm_rcu_qsbr_add positive and negative tests.\n\n+ * - Add RCU QSBR variable to LPM\n\n+ * - Add another RCU QSBR variable to LPM\n\n+ * - Check returns\n\n+ */\n\n+int32_t\n\n+test19(void)\n\n+{\n\n+ struct rte_lpm *lpm = NULL;\n\n+ struct rte_lpm_config config;\n\n+ size_t sz;\n\n+ struct rte_rcu_qsbr *qsv;\n\n+ struct rte_rcu_qsbr *qsv2;\n\n+ int32_t status;\n\n+ struct rte_lpm_rcu_config rcu_cfg = {0};\n\n+\n\n+ config.max_rules = MAX_RULES;\n\n+ config.number_tbl8s = NUMBER_TBL8S;\n\n+ config.flags = 0;\n\n+\n\n+ lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n\n+ TEST_LPM_ASSERT(lpm != NULL);\n\n+\n\n+ /* Create RCU QSBR variable */\n\n+ sz = rte_rcu_qsbr_get_memsize(RTE_MAX_LCORE);\n\n+ qsv = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n\n+ RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n\n+ TEST_LPM_ASSERT(qsv != NULL);\n\n+\n\n+ status = rte_rcu_qsbr_init(qsv, RTE_MAX_LCORE);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ rcu_cfg.v = qsv;\n\n+ /* Invalid QSBR mode */\n\n+ rcu_cfg.mode = 2;\n\n+ status = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n\n+ TEST_LPM_ASSERT(status != 0);\n\n+\n\n+ rcu_cfg.mode = RTE_LPM_QSBR_MODE_DQ;\n\n+ /* Attach RCU QSBR to LPM table */\n\n+ status = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ /* Create and attach another RCU QSBR to LPM table */\n\n+ qsv2 = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n\n+ RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n\n+ TEST_LPM_ASSERT(qsv2 != NULL);\n\n+\n\n+ rcu_cfg.v = qsv2;\n\n+ rcu_cfg.mode = RTE_LPM_QSBR_MODE_SYNC;\n\n+ status = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n\n+ TEST_LPM_ASSERT(status != 0);\n\n+\n\n+ rte_lpm_free(lpm);\n\n+ rte_free(qsv);\n\n+ rte_free(qsv2);\n\n+\n\n+ return PASS;\n\n+}\n\n+\n\n+/*\n\n+ * rte_lpm_rcu_qsbr_add DQ mode functional test.\n\n+ * Reader and writer are in the same thread in this test.\n\n+ * - Create LPM which supports 1 tbl8 group at max\n\n+ * - Add RCU QSBR variable to LPM\n\n+ * - Add a rule with depth=28 (> 24)\n\n+ * - Register a reader thread (not a real thread)\n\n+ * - Reader lookup existing rule\n\n+ * - Writer delete the rule\n\n+ * - Reader lookup the rule\n\n+ * - Writer re-add the rule (no available tbl8 group)\n\n+ * - Reader report quiescent state and unregister\n\n+ * - Writer re-add the rule\n\n+ * - Reader lookup the rule\n\n+ */\n\n+int32_t\n\n+test20(void)\n\n+{\n\n+ struct rte_lpm *lpm = NULL;\n\n+ struct rte_lpm_config config;\n\n+ size_t sz;\n\n+ struct rte_rcu_qsbr *qsv;\n\n+ int32_t status;\n\n+ uint32_t ip, next_hop, next_hop_return;\n\n+ uint8_t depth;\n\n+ struct rte_lpm_rcu_config rcu_cfg = {0};\n\n+\n\n+ config.max_rules = MAX_RULES;\n\n+ config.number_tbl8s = 1;\n\n+ config.flags = 0;\n\n+\n\n+ lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n\n+ TEST_LPM_ASSERT(lpm != NULL);\n\n+\n\n+ /* Create RCU QSBR variable */\n\n+ sz = rte_rcu_qsbr_get_memsize(1);\n\n+ qsv = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n\n+ RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n\n+ TEST_LPM_ASSERT(qsv != NULL);\n\n+\n\n+ status = rte_rcu_qsbr_init(qsv, 1);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ rcu_cfg.v = qsv;\n\n+ rcu_cfg.mode = RTE_LPM_QSBR_MODE_DQ;\n\n+ /* Attach RCU QSBR to LPM table */\n\n+ status = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ ip = RTE_IPV4(192, 18, 100, 100);\n\n\n\nThis is a globally routed ip, it looks like you missed \"6\" in the second octet. Here it is better to use the rfc5737 address, rather than rfc1918.\n\n[Ruifeng] Agreed. Use reserved address is better. Will change to rfc5737 address in next version.\n\n\n\n+ depth = 28;\n\n+ next_hop = 1;\n\n+ status = rte_lpm_add(lpm, ip, depth, next_hop);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+ TEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group);\n\n+\n\n+ /* Register pseudo reader */\n\n+ status = rte_rcu_qsbr_thread_register(qsv, 0);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+ rte_rcu_qsbr_thread_online(qsv, 0);\n\n+\n\n+ status = rte_lpm_lookup(lpm, ip, &next_hop_return);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+ TEST_LPM_ASSERT(next_hop_return == next_hop);\n\n+\n\n+ /* Writer update */\n\n+ status = rte_lpm_delete(lpm, ip, depth);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+ TEST_LPM_ASSERT(!lpm->tbl24[ip>>8].valid);\n\n+\n\n+ status = rte_lpm_lookup(lpm, ip, &next_hop_return);\n\n+ TEST_LPM_ASSERT(status != 0);\n\n+\n\n+ status = rte_lpm_add(lpm, ip, depth, next_hop);\n\n+ TEST_LPM_ASSERT(status != 0);\n\n+\n\n+ /* Reader quiescent */\n\n+ rte_rcu_qsbr_quiescent(qsv, 0);\n\n+\n\n+ status = rte_lpm_add(lpm, ip, depth, next_hop);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ rte_rcu_qsbr_thread_offline(qsv, 0);\n\n+ status = rte_rcu_qsbr_thread_unregister(qsv, 0);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ status = rte_lpm_lookup(lpm, ip, &next_hop_return);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+ TEST_LPM_ASSERT(next_hop_return == next_hop);\n\n+\n\n+ rte_lpm_free(lpm);\n\n+ rte_free(qsv);\n\n+\n\n+ return PASS;\n\n+}\n\n+\n\n+static struct rte_lpm *g_lpm;\n\n+static struct rte_rcu_qsbr *g_v;\n\n+static uint32_t g_ip = RTE_IPV4(192, 18, 100, 100);\n\n\n\nSame here as above\n\n[Ruifeng] Will change. Thank you.\n\n\n\n+static volatile uint8_t writer_done;\n\n+/* Report quiescent state interval every 1024 lookups. Larger critical\n\n+ * sections in reader will result in writer polling multiple times.\n\n+ */\n\n+#define QSBR_REPORTING_INTERVAL 1024\n\n+#define WRITER_ITERATIONS 512\n\n+\n\n+/*\n\n+ * Reader thread using rte_lpm data structure with RCU.\n\n+ */\n\n+static int\n\n+test_lpm_rcu_qsbr_reader(void *arg)\n\n+{\n\n+ int i;\n\n+ uint32_t next_hop_return = 0;\n\n+\n\n+ RTE_SET_USED(arg);\n\n+ /* Register this thread to report quiescent state */\n\n+ rte_rcu_qsbr_thread_register(g_v, 0);\n\n+ rte_rcu_qsbr_thread_online(g_v, 0);\n\n+\n\n+ do {\n\n+ for (i = 0; i < QSBR_REPORTING_INTERVAL; i++)\n\n+ rte_lpm_lookup(g_lpm, g_ip, &next_hop_return);\n\n+\n\n+ /* Update quiescent state */\n\n+ rte_rcu_qsbr_quiescent(g_v, 0);\n\n+ } while (!writer_done);\n\n+\n\n+ rte_rcu_qsbr_thread_offline(g_v, 0);\n\n+ rte_rcu_qsbr_thread_unregister(g_v, 0);\n\n+\n\n+ return 0;\n\n+}\n\n+\n\n+/*\n\n+ * rte_lpm_rcu_qsbr_add sync mode functional test.\n\n+ * 1 Reader and 1 writer. They cannot be in the same thread in this test.\n\n+ * - Create LPM which supports 1 tbl8 group at max\n\n+ * - Add RCU QSBR variable with sync mode to LPM\n\n+ * - Register a reader thread. Reader keeps looking up a specific rule.\n\n+ * - Writer keeps adding and deleting a specific rule with depth=28 (> 24)\n\n+ */\n\n+int32_t\n\n+test21(void)\n\n+{\n\n+ struct rte_lpm_config config;\n\n+ size_t sz;\n\n+ int32_t status;\n\n+ uint32_t i, next_hop;\n\n+ uint8_t depth;\n\n+ struct rte_lpm_rcu_config rcu_cfg = {0};\n\n+\n\n+ if (rte_lcore_count() < 2) {\n\n+ printf(\"Not enough cores for %s, expecting at least 2\\n\",\n\n+ __func__);\n\n+ return TEST_SKIPPED;\n\n+ }\n\n+\n\n+ config.max_rules = MAX_RULES;\n\n+ config.number_tbl8s = 1;\n\n+ config.flags = 0;\n\n+\n\n+ g_lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n\n+ TEST_LPM_ASSERT(g_lpm != NULL);\n\n+\n\n+ /* Create RCU QSBR variable */\n\n+ sz = rte_rcu_qsbr_get_memsize(1);\n\n+ g_v = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n\n+ RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n\n+ TEST_LPM_ASSERT(g_v != NULL);\n\n+\n\n+ status = rte_rcu_qsbr_init(g_v, 1);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ rcu_cfg.v = g_v;\n\n+ rcu_cfg.mode = RTE_LPM_QSBR_MODE_SYNC;\n\n+ /* Attach RCU QSBR to LPM table */\n\n+ status = rte_lpm_rcu_qsbr_add(g_lpm, &rcu_cfg, NULL);\n\n+ TEST_LPM_ASSERT(status == 0);\n\n+\n\n+ writer_done = 0;\n\n+ /* Launch reader thread */\n\n+ rte_eal_remote_launch(test_lpm_rcu_qsbr_reader, NULL,\n\n+ rte_get_next_lcore(-1, 1, 0));\n\n+\n\n+ depth = 28;\n\n+ next_hop = 1;\n\n+ status = rte_lpm_add(g_lpm, g_ip, depth, next_hop);\n\n+ if (status != 0) {\n\n+ printf(\"%s: Failed to add rule\\n\", __func__);\n\n+ goto error;\n\n+ }\n\n+\n\n+ /* Writer update */\n\n+ for (i = 0; i < WRITER_ITERATIONS; i++) {\n\n+ status = rte_lpm_delete(g_lpm, g_ip, depth);\n\n+ if (status != 0) {\n\n+ printf(\"%s: Failed to delete rule at iteration %d\\n\",\n\n+ __func__, i);\n\n+ goto error;\n\n+ }\n\n+\n\n+ status = rte_lpm_add(g_lpm, g_ip, depth, next_hop);\n\n+ if (status != 0) {\n\n+ printf(\"%s: Failed to add rule at iteration %d\\n\",\n\n+ __func__, i);\n\n+ goto error;\n\n+ }\n\n+ }\n\n+\n\n+error:\n\n+ writer_done = 1;\n\n+ /* Wait until reader exited. */\n\n+ rte_eal_mp_wait_lcore();\n\n+\n\n+ rte_lpm_free(g_lpm);\n\n+ rte_free(g_v);\n\n+\n\n+ return (status == 0) ? PASS : -1;\n\n+}\n\n+\n\n /*\n\n * Do all unit tests.\n\n */\n\n\n\nAcked-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com><mailto:vladimir.medvedkin@intel.com>\n\n\n\n\n\n\n\n--\n\nRegards,\n\nVladimir", "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 833F9A0526;\n\tWed, 8 Jul 2020 16:01:12 +0200 (CEST)", "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5AF2A1D643;\n\tWed, 8 Jul 2020 16:01:12 +0200 (CEST)", "from EUR04-DB3-obe.outbound.protection.outlook.com\n (mail-eopbgr60056.outbound.protection.outlook.com [40.107.6.56])\n by dpdk.org (Postfix) with ESMTP id 040F11D5BB\n for <dev@dpdk.org>; Wed, 8 Jul 2020 16:01:11 +0200 (CEST)", "from AM6P193CA0056.EURP193.PROD.OUTLOOK.COM (2603:10a6:209:8e::33)\n by AM0PR08MB4116.eurprd08.prod.outlook.com (2603:10a6:208:131::32) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3174.20; Wed, 8 Jul\n 2020 14:01:06 +0000", "from AM5EUR03FT015.eop-EUR03.prod.protection.outlook.com\n (2603:10a6:209:8e:cafe::99) by AM6P193CA0056.outlook.office365.com\n (2603:10a6:209:8e::33) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3174.21 via Frontend\n Transport; Wed, 8 Jul 2020 14:01:06 +0000", "from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by\n AM5EUR03FT015.mail.protection.outlook.com (10.152.16.132) with\n Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.3174.21 via Frontend Transport; Wed, 8 Jul 2020 14:01:06 +0000", "(\"Tessian outbound b8ad5ab47c8c:v62\");\n Wed, 08 Jul 2020 14:01:06 +0000", "from 190d82e3e429.1\n by 64aa7808-outbound-1.mta.getcheckrecipient.com id\n 76B7384C-BB8B-4A61-AF74-BBE1FE60FF2A.1;\n Wed, 08 Jul 2020 14:01:01 +0000", "from EUR05-AM6-obe.outbound.protection.outlook.com\n by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id\n 190d82e3e429.1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384);\n Wed, 08 Jul 2020 14:01:01 +0000", "from HE1PR0801MB2025.eurprd08.prod.outlook.com (2603:10a6:3:50::14)\n by HE1PR08MB2795.eurprd08.prod.outlook.com (2603:10a6:7:33::31) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3153.27; Wed, 8 Jul\n 2020 14:00:57 +0000", "from HE1PR0801MB2025.eurprd08.prod.outlook.com\n ([fe80::e863:15c9:b803:6533]) by HE1PR0801MB2025.eurprd08.prod.outlook.com\n ([fe80::e863:15c9:b803:6533%7]) with mapi id 15.20.3174.021; Wed, 8 Jul 2020\n 14:00:57 +0000" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com;\n s=selector2-armh-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=6a1JCEcufzWyRBNSeNKi82ytdHMGvi0EnDCPOKam0GY=;\n b=D/HmA3sVWOEh/2sHJuc292uGBrsnlGF4LAeT7TaLKqSMyojPR1wviaXF4qxXuwy8k8jqZOmEt6e94olenAOpqmLh58TNTR0/VMjbAsYxjBscd/zmQRF+Y9N8PN8N1POQOAuaxGTi6mdJ90uS4VPniFb0+B/QKBsAqzDiWywSF6k=", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com;\n s=selector2-armh-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=6a1JCEcufzWyRBNSeNKi82ytdHMGvi0EnDCPOKam0GY=;\n b=D/HmA3sVWOEh/2sHJuc292uGBrsnlGF4LAeT7TaLKqSMyojPR1wviaXF4qxXuwy8k8jqZOmEt6e94olenAOpqmLh58TNTR0/VMjbAsYxjBscd/zmQRF+Y9N8PN8N1POQOAuaxGTi6mdJ90uS4VPniFb0+B/QKBsAqzDiWywSF6k=" ], "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 63.35.35.123)\n smtp.mailfrom=arm.com; dpdk.org; dkim=pass (signature was verified)\n header.d=armh.onmicrosoft.com;dpdk.org; dmarc=bestguesspass action=none\n header.from=arm.com;", "Received-SPF": "Pass (protection.outlook.com: domain of arm.com designates\n 63.35.35.123 as permitted sender) receiver=protection.outlook.com;\n client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com;", "X-CR-MTA-TID": "64aa7808", "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=jdxYdJGyPREZQo2e7Uov2+YyNcVIQKZZrAQeAQQHgKvwgLtiEn5ddbkw93UH9KP5mIqM0iUQe8Qsbi70xtiarOkR81sG4Cp44ZwvuG6zFc4rDkW5AAHjFtxrJeNW+vr8vrSMYmMfMR88dfgj9IbNHSjWNBPx3jFx82kw57sjgEN/bVjnZ+HmNoVSkJxVWUCJJInhTQhtx0qInhBUaAkWjQBvDFWMuID2RxE5NRhR2DPv2Zcpb6HbB5O6bxXpgN2VUshc9bSoqHvjlhKv46g8qFdZPYIlibv0mvfywCG+0Ps8lpsuzp0ylwQ+t1w9hibu+DC2lmeIHWr/QhDYAkhwSA==", "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-SenderADCheck;\n bh=6a1JCEcufzWyRBNSeNKi82ytdHMGvi0EnDCPOKam0GY=;\n b=DVv7gsV+dElY260bzR74ovaQDK0y5Wv+3TU+fZ8fstTTrVmFyyeR1mjWCZuvjHgD/RVmynpPwABRwq8o9a1vSSHEL+Rrjnnx0vMm3n3aVUq+wcXu+GEmFhMWykVkit04OB0pqzbnOC900mXdVc+19udmY61tPlBQDHNKKyja493B/U0S/NXZCW27NhYT4GeW7u12vtxkoJuppbGYDV5dlmcekv9GyVyzMsDRlUMHjJUxr3PG5txgLtZZtD67UhXkt2IDIdWXRC7c7r+GKVEc2TxVN7B8YI69bwzmuCG50Ikfrj3+m16sY5xtaPN3HKu338493dDG5bbRmEtBspKelg==", "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass\n header.d=arm.com; arc=none", "From": "Ruifeng Wang <Ruifeng.Wang@arm.com>", "To": "\"Medvedkin, Vladimir\" <vladimir.medvedkin@intel.com>, Bruce Richardson\n <bruce.richardson@intel.com>", "CC": "\"dev@dpdk.org\" <dev@dpdk.org>, \"mdr@ashroe.eu\" <mdr@ashroe.eu>,\n \"konstantin.ananyev@intel.com\" <konstantin.ananyev@intel.com>, Honnappa\n Nagarahalli <Honnappa.Nagarahalli@arm.com>, nd <nd@arm.com>, nd <nd@arm.com>", "Thread-Topic": "[PATCH v7 2/3] test/lpm: add LPM RCU integration functional\n tests", "Thread-Index": "AQHWVHGaZQQDWRy9/UanDoRNDP1kkqj9oCIAgAAWZJA=", "Date": "Wed, 8 Jul 2020 14:00:57 +0000", "Message-ID": "\n <HE1PR0801MB20258C304AE23716F6CE67999E670@HE1PR0801MB2025.eurprd08.prod.outlook.com>", "References": "<20190906094534.36060-1-ruifeng.wang@arm.com>\n <20200707151554.64431-1-ruifeng.wang@arm.com>\n <20200707151554.64431-3-ruifeng.wang@arm.com>\n <b3f83d51-0e0a-49ab-adf3-0b4ae3bdd3e4@intel.com>", "In-Reply-To": "<b3f83d51-0e0a-49ab-adf3-0b4ae3bdd3e4@intel.com>", "Accept-Language": "en-US", "Content-Language": "en-US", "X-MS-Has-Attach": "", "X-MS-TNEF-Correlator": "", "x-ts-tracking-id": "961f54a5-eaa1-4c85-9ea4-0bce7e56f05f.0", "x-checkrecipientchecked": "true", "Authentication-Results-Original": "intel.com; dkim=none (message not signed)\n header.d=none;intel.com; dmarc=none action=none header.from=arm.com;", "x-originating-ip": "[203.126.0.113]", "x-ms-publictraffictype": "Email", "X-MS-Office365-Filtering-HT": "Tenant", "X-MS-Office365-Filtering-Correlation-Id": "1b226ed3-b888-463b-ea12-08d823475bfd", "x-ms-traffictypediagnostic": "HE1PR08MB2795:|AM0PR08MB4116:", "x-ms-exchange-transport-forked": "True", "X-Microsoft-Antispam-PRVS": "\n <AM0PR08MB4116C32C196B3A61C36DA78E9E670@AM0PR08MB4116.eurprd08.prod.outlook.com>", "x-checkrecipientrouted": "true", "nodisclaimer": "true", "x-ms-oob-tlc-oobclassifiers": "OLM:2657;OLM:2657;", "x-forefront-prvs": "04583CED1A", "X-MS-Exchange-SenderADCheck": "1", "X-Microsoft-Antispam-Untrusted": "BCL:0;", "X-Microsoft-Antispam-Message-Info-Original": "\n 9OJvlJ0vIo7q7ZUwBilFbBlUUr9OxsGlxRnm9cQKwYrP54A6swd2mlB7Su+EyeoXVXU6xRPxCaAcm/xLPBqmhsaIIIxfjpClB9nHwZqtf/2XztC4afN4nkW4NlFUfl2w7lJM+hFtdT4Du7g77Du6bHo2+nUoojJtM8WBPtAW0rYEhO3DjGX+QRf0Lc6ocfMjlNjCjonIG98UP0lYQ73C3UiRUHWeGXrxfXxYsiPDKIZBIrmwYYiaRf3/yzzJKMJXr5Vi5xmXeW7DfQYTHafGsB5NXaGuEhJvNhAx+zjC/9t4rReg8znpEq9AGUG5Wtpn", "X-Forefront-Antispam-Report-Untrusted": "CIP:255.255.255.255; CTRY:; LANG:en;\n SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1PR0801MB2025.eurprd08.prod.outlook.com;\n PTR:; CAT:NONE; SFTY:;\n SFS:(4636009)(366004)(346002)(136003)(376002)(396003)(39860400002)(26005)(66476007)(66446008)(6506007)(64756008)(66946007)(53546011)(186003)(66556008)(2906002)(4326008)(7696005)(8936002)(5660300002)(83380400001)(55016002)(86362001)(76116006)(9686003)(52536014)(8676002)(316002)(478600001)(54906003)(33656002)(110136005)(71200400001);\n DIR:OUT; SFP:1101;", "x-ms-exchange-antispam-messagedata": "\n NW9vZatV3ItpbdJMq8PxOgfnBDKrXU0epg6XT48+uPthoZpeH0xR2592cHQuT0jMaZHhnUEFlxeLbiAtngU/PiNi15aJuLtdpa4/fGl0NtEhHf3djt5owF9jXtKOsbnj3j3obfOsGTNNEQDA7TPEv5YFewzrNHilWIaycgHVmcJkokG+6x0FBCSK3X2w3v6TLmYJJ2OgUJb55ehh+t6HSqQpEXj8UoS4ypi2wGzdbtMDSJuIDjgNNz0Z1ivFfQfAfRcu/FLbIUuAPS0m3v2A8FqUqpKKNB2J8BNN1WbXuy4f5HWhC5pXeo9XCKACRn2zfeZ4G5QPzwaR6kBNrjakLtXpFiXTXrK1rMiGPtxix8YCM09ql1GwN7WCBNgQZnO4wegHYCYKMWjKsXVWD6FTFkXUaxxmMQP/P2TKVKfcFoiUL6Aok9LAZ//vXcLTSVOzcZ5zVuP6GNOyCZOd8rNlkB5STe9HhfKt73CjibfJWtc=", "MIME-Version": "1.0", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": [ "HE1PR08MB2795", "AM0PR08MB4116" ], "Original-Authentication-Results": "intel.com; dkim=none (message not signed)\n header.d=none;intel.com; dmarc=none action=none header.from=arm.com;", "X-EOPAttributedMessage": "0", "X-MS-Exchange-Transport-CrossTenantHeadersStripped": "\n AM5EUR03FT015.eop-EUR03.prod.protection.outlook.com", "X-Forefront-Antispam-Report": "CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:;\n IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com;\n PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFTY:;\n SFS:(4636009)(396003)(346002)(39860400002)(136003)(376002)(46966005)(33964004)(26005)(36906005)(70586007)(30864003)(53546011)(4326008)(478600001)(6506007)(47076004)(186003)(82310400002)(70206006)(83380400001)(336012)(2906002)(54906003)(9686003)(110136005)(55016002)(316002)(8936002)(52536014)(356005)(86362001)(5660300002)(81166007)(8676002)(82740400003)(33656002)(7696005)(579004);\n DIR:OUT; SFP:1101;", "X-MS-Office365-Filtering-Correlation-Id-Prvs": "\n 592f0aa5-9ba1-4490-625c-08d8234756b8", "X-Microsoft-Antispam": "BCL:0;", "X-Microsoft-Antispam-Message-Info": "\n VIvz4bRad/gXFpdnzP10biRUgsoxiXBXqRcn0xB3brHl3pHk3aYj0/7yyCfBf2+4Q5fEq0S73lA5QvmUVZ6yRezpqBYKbqSGDhH39mx7H5OEuZLwnhd3G6EvE6M6frgXZJkn2mnYeHHRCvDHPqNOGaeb0l1P95d33kGV6AWAvI94A++1YQiXINBWA/nIB48ONnJhN1alcZH1s6TVaxZ6PGSmE11r4f2XaBYBGwPKknrzPlGet4bL/BxYay2mz0zRblaFSJ6JYmUYbSPtp6j3RzMSqJMKldeU0uT7/jefcHKqTJdLZbUV39VtregZ6Ld7WwTUYuoGVquynRr89wD/Dk3w0lO/u27y0MEtcz9pO9CnU0wF4GJABL42jnCy6LWEOyikUHj36OdVN88tdS7H/w==", "X-OriginatorOrg": "arm.com", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 Jul 2020 14:01:06.5082 (UTC)", "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 1b226ed3-b888-463b-ea12-08d823475bfd", "X-MS-Exchange-CrossTenant-Id": "f34e5979-57d9-4aaa-ad4d-b122a662184d", "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123];\n Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com]", "X-MS-Exchange-CrossTenant-AuthSource": "\n AM5EUR03FT015.eop-EUR03.prod.protection.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous", "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "X-Content-Filtered-By": "Mailman/MimeDel 2.1.15", "Subject": "Re: [dpdk-dev] [PATCH v7 2/3] test/lpm: add LPM RCU integration\n\tfunctional tests", "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>" }, "addressed": null }, { "id": 115512, "web_url": "https://patches.dpdk.org/comment/115512/", "msgid": "<b3f83d51-0e0a-49ab-adf3-0b4ae3bdd3e4@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/b3f83d51-0e0a-49ab-adf3-0b4ae3bdd3e4@intel.com", "date": "2020-07-08T12:37:16", "subject": "Re: [dpdk-dev] [PATCH v7 2/3] test/lpm: add LPM RCU integration\n\tfunctional tests", "submitter": { "id": 1216, "url": "https://patches.dpdk.org/api/people/1216/?format=api", "name": "Vladimir Medvedkin", "email": "vladimir.medvedkin@intel.com" }, "content": "Hi Ruifeng,\n\nJust a few nits\n\nOn 07/07/2020 16:15, Ruifeng Wang wrote:\n> Add positive and negative tests for API rte_lpm_rcu_qsbr_add.\n> Also test LPM library behavior when RCU QSBR is enabled.\n>\n> Signed-off-by: Ruifeng Wang <ruifeng.wang@arm.com>\n> Reviewed-by: Gavin Hu <gavin.hu@arm.com>\n> Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>\n> ---\n> app/test/test_lpm.c | 291 +++++++++++++++++++++++++++++++++++++++++++-\n> 1 file changed, 290 insertions(+), 1 deletion(-)\n>\n> diff --git a/app/test/test_lpm.c b/app/test/test_lpm.c\n> index 3a3fd097f..93742e3c7 100644\n> --- a/app/test/test_lpm.c\n> +++ b/app/test/test_lpm.c\n> @@ -8,6 +8,7 @@\n> \n> #include <rte_ip.h>\n> #include <rte_lpm.h>\n> +#include <rte_malloc.h>\n> \n> #include \"test.h\"\n> #include \"test_xmmt_ops.h\"\n> @@ -40,6 +41,9 @@ static int32_t test15(void);\n> static int32_t test16(void);\n> static int32_t test17(void);\n> static int32_t test18(void);\n> +static int32_t test19(void);\n> +static int32_t test20(void);\n> +static int32_t test21(void);\n> \n> rte_lpm_test tests[] = {\n> /* Test Cases */\n> @@ -61,7 +65,10 @@ rte_lpm_test tests[] = {\n> \ttest15,\n> \ttest16,\n> \ttest17,\n> -\ttest18\n> +\ttest18,\n> +\ttest19,\n> +\ttest20,\n> +\ttest21\n> };\n> \n> #define MAX_DEPTH 32\n> @@ -1265,6 +1272,288 @@ test18(void)\n> \treturn PASS;\n> }\n> \n> +/*\n> + * rte_lpm_rcu_qsbr_add positive and negative tests.\n> + * - Add RCU QSBR variable to LPM\n> + * - Add another RCU QSBR variable to LPM\n> + * - Check returns\n> + */\n> +int32_t\n> +test19(void)\n> +{\n> +\tstruct rte_lpm *lpm = NULL;\n> +\tstruct rte_lpm_config config;\n> +\tsize_t sz;\n> +\tstruct rte_rcu_qsbr *qsv;\n> +\tstruct rte_rcu_qsbr *qsv2;\n> +\tint32_t status;\n> +\tstruct rte_lpm_rcu_config rcu_cfg = {0};\n> +\n> +\tconfig.max_rules = MAX_RULES;\n> +\tconfig.number_tbl8s = NUMBER_TBL8S;\n> +\tconfig.flags = 0;\n> +\n> +\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n> +\tTEST_LPM_ASSERT(lpm != NULL);\n> +\n> +\t/* Create RCU QSBR variable */\n> +\tsz = rte_rcu_qsbr_get_memsize(RTE_MAX_LCORE);\n> +\tqsv = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n> +\t\t\t\t\tRTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n> +\tTEST_LPM_ASSERT(qsv != NULL);\n> +\n> +\tstatus = rte_rcu_qsbr_init(qsv, RTE_MAX_LCORE);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\trcu_cfg.v = qsv;\n> +\t/* Invalid QSBR mode */\n> +\trcu_cfg.mode = 2;\n> +\tstatus = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n> +\tTEST_LPM_ASSERT(status != 0);\n> +\n> +\trcu_cfg.mode = RTE_LPM_QSBR_MODE_DQ;\n> +\t/* Attach RCU QSBR to LPM table */\n> +\tstatus = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\t/* Create and attach another RCU QSBR to LPM table */\n> +\tqsv2 = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n> +\t\t\t\t\tRTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n> +\tTEST_LPM_ASSERT(qsv2 != NULL);\n> +\n> +\trcu_cfg.v = qsv2;\n> +\trcu_cfg.mode = RTE_LPM_QSBR_MODE_SYNC;\n> +\tstatus = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n> +\tTEST_LPM_ASSERT(status != 0);\n> +\n> +\trte_lpm_free(lpm);\n> +\trte_free(qsv);\n> +\trte_free(qsv2);\n> +\n> +\treturn PASS;\n> +}\n> +\n> +/*\n> + * rte_lpm_rcu_qsbr_add DQ mode functional test.\n> + * Reader and writer are in the same thread in this test.\n> + * - Create LPM which supports 1 tbl8 group at max\n> + * - Add RCU QSBR variable to LPM\n> + * - Add a rule with depth=28 (> 24)\n> + * - Register a reader thread (not a real thread)\n> + * - Reader lookup existing rule\n> + * - Writer delete the rule\n> + * - Reader lookup the rule\n> + * - Writer re-add the rule (no available tbl8 group)\n> + * - Reader report quiescent state and unregister\n> + * - Writer re-add the rule\n> + * - Reader lookup the rule\n> + */\n> +int32_t\n> +test20(void)\n> +{\n> +\tstruct rte_lpm *lpm = NULL;\n> +\tstruct rte_lpm_config config;\n> +\tsize_t sz;\n> +\tstruct rte_rcu_qsbr *qsv;\n> +\tint32_t status;\n> +\tuint32_t ip, next_hop, next_hop_return;\n> +\tuint8_t depth;\n> +\tstruct rte_lpm_rcu_config rcu_cfg = {0};\n> +\n> +\tconfig.max_rules = MAX_RULES;\n> +\tconfig.number_tbl8s = 1;\n> +\tconfig.flags = 0;\n> +\n> +\tlpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n> +\tTEST_LPM_ASSERT(lpm != NULL);\n> +\n> +\t/* Create RCU QSBR variable */\n> +\tsz = rte_rcu_qsbr_get_memsize(1);\n> +\tqsv = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n> +\t\t\t\tRTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n> +\tTEST_LPM_ASSERT(qsv != NULL);\n> +\n> +\tstatus = rte_rcu_qsbr_init(qsv, 1);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\trcu_cfg.v = qsv;\n> +\trcu_cfg.mode = RTE_LPM_QSBR_MODE_DQ;\n> +\t/* Attach RCU QSBR to LPM table */\n> +\tstatus = rte_lpm_rcu_qsbr_add(lpm, &rcu_cfg, NULL);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\tip = RTE_IPV4(192, 18, 100, 100);\n\n\nThis is a globally routed ip, it looks like you missed \"6\" in the second \noctet. Here it is better to use the rfc5737 address, rather than rfc1918.\n\n\n> +\tdepth = 28;\n> +\tnext_hop = 1;\n> +\tstatus = rte_lpm_add(lpm, ip, depth, next_hop);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\tTEST_LPM_ASSERT(lpm->tbl24[ip>>8].valid_group);\n> +\n> +\t/* Register pseudo reader */\n> +\tstatus = rte_rcu_qsbr_thread_register(qsv, 0);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\trte_rcu_qsbr_thread_online(qsv, 0);\n> +\n> +\tstatus = rte_lpm_lookup(lpm, ip, &next_hop_return);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\tTEST_LPM_ASSERT(next_hop_return == next_hop);\n> +\n> +\t/* Writer update */\n> +\tstatus = rte_lpm_delete(lpm, ip, depth);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\tTEST_LPM_ASSERT(!lpm->tbl24[ip>>8].valid);\n> +\n> +\tstatus = rte_lpm_lookup(lpm, ip, &next_hop_return);\n> +\tTEST_LPM_ASSERT(status != 0);\n> +\n> +\tstatus = rte_lpm_add(lpm, ip, depth, next_hop);\n> +\tTEST_LPM_ASSERT(status != 0);\n> +\n> +\t/* Reader quiescent */\n> +\trte_rcu_qsbr_quiescent(qsv, 0);\n> +\n> +\tstatus = rte_lpm_add(lpm, ip, depth, next_hop);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\trte_rcu_qsbr_thread_offline(qsv, 0);\n> +\tstatus = rte_rcu_qsbr_thread_unregister(qsv, 0);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\tstatus = rte_lpm_lookup(lpm, ip, &next_hop_return);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\tTEST_LPM_ASSERT(next_hop_return == next_hop);\n> +\n> +\trte_lpm_free(lpm);\n> +\trte_free(qsv);\n> +\n> +\treturn PASS;\n> +}\n> +\n> +static struct rte_lpm *g_lpm;\n> +static struct rte_rcu_qsbr *g_v;\n> +static uint32_t g_ip = RTE_IPV4(192, 18, 100, 100);\n\n\nSame here as above\n\n\n> +static volatile uint8_t writer_done;\n> +/* Report quiescent state interval every 1024 lookups. Larger critical\n> + * sections in reader will result in writer polling multiple times.\n> + */\n> +#define QSBR_REPORTING_INTERVAL 1024\n> +#define WRITER_ITERATIONS\t512\n> +\n> +/*\n> + * Reader thread using rte_lpm data structure with RCU.\n> + */\n> +static int\n> +test_lpm_rcu_qsbr_reader(void *arg)\n> +{\n> +\tint i;\n> +\tuint32_t next_hop_return = 0;\n> +\n> +\tRTE_SET_USED(arg);\n> +\t/* Register this thread to report quiescent state */\n> +\trte_rcu_qsbr_thread_register(g_v, 0);\n> +\trte_rcu_qsbr_thread_online(g_v, 0);\n> +\n> +\tdo {\n> +\t\tfor (i = 0; i < QSBR_REPORTING_INTERVAL; i++)\n> +\t\t\trte_lpm_lookup(g_lpm, g_ip, &next_hop_return);\n> +\n> +\t\t/* Update quiescent state */\n> +\t\trte_rcu_qsbr_quiescent(g_v, 0);\n> +\t} while (!writer_done);\n> +\n> +\trte_rcu_qsbr_thread_offline(g_v, 0);\n> +\trte_rcu_qsbr_thread_unregister(g_v, 0);\n> +\n> +\treturn 0;\n> +}\n> +\n> +/*\n> + * rte_lpm_rcu_qsbr_add sync mode functional test.\n> + * 1 Reader and 1 writer. They cannot be in the same thread in this test.\n> + * - Create LPM which supports 1 tbl8 group at max\n> + * - Add RCU QSBR variable with sync mode to LPM\n> + * - Register a reader thread. Reader keeps looking up a specific rule.\n> + * - Writer keeps adding and deleting a specific rule with depth=28 (> 24)\n> + */\n> +int32_t\n> +test21(void)\n> +{\n> +\tstruct rte_lpm_config config;\n> +\tsize_t sz;\n> +\tint32_t status;\n> +\tuint32_t i, next_hop;\n> +\tuint8_t depth;\n> +\tstruct rte_lpm_rcu_config rcu_cfg = {0};\n> +\n> +\tif (rte_lcore_count() < 2) {\n> +\t\tprintf(\"Not enough cores for %s, expecting at least 2\\n\",\n> +\t\t\t__func__);\n> +\t\treturn TEST_SKIPPED;\n> +\t}\n> +\n> +\tconfig.max_rules = MAX_RULES;\n> +\tconfig.number_tbl8s = 1;\n> +\tconfig.flags = 0;\n> +\n> +\tg_lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, &config);\n> +\tTEST_LPM_ASSERT(g_lpm != NULL);\n> +\n> +\t/* Create RCU QSBR variable */\n> +\tsz = rte_rcu_qsbr_get_memsize(1);\n> +\tg_v = (struct rte_rcu_qsbr *)rte_zmalloc_socket(NULL, sz,\n> +\t\t\t\tRTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);\n> +\tTEST_LPM_ASSERT(g_v != NULL);\n> +\n> +\tstatus = rte_rcu_qsbr_init(g_v, 1);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\trcu_cfg.v = g_v;\n> +\trcu_cfg.mode = RTE_LPM_QSBR_MODE_SYNC;\n> +\t/* Attach RCU QSBR to LPM table */\n> +\tstatus = rte_lpm_rcu_qsbr_add(g_lpm, &rcu_cfg, NULL);\n> +\tTEST_LPM_ASSERT(status == 0);\n> +\n> +\twriter_done = 0;\n> +\t/* Launch reader thread */\n> +\trte_eal_remote_launch(test_lpm_rcu_qsbr_reader, NULL,\n> +\t\t\t\trte_get_next_lcore(-1, 1, 0));\n> +\n> +\tdepth = 28;\n> +\tnext_hop = 1;\n> +\tstatus = rte_lpm_add(g_lpm, g_ip, depth, next_hop);\n> +\tif (status != 0) {\n> +\t\tprintf(\"%s: Failed to add rule\\n\", __func__);\n> +\t\tgoto error;\n> +\t}\n> +\n> +\t/* Writer update */\n> +\tfor (i = 0; i < WRITER_ITERATIONS; i++) {\n> +\t\tstatus = rte_lpm_delete(g_lpm, g_ip, depth);\n> +\t\tif (status != 0) {\n> +\t\t\tprintf(\"%s: Failed to delete rule at iteration %d\\n\",\n> +\t\t\t\t__func__, i);\n> +\t\t\tgoto error;\n> +\t\t}\n> +\n> +\t\tstatus = rte_lpm_add(g_lpm, g_ip, depth, next_hop);\n> +\t\tif (status != 0) {\n> +\t\t\tprintf(\"%s: Failed to add rule at iteration %d\\n\",\n> +\t\t\t\t__func__, i);\n> +\t\t\tgoto error;\n> +\t\t}\n> +\t}\n> +\n> +error:\n> +\twriter_done = 1;\n> +\t/* Wait until reader exited. */\n> +\trte_eal_mp_wait_lcore();\n> +\n> +\trte_lpm_free(g_lpm);\n> +\trte_free(g_v);\n> +\n> +\treturn (status == 0) ? PASS : -1;\n> +}\n> +\n> /*\n> * Do all unit tests.\n> */\n\nAcked-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>", "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 42CECA0526;\n\tWed, 8 Jul 2020 14:37:23 +0200 (CEST)", "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 1679A1DD10;\n\tWed, 8 Jul 2020 14:37:23 +0200 (CEST)", "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by dpdk.org (Postfix) with ESMTP id 7E99B1DD3E\n for <dev@dpdk.org>; Wed, 8 Jul 2020 14:37:20 +0200 (CEST)", "from fmsmga002.fm.intel.com ([10.253.24.26])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Jul 2020 05:37:19 -0700", "from vmedvedk-mobl.ger.corp.intel.com (HELO [10.213.247.70])\n ([10.213.247.70])\n by fmsmga002.fm.intel.com with ESMTP; 08 Jul 2020 05:37:17 -0700" ], "IronPort-SDR": [ "\n IaYs+2KZ0TiQlUZsVtgCGcsDNcbD1qpFG8Fl2UIXu9dufXN9efdWZxLOFYgFlfThlxvFpoh7rR\n 3fmqPbT3033w==", "\n GxPRa749xxrlu+jEzT0/t8bSHNaKJmWKliE/U6a648/nQ+/Hs2QBGOyB7sM6ojMAHNmM+b3CfA\n sdqluC4BLLpA==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6000,8403,9675\"; a=\"136015206\"", "E=Sophos;i=\"5.75,327,1589266800\";\n d=\"scan'208,217\";a=\"136015206\"", "E=Sophos;i=\"5.75,327,1589266800\";\n d=\"scan'208,217\";a=\"315856508\"" ], "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "To": "Ruifeng Wang <ruifeng.wang@arm.com>,\n Bruce Richardson <bruce.richardson@intel.com>", "Cc": "dev@dpdk.org, mdr@ashroe.eu, konstantin.ananyev@intel.com,\n honnappa.nagarahalli@arm.com, nd@arm.com", "References": "<20190906094534.36060-1-ruifeng.wang@arm.com>\n <20200707151554.64431-1-ruifeng.wang@arm.com>\n <20200707151554.64431-3-ruifeng.wang@arm.com>", "From": "\"Medvedkin, Vladimir\" <vladimir.medvedkin@intel.com>", "Message-ID": "<b3f83d51-0e0a-49ab-adf3-0b4ae3bdd3e4@intel.com>", "Date": "Wed, 8 Jul 2020 13:37:16 +0100", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101\n Thunderbird/68.10.0", "MIME-Version": "1.0", "In-Reply-To": "<20200707151554.64431-3-ruifeng.wang@arm.com>", "Content-Language": "en-US", "Content-Type": "text/plain; charset=utf-8; format=flowed", "Content-Transfer-Encoding": "7bit", "X-Content-Filtered-By": "Mailman/MimeDel 2.1.15", "Subject": "Re: [dpdk-dev] [PATCH v7 2/3] test/lpm: add LPM RCU integration\n\tfunctional tests", "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>" }, "addressed": null } ]