From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id AD1171B896 for ; Wed, 4 Apr 2018 01:22:31 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Apr 2018 16:22:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,403,1517904000"; d="scan'208";a="34029405" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga002.fm.intel.com with ESMTP; 03 Apr 2018 16:22:27 -0700 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id w33NMQR6013140; Wed, 4 Apr 2018 00:22:27 +0100 Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id w33NMQnU014816; Wed, 4 Apr 2018 00:22:26 +0100 Received: (from aburakov@localhost) by sivswdev01.ir.intel.com with LOCAL id w33NMQ4i014812; Wed, 4 Apr 2018 00:22:26 +0100 From: Anatoly Burakov To: dev@dpdk.org Cc: keith.wiles@intel.com, jianfeng.tan@intel.com, andras.kovacs@ericsson.com, laszlo.vadkeri@ericsson.com, benjamin.walker@intel.com, bruce.richardson@intel.com, thomas@monjalon.net, konstantin.ananyev@intel.com, kuralamudhan.ramakrishnan@intel.com, louise.m.daly@intel.com, nelio.laranjeiro@6wind.com, yskoh@mellanox.com, pepperjo@japf.ch, jerin.jacob@caviumnetworks.com, hemant.agrawal@nxp.com, olivier.matz@6wind.com, shreyansh.jain@nxp.com, gowrishankar.m@linux.vnet.ibm.com Date: Wed, 4 Apr 2018 00:21:46 +0100 Message-Id: X-Mailer: git-send-email 1.7.0.7 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v3 34/68] eal: add contig walk function 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: , X-List-Received-Date: Tue, 03 Apr 2018 23:22:33 -0000 For now, this function is identical to memseg walk function, but it is meant to walk over first segment of each VA contiguous group of memsegs. The difference will become apparent when memseg lists will come into play. Again, this is done so that there is less dependency on internals of mem API and less noise later change sets. Signed-off-by: Anatoly Burakov --- lib/librte_eal/common/eal_common_memory.c | 37 ++++++++++++++++++++++++++++++ lib/librte_eal/common/include/rte_memory.h | 27 ++++++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 65 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index 4f588c7..4b528b0 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -242,6 +242,43 @@ rte_memseg_walk(rte_memseg_walk_t func, void *arg) return 0; } +int __rte_experimental +rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg) +{ + struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; + int i, j, ret; + + for (i = 0; i < RTE_MAX_MEMSEG; i++) { + const struct rte_memseg *ms = &mcfg->memseg[i]; + size_t total_len; + void *end_addr; + + if (ms->addr == NULL) + continue; + + end_addr = RTE_PTR_ADD(ms->addr, ms->len); + + /* check how many more segments are contiguous to this one */ + for (j = i + 1; j < RTE_MAX_MEMSEG; j++) { + const struct rte_memseg *next = &mcfg->memseg[j]; + + if (next->addr != end_addr) + break; + + end_addr = RTE_PTR_ADD(next->addr, next->len); + i++; + } + total_len = RTE_PTR_DIFF(end_addr, ms->addr); + + ret = func(ms, total_len, arg); + if (ret < 0) + return -1; + if (ret > 0) + return 1; + } + return 0; +} + /* init memory subsystem */ int rte_eal_memory_init(void) diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h index 93eadaa..45d067f 100644 --- a/lib/librte_eal/common/include/rte_memory.h +++ b/lib/librte_eal/common/include/rte_memory.h @@ -140,6 +140,18 @@ rte_iova_t rte_mem_virt2iova(const void *virt); typedef int (*rte_memseg_walk_t)(const struct rte_memseg *ms, void *arg); /** + * Memseg contig walk function prototype. This will trigger a callback on every + * VA-contiguous are starting at memseg ``ms``, so total valid VA space at each + * callback call will be [``ms->addr``, ``ms->addr + len``). + * + * Returning 0 will continue walk + * Returning 1 will stop the walk + * Returning -1 will stop the walk and report error + */ +typedef int (*rte_memseg_contig_walk_t)(const struct rte_memseg *ms, + size_t len, void *arg); + +/** * Walk list of all memsegs. * * @param func @@ -155,6 +167,21 @@ int __rte_experimental rte_memseg_walk(rte_memseg_walk_t func, void *arg); /** + * Walk each VA-contiguous area. + * + * @param func + * Iterator function + * @param arg + * Argument passed to iterator + * @return + * 0 if walked over the entire list + * 1 if stopped by the user + * -1 if user function reported error + */ +int __rte_experimental +rte_memseg_contig_walk(rte_memseg_contig_walk_t func, void *arg); + +/** * Get the layout of the available physical memory. * * It can be useful for an application to have the full physical diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 7e9900d..8409a3a 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -223,6 +223,7 @@ EXPERIMENTAL { rte_eal_mbuf_user_pool_ops; rte_log_register_type_and_pick_level; rte_malloc_dump_heaps; + rte_memseg_contig_walk; rte_memseg_walk; rte_memzone_reserve_contig; rte_memzone_reserve_aligned_contig; -- 2.7.4