1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#ifndef _LINUX_KFIFO_H
22#define _LINUX_KFIFO_H
23
24#include <linux/kernel.h>
25#include <linux/spinlock.h>
26
27struct kfifo {
28 unsigned char *buffer;
29 unsigned int size;
30 unsigned int in;
31 unsigned int out;
32 spinlock_t *lock;
33};
34
35extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
36 gfp_t gfp_mask, spinlock_t *lock);
37extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
38 spinlock_t *lock);
39extern void kfifo_free(struct kfifo *fifo);
40extern unsigned int __kfifo_put(struct kfifo *fifo,
41 const unsigned char *buffer, unsigned int len);
42extern unsigned int __kfifo_get(struct kfifo *fifo,
43 unsigned char *buffer, unsigned int len);
44
45
46
47
48
49static inline void __kfifo_reset(struct kfifo *fifo)
50{
51 fifo->in = fifo->out = 0;
52}
53
54
55
56
57
58static inline void kfifo_reset(struct kfifo *fifo)
59{
60 unsigned long flags;
61
62 spin_lock_irqsave(fifo->lock, flags);
63
64 __kfifo_reset(fifo);
65
66 spin_unlock_irqrestore(fifo->lock, flags);
67}
68
69
70
71
72
73
74
75
76
77
78
79static inline unsigned int kfifo_put(struct kfifo *fifo,
80 const unsigned char *buffer, unsigned int len)
81{
82 unsigned long flags;
83 unsigned int ret;
84
85 spin_lock_irqsave(fifo->lock, flags);
86
87 ret = __kfifo_put(fifo, buffer, len);
88
89 spin_unlock_irqrestore(fifo->lock, flags);
90
91 return ret;
92}
93
94
95
96
97
98
99
100
101
102
103static inline unsigned int kfifo_get(struct kfifo *fifo,
104 unsigned char *buffer, unsigned int len)
105{
106 unsigned long flags;
107 unsigned int ret;
108
109 spin_lock_irqsave(fifo->lock, flags);
110
111 ret = __kfifo_get(fifo, buffer, len);
112
113
114
115
116
117 if (fifo->in == fifo->out)
118 fifo->in = fifo->out = 0;
119
120 spin_unlock_irqrestore(fifo->lock, flags);
121
122 return ret;
123}
124
125
126
127
128
129static inline unsigned int __kfifo_len(struct kfifo *fifo)
130{
131 return fifo->in - fifo->out;
132}
133
134
135
136
137
138static inline unsigned int kfifo_len(struct kfifo *fifo)
139{
140 unsigned long flags;
141 unsigned int ret;
142
143 spin_lock_irqsave(fifo->lock, flags);
144
145 ret = __kfifo_len(fifo);
146
147 spin_unlock_irqrestore(fifo->lock, flags);
148
149 return ret;
150}
151
152#endif
153