DPDK patches and discussions
 help / color / mirror / Atom feed
From: Shijith Thotton <sthotton@marvell.com>
To: Erik Gabriel Carrillo <erik.g.carrillo@intel.com>
Cc: Shijith Thotton <sthotton@marvell.com>,
	Pavan Nikhilesh <pbhagavatula@marvell.com>,
	Jerin Jacob <jerinj@marvell.com>, <dev@dpdk.org>
Subject: [dpdk-dev] [RFC PATCH] eventdev: use shared memory to store timer adapter
Date: Fri, 12 Feb 2021 15:43:43 +0530	[thread overview]
Message-ID: <20210212101343.689792-1-sthotton@marvell.com> (raw)

It is not possible for secondary process to arm timer as timer adapter
is not stored in shared memory. Using shared memory allows the secondary
to lookup adapters and arm them.

Signed-off-by: Shijith Thotton <sthotton@marvell.com>
---
 drivers/event/octeontx/timvf_evdev.c          |  20 +-
 drivers/event/octeontx/timvf_worker.c         |  12 +-
 drivers/event/octeontx2/otx2_tim_evdev.c      |  28 +--
 drivers/event/octeontx2/otx2_tim_worker.c     |   4 +-
 lib/librte_eventdev/rte_event_timer_adapter.c | 193 ++++++++++--------
 lib/librte_eventdev/rte_event_timer_adapter.h |  58 ++++--
 .../rte_event_timer_adapter_pmd.h             |  31 ---
 7 files changed, 186 insertions(+), 160 deletions(-)

diff --git a/drivers/event/octeontx/timvf_evdev.c b/drivers/event/octeontx/timvf_evdev.c
index 8af4d6e37..ee93c87b5 100644
--- a/drivers/event/octeontx/timvf_evdev.c
+++ b/drivers/event/octeontx/timvf_evdev.c
@@ -39,10 +39,10 @@ static void
 timvf_ring_info_get(const struct rte_event_timer_adapter *adptr,
 		struct rte_event_timer_adapter_info *adptr_info)
 {
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	adptr_info->max_tmo_ns = timr->max_tout;
 	adptr_info->min_resolution_ns = timr->tck_nsec;
-	rte_memcpy(&adptr_info->conf, &adptr->data->conf,
+	rte_memcpy(&adptr_info->conf, &adptr->data.conf,
 			sizeof(struct rte_event_timer_adapter_conf));
 }
 
@@ -123,7 +123,7 @@ timvf_ring_start(const struct rte_event_timer_adapter *adptr)
 	uintptr_t pool;
 	struct timvf_ctrl_reg rctrl;
 	struct timvf_mbox_dev_info dinfo;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 
 	ret = timvf_mbox_dev_info_get(&dinfo);
 	if (ret < 0 || ret != sizeof(struct timvf_mbox_dev_info))
@@ -210,7 +210,7 @@ timvf_ring_start(const struct rte_event_timer_adapter *adptr)
 static int
 timvf_ring_stop(const struct rte_event_timer_adapter *adptr)
 {
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	struct timvf_ctrl_reg rctrl = {0};
 	rctrl.rctrl0 = timvf_read64((uint8_t *)timr->vbar0 + TIM_VRING_CTL0);
 	rctrl.rctrl1 = timvf_read64((uint8_t *)timr->vbar0 + TIM_VRING_CTL1);
@@ -225,7 +225,7 @@ timvf_ring_stop(const struct rte_event_timer_adapter *adptr)
 static int
 timvf_ring_create(struct rte_event_timer_adapter *adptr)
 {
-	struct rte_event_timer_adapter_conf *rcfg = &adptr->data->conf;
+	struct rte_event_timer_adapter_conf *rcfg = &adptr->data.conf;
 	uint16_t free_idx = UINT16_MAX;
 	unsigned int mp_flags = 0;
 	struct ssovf_evdev *edev;
@@ -245,7 +245,7 @@ timvf_ring_create(struct rte_event_timer_adapter *adptr)
 	if (timr == NULL)
 		return -ENOMEM;
 
-	adptr->data->adapter_priv = timr;
+	adptr->data.adapter_priv = timr;
 	/* Check config parameters. */
 	if ((rcfg->clk_src != RTE_EVENT_TIMER_ADAPTER_CPU_CLK) &&
 			(!rcfg->timer_tick_ns ||
@@ -364,7 +364,7 @@ timvf_ring_create(struct rte_event_timer_adapter *adptr)
 static int
 timvf_ring_free(struct rte_event_timer_adapter *adptr)
 {
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	struct ssovf_evdev *edev;
 	int i;
 
@@ -380,7 +380,7 @@ timvf_ring_free(struct rte_event_timer_adapter *adptr)
 	rte_mempool_free(timr->chunk_pool);
 	rte_free(timr->bkt);
 	timvf_release_ring(timr->tim_ring_id);
-	rte_free(adptr->data->adapter_priv);
+	rte_free(adptr->data.adapter_priv);
 	return 0;
 }
 
@@ -388,7 +388,7 @@ static int
 timvf_stats_get(const struct rte_event_timer_adapter *adapter,
 		struct rte_event_timer_adapter_stats *stats)
 {
-	struct timvf_ring *timr = adapter->data->adapter_priv;
+	struct timvf_ring *timr = adapter->data.adapter_priv;
 	uint64_t bkt_cyc = rte_rdtsc() - timr->ring_start_cyc;
 
 	stats->evtim_exp_count = timr->tim_arm_cnt;
@@ -401,7 +401,7 @@ timvf_stats_get(const struct rte_event_timer_adapter *adapter,
 static int
 timvf_stats_reset(const struct rte_event_timer_adapter *adapter)
 {
-	struct timvf_ring *timr = adapter->data->adapter_priv;
+	struct timvf_ring *timr = adapter->data.adapter_priv;
 
 	timr->tim_arm_cnt = 0;
 	return 0;
diff --git a/drivers/event/octeontx/timvf_worker.c b/drivers/event/octeontx/timvf_worker.c
index 50790e199..2e33ddd33 100644
--- a/drivers/event/octeontx/timvf_worker.c
+++ b/drivers/event/octeontx/timvf_worker.c
@@ -70,7 +70,7 @@ timvf_timer_arm_burst_sp(const struct rte_event_timer_adapter *adptr,
 	int ret;
 	uint16_t index;
 	struct tim_mem_entry entry;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	for (index = 0; index < nb_timers; index++) {
 		if (timvf_timer_reg_checks(timr, tim[index]))
 			break;
@@ -92,7 +92,7 @@ timvf_timer_arm_burst_sp_stats(const struct rte_event_timer_adapter *adptr,
 		struct rte_event_timer **tim, const uint16_t nb_timers)
 {
 	uint16_t ret;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 
 	ret = timvf_timer_arm_burst_sp(adptr, tim, nb_timers);
 	timr->tim_arm_cnt += ret;
@@ -107,7 +107,7 @@ timvf_timer_arm_burst_mp(const struct rte_event_timer_adapter *adptr,
 	int ret;
 	uint16_t index;
 	struct tim_mem_entry entry;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	for (index = 0; index < nb_timers; index++) {
 		if (timvf_timer_reg_checks(timr, tim[index]))
 			break;
@@ -128,7 +128,7 @@ timvf_timer_arm_burst_mp_stats(const struct rte_event_timer_adapter *adptr,
 		struct rte_event_timer **tim, const uint16_t nb_timers)
 {
 	uint16_t ret;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 
 	ret = timvf_timer_arm_burst_mp(adptr, tim, nb_timers);
 	timr->tim_arm_cnt += ret;
@@ -145,7 +145,7 @@ timvf_timer_arm_tmo_brst(const struct rte_event_timer_adapter *adptr,
 	uint16_t set_timers = 0;
 	uint16_t idx;
 	uint16_t arr_idx = 0;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 	struct tim_mem_entry entry[TIMVF_MAX_BURST] __rte_cache_aligned;
 
 	if (unlikely(!timeout_tick || timeout_tick >= timr->nb_bkts)) {
@@ -180,7 +180,7 @@ timvf_timer_arm_tmo_brst_stats(const struct rte_event_timer_adapter *adptr,
 		const uint16_t nb_timers)
 {
 	uint16_t set_timers;
-	struct timvf_ring *timr = adptr->data->adapter_priv;
+	struct timvf_ring *timr = adptr->data.adapter_priv;
 
 	set_timers = timvf_timer_arm_tmo_brst(adptr, tim, timeout_tick,
 			nb_timers);
diff --git a/drivers/event/octeontx2/otx2_tim_evdev.c b/drivers/event/octeontx2/otx2_tim_evdev.c
index 4c24cc8a6..24b8c605b 100644
--- a/drivers/event/octeontx2/otx2_tim_evdev.c
+++ b/drivers/event/octeontx2/otx2_tim_evdev.c
@@ -62,11 +62,11 @@ static void
 otx2_tim_ring_info_get(const struct rte_event_timer_adapter *adptr,
 		       struct rte_event_timer_adapter_info *adptr_info)
 {
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 
 	adptr_info->max_tmo_ns = tim_ring->max_tout;
 	adptr_info->min_resolution_ns = tim_ring->tck_nsec;
-	rte_memcpy(&adptr_info->conf, &adptr->data->conf,
+	rte_memcpy(&adptr_info->conf, &adptr->data.conf,
 		   sizeof(struct rte_event_timer_adapter_conf));
 }
 
@@ -247,7 +247,7 @@ tim_err_desc(int rc)
 static int
 otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
 {
-	struct rte_event_timer_adapter_conf *rcfg = &adptr->data->conf;
+	struct rte_event_timer_adapter_conf *rcfg = &adptr->data.conf;
 	struct otx2_tim_evdev *dev = tim_priv_get();
 	struct otx2_tim_ring *tim_ring;
 	struct tim_config_req *cfg_req;
@@ -259,13 +259,13 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
 	if (dev == NULL)
 		return -ENODEV;
 
-	if (adptr->data->id >= dev->nb_rings)
+	if (adptr->data.id >= dev->nb_rings)
 		return -ENODEV;
 
 	req = otx2_mbox_alloc_msg_tim_lf_alloc(dev->mbox);
 	req->npa_pf_func = otx2_npa_pf_func_get();
 	req->sso_pf_func = otx2_sso_pf_func_get();
-	req->ring = adptr->data->id;
+	req->ring = adptr->data.id;
 
 	rc = otx2_mbox_process_msg(dev->mbox, (void **)&rsp);
 	if (rc < 0) {
@@ -290,11 +290,11 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
 		goto rng_mem_err;
 	}
 
-	adptr->data->adapter_priv = tim_ring;
+	adptr->data.adapter_priv = tim_ring;
 
 	tim_ring->tenns_clk_freq = rsp->tenns_clk;
 	tim_ring->clk_src = (int)rcfg->clk_src;
-	tim_ring->ring_id = adptr->data->id;
+	tim_ring->ring_id = adptr->data.id;
 	tim_ring->tck_nsec = RTE_ALIGN_MUL_CEIL(rcfg->timer_tick_ns, 10);
 	tim_ring->max_tout = rcfg->max_tmo_ns;
 	tim_ring->nb_bkts = (tim_ring->max_tout / tim_ring->tck_nsec);
@@ -393,7 +393,7 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
 	rte_free(tim_ring);
 rng_mem_err:
 	free_req = otx2_mbox_alloc_msg_tim_lf_free(dev->mbox);
-	free_req->ring = adptr->data->id;
+	free_req->ring = adptr->data.id;
 	otx2_mbox_process(dev->mbox);
 	return rc;
 }
@@ -426,7 +426,7 @@ otx2_tim_calibrate_start_tsc(struct otx2_tim_ring *tim_ring)
 static int
 otx2_tim_ring_start(const struct rte_event_timer_adapter *adptr)
 {
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 	struct otx2_tim_evdev *dev = tim_priv_get();
 	struct tim_enable_rsp *rsp;
 	struct tim_ring_req *req;
@@ -469,7 +469,7 @@ otx2_tim_ring_start(const struct rte_event_timer_adapter *adptr)
 static int
 otx2_tim_ring_stop(const struct rte_event_timer_adapter *adptr)
 {
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 	struct otx2_tim_evdev *dev = tim_priv_get();
 	struct tim_ring_req *req;
 	int rc;
@@ -492,7 +492,7 @@ otx2_tim_ring_stop(const struct rte_event_timer_adapter *adptr)
 static int
 otx2_tim_ring_free(struct rte_event_timer_adapter *adptr)
 {
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 	struct otx2_tim_evdev *dev = tim_priv_get();
 	struct tim_ring_req *req;
 	int rc;
@@ -513,7 +513,7 @@ otx2_tim_ring_free(struct rte_event_timer_adapter *adptr)
 
 	rte_free(tim_ring->bkt);
 	rte_mempool_free(tim_ring->chunk_pool);
-	rte_free(adptr->data->adapter_priv);
+	rte_free(adptr->data.adapter_priv);
 
 	return 0;
 }
@@ -522,7 +522,7 @@ static int
 otx2_tim_stats_get(const struct rte_event_timer_adapter *adapter,
 		   struct rte_event_timer_adapter_stats *stats)
 {
-	struct otx2_tim_ring *tim_ring = adapter->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adapter->data.adapter_priv;
 	uint64_t bkt_cyc = rte_rdtsc() - tim_ring->ring_start_cyc;
 
 
@@ -537,7 +537,7 @@ otx2_tim_stats_get(const struct rte_event_timer_adapter *adapter,
 static int
 otx2_tim_stats_reset(const struct rte_event_timer_adapter *adapter)
 {
-	struct otx2_tim_ring *tim_ring = adapter->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adapter->data.adapter_priv;
 
 	__atomic_store_n(&tim_ring->arm_cnt, 0, __ATOMIC_RELAXED);
 	return 0;
diff --git a/drivers/event/octeontx2/otx2_tim_worker.c b/drivers/event/octeontx2/otx2_tim_worker.c
index 4b5cfdc72..5614e1643 100644
--- a/drivers/event/octeontx2/otx2_tim_worker.c
+++ b/drivers/event/octeontx2/otx2_tim_worker.c
@@ -61,7 +61,7 @@ tim_timer_arm_burst(const struct rte_event_timer_adapter *adptr,
 		    const uint16_t nb_timers,
 		    const uint8_t flags)
 {
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 	struct otx2_tim_ent entry;
 	uint16_t index;
 	int ret;
@@ -100,7 +100,7 @@ tim_timer_arm_tmo_brst(const struct rte_event_timer_adapter *adptr,
 		       const uint16_t nb_timers, const uint8_t flags)
 {
 	struct otx2_tim_ent entry[OTX2_TIM_MAX_BURST] __rte_cache_aligned;
-	struct otx2_tim_ring *tim_ring = adptr->data->adapter_priv;
+	struct otx2_tim_ring *tim_ring = adptr->data.adapter_priv;
 	uint16_t set_timers = 0;
 	uint16_t arr_idx = 0;
 	uint16_t idx;
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/librte_eventdev/rte_event_timer_adapter.c
index dd7b83087..682b1c3c2 100644
--- a/lib/librte_eventdev/rte_event_timer_adapter.c
+++ b/lib/librte_eventdev/rte_event_timer_adapter.c
@@ -26,14 +26,14 @@
 #include "rte_event_timer_adapter.h"
 #include "rte_event_timer_adapter_pmd.h"
 
-#define DATA_MZ_NAME_MAX_LEN 64
-#define DATA_MZ_NAME_FORMAT "rte_event_timer_adapter_data_%d"
+#define EVTIM_MZ_NAME_MAX_LEN 64
+#define EVTIM_MZ_NAME_FORMAT "rte_event_timer_adapter_%d"
 
 RTE_LOG_REGISTER(evtim_logtype, lib.eventdev.adapter.timer, NOTICE);
 RTE_LOG_REGISTER(evtim_buffer_logtype, lib.eventdev.adapter.timer, NOTICE);
 RTE_LOG_REGISTER(evtim_svc_logtype, lib.eventdev.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 rte_event_timer_adapter_ops swtim_ops;
 
@@ -72,8 +72,8 @@ default_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id,
 
 	RTE_SET_USED(event_dev_id);
 
-	adapter = &adapters[id];
-	dev = &rte_eventdevs[adapter->data->event_dev_id];
+	adapter = adapters[id];
+	dev = &rte_eventdevs[adapter->data.event_dev_id];
 	dev_id = dev->data->dev_id;
 	dev_conf = dev->data->dev_conf;
 
@@ -118,6 +118,31 @@ default_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id,
 	return ret;
 }
 
+static int
+rte_event_timer_adapter_init(void)
+{
+	const char *name = "rte_event_timer_adapter_array";
+	const struct rte_memzone *mz;
+	unsigned int sz;
+
+	sz = sizeof(*adapters) * RTE_EVENT_TIMER_ADAPTER_NUM_MAX;
+	sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE);
+
+	mz = rte_memzone_lookup(name);
+	if (mz == NULL) {
+		mz = rte_memzone_reserve_aligned(name, sz, rte_socket_id(), 0,
+						 RTE_CACHE_LINE_SIZE);
+		if (mz == NULL) {
+			EVTIM_LOG_ERR("failed to reserve memzone err = %"
+					PRId32, rte_errno);
+			return -rte_errno;
+		}
+	}
+
+	adapters = mz->addr;
+	return 0;
+}
+
 struct rte_event_timer_adapter *
 rte_event_timer_adapter_create(const struct rte_event_timer_adapter_conf *conf)
 {
@@ -134,7 +159,7 @@ rte_event_timer_adapter_create_ext(
 	uint16_t adapter_id;
 	struct rte_event_timer_adapter *adapter;
 	const struct rte_memzone *mz;
-	char mz_name[DATA_MZ_NAME_MAX_LEN];
+	char mz_name[EVTIM_MZ_NAME_MAX_LEN];
 	int n, ret;
 	struct rte_eventdev *dev;
 
@@ -143,6 +168,11 @@ rte_event_timer_adapter_create_ext(
 		return NULL;
 	}
 
+	if (adapters == NULL) {
+		if (rte_event_timer_adapter_init())
+			return NULL;
+	}
+
 	/* Check eventdev ID */
 	if (!rte_event_pmd_is_valid_dev(conf->event_dev_id)) {
 		rte_errno = EINVAL;
@@ -159,49 +189,51 @@ rte_event_timer_adapter_create_ext(
 	}
 
 	/* Check adapter ID not already allocated */
-	adapter = &adapters[adapter_id];
-	if (adapter->allocated) {
+	adapter = adapters[adapter_id];
+	if (adapter) {
+		EVTIM_LOG_ERR("Timer adapter id %u already exists", adapter_id);
 		rte_errno = EEXIST;
 		return NULL;
 	}
 
-	/* Create shared data area. */
-	n = snprintf(mz_name, sizeof(mz_name), DATA_MZ_NAME_FORMAT, adapter_id);
+	/* Reserve timer adapter memory. */
+	n = snprintf(mz_name, sizeof(mz_name), EVTIM_MZ_NAME_FORMAT,
+		     adapter_id);
 	if (n >= (int)sizeof(mz_name)) {
 		rte_errno = EINVAL;
 		return NULL;
 	}
 	mz = rte_memzone_reserve(mz_name,
-				 sizeof(struct rte_event_timer_adapter_data),
+				 sizeof(struct rte_event_timer_adapter),
 				 conf->socket_id, 0);
 	if (mz == NULL)
 		/* rte_errno set by rte_memzone_reserve */
 		return NULL;
 
-	adapter->data = mz->addr;
-	memset(adapter->data, 0, sizeof(struct rte_event_timer_adapter_data));
+	adapter = mz->addr;
+	memset(adapter, 0, sizeof(struct rte_event_timer_adapter));
 
-	adapter->data->mz = mz;
-	adapter->data->event_dev_id = conf->event_dev_id;
-	adapter->data->id = adapter_id;
-	adapter->data->socket_id = conf->socket_id;
-	adapter->data->conf = *conf;  /* copy conf structure */
+	adapter->mz = mz;
+	adapter->data.event_dev_id = conf->event_dev_id;
+	adapter->data.id = adapter_id;
+	adapter->data.socket_id = conf->socket_id;
+	adapter->data.conf = *conf;  /* copy conf structure */
 
 	/* Query eventdev PMD for timer adapter capabilities and ops */
 	ret = dev->dev_ops->timer_adapter_caps_get(dev,
-						   adapter->data->conf.flags,
-						   &adapter->data->caps,
+						   adapter->data.conf.flags,
+						   &adapter->data.caps,
 						   &adapter->ops);
 	if (ret < 0) {
 		rte_errno = -ret;
 		goto free_memzone;
 	}
 
-	if (!(adapter->data->caps &
+	if (!(adapter->data.caps &
 	      RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) {
 		FUNC_PTR_OR_NULL_RET_WITH_ERRNO(conf_cb, EINVAL);
-		ret = conf_cb(adapter->data->id, adapter->data->event_dev_id,
-			      &adapter->data->event_port_id, conf_arg);
+		ret = conf_cb(adapter->data.id, adapter->data.event_dev_id,
+			      &adapter->data.event_port_id, conf_arg);
 		if (ret < 0) {
 			rte_errno = -ret;
 			goto free_memzone;
@@ -227,14 +259,14 @@ rte_event_timer_adapter_create_ext(
 	adapter->arm_tmo_tick_burst = adapter->ops->arm_tmo_tick_burst;
 	adapter->cancel_burst = adapter->ops->cancel_burst;
 
-	adapter->allocated = 1;
+	adapters[adapter_id] = adapter;
 
 	rte_eventdev_trace_timer_adapter_create(adapter_id, adapter, conf,
 		conf_cb);
 	return adapter;
 
 free_memzone:
-	rte_memzone_free(adapter->data->mz);
+	rte_memzone_free(adapter->mz);
 	return NULL;
 }
 
@@ -249,24 +281,24 @@ rte_event_timer_adapter_get_info(const struct rte_event_timer_adapter *adapter,
 		adapter->ops->get_info(adapter, adapter_info);
 
 	/* Set common values */
-	adapter_info->conf = adapter->data->conf;
-	adapter_info->event_dev_port_id = adapter->data->event_port_id;
-	adapter_info->caps = adapter->data->caps;
+	adapter_info->conf = adapter->data.conf;
+	adapter_info->event_dev_port_id = adapter->data.event_port_id;
+	adapter_info->caps = adapter->data.caps;
 
 	return 0;
 }
 
 int
-rte_event_timer_adapter_start(const struct rte_event_timer_adapter *adapter)
+rte_event_timer_adapter_start(struct rte_event_timer_adapter *adapter)
 {
 	int ret;
 
 	ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL);
 	FUNC_PTR_OR_ERR_RET(adapter->ops->start, -EINVAL);
 
-	if (adapter->data->started) {
+	if (adapter->data.started) {
 		EVTIM_LOG_ERR("event timer adapter %"PRIu8" already started",
-			      adapter->data->id);
+			      adapter->data.id);
 		return -EALREADY;
 	}
 
@@ -274,22 +306,22 @@ rte_event_timer_adapter_start(const struct rte_event_timer_adapter *adapter)
 	if (ret < 0)
 		return ret;
 
-	adapter->data->started = 1;
+	adapter->data.started = 1;
 	rte_eventdev_trace_timer_adapter_start(adapter);
 	return 0;
 }
 
 int
-rte_event_timer_adapter_stop(const struct rte_event_timer_adapter *adapter)
+rte_event_timer_adapter_stop(struct rte_event_timer_adapter *adapter)
 {
 	int ret;
 
 	ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL);
 	FUNC_PTR_OR_ERR_RET(adapter->ops->stop, -EINVAL);
 
-	if (adapter->data->started == 0) {
+	if (adapter->data.started == 0) {
 		EVTIM_LOG_ERR("event timer adapter %"PRIu8" already stopped",
-			      adapter->data->id);
+			      adapter->data.id);
 		return 0;
 	}
 
@@ -297,7 +329,7 @@ rte_event_timer_adapter_stop(const struct rte_event_timer_adapter *adapter)
 	if (ret < 0)
 		return ret;
 
-	adapter->data->started = 0;
+	adapter->data.started = 0;
 	rte_eventdev_trace_timer_adapter_stop(adapter);
 	return 0;
 }
@@ -305,34 +337,26 @@ rte_event_timer_adapter_stop(const struct rte_event_timer_adapter *adapter)
 struct rte_event_timer_adapter *
 rte_event_timer_adapter_lookup(uint16_t adapter_id)
 {
-	char name[DATA_MZ_NAME_MAX_LEN];
-	const struct rte_memzone *mz;
-	struct rte_event_timer_adapter_data *data;
 	struct rte_event_timer_adapter *adapter;
-	int ret;
+	char name[EVTIM_MZ_NAME_MAX_LEN];
+	const struct rte_memzone *mz;
 	struct rte_eventdev *dev;
+	int ret;
 
-	if (adapters[adapter_id].allocated)
-		return &adapters[adapter_id]; /* Adapter is already loaded */
-
-	snprintf(name, DATA_MZ_NAME_MAX_LEN, DATA_MZ_NAME_FORMAT, adapter_id);
+	snprintf(name, EVTIM_MZ_NAME_MAX_LEN, EVTIM_MZ_NAME_FORMAT, adapter_id);
 	mz = rte_memzone_lookup(name);
 	if (mz == NULL) {
 		rte_errno = ENOENT;
 		return NULL;
 	}
 
-	data = mz->addr;
-
-	adapter = &adapters[data->id];
-	adapter->data = data;
-
-	dev = &rte_eventdevs[adapter->data->event_dev_id];
+	adapter = mz->addr;
+	dev = &rte_eventdevs[adapter->data.event_dev_id];
 
 	/* Query eventdev PMD for timer adapter capabilities and ops */
 	ret = dev->dev_ops->timer_adapter_caps_get(dev,
-						   adapter->data->conf.flags,
-						   &adapter->data->caps,
+						   adapter->data.conf.flags,
+						   &adapter->data.caps,
 						   &adapter->ops);
 	if (ret < 0) {
 		rte_errno = EINVAL;
@@ -350,37 +374,36 @@ rte_event_timer_adapter_lookup(uint16_t adapter_id)
 	adapter->arm_tmo_tick_burst = adapter->ops->arm_tmo_tick_burst;
 	adapter->cancel_burst = adapter->ops->cancel_burst;
 
-	adapter->allocated = 1;
-
 	return adapter;
 }
 
 int
 rte_event_timer_adapter_free(struct rte_event_timer_adapter *adapter)
 {
+	uint8_t adapter_id;
 	int ret;
 
 	ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL);
 	FUNC_PTR_OR_ERR_RET(adapter->ops->uninit, -EINVAL);
 
-	if (adapter->data->started == 1) {
+	if (adapter->data.started == 1) {
 		EVTIM_LOG_ERR("event timer adapter %"PRIu8" must be stopped "
-			      "before freeing", adapter->data->id);
+			      "before freeing", adapter->data.id);
 		return -EBUSY;
 	}
 
+	adapter_id = adapter->data.id;
 	/* free impl priv data */
 	ret = adapter->ops->uninit(adapter);
 	if (ret < 0)
 		return ret;
 
-	/* free shared data area */
-	ret = rte_memzone_free(adapter->data->mz);
+	/* free shared adapter memory */
+	ret = rte_memzone_free(adapter->mz);
 	if (ret < 0)
 		return ret;
 
-	adapter->data = NULL;
-	adapter->allocated = 0;
+	adapters[adapter_id] = NULL;
 
 	rte_eventdev_trace_timer_adapter_free(adapter);
 	return 0;
@@ -392,10 +415,10 @@ rte_event_timer_adapter_service_id_get(struct rte_event_timer_adapter *adapter,
 {
 	ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL);
 
-	if (adapter->data->service_inited && service_id != NULL)
-		*service_id = adapter->data->service_id;
+	if (adapter->data.service_inited && service_id != NULL)
+		*service_id = adapter->data.service_id;
 
-	return adapter->data->service_inited ? 0 : -ESRCH;
+	return adapter->data.service_inited ? 0 : -ESRCH;
 }
 
 int
@@ -569,7 +592,7 @@ struct swtim {
 static inline struct swtim *
 swtim_pmd_priv(const struct rte_event_timer_adapter *adapter)
 {
-	return adapter->data->adapter_priv;
+	return adapter->data.adapter_priv;
 }
 
 static void
@@ -635,8 +658,8 @@ swtim_callback(struct rte_timer *tim)
 
 	if (event_buffer_batch_ready(&sw->buffer)) {
 		event_buffer_flush(&sw->buffer,
-				   adapter->data->event_dev_id,
-				   adapter->data->event_port_id,
+				   adapter->data.event_dev_id,
+				   adapter->data.event_port_id,
 				   &nb_evs_flushed,
 				   &nb_evs_invalid);
 
@@ -712,7 +735,7 @@ check_destination_event_queue(struct rte_event_timer *evtim,
 	int ret;
 	uint32_t sched_type;
 
-	ret = rte_event_queue_attr_get(adapter->data->event_dev_id,
+	ret = rte_event_queue_attr_get(adapter->data.event_dev_id,
 				       evtim->ev.queue_id,
 				       RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE,
 				       &sched_type);
@@ -744,8 +767,8 @@ swtim_service_func(void *arg)
 		sw->n_expired_timers = 0;
 
 		event_buffer_flush(&sw->buffer,
-				   adapter->data->event_dev_id,
-				   adapter->data->event_port_id,
+				   adapter->data.event_dev_id,
+				   adapter->data.event_port_id,
 				   &nb_evs_flushed,
 				   &nb_evs_invalid);
 
@@ -799,9 +822,9 @@ swtim_init(struct rte_event_timer_adapter *adapter)
 #define SWTIM_NAMESIZE 32
 	char swtim_name[SWTIM_NAMESIZE];
 	snprintf(swtim_name, SWTIM_NAMESIZE, "swtim_%"PRIu8,
-			adapter->data->id);
+			adapter->data.id);
 	sw = rte_zmalloc_socket(swtim_name, sizeof(*sw), RTE_CACHE_LINE_SIZE,
-			adapter->data->socket_id);
+			adapter->data.socket_id);
 	if (sw == NULL) {
 		EVTIM_LOG_ERR("failed to allocate space for private data");
 		rte_errno = ENOMEM;
@@ -809,25 +832,25 @@ swtim_init(struct rte_event_timer_adapter *adapter)
 	}
 
 	/* Connect storage to adapter instance */
-	adapter->data->adapter_priv = sw;
+	adapter->data.adapter_priv = sw;
 	sw->adapter = adapter;
 
-	sw->timer_tick_ns = adapter->data->conf.timer_tick_ns;
-	sw->max_tmo_ns = adapter->data->conf.max_tmo_ns;
+	sw->timer_tick_ns = adapter->data.conf.timer_tick_ns;
+	sw->max_tmo_ns = adapter->data.conf.max_tmo_ns;
 
 	/* Create a timer pool */
 	char pool_name[SWTIM_NAMESIZE];
 	snprintf(pool_name, SWTIM_NAMESIZE, "swtim_pool_%"PRIu8,
-		 adapter->data->id);
+		 adapter->data.id);
 	/* Optimal mempool size is a power of 2 minus one */
-	uint64_t nb_timers = rte_align64pow2(adapter->data->conf.nb_timers);
+	uint64_t nb_timers = rte_align64pow2(adapter->data.conf.nb_timers);
 	int pool_size = nb_timers - 1;
 	int cache_size = compute_msg_mempool_cache_size(
-				adapter->data->conf.nb_timers, nb_timers);
+				adapter->data.conf.nb_timers, nb_timers);
 	flags = 0; /* pool is multi-producer, multi-consumer */
 	sw->tim_pool = rte_mempool_create(pool_name, pool_size,
 			sizeof(struct rte_timer), cache_size, 0, NULL, NULL,
-			NULL, NULL, adapter->data->socket_id, flags);
+			NULL, NULL, adapter->data.socket_id, flags);
 	if (sw->tim_pool == NULL) {
 		EVTIM_LOG_ERR("failed to create timer object mempool");
 		rte_errno = ENOMEM;
@@ -863,8 +886,8 @@ swtim_init(struct rte_event_timer_adapter *adapter)
 	/* Register a service component to run adapter logic */
 	memset(&service, 0, sizeof(service));
 	snprintf(service.name, RTE_SERVICE_NAME_MAX,
-		 "swtim_svc_%"PRIu8, adapter->data->id);
-	service.socket_id = adapter->data->socket_id;
+		 "swtim_svc_%"PRIu8, adapter->data.id);
+	service.socket_id = adapter->data.socket_id;
 	service.callback = swtim_service_func;
 	service.callback_userdata = adapter;
 	service.capabilities &= ~(RTE_SERVICE_CAP_MT_SAFE);
@@ -881,8 +904,8 @@ swtim_init(struct rte_event_timer_adapter *adapter)
 	EVTIM_LOG_DBG("registered service %s with id %"PRIu32, service.name,
 		      sw->service_id);
 
-	adapter->data->service_id = sw->service_id;
-	adapter->data->service_inited = 1;
+	adapter->data.service_id = sw->service_id;
+	adapter->data.service_inited = 1;
 
 	return 0;
 free_mempool:
@@ -924,7 +947,7 @@ swtim_uninit(struct rte_event_timer_adapter *adapter)
 
 	rte_mempool_free(sw->tim_pool);
 	rte_free(sw);
-	adapter->data->adapter_priv = NULL;
+	adapter->data.adapter_priv = NULL;
 
 	return 0;
 }
@@ -1025,7 +1048,7 @@ __swtim_arm_burst(const struct rte_event_timer_adapter *adapter,
 
 #ifdef RTE_LIBRTE_EVENTDEV_DEBUG
 	/* Check that the service is running. */
-	if (rte_service_runstate_get(adapter->data->service_id) != 1) {
+	if (rte_service_runstate_get(adapter->data.service_id) != 1) {
 		rte_errno = EINVAL;
 		return 0;
 	}
@@ -1149,7 +1172,7 @@ swtim_cancel_burst(const struct rte_event_timer_adapter *adapter,
 
 #ifdef RTE_LIBRTE_EVENTDEV_DEBUG
 	/* Check that the service is running. */
-	if (rte_service_runstate_get(adapter->data->service_id) != 1) {
+	if (rte_service_runstate_get(adapter->data.service_id) != 1) {
 		rte_errno = EINVAL;
 		return 0;
 	}
diff --git a/lib/librte_eventdev/rte_event_timer_adapter.h b/lib/librte_eventdev/rte_event_timer_adapter.h
index d2ebcb090..af9541736 100644
--- a/lib/librte_eventdev/rte_event_timer_adapter.h
+++ b/lib/librte_eventdev/rte_event_timer_adapter.h
@@ -320,8 +320,7 @@ rte_event_timer_adapter_get_info(
  *  be started before calling rte_event_timer_adapter_start().
  */
 int
-rte_event_timer_adapter_start(
-		const struct rte_event_timer_adapter *adapter);
+rte_event_timer_adapter_start(struct rte_event_timer_adapter *adapter);
 
 /**
  * Stop an event timer adapter.
@@ -338,7 +337,7 @@ rte_event_timer_adapter_start(
  *   - -EINVAL if adapter identifier invalid
  */
 int
-rte_event_timer_adapter_stop(const struct rte_event_timer_adapter *adapter);
+rte_event_timer_adapter_stop(struct rte_event_timer_adapter *adapter);
 
 /**
  * Lookup an event timer adapter using its identifier.
@@ -503,6 +502,34 @@ typedef uint16_t (*rte_event_timer_cancel_burst_t)(
 		uint16_t nb_tims);
 /**< @internal Prevent event timers from enqueuing timer events */
 
+/**
+ * @internal Adapter data.
+ */
+struct rte_event_timer_adapter_data {
+	uint8_t id;
+	/**< Event timer adapter ID */
+	uint8_t event_dev_id;
+	/**< Event device ID */
+	uint32_t socket_id;
+	/**< Socket ID where memory is allocated */
+	uint8_t event_port_id;
+	/**< Optional: event port ID used when the inbuilt port is absent */
+	struct rte_event_timer_adapter_conf conf;
+	/**< Configuration used to configure the adapter. */
+	uint32_t caps;
+	/**< Adapter capabilities */
+	void *adapter_priv;
+	/**< Timer adapter private data*/
+	uint8_t service_inited;
+	/**< Service initialization state */
+	uint32_t service_id;
+	/**< Service ID*/
+
+	RTE_STD_C11
+	uint8_t started : 1;
+	/**< Flag to indicate adapter started. */
+} __rte_cache_aligned;
+
 /**
  * @internal Data structure associated with each event timer adapter.
  */
@@ -513,19 +540,26 @@ struct rte_event_timer_adapter {
 	/**< Pointer to driver arm_tmo_tick_burst function. */
 	rte_event_timer_cancel_burst_t cancel_burst;
 	/**< Pointer to driver cancel function. */
-	struct rte_event_timer_adapter_data *data;
-	/**< Pointer to shared adapter data */
+	struct rte_event_timer_adapter_data data;
+	/**< Event timer adapter data. */
 	const struct rte_event_timer_adapter_ops *ops;
 	/**< Functions exported by adapter driver */
-
-	RTE_STD_C11
-	uint8_t allocated : 1;
-	/**< Flag to indicate that this adapter has been allocated */
+	const struct rte_memzone *mz;
+	/**< Event timer adapter memzone pointer */
 } __rte_cache_aligned;
 
-#define ADAPTER_VALID_OR_ERR_RET(adapter, retval) do {		\
-	if (adapter == NULL || !adapter->allocated)		\
-		return retval;					\
+#define ADAPTER_VALID_OR_ERR_RET(adapter, retval) do {			\
+	if (adapter == NULL) {						\
+		return retval;						\
+	} else {							\
+		int i;							\
+		for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++) {	\
+			if (adapters[i] == adapter)			\
+				break;					\
+		}							\
+		if (i == RTE_EVENT_TIMER_ADAPTER_NUM_MAX)		\
+			return retval;					\
+	}								\
 } while (0)
 
 #define FUNC_PTR_OR_ERR_RET(func, errval) do { 			\
diff --git a/lib/librte_eventdev/rte_event_timer_adapter_pmd.h b/lib/librte_eventdev/rte_event_timer_adapter_pmd.h
index cf3509dc6..0766b336e 100644
--- a/lib/librte_eventdev/rte_event_timer_adapter_pmd.h
+++ b/lib/librte_eventdev/rte_event_timer_adapter_pmd.h
@@ -76,37 +76,6 @@ struct rte_event_timer_adapter_ops {
 	/**< Cancel one or more event timers */
 };
 
-/**
- * @internal Adapter data; structure to be placed in shared memory to be
- * accessible by various processes in a multi-process configuration.
- */
-struct rte_event_timer_adapter_data {
-	uint8_t id;
-	/**< Event timer adapter ID */
-	uint8_t event_dev_id;
-	/**< Event device ID */
-	uint32_t socket_id;
-	/**< Socket ID where memory is allocated */
-	uint8_t event_port_id;
-	/**< Optional: event port ID used when the inbuilt port is absent */
-	const struct rte_memzone *mz;
-	/**< Event timer adapter memzone pointer */
-	struct rte_event_timer_adapter_conf conf;
-	/**< Configuration used to configure the adapter. */
-	uint32_t caps;
-	/**< Adapter capabilities */
-	void *adapter_priv;
-	/**< Timer adapter private data*/
-	uint8_t service_inited;
-	/**< Service initialization state */
-	uint32_t service_id;
-	/**< Service ID*/
-
-	RTE_STD_C11
-	uint8_t started : 1;
-	/**< Flag to indicate adapter started. */
-} __rte_cache_aligned;
-
 #ifdef __cplusplus
 }
 #endif
-- 
2.25.1


             reply	other threads:[~2021-02-12 10:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-12 10:13 Shijith Thotton [this message]
2021-02-12 11:03 ` Pavan Nikhilesh Bhagavatula

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210212101343.689792-1-sthotton@marvell.com \
    --to=sthotton@marvell.com \
    --cc=dev@dpdk.org \
    --cc=erik.g.carrillo@intel.com \
    --cc=jerinj@marvell.com \
    --cc=pbhagavatula@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).