xref: /dpdk/drivers/net/softnic/rte_eth_softnic_swq.c (revision f1f6ebc0eaf68a825c6175f5e6a436f7d91660c3)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4 
5 #include <stdlib.h>
6 #include <string.h>
7 
8 #include <rte_string_fns.h>
9 #include <rte_tailq.h>
10 
11 #include "rte_eth_softnic_internals.h"
12 
13 int
softnic_swq_init(struct pmd_internals * p)14 softnic_swq_init(struct pmd_internals *p)
15 {
16 	TAILQ_INIT(&p->swq_list);
17 
18 	return 0;
19 }
20 
21 void
softnic_swq_free(struct pmd_internals * p)22 softnic_swq_free(struct pmd_internals *p)
23 {
24 	for ( ; ; ) {
25 		struct softnic_swq *swq;
26 
27 		swq = TAILQ_FIRST(&p->swq_list);
28 		if (swq == NULL)
29 			break;
30 
31 		TAILQ_REMOVE(&p->swq_list, swq, node);
32 		rte_ring_free(swq->r);
33 		free(swq);
34 	}
35 }
36 
37 void
softnic_softnic_swq_free_keep_rxq_txq(struct pmd_internals * p)38 softnic_softnic_swq_free_keep_rxq_txq(struct pmd_internals *p)
39 {
40 	struct softnic_swq *swq, *tswq;
41 
42 	RTE_TAILQ_FOREACH_SAFE(swq, &p->swq_list, node, tswq) {
43 		if ((strncmp(swq->name, "RXQ", strlen("RXQ")) == 0) ||
44 			(strncmp(swq->name, "TXQ", strlen("TXQ")) == 0))
45 			continue;
46 
47 		TAILQ_REMOVE(&p->swq_list, swq, node);
48 		rte_ring_free(swq->r);
49 		free(swq);
50 	}
51 }
52 
53 struct softnic_swq *
softnic_swq_find(struct pmd_internals * p,const char * name)54 softnic_swq_find(struct pmd_internals *p,
55 	const char *name)
56 {
57 	struct softnic_swq *swq;
58 
59 	if (name == NULL)
60 		return NULL;
61 
62 	TAILQ_FOREACH(swq, &p->swq_list, node)
63 		if (strcmp(swq->name, name) == 0)
64 			return swq;
65 
66 	return NULL;
67 }
68 
69 struct softnic_swq *
softnic_swq_create(struct pmd_internals * p,const char * name,struct softnic_swq_params * params)70 softnic_swq_create(struct pmd_internals *p,
71 	const char *name,
72 	struct softnic_swq_params *params)
73 {
74 	char ring_name[NAME_SIZE];
75 	struct softnic_swq *swq;
76 	struct rte_ring *r;
77 	unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ;
78 
79 	/* Check input params */
80 	if (name == NULL ||
81 		softnic_swq_find(p, name) ||
82 		params == NULL ||
83 		params->size == 0)
84 		return NULL;
85 
86 	/* Resource create */
87 	snprintf(ring_name, sizeof(ring_name), "%s_%s",
88 		p->params.name,
89 		name);
90 
91 	r = rte_ring_create(ring_name,
92 		params->size,
93 		p->params.cpu_id,
94 		flags);
95 
96 	if (r == NULL)
97 		return NULL;
98 
99 	/* Node allocation */
100 	swq = calloc(1, sizeof(struct softnic_swq));
101 	if (swq == NULL) {
102 		rte_ring_free(r);
103 		return NULL;
104 	}
105 
106 	/* Node fill in */
107 	strlcpy(swq->name, name, sizeof(swq->name));
108 	swq->r = r;
109 
110 	/* Node add to list */
111 	TAILQ_INSERT_TAIL(&p->swq_list, swq, node);
112 
113 	return swq;
114 }
115