From patchwork Tue Apr 3 23:21:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Burakov, Anatoly" X-Patchwork-Id: 37027 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E694C1BA5A; Wed, 4 Apr 2018 01:23:35 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 85FCE1B8A2 for ; Wed, 4 Apr 2018 01:22:32 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Apr 2018 16:22:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,403,1517904000"; d="scan'208";a="29885110" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga008.fm.intel.com with ESMTP; 03 Apr 2018 16:22:28 -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 w33NMR8m013158; 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 w33NMRwI014862; Wed, 4 Apr 2018 00:22:27 +0100 Received: (from aburakov@localhost) by sivswdev01.ir.intel.com with LOCAL id w33NMRjq014858; Wed, 4 Apr 2018 00:22:27 +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:52 +0100 Message-Id: <6dff8ae6a20b4d43092a68887f2d9e3579f57d85.1522797505.git.anatoly.burakov@intel.com> X-Mailer: git-send-email 1.7.0.7 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v3 40/68] eal: add virt2memseg 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This can be used as a virt2iova function that only looks up memory that is owned by DPDK (as opposed to doing pagemap walks). Using this will result in less dependency on internals of mem API. Signed-off-by: Anatoly Burakov --- lib/librte_eal/common/eal_common_memory.c | 37 ++++++++++++++++++++++++++++++ lib/librte_eal/common/include/rte_memory.h | 11 +++++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 49 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c index ea3c5a7..fd78d2f 100644 --- a/lib/librte_eal/common/eal_common_memory.c +++ b/lib/librte_eal/common/eal_common_memory.c @@ -161,6 +161,43 @@ rte_mem_iova2virt(rte_iova_t iova) return vi.virt; } +struct virtms { + const void *virt; + struct rte_memseg *ms; +}; +static int +find_memseg(const struct rte_memseg *ms, void *arg) +{ + struct virtms *vm = arg; + + if (arg >= ms->addr && arg < RTE_PTR_ADD(ms->addr, ms->len)) { + struct rte_memseg *memseg, *found_ms; + int idx; + + memseg = rte_eal_get_configuration()->mem_config->memseg; + idx = ms - memseg; + found_ms = &memseg[idx]; + + vm->ms = found_ms; + return 1; + } + return 0; +} + +__rte_experimental struct rte_memseg * +rte_mem_virt2memseg(const void *addr) +{ + struct virtms vm; + + memset(&vm, 0, sizeof(vm)); + + vm.virt = addr; + + rte_memseg_walk(find_memseg, &vm); + + return vm.ms; +} + static int physmem_size(const struct rte_memseg *ms, void *arg) { diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h index 5c60b91..b3d7e61 100644 --- a/lib/librte_eal/common/include/rte_memory.h +++ b/lib/librte_eal/common/include/rte_memory.h @@ -143,6 +143,17 @@ __rte_experimental void * rte_mem_iova2virt(rte_iova_t iova); /** + * Get memseg to which a particular virtual address belongs. + * + * @param virt + * The virtual address. + * @return + * Memseg pointer on success, or NULL on error. + */ +__rte_experimental struct rte_memseg * +rte_mem_virt2memseg(const void *virt); + +/** * Memseg walk function prototype. * * Returning 0 will continue walk diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 83b1635..70ec778 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -224,6 +224,7 @@ EXPERIMENTAL { rte_log_register_type_and_pick_level; rte_malloc_dump_heaps; rte_mem_iova2virt; + rte_mem_virt2memseg; rte_memseg_contig_walk; rte_memseg_walk; rte_memzone_reserve_contig;