From patchwork Fri Mar 6 13:36:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 66343 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id AE985A056A; Fri, 6 Mar 2020 14:36:49 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7736E2BA8; Fri, 6 Mar 2020 14:36:47 +0100 (CET) Received: from mail-pj1-f67.google.com (mail-pj1-f67.google.com [209.85.216.67]) by dpdk.org (Postfix) with ESMTP id 0075FFEB for ; Fri, 6 Mar 2020 14:36:45 +0100 (CET) Received: by mail-pj1-f67.google.com with SMTP id gv19so1095644pjb.5 for ; Fri, 06 Mar 2020 05:36:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cvsTj1fFttzE6rSJxSy+EkOOrkUffj155JO3lhXUOLE=; b=JyjG1iDZDGYo0e0gwbFLdMB3+OscEgTg18zVPn5fA4gbk/s7Mt5q7Fkvo7ixGZYQbi 1KMrLcVs9gi5UxqQPt2rhqxF7JTgjL818aCB0Vr4BaN1EUtRapK2bi6EjaoSUFBWJA5B 3tRzlTegrLBTMISeveMy7rPmTWR4tvDOWbvJ00zOJ19hGdd2lANVo9Ibk8A3zcrN75Q1 N8NZgcNlNvDrmQExGh01xZOVBTzWMV+qRPPCrCIYrcgYCgXl9E3AY7kRlCMDExkkUKgw tp4+EacHM3/8RyLCTJT7BFC2aoyZ/HHPr7R1/MFc/GVTY11LdgYqq6N+VJ6231n6nBmt N9CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cvsTj1fFttzE6rSJxSy+EkOOrkUffj155JO3lhXUOLE=; b=EXofME3DheyqETmM7LxhyAQC/X56G84/RYO1lkA96g3ASKvMtZ4xQ+Tw0IgFc7rRvW ryq26+iV3junFC6yV9qnrPefCqViGnn5VBTLoiR7n5j2kad4rWI83M42dj+lyf3QeAIN N+/OXGtS5zHvCYiCbjdC+BUn5Y1vlU1Fh8UmmzDD89GCKKtOWXv6w4/VkuOwDjFHiCuC /TP8rZMU4UUv5UQOV0DDPghBx7z0IxxwXsZRtZQw7bepoiI2Kh/rA1N46zm3BUmsdsXu ZoM8YiaGQ+qAvfoixEQsheD8Yv33krKW7qkw+NK0I/IaT8SXPSHx7yDvh0cAbFHPCmUo qJFA== X-Gm-Message-State: ANhLgQ06EuE3UEedlRwDS6lFxB+ybu8HQohJslC1qBTe6gpjmk0xXxFz DitlYVIaJbN1QGJAq9ne8HzuJW2yx3k= X-Google-Smtp-Source: ADFU+vs6mIDrp5VGXj/ALw72o/Ywom4Qfltwt32g/Kk/lQVO02Wi6oYFpUrhknuiIFjRRSNbQlY0MQ== X-Received: by 2002:a17:90a:d103:: with SMTP id l3mr3822602pju.91.1583501804633; Fri, 06 Mar 2020 05:36:44 -0800 (PST) Received: from local.opencloud.tech.localdomain ([219.143.129.147]) by smtp.gmail.com with ESMTPSA id a36sm34916441pga.32.2020.03.06.05.36.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Mar 2020 05:36:43 -0800 (PST) From: xiangxia.m.yue@gmail.com To: dev@dpdk.org, olivier.matz@6wind.com, arybchenko@solarflare.com, gage.eads@intel.com, artem.andreev@oktetlabs.ru, jerinj@marvell.com, ndabilpuram@marvell.com, vattunuru@marvell.com, hemant.agrawal@nxp.com Cc: Tonghao Zhang Date: Fri, 6 Mar 2020 21:36:16 +0800 Message-Id: <1583501776-9958-1-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1583114253-15345-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1583114253-15345-1-git-send-email-xiangxia.m.yue@gmail.com> Subject: [dpdk-dev] [PATCH dpdk-dev v3] mempool: sort the rte_mempool_ops by name X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Tonghao Zhang The order of mempool initiation affects mempool index in the rte_mempool_ops_table. For example, when building APPs with: $ gcc -lrte_mempool_bucket -lrte_mempool_ring ... The "bucket" mempool will be registered firstly, and its index in table is 0 while the index of "ring" mempool is 1. DPDK uses the mk/rte.app.mk to build APPs, and others, for example, Open vSwitch, use the libdpdk.a or libdpdk.so to build it. The mempool lib linked in dpdk and Open vSwitch is different. The mempool can be used between primary and secondary process, such as dpdk-pdump and pdump-pmd/Open vSwitch(pdump enabled). There will be a crash because dpdk-pdump creates the "ring_mp_mc" ring which index in table is 0, but the index of "bucket" ring is 0 in Open vSwitch. If Open vSwitch use the index 0 to get mempool ops and malloc memory from mempool. The crash will occur: bucket_dequeue (access null and crash) rte_mempool_get_ops (should get "ring_mp_mc", but get "bucket" mempool) rte_mempool_ops_dequeue_bulk ... rte_pktmbuf_alloc rte_pktmbuf_copy pdump_copy pdump_rx rte_eth_rx_burst To avoid the crash, there are some solution: * constructor priority: Different mempool uses different priority in RTE_INIT, but it's not easy to maintain. * change mk/rte.app.mk: Change the order in mk/rte.app.mk to be same as libdpdk.a/libdpdk.so, but when adding a new mempool driver in future, we must make sure the order. * register mempool orderly: Sort the mempool when registering, so the lib linked will not affect the index in mempool table. Signed-off-by: Tonghao Zhang Acked-by: Olivier Matz Acked-by: Jerin Jacob --- v3: * fix checkpatches.sh WARNING * change "initiation -> initialization" v2: * use the qsort to sort the mempool_ops. * tested: https://travis-ci.com/ovn-open-virtual-networks/dpdk-next-net/builds/151894026 --- lib/librte_mempool/rte_mempool_ops.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/librte_mempool/rte_mempool_ops.c b/lib/librte_mempool/rte_mempool_ops.c index 22c5251..b0da096 100644 --- a/lib/librte_mempool/rte_mempool_ops.c +++ b/lib/librte_mempool/rte_mempool_ops.c @@ -17,6 +17,15 @@ struct rte_mempool_ops_table rte_mempool_ops_table = { .num_ops = 0 }; +static int +compare_mempool_ops(const void *a, const void *b) +{ + const struct rte_mempool_ops *m_a = a; + const struct rte_mempool_ops *m_b = b; + + return strcmp(m_a->name, m_b->name); +} + /* add a new ops struct in rte_mempool_ops_table, return its index. */ int rte_mempool_register_ops(const struct rte_mempool_ops *h) @@ -63,6 +72,13 @@ struct rte_mempool_ops_table rte_mempool_ops_table = { ops->get_info = h->get_info; ops->dequeue_contig_blocks = h->dequeue_contig_blocks; + /* + * sort the rte_mempool_ops by name. the order of the mempool + * lib initialization will not affect rte_mempool_ops index. + */ + qsort(rte_mempool_ops_table.ops, rte_mempool_ops_table.num_ops, + sizeof(rte_mempool_ops_table.ops[0]), compare_mempool_ops); + rte_spinlock_unlock(&rte_mempool_ops_table.sl); return ops_index;