event: create/get/put mempool per sockect

Change-Id: I6ea82f7b0ffc86e01466717d1b5bf0816cb232ae
Signed-off-by: GangCao <gang.cao@intel.com>
This commit is contained in:
GangCao 2016-06-27 23:24:36 -04:00 committed by Daniel Verkamp
parent a84c493af3
commit e0f4313dbd

View File

@ -56,6 +56,8 @@
#include "spdk/log.h" #include "spdk/log.h"
#define SPDK_MAX_SOCKET 64
enum spdk_reactor_state { enum spdk_reactor_state {
SPDK_REACTOR_STATE_INVALID = 0, SPDK_REACTOR_STATE_INVALID = 0,
SPDK_REACTOR_STATE_INITIALIZED = 1, SPDK_REACTOR_STATE_INITIALIZED = 1,
@ -87,7 +89,7 @@ static enum spdk_reactor_state g_reactor_state = SPDK_REACTOR_STATE_INVALID;
static void spdk_reactor_construct(struct spdk_reactor *w, uint32_t lcore); static void spdk_reactor_construct(struct spdk_reactor *w, uint32_t lcore);
struct rte_mempool *g_spdk_event_mempool; struct rte_mempool *g_spdk_event_mempool[SPDK_MAX_SOCKET];
/** \file /** \file
@ -107,8 +109,10 @@ spdk_event_allocate(uint32_t lcore, spdk_event_fn fn, void *arg1, void *arg2,
{ {
struct spdk_event *event = NULL; struct spdk_event *event = NULL;
int rc; int rc;
uint8_t socket_id = rte_lcore_to_socket_id(lcore);
RTE_VERIFY(socket_id < SPDK_MAX_SOCKET);
rc = rte_mempool_get(g_spdk_event_mempool, (void **)&event); rc = rte_mempool_get(g_spdk_event_mempool[socket_id], (void **)&event);
RTE_VERIFY((rc == 0) && (event != NULL)); RTE_VERIFY((rc == 0) && (event != NULL));
event->lcore = lcore; event->lcore = lcore;
@ -121,9 +125,12 @@ spdk_event_allocate(uint32_t lcore, spdk_event_fn fn, void *arg1, void *arg2,
} }
static void static void
spdk_event_free(struct spdk_event *event) spdk_event_free(uint32_t lcore, struct spdk_event *event)
{ {
rte_mempool_put(g_spdk_event_mempool, (void *)event); uint8_t socket_id = rte_lcore_to_socket_id(lcore);
RTE_VERIFY(socket_id < SPDK_MAX_SOCKET);
rte_mempool_put(g_spdk_event_mempool[socket_id], (void *)event);
} }
void void
@ -170,7 +177,7 @@ spdk_event_queue_run_single(uint32_t lcore)
} }
event->fn(event); event->fn(event);
spdk_event_free(event); spdk_event_free(lcore, event);
} }
static void static void
@ -440,6 +447,9 @@ spdk_reactors_init(const char *mask)
uint32_t i; uint32_t i;
int rc; int rc;
struct spdk_reactor *reactor; struct spdk_reactor *reactor;
uint64_t socket_mask = 0x0;
uint8_t socket_count = 0;
char mempool_name[32];
rc = spdk_reactor_parse_mask(mask); rc = spdk_reactor_parse_mask(mask);
if (rc < 0) { if (rc < 0) {
@ -447,7 +457,6 @@ spdk_reactors_init(const char *mask)
} }
printf("Occupied cpu core mask is 0x%lx\n", spdk_app_get_core_mask()); printf("Occupied cpu core mask is 0x%lx\n", spdk_app_get_core_mask());
printf("Occupied cpu socket mask is 0x%lx\n", spdk_reactor_get_socket_mask());
RTE_LCORE_FOREACH(i) { RTE_LCORE_FOREACH(i) {
if (((1ULL << i) & spdk_app_get_core_mask())) { if (((1ULL << i) & spdk_app_get_core_mask())) {
@ -457,15 +466,47 @@ spdk_reactors_init(const char *mask)
} }
} }
/* TODO: separate event mempools per socket */ socket_mask = spdk_reactor_get_socket_mask();
g_spdk_event_mempool = rte_mempool_create("spdk_event_mempool", 262144, printf("Occupied cpu socket mask is 0x%lx\n", socket_mask);
sizeof(struct spdk_event), 128, 0,
NULL, NULL, NULL, NULL,
SOCKET_ID_ANY, 0);
if (g_spdk_event_mempool == NULL) { for (i = 0; i < SPDK_MAX_SOCKET; i++) {
SPDK_ERRLOG("spdk_event_mempool allocation failed\n"); if ((1ULL << i) & socket_mask) {
return -1; socket_count++;
}
}
for (i = 0; i < SPDK_MAX_SOCKET; i++) {
if ((1ULL << i) & socket_mask) {
snprintf(mempool_name, sizeof(mempool_name), "spdk_event_mempool_%d", i);
g_spdk_event_mempool[i] = rte_mempool_create(mempool_name,
(262144 / socket_count),
sizeof(struct spdk_event), 128, 0,
NULL, NULL, NULL, NULL, i, 0);
if (g_spdk_event_mempool[i] == NULL) {
SPDK_ERRLOG("spdk_event_mempool creation failed on socket %d\n", i);
/*
* Instead of failing the operation directly, try to create
* the mempool on any available sockets in the case that
* memory is not evenly installed on all sockets. If still
* fails, free all allocated memory and exits.
*/
g_spdk_event_mempool[i] = rte_mempool_create(
mempool_name,
(262144 / socket_count),
sizeof(struct spdk_event),
128, 0,
NULL, NULL, NULL, NULL,
SOCKET_ID_ANY, 0);
/* TODO: in DPDK 16.04, free mempool API is avaialbe. */
if (g_spdk_event_mempool[i] == NULL) {
SPDK_ERRLOG("spdk_event_mempool creation failed\n");
return -1;
}
}
}
} }
g_reactor_state = SPDK_REACTOR_STATE_INITIALIZED; g_reactor_state = SPDK_REACTOR_STATE_INITIALIZED;