From patchwork Fri Sep 22 08:19:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 131823 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AAFD242612; Fri, 22 Sep 2023 10:19:57 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BBEB8406B7; Fri, 22 Sep 2023 10:19:45 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id DBF0D402CF for ; Fri, 22 Sep 2023 10:19:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695370783; x=1726906783; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=U4rN/bJ0jMS4H1nA4okPsutu3C1ppa60frVKw3sTBsM=; b=bS1adXb9WKcVbwQDtCiWWRzScMNFw6Z8XeSy5S0vdBjkWeWZ+OR5QTYc xf7+b2yFDXVr6BAm3zmCuYbo+CDOcJP1srS5tO+GMD1yrYRedTcuPq2E6 GKYjkP8bK+tyu9P9DT65Yh9R3naqMWY5Kcy8ViMV1TnMnmvyRkQczIemd OnSW3LFZunPJyMjUZY/VHKbZVVn7cpQxIXWwDP8canfKgiuVvR/Em09Yx bKRxOmv2IfuC1WNff+HP41XYC8A7LN3NHoaXqF+PHCgx/X7A7R6zD2jRh WLYkGJ7h7lxBxasrTYbP+N5FNjJH4/T2L58AgNj0VE7b30aQ8L5hKODMt A==; X-IronPort-AV: E=McAfee;i="6600,9927,10840"; a="378063968" X-IronPort-AV: E=Sophos;i="6.03,167,1694761200"; d="scan'208";a="378063968" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Sep 2023 01:19:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10840"; a="1078281125" X-IronPort-AV: E=Sophos;i="6.03,167,1694761200"; d="scan'208";a="1078281125" Received: from silpixa00401385.ir.intel.com ([10.237.214.14]) by fmsmga005.fm.intel.com with ESMTP; 22 Sep 2023 01:19:28 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson Subject: [RFC PATCH 2/5] mempool: driver for mempools of mbufs on shared memory Date: Fri, 22 Sep 2023 09:19:09 +0100 Message-Id: <20230922081912.7090-3-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230922081912.7090-1-bruce.richardson@intel.com> References: <20230922081912.7090-1-bruce.richardson@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This mempool driver can be used with the shared_mem bus driver to create a pool of shared mbufs on a shared memory segment. Signed-off-by: Bruce Richardson --- drivers/mempool/meson.build | 1 + drivers/mempool/shared_mem/meson.build | 10 +++ drivers/mempool/shared_mem/shared_mem_mp.c | 94 ++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 drivers/mempool/shared_mem/meson.build create mode 100644 drivers/mempool/shared_mem/shared_mem_mp.c diff --git a/drivers/mempool/meson.build b/drivers/mempool/meson.build index dc88812585..4326bd0ea3 100644 --- a/drivers/mempool/meson.build +++ b/drivers/mempool/meson.build @@ -8,6 +8,7 @@ drivers = [ 'dpaa2', 'octeontx', 'ring', + 'shared_mem', 'stack', ] diff --git a/drivers/mempool/shared_mem/meson.build b/drivers/mempool/shared_mem/meson.build new file mode 100644 index 0000000000..ee740ccdc9 --- /dev/null +++ b/drivers/mempool/shared_mem/meson.build @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2023 Intel Corporation + +if is_windows + build = false + reason = 'not supported on Windows' +endif +sources = files('shared_mem_mp.c') +require_iova_in_mbuf = false +deps += ['stack', 'bus_shared_mem'] diff --git a/drivers/mempool/shared_mem/shared_mem_mp.c b/drivers/mempool/shared_mem/shared_mem_mp.c new file mode 100644 index 0000000000..7dae8aba92 --- /dev/null +++ b/drivers/mempool/shared_mem/shared_mem_mp.c @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Intel Corporation + */ +#include +#include +#include +#include +#include + +RTE_LOG_REGISTER_DEFAULT(shared_mem_mp_log, DEBUG); +#define MP_LOG(level, fmt, args...) rte_log(RTE_LOG_ ## level, \ + shared_mem_mp_log, "## SHARED MP: %s(): " fmt "\n", __func__, ##args) +#define MP_ERR(fmt, args...) MP_LOG(ERR, fmt, ## args) +#define MP_INFO(fmt, args...) MP_LOG(INFO, fmt, ## args) +#define MP_DEBUG(fmt, args...) MP_LOG(DEBUG, fmt, ## args) + +static int +shm_mp_alloc(struct rte_mempool *mp) +{ + char name[RTE_STACK_NAMESIZE]; + struct rte_stack *s; + int ret; + + ret = snprintf(name, sizeof(name), RTE_MEMPOOL_MZ_FORMAT, mp->name); + if (ret < 0 || ret >= (int)sizeof(name)) { + rte_errno = ENAMETOOLONG; + return -rte_errno; + } + + s = rte_stack_create(name, mp->size, mp->socket_id, 0); + if (s == NULL) + return -rte_errno; + MP_DEBUG("Stack created at address: %p", s); + + mp->pool_data = s; + + return 0; +} + +static int +shm_mp_enqueue(struct rte_mempool *mp, void * const *obj_table, + unsigned int n) +{ + struct rte_stack *s = mp->pool_data; + + void *offset_table[n]; + uintptr_t mempool_base = (uintptr_t)rte_shm_bus_get_mem_ptr(0); /* offset 0 == base addr */ + for (uint i = 0; i < n; i++) + offset_table[i] = RTE_PTR_SUB(obj_table[i], mempool_base); + + return rte_stack_push(s, offset_table, n) == 0 ? -ENOBUFS : 0; +} + +static int +shm_mp_dequeue(struct rte_mempool *mp, void **obj_table, + unsigned int n) +{ + struct rte_stack *s = mp->pool_data; + uintptr_t mempool_base = (uintptr_t)rte_shm_bus_get_mem_ptr(0); /* offset 0 == base addr */ + uint16_t priv_size = rte_pktmbuf_priv_size(mp); + + if (rte_stack_pop(s, obj_table, n) == 0) + return -ENOBUFS; + for (uint i = 0; i < n; i++) { + obj_table[i] = RTE_PTR_ADD(obj_table[i], mempool_base); + struct rte_mbuf *mb = obj_table[i]; + mb->buf_addr = RTE_PTR_ADD(mb, sizeof(struct rte_mbuf) + priv_size); + mb->pool = mp; + } + return 0; +} + +static unsigned +shm_mp_get_count(const struct rte_mempool *mp) +{ + return rte_stack_count(mp->pool_data); +} + +static void +shm_mp_free(struct rte_mempool *mp) +{ + rte_stack_free(mp->pool_data); +} + +static struct rte_mempool_ops ops_shared_mem_mp = { + .name = "shared_mem", + .alloc = shm_mp_alloc, + .free = shm_mp_free, + .enqueue = shm_mp_enqueue, + .dequeue = shm_mp_dequeue, + .get_count = shm_mp_get_count, +}; + +RTE_MEMPOOL_REGISTER_OPS(ops_shared_mem_mp);