netmap: change header includes
[dragonfly.git] / sys / net / netmap / netmap_mbq.c
CommitLineData
fb578518
FF
1/*
2 * Copyright (C) 2013 Vincenzo Maffione. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
fb578518 26#include <sys/param.h>
bf9f7c16
FF
27#include <sys/spinlock.h>
28#include <sys/spinlock2.h>
fb578518
FF
29#include <sys/systm.h>
30#include <sys/mbuf.h>
fb578518 31
b3f97fad 32#include <net/netmap/netmap_mbq.h>
fb578518
FF
33
34
35static inline void __mbq_init(struct mbq *q)
36{
37 q->head = q->tail = NULL;
38 q->count = 0;
39}
40
41void mbq_safe_init(struct mbq *q)
42{
bf9f7c16 43 spin_init(&q->lock);
fb578518
FF
44 __mbq_init(q);
45}
46
47void mbq_init(struct mbq *q)
48{
49 __mbq_init(q);
50}
51
52static inline void __mbq_enqueue(struct mbq *q, struct mbuf *m)
53{
54 m->m_nextpkt = NULL;
55 if (q->tail) {
56 q->tail->m_nextpkt = m;
57 q->tail = m;
58 } else {
59 q->head = q->tail = m;
60 }
61 q->count++;
62}
63
64void mbq_safe_enqueue(struct mbq *q, struct mbuf *m)
65{
bf9f7c16 66 spin_lock(&q->lock);
fb578518 67 __mbq_enqueue(q, m);
bf9f7c16 68 spin_unlock(&q->lock);
fb578518
FF
69}
70
71void mbq_enqueue(struct mbq *q, struct mbuf *m)
72{
73 __mbq_enqueue(q, m);
74}
75
76static inline struct mbuf *__mbq_dequeue(struct mbq *q)
77{
78 struct mbuf *ret = NULL;
79
80 if (q->head) {
81 ret = q->head;
82 q->head = ret->m_nextpkt;
83 if (q->head == NULL) {
84 q->tail = NULL;
85 }
86 q->count--;
87 ret->m_nextpkt = NULL;
88 }
89
90 return ret;
91}
92
93struct mbuf *mbq_safe_dequeue(struct mbq *q)
94{
95 struct mbuf *ret;
96
bf9f7c16 97 spin_lock(&q->lock);
fb578518 98 ret = __mbq_dequeue(q);
bf9f7c16 99 spin_unlock(&q->lock);
fb578518
FF
100
101 return ret;
102}
103
104struct mbuf *mbq_dequeue(struct mbq *q)
105{
106 return __mbq_dequeue(q);
107}
108
109/* XXX seems pointless to have a generic purge */
110static void __mbq_purge(struct mbq *q, int safe)
111{
112 struct mbuf *m;
113
114 for (;;) {
115 m = safe ? mbq_safe_dequeue(q) : mbq_dequeue(q);
116 if (m) {
117 m_freem(m);
118 } else {
119 break;
120 }
121 }
122}
123
124void mbq_purge(struct mbq *q)
125{
126 __mbq_purge(q, 0);
127}
128
129void mbq_safe_purge(struct mbq *q)
130{
131 __mbq_purge(q, 1);
132}
133
134void mbq_safe_destroy(struct mbq *q)
135{
bf9f7c16 136 spin_uninit(&q->lock);
fb578518
FF
137}
138
139
140void mbq_destroy(struct mbq *q)
141{
142}
143