Hi Erik, >Hi Pavan, > >Some comments below: > >> -----Original Message----- >> From: pbhagavat...@marvell.com <pbhagavat...@marvell.com> >> Sent: Wednesday, October 6, 2021 1:50 AM >> To: jer...@marvell.com; Carrillo, Erik G <erik.g.carri...@intel.com> >> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavat...@marvell.com> >> Subject: [dpdk-dev] [PATCH v3 11/14] eventdev: move timer adapters >> memory to hugepage >> >> From: Pavan Nikhilesh <pbhagavat...@marvell.com> >> >> Move memory used by timer adapters to hugepage. >> Allocate memory on the first adapter create or lookup to address both >> primary and secondary process usecases. >> This will prevent TLB misses if any and aligns to memory structure of >other >> subsystems. >> >> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> >> --- >> lib/eventdev/rte_event_timer_adapter.c | 24 >> +++++++++++++++++++++++- >> 1 file changed, 23 insertions(+), 1 deletion(-) >> >> diff --git a/lib/eventdev/rte_event_timer_adapter.c >> b/lib/eventdev/rte_event_timer_adapter.c >> index ae55407042..c4dc7a5fd4 100644 >> --- a/lib/eventdev/rte_event_timer_adapter.c >> +++ b/lib/eventdev/rte_event_timer_adapter.c >> @@ -33,7 +33,7 @@ RTE_LOG_REGISTER_SUFFIX(evtim_logtype, >> adapter.timer, NOTICE); >> RTE_LOG_REGISTER_SUFFIX(evtim_buffer_logtype, adapter.timer, >NOTICE); >> RTE_LOG_REGISTER_SUFFIX(evtim_svc_logtype, adapter.timer.svc, >> NOTICE); >> >> -static struct rte_event_timer_adapter >> adapters[RTE_EVENT_TIMER_ADAPTER_NUM_MAX]; >> +static struct rte_event_timer_adapter *adapters; >> >> static const struct event_timer_adapter_ops swtim_ops; >> >> @@ -138,6 +138,17 @@ rte_event_timer_adapter_create_ext( >> int n, ret; >> struct rte_eventdev *dev; >> >> + if (adapters == NULL) { >> + adapters = rte_zmalloc("Eventdev", >> + sizeof(struct >rte_event_timer_adapter) * >> + >> RTE_EVENT_TIMER_ADAPTER_NUM_MAX, >> + RTE_CACHE_LINE_SIZE); >> + if (adapters == NULL) { >> + rte_errno = ENOMEM; >> + return NULL; >> + } >> + } >> + >> if (conf == NULL) { >> rte_errno = EINVAL; >> return NULL; >> @@ -312,6 +323,17 @@ rte_event_timer_adapter_lookup(uint16_t >> adapter_id) >> int ret; >> struct rte_eventdev *dev; >> >> + if (adapters == NULL) { >> + adapters = rte_zmalloc("Eventdev", >> + sizeof(struct >rte_event_timer_adapter) * >> + >> RTE_EVENT_TIMER_ADAPTER_NUM_MAX, >> + RTE_CACHE_LINE_SIZE); >> + if (adapters == NULL) { >> + rte_errno = ENOMEM; >> + return NULL; >> + } >> + } >> + >> if (adapters[adapter_id].allocated) >> return &adapters[adapter_id]; /* Adapter is already >loaded >> */ >> >> -- >> 2.17.1 > >The rte_event_timer_adapter struct has several fields that have per- >process values. > >For example, there are three fast path function pointers and each will >be assigned distinct addresses for each process in a multi-process >scenario. The "allocated" field is also per-process. With the changes >above, if a secondary process did a lookup() after a primary process did >a create(), the secondary would get a reference to an object with >function pointers that are invalid in the secondary process. >
I understand, the current patch doesn't unify the memory between processes. Instead, we zmalloc the per-process 'array' that holds the adapter objects when ever the process calls either create or lookup and initialize the per-process data structure. The pointer to the adapter array is static, so when ever a process is initialized it will be NULL. >To fully move the adapter object table into shared hugepage memory, >those "per-process" members would need to be collected into a per- >process data structure that could be independently allocated for each >process. However, that would add one more pointer dereference to >get to the fast path functions, and avoiding that was the original reason >to put those pointers there. This is similar to the rte_eventdev struct. > >Thanks, >Erik