xref: /freebsd/sys/dev/netmap/netmap_mbq.h (revision f4b37ed0f8b307b1f3f0f630ca725d68f1dff30d)
1 /*
2  * Copyright (C) 2013-2014 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 
26 /*
27  * $FreeBSD$
28  */
29 
30 
31 #ifndef __NETMAP_MBQ_H__
32 #define __NETMAP_MBQ_H__
33 
34 /*
35  * These function implement an mbuf tailq with an optional lock.
36  * The base functions act ONLY ON THE QUEUE, whereas the "safe"
37  * variants (mbq_safe_*) also handle the lock.
38  */
39 
40 /* XXX probably rely on a previous definition of SPINLOCK_T */
41 #ifdef linux
42 #define SPINLOCK_T  safe_spinlock_t
43 #else
44 #define SPINLOCK_T  struct mtx
45 #endif
46 
47 /* A FIFO queue of mbufs with an optional lock. */
48 struct mbq {
49     struct mbuf *head;
50     struct mbuf *tail;
51     int count;
52     SPINLOCK_T lock;
53 };
54 
55 /* XXX "destroy" does not match "init" as a name.
56  * We should also clarify whether init can be used while
57  * holding a lock, and whether mbq_safe_destroy() is a NOP.
58  */
59 void mbq_init(struct mbq *q);
60 void mbq_destroy(struct mbq *q);
61 void mbq_enqueue(struct mbq *q, struct mbuf *m);
62 struct mbuf *mbq_dequeue(struct mbq *q);
63 void mbq_purge(struct mbq *q);
64 
65 static inline void
66 mbq_lock(struct mbq *q)
67 {
68 	mtx_lock_spin(&q->lock);
69 }
70 
71 static inline void
72 mbq_unlock(struct mbq *q)
73 {
74 	mtx_unlock_spin(&q->lock);
75 }
76 
77 
78 void mbq_safe_init(struct mbq *q);
79 void mbq_safe_destroy(struct mbq *q);
80 void mbq_safe_enqueue(struct mbq *q, struct mbuf *m);
81 struct mbuf *mbq_safe_dequeue(struct mbq *q);
82 void mbq_safe_purge(struct mbq *q);
83 
84 static inline unsigned int mbq_len(struct mbq *q)
85 {
86     return q->count;
87 }
88 
89 #endif /* __NETMAP_MBQ_H_ */
90