#include <rte_fbarray.h>
#include <rte_memzone.h>
#include <rte_memory.h>
-#include <rte_eal_memconfig.h>
+#include <rte_string_fns.h>
#include <rte_rwlock.h>
#include "eal_private.h"
TAILQ_ENTRY(mem_event_callback_entry) next;
char name[RTE_MEM_EVENT_CALLBACK_NAME_LEN];
rte_mem_event_callback_t clb;
+ void *arg;
};
struct mem_alloc_validator_entry {
static rte_rwlock_t mem_alloc_validator_rwlock = RTE_RWLOCK_INITIALIZER;
static struct mem_event_callback_entry *
-find_mem_event_callback(const char *name)
+find_mem_event_callback(const char *name, void *arg)
{
struct mem_event_callback_entry *r;
TAILQ_FOREACH(r, &mem_event_callback_list, next) {
- if (!strcmp(r->name, name))
+ if (!strcmp(r->name, name) && r->arg == arg)
break;
}
return r;
const struct rte_memseg *ms;
/* for IOVA_VA, it's always contiguous */
- if (rte_eal_iova_mode() == RTE_IOVA_VA)
+ if (rte_eal_iova_mode() == RTE_IOVA_VA && !msl->external)
return true;
/* for legacy memory, it's always contiguous */
int
eal_memalloc_mem_event_callback_register(const char *name,
- rte_mem_event_callback_t clb)
+ rte_mem_event_callback_t clb, void *arg)
{
struct mem_event_callback_entry *entry;
int ret, len;
}
rte_rwlock_write_lock(&mem_event_rwlock);
- entry = find_mem_event_callback(name);
+ entry = find_mem_event_callback(name, arg);
if (entry != NULL) {
rte_errno = EEXIST;
ret = -1;
/* callback successfully created and is valid, add it to the list */
entry->clb = clb;
- snprintf(entry->name, RTE_MEM_EVENT_CALLBACK_NAME_LEN, "%s", name);
+ entry->arg = arg;
+ strlcpy(entry->name, name, RTE_MEM_EVENT_CALLBACK_NAME_LEN);
TAILQ_INSERT_TAIL(&mem_event_callback_list, entry, next);
ret = 0;
- RTE_LOG(DEBUG, EAL, "Mem event callback '%s' registered\n", name);
+ RTE_LOG(DEBUG, EAL, "Mem event callback '%s:%p' registered\n",
+ name, arg);
unlock:
rte_rwlock_write_unlock(&mem_event_rwlock);
}
int
-eal_memalloc_mem_event_callback_unregister(const char *name)
+eal_memalloc_mem_event_callback_unregister(const char *name, void *arg)
{
struct mem_event_callback_entry *entry;
int ret, len;
}
rte_rwlock_write_lock(&mem_event_rwlock);
- entry = find_mem_event_callback(name);
+ entry = find_mem_event_callback(name, arg);
if (entry == NULL) {
rte_errno = ENOENT;
ret = -1;
ret = 0;
- RTE_LOG(DEBUG, EAL, "Mem event callback '%s' unregistered\n", name);
+ RTE_LOG(DEBUG, EAL, "Mem event callback '%s:%p' unregistered\n",
+ name, arg);
unlock:
rte_rwlock_write_unlock(&mem_event_rwlock);
rte_rwlock_read_lock(&mem_event_rwlock);
TAILQ_FOREACH(entry, &mem_event_callback_list, next) {
- RTE_LOG(DEBUG, EAL, "Calling mem event callback %s",
- entry->name);
- entry->clb(event, start, len);
+ RTE_LOG(DEBUG, EAL, "Calling mem event callback '%s:%p'\n",
+ entry->name, entry->arg);
+ entry->clb(event, start, len, entry->arg);
}
rte_rwlock_read_unlock(&mem_event_rwlock);
entry->clb = clb;
entry->socket_id = socket_id;
entry->limit = limit;
- snprintf(entry->name, RTE_MEM_ALLOC_VALIDATOR_NAME_LEN, "%s", name);
+ strlcpy(entry->name, name, RTE_MEM_ALLOC_VALIDATOR_NAME_LEN);
TAILQ_INSERT_TAIL(&mem_alloc_validator_list, entry, next);
ret = 0;