From: Danylo Vodopianov <dvo-plv@napatech.com>
Introduce clear_pdrv to unregister driver
from global tracking.
Modify drv_deinit to call clear_pdirv and ensure
safe termination.
Add flm sta and age event free.
Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
.../flow_api/profile_inline/flm_age_queue.c | 10 +++
.../flow_api/profile_inline/flm_age_queue.h | 1 +
.../flow_api/profile_inline/flm_evt_queue.c | 76 +++++++++++++++++++
.../flow_api/profile_inline/flm_evt_queue.h | 1 +
drivers/net/ntnic/ntnic_ethdev.c | 6 ++
5 files changed, 94 insertions(+)
@@ -44,6 +44,16 @@ void flm_age_queue_free(uint8_t port, uint16_t caller_id)
rte_ring_free(q);
}
+void flm_age_queue_free_all(void)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < MAX_EVT_AGE_PORTS; i++)
+ for (j = 0; j < MAX_EVT_AGE_QUEUES; j++)
+ flm_age_queue_free(i, j);
+}
+
struct rte_ring *flm_age_queue_create(uint8_t port, uint16_t caller_id, unsigned int count)
{
char name[20];
@@ -32,6 +32,7 @@ int flm_age_event_get(uint8_t port);
void flm_age_event_set(uint8_t port);
void flm_age_event_clear(uint8_t port);
void flm_age_queue_free(uint8_t port, uint16_t caller_id);
+void flm_age_queue_free_all(void);
struct rte_ring *flm_age_queue_create(uint8_t port, uint16_t caller_id, unsigned int count);
void flm_age_queue_put(uint16_t caller_id, struct flm_age_event_s *obj);
int flm_age_queue_get(uint16_t caller_id, struct flm_age_event_s *obj);
@@ -25,6 +25,82 @@ static struct rte_ring *stat_q_local[MAX_STAT_LCL_QUEUES];
/* Remote queues for flm status records */
static struct rte_ring *stat_q_remote[MAX_STAT_RMT_QUEUES];
+static void flm_inf_sta_queue_free(uint8_t port, uint8_t caller)
+{
+ struct rte_ring *q = NULL;
+
+ /* If queues is not created, then ignore and return */
+ switch (caller) {
+ case FLM_INFO_LOCAL:
+ if (port < MAX_INFO_LCL_QUEUES && info_q_local[port] != NULL) {
+ q = info_q_local[port];
+ info_q_local[port] = NULL;
+ }
+
+ break;
+
+ case FLM_INFO_REMOTE:
+ if (port < MAX_INFO_RMT_QUEUES && info_q_remote[port] != NULL) {
+ q = info_q_remote[port];
+ info_q_remote[port] = NULL;
+ }
+
+ break;
+
+ case FLM_STAT_LOCAL:
+ if (port < MAX_STAT_LCL_QUEUES && stat_q_local[port] != NULL) {
+ q = stat_q_local[port];
+ stat_q_local[port] = NULL;
+ }
+
+ break;
+
+ case FLM_STAT_REMOTE:
+ if (port < MAX_STAT_RMT_QUEUES && stat_q_remote[port] != NULL) {
+ q = stat_q_remote[port];
+ stat_q_remote[port] = NULL;
+ }
+
+ break;
+
+ default:
+ NT_LOG(ERR, FILTER, "FLM queue free illegal caller: %u", caller);
+ break;
+ }
+
+ if (q)
+ rte_ring_free(q);
+}
+
+void flm_inf_sta_queue_free_all(uint8_t caller)
+{
+ int count = 0;
+
+ switch (caller) {
+ case FLM_INFO_LOCAL:
+ count = MAX_INFO_LCL_QUEUES;
+ break;
+
+ case FLM_INFO_REMOTE:
+ count = MAX_INFO_RMT_QUEUES;
+ break;
+
+ case FLM_STAT_LOCAL:
+ count = MAX_STAT_LCL_QUEUES;
+ break;
+
+ case FLM_STAT_REMOTE:
+ count = MAX_STAT_RMT_QUEUES;
+ break;
+
+ default:
+ NT_LOG(ERR, FILTER, "FLM queue free illegal caller: %u", caller);
+ return;
+ }
+
+ for (int i = 0; i < count; i++)
+ flm_inf_sta_queue_free(i, caller);
+}
static struct rte_ring *flm_evt_queue_create(uint8_t port, uint8_t caller)
{
@@ -47,6 +47,7 @@ enum {
#define FLM_EVT_ELEM_SIZE sizeof(struct flm_info_event_s)
#define FLM_STAT_ELEM_SIZE sizeof(struct flm_status_event_s)
+void flm_inf_sta_queue_free_all(uint8_t caller);
int flm_inf_queue_get(uint8_t port, bool remote, struct flm_info_event_s *obj);
int flm_sta_queue_put(uint8_t port, bool remote, struct flm_status_event_s *obj);
@@ -1420,6 +1420,12 @@ drv_deinit(struct drv_s *p_drv)
THREAD_JOIN(p_nt_drv->flm_thread);
profile_inline_ops->flm_free_queues();
THREAD_JOIN(p_nt_drv->port_event_thread);
+ /* Free all local flm event queues */
+ flm_inf_sta_queue_free_all(FLM_INFO_LOCAL);
+ /* Free all remote flm event queues */
+ flm_inf_sta_queue_free_all(FLM_INFO_REMOTE);
+ /* Free all aged flow event queues */
+ flm_age_queue_free_all();
}
/* stop adapter */