aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@linaro.org>2014-06-25 17:35:00 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2014-06-26 21:43:15 +0400
commit17317a758132ac9996eeed2c90c1b2477da99d57 (patch)
tree9b9ba1198af53207ef2ce1a1a7e6eecca5017619 /platform/linux-generic
parent0e683f99047f78f78202b2bc54326c4a500e86ab (diff)
Buffer header C99 compliance and cleanup
Fixed C99 compliance bug in buffer header (removed the empty array). Cleaned and harmonized buffer pool implementation for different buffer types. Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r--platform/linux-generic/include/odp_buffer_internal.h14
-rw-r--r--platform/linux-generic/include/odp_buffer_pool_internal.h4
-rw-r--r--platform/linux-generic/include/odp_packet_internal.h5
-rw-r--r--platform/linux-generic/include/odp_timer_internal.h4
-rw-r--r--platform/linux-generic/source/odp_buffer_pool.c130
-rw-r--r--platform/linux-generic/source/odp_packet.c4
6 files changed, 94 insertions, 67 deletions
diff --git a/platform/linux-generic/include/odp_buffer_internal.h b/platform/linux-generic/include/odp_buffer_internal.h
index a1a6b4eba..11024f84a 100644
--- a/platform/linux-generic/include/odp_buffer_internal.h
+++ b/platform/linux-generic/include/odp_buffer_internal.h
@@ -79,6 +79,7 @@ typedef struct odp_buffer_chunk_t {
} odp_buffer_chunk_t;
+/* Common buffer header */
typedef struct odp_buffer_hdr_t {
struct odp_buffer_hdr_t *next; /* next buf in a list */
odp_buffer_bits_t handle; /* handle */
@@ -92,13 +93,20 @@ typedef struct odp_buffer_hdr_t {
int type; /* type of next header */
odp_buffer_pool_t pool; /* buffer pool */
- uint8_t payload[]; /* next header or data */
} odp_buffer_hdr_t;
-ODP_ASSERT(sizeof(odp_buffer_hdr_t) == ODP_OFFSETOF(odp_buffer_hdr_t, payload),
- ODP_BUFFER_HDR_T__SIZE_ERROR);
+/* Ensure next header starts from 8 byte align */
+ODP_ASSERT((sizeof(odp_buffer_hdr_t) % 8) == 0, ODP_BUFFER_HDR_T__SIZE_ERROR);
+/* Raw buffer header */
+typedef struct {
+ odp_buffer_hdr_t buf_hdr; /* common buffer header */
+ uint8_t buf_data[]; /* start of buffer data area */
+} odp_raw_buffer_hdr_t;
+
+
+/* Chunk header */
typedef struct odp_buffer_chunk_hdr_t {
odp_buffer_hdr_t buf_hdr;
odp_buffer_chunk_t chunk;
diff --git a/platform/linux-generic/include/odp_buffer_pool_internal.h b/platform/linux-generic/include/odp_buffer_pool_internal.h
index 381482f17..1c0a9fcbe 100644
--- a/platform/linux-generic/include/odp_buffer_pool_internal.h
+++ b/platform/linux-generic/include/odp_buffer_pool_internal.h
@@ -58,8 +58,8 @@ struct pool_entry_s {
uint64_t num_bufs;
void *pool_base_addr;
uint64_t pool_size;
- size_t payload_size;
- size_t payload_align;
+ size_t user_size;
+ size_t user_align;
int buf_type;
size_t hdr_size;
};
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index eb978a3e9..45ed41254 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -115,11 +115,10 @@ typedef struct {
odp_pktio_t input;
uint32_t pad;
- uint8_t payload[];
-
+ uint8_t buf_data[]; /* start of buffer data area */
} odp_packet_hdr_t;
-ODP_ASSERT(sizeof(odp_packet_hdr_t) == ODP_OFFSETOF(odp_packet_hdr_t, payload),
+ODP_ASSERT(sizeof(odp_packet_hdr_t) == ODP_OFFSETOF(odp_packet_hdr_t, buf_data),
ODP_PACKET_HDR_T__SIZE_ERR);
ODP_ASSERT(sizeof(odp_packet_hdr_t) % sizeof(uint64_t) == 0,
ODP_PACKET_HDR_T__SIZE_ERR2);
diff --git a/platform/linux-generic/include/odp_timer_internal.h b/platform/linux-generic/include/odp_timer_internal.h
index f99a10e3f..76f1545ee 100644
--- a/platform/linux-generic/include/odp_timer_internal.h
+++ b/platform/linux-generic/include/odp_timer_internal.h
@@ -48,13 +48,13 @@ typedef struct odp_timeout_hdr_t {
timeout_t meta;
- uint8_t payload[];
+ uint8_t buf_data[];
} odp_timeout_hdr_t;
ODP_ASSERT(sizeof(odp_timeout_hdr_t) ==
- ODP_OFFSETOF(odp_timeout_hdr_t, payload),
+ ODP_OFFSETOF(odp_timeout_hdr_t, buf_data),
ODP_TIMEOUT_HDR_T__SIZE_ERR);
ODP_ASSERT(sizeof(odp_timeout_hdr_t) % sizeof(uint64_t) == 0,
diff --git a/platform/linux-generic/source/odp_buffer_pool.c b/platform/linux-generic/source/odp_buffer_pool.c
index f4aedff86..25c95650b 100644
--- a/platform/linux-generic/source/odp_buffer_pool.c
+++ b/platform/linux-generic/source/odp_buffer_pool.c
@@ -46,9 +46,15 @@ union buffer_type_any_u {
odp_timeout_hdr_t tmo;
};
-ODP_ASSERT(sizeof(union buffer_type_any_u) % sizeof(uint64_t) == 0,
+ODP_ASSERT((sizeof(union buffer_type_any_u) % 8) == 0,
BUFFER_TYPE_ANY_U__SIZE_ERR);
+/* Any buffer type header */
+typedef struct {
+ union buffer_type_any_u any_hdr; /* any buffer type */
+ uint8_t buf_data[]; /* start of buffer data area */
+} odp_any_buffer_hdr_t;
+
typedef union pool_entry_u {
struct pool_entry_s s;
@@ -184,10 +190,9 @@ static odp_buffer_chunk_hdr_t *rem_chunk(pool_entry_t *pool)
static void add_chunk(pool_entry_t *pool, odp_buffer_chunk_hdr_t *chunk_hdr)
{
- if (pool->s.head) {
- /* link pool head to the chunk */
+ if (pool->s.head) /* link pool head to the chunk */
add_buf_index(chunk_hdr, pool->s.head->buf_hdr.index);
- } else
+ else
add_buf_index(chunk_hdr, NULL_INDEX);
pool->s.head = chunk_hdr;
@@ -197,9 +202,9 @@ static void add_chunk(pool_entry_t *pool, odp_buffer_chunk_hdr_t *chunk_hdr)
static void check_align(pool_entry_t *pool, odp_buffer_hdr_t *hdr)
{
- if (!ODP_ALIGNED_CHECK_POWER_2(hdr->addr, pool->s.payload_align)) {
- ODP_ERR("check_align: payload align error %p, align %zu\n",
- hdr->addr, pool->s.payload_align);
+ if (!ODP_ALIGNED_CHECK_POWER_2(hdr->addr, pool->s.user_align)) {
+ ODP_ERR("check_align: user data align error %p, align %zu\n",
+ hdr->addr, pool->s.user_align);
exit(0);
}
@@ -216,28 +221,45 @@ static void fill_hdr(void *ptr, pool_entry_t *pool, uint32_t index,
{
odp_buffer_hdr_t *hdr = (odp_buffer_hdr_t *)ptr;
size_t size = pool->s.hdr_size;
- uint8_t *payload = hdr->payload;
+ uint8_t *buf_data;
if (buf_type == ODP_BUFFER_TYPE_CHUNK)
size = sizeof(odp_buffer_chunk_hdr_t);
- if (pool->s.buf_type == ODP_BUFFER_TYPE_PACKET) {
- odp_packet_hdr_t *packet_hdr = ptr;
- payload = packet_hdr->payload;
- } else if (pool->s.buf_type == ODP_BUFFER_TYPE_TIMEOUT) {
- odp_timeout_hdr_t *tmo_hdr = ptr;
- payload = tmo_hdr->payload;
- } else if (pool->s.buf_type == ODP_BUFFER_TYPE_ANY) {
- payload = ((uint8_t *)ptr) + sizeof(union buffer_type_any_u);
+ switch (pool->s.buf_type) {
+ odp_raw_buffer_hdr_t *raw_hdr;
+ odp_packet_hdr_t *packet_hdr;
+ odp_timeout_hdr_t *tmo_hdr;
+ odp_any_buffer_hdr_t *any_hdr;
+
+ case ODP_BUFFER_TYPE_RAW:
+ raw_hdr = ptr;
+ buf_data = raw_hdr->buf_data;
+ break;
+ case ODP_BUFFER_TYPE_PACKET:
+ packet_hdr = ptr;
+ buf_data = packet_hdr->buf_data;
+ break;
+ case ODP_BUFFER_TYPE_TIMEOUT:
+ tmo_hdr = ptr;
+ buf_data = tmo_hdr->buf_data;
+ break;
+ case ODP_BUFFER_TYPE_ANY:
+ any_hdr = ptr;
+ buf_data = any_hdr->buf_data;
+ break;
+ default:
+ ODP_ERR("Bad buffer type\n");
+ exit(0);
}
memset(hdr, 0, size);
set_handle(hdr, pool, index);
- hdr->addr = &payload[pool->s.buf_offset - pool->s.hdr_size];
+ hdr->addr = &buf_data[pool->s.buf_offset - pool->s.hdr_size];
hdr->index = index;
- hdr->size = pool->s.payload_size;
+ hdr->size = pool->s.user_size;
hdr->pool = pool->s.pool;
hdr->type = buf_type;
@@ -249,9 +271,9 @@ static void link_bufs(pool_entry_t *pool)
{
odp_buffer_chunk_hdr_t *chunk_hdr;
size_t hdr_size;
- size_t payload_size;
- size_t payload_align;
- size_t size;
+ size_t data_size;
+ size_t data_align;
+ size_t tot_size;
size_t offset;
size_t min_size;
uint64_t pool_size;
@@ -260,51 +282,49 @@ static void link_bufs(pool_entry_t *pool)
uintptr_t pool_base;
int buf_type;
- buf_type = pool->s.buf_type;
- payload_size = pool->s.payload_size;
- payload_align = pool->s.payload_align;
- pool_size = pool->s.pool_size;
- pool_base = (uintptr_t) pool->s.pool_base_addr;
+ buf_type = pool->s.buf_type;
+ data_size = pool->s.user_size;
+ data_align = pool->s.user_align;
+ pool_size = pool->s.pool_size;
+ pool_base = (uintptr_t) pool->s.pool_base_addr;
- if (buf_type == ODP_BUFFER_TYPE_RAW)
- hdr_size = sizeof(odp_buffer_hdr_t);
- else if (buf_type == ODP_BUFFER_TYPE_PACKET)
+ if (buf_type == ODP_BUFFER_TYPE_RAW) {
+ hdr_size = sizeof(odp_raw_buffer_hdr_t);
+ } else if (buf_type == ODP_BUFFER_TYPE_PACKET) {
hdr_size = sizeof(odp_packet_hdr_t);
- else if (buf_type == ODP_BUFFER_TYPE_TIMEOUT)
+ } else if (buf_type == ODP_BUFFER_TYPE_TIMEOUT) {
hdr_size = sizeof(odp_timeout_hdr_t);
- else if (buf_type == ODP_BUFFER_TYPE_ANY)
- hdr_size = sizeof(union buffer_type_any_u);
- else {
- ODP_ERR("odp_buffer_pool_create: Bad type %i\n",
- buf_type);
+ } else if (buf_type == ODP_BUFFER_TYPE_ANY) {
+ hdr_size = sizeof(odp_any_buffer_hdr_t);
+ } else {
+ ODP_ERR("odp_buffer_pool_create: Bad type %i\n", buf_type);
exit(0);
}
- /* Chunk must fit into buffer payload.*/
+ /* Chunk must fit into buffer data area.*/
min_size = sizeof(odp_buffer_chunk_hdr_t) - hdr_size;
- if (payload_size < min_size)
- payload_size = min_size;
+ if (data_size < min_size)
+ data_size = min_size;
- /* Roundup payload size to full cachelines */
- payload_size = ODP_CACHE_LINE_SIZE_ROUNDUP(payload_size);
+ /* Roundup data size to full cachelines */
+ data_size = ODP_CACHE_LINE_SIZE_ROUNDUP(data_size);
- /* Min cacheline alignment for buffer header and payload */
- payload_align = ODP_CACHE_LINE_SIZE_ROUNDUP(payload_align);
- offset = ODP_CACHE_LINE_SIZE_ROUNDUP(hdr_size);
+ /* Min cacheline alignment for buffer header and data */
+ data_align = ODP_CACHE_LINE_SIZE_ROUNDUP(data_align);
+ offset = ODP_CACHE_LINE_SIZE_ROUNDUP(hdr_size);
/* Multiples of cacheline size */
- if (payload_size > payload_align)
- size = payload_size + offset;
+ if (data_size > data_align)
+ tot_size = data_size + offset;
else
- size = payload_align + offset;
+ tot_size = data_align + offset;
/* First buffer */
- buf_base = ODP_ALIGN_ROUNDUP(pool_base + offset, payload_align)
- - offset;
+ buf_base = ODP_ALIGN_ROUNDUP(pool_base + offset, data_align) - offset;
pool->s.hdr_size = hdr_size;
pool->s.buf_base = buf_base;
- pool->s.buf_size = size;
+ pool->s.buf_size = tot_size;
pool->s.buf_offset = offset;
index = 0;
@@ -312,7 +332,7 @@ static void link_bufs(pool_entry_t *pool)
pool->s.head = NULL;
pool_size -= buf_base - pool_base;
- while (pool_size > ODP_BUFS_PER_CHUNK * size) {
+ while (pool_size > ODP_BUFS_PER_CHUNK * tot_size) {
int i;
fill_hdr(chunk_hdr, pool, index, ODP_BUFFER_TYPE_CHUNK);
@@ -333,7 +353,7 @@ static void link_bufs(pool_entry_t *pool)
chunk_hdr = (odp_buffer_chunk_hdr_t *)index_to_hdr(pool,
index);
pool->s.num_bufs += ODP_BUFS_PER_CHUNK;
- pool_size -= ODP_BUFS_PER_CHUNK * size;
+ pool_size -= ODP_BUFS_PER_CHUNK * tot_size;
}
}
@@ -360,8 +380,8 @@ odp_buffer_pool_t odp_buffer_pool_create(const char *name,
pool->s.name[ODP_BUFFER_POOL_NAME_LEN - 1] = 0;
pool->s.pool_base_addr = base_addr;
pool->s.pool_size = size;
- pool->s.payload_size = buf_size;
- pool->s.payload_align = buf_align;
+ pool->s.user_size = buf_size;
+ pool->s.user_align = buf_align;
pool->s.buf_type = buf_type;
link_bufs(pool);
@@ -486,8 +506,8 @@ void odp_buffer_pool_print(odp_buffer_pool_t pool_id)
printf(" pool base %p\n", pool->s.pool_base_addr);
printf(" buf base 0x%"PRIxPTR"\n", pool->s.buf_base);
printf(" pool size 0x%"PRIx64"\n", pool->s.pool_size);
- printf(" buf size %zu\n", pool->s.payload_size);
- printf(" buf align %zu\n", pool->s.payload_align);
+ printf(" buf size %zu\n", pool->s.user_size);
+ printf(" buf align %zu\n", pool->s.user_align);
printf(" hdr size %zu\n", pool->s.hdr_size);
printf(" alloc size %zu\n", pool->s.buf_size);
printf(" offset to hdr %zu\n", pool->s.buf_offset);
diff --git a/platform/linux-generic/source/odp_packet.c b/platform/linux-generic/source/odp_packet.c
index 530e51324..99fcc6d90 100644
--- a/platform/linux-generic/source/odp_packet.c
+++ b/platform/linux-generic/source/odp_packet.c
@@ -28,7 +28,7 @@ void odp_packet_init(odp_packet_t pkt)
size_t len;
start = (uint8_t *)pkt_hdr + start_offset;
- len = ODP_OFFSETOF(odp_packet_hdr_t, payload) - start_offset;
+ len = ODP_OFFSETOF(odp_packet_hdr_t, buf_data) - start_offset;
memset(start, 0, len);
pkt_hdr->l2_offset = ODP_PACKET_OFFSET_INVALID;
@@ -348,7 +348,7 @@ int odp_packet_copy(odp_packet_t pkt_dst, odp_packet_t pkt_src)
/* Copy packet header */
start_dst = (uint8_t *)pkt_hdr_dst + start_offset;
start_src = (uint8_t *)pkt_hdr_src + start_offset;
- len = ODP_OFFSETOF(odp_packet_hdr_t, payload) - start_offset;
+ len = ODP_OFFSETOF(odp_packet_hdr_t, buf_data) - start_offset;
memcpy(start_dst, start_src, len);
/* Copy frame payload */