xref: /dpdk/examples/ip_pipeline/swq.c (revision 7959831b4d1b52f6525acb63ce0d94eeeb396855)
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 
10 #include "swq.h"
11 
12 static struct swq_list swq_list;
13 
14 int
swq_init(void)15 swq_init(void)
16 {
17 	TAILQ_INIT(&swq_list);
18 
19 	return 0;
20 }
21 
22 struct swq *
swq_find(const char * name)23 swq_find(const char *name)
24 {
25 	struct swq *swq;
26 
27 	if (name == NULL)
28 		return NULL;
29 
30 	TAILQ_FOREACH(swq, &swq_list, node)
31 		if (strcmp(swq->name, name) == 0)
32 			return swq;
33 
34 	return NULL;
35 }
36 
37 struct swq *
swq_create(const char * name,struct swq_params * params)38 swq_create(const char *name, struct swq_params *params)
39 {
40 	struct swq *swq;
41 	struct rte_ring *r;
42 	unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ;
43 
44 	/* Check input params */
45 	if ((name == NULL) ||
46 		swq_find(name) ||
47 		(params == NULL) ||
48 		(params->size == 0))
49 		return NULL;
50 
51 	/* Resource create */
52 	r = rte_ring_create(
53 		name,
54 		params->size,
55 		params->cpu_id,
56 		flags);
57 
58 	if (r == NULL)
59 		return NULL;
60 
61 	/* Node allocation */
62 	swq = calloc(1, sizeof(struct swq));
63 	if (swq == NULL) {
64 		rte_ring_free(r);
65 		return NULL;
66 	}
67 
68 	/* Node fill in */
69 	strlcpy(swq->name, name, sizeof(swq->name));
70 	swq->r = r;
71 
72 	/* Node add to list */
73 	TAILQ_INSERT_TAIL(&swq_list, swq, node);
74 
75 	return swq;
76 }
77