aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/odp-linux-generic.conf12
-rw-r--r--platform/linux-generic/include/odp_pool_internal.h5
-rw-r--r--platform/linux-generic/odp_pool.c39
-rw-r--r--platform/linux-generic/test/process-mode.conf2
4 files changed, 53 insertions, 5 deletions
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf
index 4db9ed489..af651d7f6 100644
--- a/config/odp-linux-generic.conf
+++ b/config/odp-linux-generic.conf
@@ -16,7 +16,7 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.0"
+config_file_version = "0.1.1"
# Shared memory options
shm: {
@@ -39,6 +39,16 @@ shm: {
single_va = 0
}
+# Pool options
+pool: {
+ # Packet pool options
+ pkt: {
+ # Maximum number of packets per pool. Power of two minus one
+ # results optimal memory usage (e.g. (256 * 1024) - 1).
+ max_num = 262143
+ }
+}
+
# DPDK pktio options
pktio_dpdk: {
# Default options
diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h
index 2696e8eec..94f859de0 100644
--- a/platform/linux-generic/include/odp_pool_internal.h
+++ b/platform/linux-generic/include/odp_pool_internal.h
@@ -89,6 +89,11 @@ typedef struct pool_t {
typedef struct pool_table_t {
pool_t pool[ODP_CONFIG_POOLS];
odp_shm_t shm;
+
+ struct {
+ uint32_t pkt_max_num;
+ } config;
+
} pool_table_t;
extern pool_table_t *pool_tbl;
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c
index db7a8da3f..d08be4378 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -22,6 +22,7 @@
#include <odp_ring_internal.h>
#include <odp_shm_internal.h>
#include <odp_global_data.h>
+#include <odp_libconfig_internal.h>
#include <string.h>
#include <stdio.h>
@@ -33,8 +34,9 @@
#define UNLOCK(a) odp_ticketlock_unlock(a)
#define LOCK_INIT(a) odp_ticketlock_init(a)
-#define CACHE_BURST 32
-#define RING_SIZE_MIN (2 * CACHE_BURST)
+#define CACHE_BURST 32
+#define RING_SIZE_MIN (2 * CACHE_BURST)
+#define POOL_MAX_NUM_MIN RING_SIZE_MIN
/* Make sure packet buffers don't cross huge page boundaries starting from this
* page size. 2MB is typically the smallest used huge page size. */
@@ -83,6 +85,32 @@ static inline pool_t *pool_from_buf(odp_buffer_t buf)
return buf_hdr->pool_ptr;
}
+static int read_config_file(pool_table_t *pool_tbl)
+{
+ const char *str;
+ int val = 0;
+
+ ODP_PRINT("Pool config:\n");
+
+ str = "pool.pkt.max_num";
+ if (!_odp_libconfig_lookup_int(str, &val)) {
+ ODP_ERR("Config option '%s' not found.\n", str);
+ return -1;
+ }
+
+ if (val > CONFIG_POOL_MAX_NUM || val < POOL_MAX_NUM_MIN) {
+ ODP_ERR("Bad value %s = %u\n", str, val);
+ return -1;
+ }
+
+ pool_tbl->config.pkt_max_num = val;
+ ODP_PRINT(" %s: %i\n", str, val);
+
+ ODP_PRINT("\n");
+
+ return 0;
+}
+
int odp_pool_init_global(void)
{
uint32_t i;
@@ -101,6 +129,11 @@ int odp_pool_init_global(void)
memset(pool_tbl, 0, sizeof(pool_table_t));
pool_tbl->shm = shm;
+ if (read_config_file(pool_tbl)) {
+ odp_shm_free(shm);
+ return -1;
+ }
+
for (i = 0; i < ODP_CONFIG_POOLS; i++) {
pool_t *pool = pool_entry(i);
@@ -950,7 +983,7 @@ int odp_pool_capability(odp_pool_capability_t *capa)
/* Packet pools */
capa->pkt.max_pools = ODP_CONFIG_POOLS;
capa->pkt.max_len = CONFIG_PACKET_MAX_LEN;
- capa->pkt.max_num = CONFIG_POOL_MAX_NUM;
+ capa->pkt.max_num = pool_tbl->config.pkt_max_num;
capa->pkt.min_headroom = CONFIG_PACKET_HEADROOM;
capa->pkt.max_headroom = CONFIG_PACKET_HEADROOM;
capa->pkt.min_tailroom = CONFIG_PACKET_TAILROOM;
diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf
index 8618f2fdb..d80df25c4 100644
--- a/platform/linux-generic/test/process-mode.conf
+++ b/platform/linux-generic/test/process-mode.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.0"
+config_file_version = "0.1.1"
# Shared memory options
shm: {