From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f171.google.com (mail-wi0-f171.google.com [209.85.212.171]) by dpdk.org (Postfix) with ESMTP id F0A4D68A8 for ; Fri, 9 May 2014 12:15:03 +0200 (CEST) Received: by mail-wi0-f171.google.com with SMTP id hm4so1073226wib.4 for ; Fri, 09 May 2014 03:15:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ezWJVRwpXaViT7y4zGJP43iwPaJS7PJL3rkFdW5D328=; b=Aw0BYWjaSpKnDXzCTx5HzB9wTD4fpiq8RCNvATFCw9KfY0JlmYhXlahSExxQBCs5T3 FQ5GIDMBhx4XRuB3buDluCN+PWbkCduHvXxoZGOGRv+kCL8udkJO2WsXjnKLGQ9hj+FN U0TWAwz9uwbomN3ny2D6znL7Dlj7Y3df4I4islaupEotdnADS39wWOvpcISjS6GjM48/ awKKK9OfHrqA2qzG4wwn7jKbFO7RKQ6mk5/Aw8YXtXdaMco9A1Kc0kcrj2RfTihjdCVF 8Xx7QL6MBN0u3hneBfT8G5Z+ouHhbrSmyo9yK0QUFKVSvSpPoCcI6tsWctPgHV0xS7od uNmw== X-Gm-Message-State: ALoCoQnMAp0oepSjCVdOGDoqEtLM61NULZVMubbsn5gqHJFbkZx2XNro90DI0sL3KhTndqn8orzx X-Received: by 10.180.99.40 with SMTP id en8mr2707642wib.24.1399630510115; Fri, 09 May 2014 03:15:10 -0700 (PDT) Received: from glumotte.dev.6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPSA id h3sm4275975wiz.16.2014.05.09.03.15.08 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 May 2014 03:15:09 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Date: Fri, 9 May 2014 12:14:52 +0200 Message-Id: <1399630493-26739-2-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 1.9.2 In-Reply-To: <1399630493-26739-1-git-send-email-olivier.matz@6wind.com> References: <1399630493-26739-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v2 1/2] ring: introduce rte_ring_get_memsize() X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 May 2014 10:15:04 -0000 Add a function that returns the amount of memory occupied by a rte_ring structure and its object table. This commit prepares the next one that will allow to allocate a ring dynamically. Signed-off-by: Olivier Matz --- lib/librte_ring/rte_ring.c | 30 +++++++++++++++++++++++------- lib/librte_ring/rte_ring.h | 16 ++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/librte_ring/rte_ring.c b/lib/librte_ring/rte_ring.c index 0d43a55..156fe49 100644 --- a/lib/librte_ring/rte_ring.c +++ b/lib/librte_ring/rte_ring.c @@ -94,6 +94,25 @@ TAILQ_HEAD(rte_ring_list, rte_ring); /* true if x is a power of 2 */ #define POWEROF2(x) ((((x)-1) & (x)) == 0) +/* return the size of memory occupied by a ring */ +ssize_t +rte_ring_get_memsize(unsigned count) +{ + ssize_t sz; + + /* count must be a power of 2 */ + if ((!POWEROF2(count)) || (count > RTE_RING_SZ_MASK )) { + RTE_LOG(ERR, RING, + "Requested size is invalid, must be power of 2, and " + "do not exceed the size limit %u\n", RTE_RING_SZ_MASK); + return -EINVAL; + } + + sz = sizeof(struct rte_ring) + count * sizeof(void *); + sz = RTE_ALIGN(sz, CACHE_LINE_SIZE); + return sz; +} + /* create the ring */ struct rte_ring * rte_ring_create(const char *name, unsigned count, int socket_id, @@ -102,7 +121,7 @@ rte_ring_create(const char *name, unsigned count, int socket_id, char mz_name[RTE_MEMZONE_NAMESIZE]; struct rte_ring *r; const struct rte_memzone *mz; - size_t ring_size; + ssize_t ring_size; int mz_flags = 0; struct rte_ring_list* ring_list = NULL; @@ -129,16 +148,13 @@ rte_ring_create(const char *name, unsigned count, int socket_id, return NULL; } - /* count must be a power of 2 */ - if ((!POWEROF2(count)) || (count > RTE_RING_SZ_MASK )) { - rte_errno = EINVAL; - RTE_LOG(ERR, RING, "Requested size is invalid, must be power of 2, and " - "do not exceed the size limit %u\n", RTE_RING_SZ_MASK); + ring_size = rte_ring_get_memsize(count); + if (ring_size < 0) { + rte_errno = ring_size; return NULL; } rte_snprintf(mz_name, sizeof(mz_name), "%s%s", RTE_RING_MZ_PREFIX, name); - ring_size = count * sizeof(void *) + sizeof(struct rte_ring); rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); diff --git a/lib/librte_ring/rte_ring.h b/lib/librte_ring/rte_ring.h index 775ea79..e8493f2 100644 --- a/lib/librte_ring/rte_ring.h +++ b/lib/librte_ring/rte_ring.h @@ -199,6 +199,22 @@ struct rte_ring { #endif /** + * Calculate the memory size needed for a ring + * + * This function returns the number of bytes needed for a ring, given + * the number of elements in it. This value is the sum of the size of + * the structure rte_ring and the size of the memory needed by the + * objects pointers. The value is aligned to a cache line size. + * + * @param count + * The number of elements in the ring (must be a power of 2). + * @return + * - The memory size needed for the ring on success. + * - -EINVAL if count is not a power of 2. + */ +ssize_t rte_ring_get_memsize(unsigned count); + +/** * Create a new ring named *name* in memory. * * This function uses ``memzone_reserve()`` to allocate memory. Its size is -- 1.9.2