ring: get size in memory

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 <olivier.matz@6wind.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
Olivier Matz 2014-05-09 12:14:52 +02:00 committed by Thomas Monjalon
parent 5d8751b83b
commit a182620042
2 changed files with 39 additions and 7 deletions

View File

@ -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);

View File

@ -198,6 +198,22 @@ struct rte_ring {
#define __RING_STAT_ADD(r, name, n) do {} while(0)
#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.
*