From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0CC52A0565; Mon, 2 Mar 2020 02:57:41 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4F21E1BE83; Mon, 2 Mar 2020 02:57:41 +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 ED7E71BE81 for ; Mon, 2 Mar 2020 02:57:39 +0100 (CET) Received: by mail-pj1-f67.google.com with SMTP id lt1so993591pjb.2 for ; Sun, 01 Mar 2020 17:57:39 -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; bh=qjFWmouWOP1lx/ZPD7VHKNjgQFqO54fIyo6M8kivSwA=; b=ehTf8niI+0Jb8LRHfGNJJ8wjAdSPeeFG+M1vtI0eZFuelLyv6CuJMpahHjWZkALU8d OQ0MtqGW95FpWCIUJgoIzhB9rSuqgaFwwGStq2/4RN6HgXYLmDt8GhQLONQwkAipgt/U I59RrMeQmnDR6uVQIE1dzKXTL4taDdlQ4YFFkvle6ocUazWJ5Bwycctwe/SIilgIwgoM 5uqSMNCCt0nyQJoSUKYDNEHpBnmSxEQtTDuULjxIP0IooSsiGdX3QkYrKKg+kryyqtnR BR3cDMYWbX3ITdSjEZhfYubboTvB/G8Si5Lf5YRCMM8a5mW6z4Xf0l+97c2iup6s+AI/ /6TQ== 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; bh=qjFWmouWOP1lx/ZPD7VHKNjgQFqO54fIyo6M8kivSwA=; b=l2gxaDzo5DxvP49MuuklLpYB1bNzQCmCi1P3uT/3sj6dA7E2ygn3g4GSZyoIw/5grg jA4om/iSgkYZols/HEdrR0I069XlaXip8eg5TdxBE5zjSU4JFY7qTHrIiS349noP/IH5 bKl+TY8xErrGznSroUbgO8SPjHaA9cbuXXH4K5G/jvpuQpj+JKJQuEKcPceWqs2sw5+5 7aGz4NdIDMCGHzNCrxFAyDB8D/qreEqWh85kBAe8B2yt0rDLNXijj/wyDwdC29Vow1BJ hERIv0mU01GEP0A5qS8YH0UiQ7UPdc10A3Y2p8LWpGXO83wFrm+qoqjTJ7IMB4G2ewOZ udQw== X-Gm-Message-State: ANhLgQ0TwsTxU6rm31dLw+YwGBs6DuklpNBnvcp1QC60oBdkR/d+nd1J Akr+BtfyuDEbEQl0VrsjgPD/KXnu X-Google-Smtp-Source: ADFU+vsxC1Lv9mZLQSqfuo+SjgeNSxJCloHdNjRp6QIQd/hoGdZln61LcOrbxpSVXoE7C7hpQqgevQ== X-Received: by 2002:a17:90a:a48:: with SMTP id o66mr12350326pjo.66.1583114258471; Sun, 01 Mar 2020 17:57:38 -0800 (PST) Received: from local.opencloud.tech.localdomain ([219.143.129.147]) by smtp.gmail.com with ESMTPSA id b184sm4806878pfb.89.2020.03.01.17.57.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 01 Mar 2020 17:57:38 -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: Mon, 2 Mar 2020 09:57:33 +0800 Message-Id: <1583114253-15345-1-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] 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 --- lib/librte_mempool/rte_mempool_ops.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/librte_mempool/rte_mempool_ops.c b/lib/librte_mempool/rte_mempool_ops.c index 22c5251..06dfe16 100644 --- a/lib/librte_mempool/rte_mempool_ops.c +++ b/lib/librte_mempool/rte_mempool_ops.c @@ -22,7 +22,7 @@ struct rte_mempool_ops_table rte_mempool_ops_table = { rte_mempool_register_ops(const struct rte_mempool_ops *h) { struct rte_mempool_ops *ops; - int16_t ops_index; + unsigned ops_index, i; rte_spinlock_lock(&rte_mempool_ops_table.sl); @@ -50,7 +50,19 @@ struct rte_mempool_ops_table rte_mempool_ops_table = { return -EEXIST; } - ops_index = rte_mempool_ops_table.num_ops++; + /* sort the rte_mempool_ops by name. the order of the mempool + * lib initiation will not affect rte_mempool_ops index. */ + ops_index = rte_mempool_ops_table.num_ops; + for (i = 0; i < rte_mempool_ops_table.num_ops; i++) { + if (strcmp(h->name, rte_mempool_ops_table.ops[i].name) < 0) { + do { + rte_mempool_ops_table.ops[ops_index] = + rte_mempool_ops_table.ops[ops_index -1]; + } while (--ops_index > i); + break; + } + } + ops = &rte_mempool_ops_table.ops[ops_index]; strlcpy(ops->name, h->name, sizeof(ops->name)); ops->alloc = h->alloc; @@ -63,6 +75,8 @@ struct rte_mempool_ops_table rte_mempool_ops_table = { ops->get_info = h->get_info; ops->dequeue_contig_blocks = h->dequeue_contig_blocks; + rte_mempool_ops_table.num_ops++; + rte_spinlock_unlock(&rte_mempool_ops_table.sl); return ops_index; -- 1.8.3.1