xref: /linux/include/linux/kfifo.h (revision 4f05e82003d1c20da29fa593420b8d92e2c8d4e6)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * A generic kernel FIFO implementation
4  *
5  * Copyright (C) 2013 Stefani Seibold <stefani@seibold.net>
6  */
7 
8 #ifndef _LINUX_KFIFO_H
9 #define _LINUX_KFIFO_H
10 
11 /*
12  * How to porting drivers to the new generic FIFO API:
13  *
14  * - Modify the declaration of the "struct kfifo *" object into a
15  *   in-place "struct kfifo" object
16  * - Init the in-place object with kfifo_alloc() or kfifo_init()
17  *   Note: The address of the in-place "struct kfifo" object must be
18  *   passed as the first argument to this functions
19  * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get
20  *   into kfifo_out
21  * - Replace the use of kfifo_put into kfifo_in_spinlocked and kfifo_get
22  *   into kfifo_out_spinlocked
23  *   Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc
24  *   must be passed now to the kfifo_in_spinlocked and kfifo_out_spinlocked
25  *   as the last parameter
26  * - The formerly __kfifo_* functions are renamed into kfifo_*
27  */
28 
29 /*
30  * Note about locking: There is no locking required until only one reader
31  * and one writer is using the fifo and no kfifo_reset() will be called.
32  * kfifo_reset_out() can be safely used, until it will be only called
33  * in the reader thread.
34  * For multiple writer and one reader there is only a need to lock the writer.
35  * And vice versa for only one writer and multiple reader there is only a need
36  * to lock the reader.
37  */
38 
39 #include <linux/array_size.h>
40 #include <linux/spinlock.h>
41 #include <linux/stddef.h>
42 #include <linux/types.h>
43 
44 #include <asm/barrier.h>
45 #include <asm/errno.h>
46 
47 struct scatterlist;
48 
49 struct __kfifo {
50 	unsigned int	in;
51 	unsigned int	out;
52 	unsigned int	mask;
53 	unsigned int	esize;
54 	void		*data;
55 };
56 
57 #define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \
58 	union { \
59 		struct __kfifo	kfifo; \
60 		datatype	*type; \
61 		const datatype	*const_type; \
62 		char		(*rectype)[recsize]; \
63 		ptrtype		*ptr; \
64 		ptrtype const	*ptr_const; \
65 	}
66 
67 #define __STRUCT_KFIFO(type, size, recsize, ptrtype) \
68 { \
69 	__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
70 	type		buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \
71 }
72 
73 #define STRUCT_KFIFO(type, size) \
74 	struct __STRUCT_KFIFO(type, size, 0, type)
75 
76 #define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \
77 { \
78 	__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
79 	type		buf[0]; \
80 }
81 
82 #define STRUCT_KFIFO_PTR(type) \
83 	struct __STRUCT_KFIFO_PTR(type, 0, type)
84 
85 /*
86  * define compatibility "struct kfifo" for dynamic allocated fifos
87  */
88 struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void);
89 
90 #define STRUCT_KFIFO_REC_1(size) \
91 	struct __STRUCT_KFIFO(unsigned char, size, 1, void)
92 
93 #define STRUCT_KFIFO_REC_2(size) \
94 	struct __STRUCT_KFIFO(unsigned char, size, 2, void)
95 
96 /*
97  * define kfifo_rec types
98  */
99 struct kfifo_rec_ptr_1 __STRUCT_KFIFO_PTR(unsigned char, 1, void);
100 struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void);
101 
102 /*
103  * helper macro to distinguish between real in place fifo where the fifo
104  * array is a part of the structure and the fifo type where the array is
105  * outside of the fifo structure.
106  */
107 #define	__is_kfifo_ptr(fifo) \
108 	(sizeof(*fifo) == sizeof(STRUCT_KFIFO_PTR(typeof(*(fifo)->type))))
109 
110 /**
111  * DECLARE_KFIFO_PTR - macro to declare a fifo pointer object
112  * @fifo: name of the declared fifo
113  * @type: type of the fifo elements
114  */
115 #define DECLARE_KFIFO_PTR(fifo, type)	STRUCT_KFIFO_PTR(type) fifo
116 
117 /**
118  * DECLARE_KFIFO - macro to declare a fifo object
119  * @fifo: name of the declared fifo
120  * @type: type of the fifo elements
121  * @size: the number of elements in the fifo, this must be a power of 2
122  */
123 #define DECLARE_KFIFO(fifo, type, size)	STRUCT_KFIFO(type, size) fifo
124 
125 /**
126  * INIT_KFIFO - Initialize a fifo declared by DECLARE_KFIFO
127  * @fifo: name of the declared fifo datatype
128  */
129 #define INIT_KFIFO(fifo) \
130 (void)({ \
131 	typeof(&(fifo)) __tmp = &(fifo); \
132 	struct __kfifo *__kfifo = &__tmp->kfifo; \
133 	__kfifo->in = 0; \
134 	__kfifo->out = 0; \
135 	__kfifo->mask = __is_kfifo_ptr(__tmp) ? 0 : ARRAY_SIZE(__tmp->buf) - 1;\
136 	__kfifo->esize = sizeof(*__tmp->buf); \
137 	__kfifo->data = __is_kfifo_ptr(__tmp) ?  NULL : __tmp->buf; \
138 })
139 
140 /**
141  * DEFINE_KFIFO - macro to define and initialize a fifo
142  * @fifo: name of the declared fifo datatype
143  * @type: type of the fifo elements
144  * @size: the number of elements in the fifo, this must be a power of 2
145  *
146  * Note: the macro can be used for global and local fifo data type variables.
147  */
148 #define DEFINE_KFIFO(fifo, type, size) \
149 	DECLARE_KFIFO(fifo, type, size) = \
150 	(typeof(fifo)) { \
151 		{ \
152 			{ \
153 			.in	= 0, \
154 			.out	= 0, \
155 			.mask	= __is_kfifo_ptr(&(fifo)) ? \
156 				  0 : \
157 				  ARRAY_SIZE((fifo).buf) - 1, \
158 			.esize	= sizeof(*(fifo).buf), \
159 			.data	= __is_kfifo_ptr(&(fifo)) ? \
160 				NULL : \
161 				(fifo).buf, \
162 			} \
163 		} \
164 	}
165 
166 
167 static inline unsigned int __must_check
168 __kfifo_uint_must_check_helper(unsigned int val)
169 {
170 	return val;
171 }
172 
173 static inline int __must_check
174 __kfifo_int_must_check_helper(int val)
175 {
176 	return val;
177 }
178 
179 /**
180  * kfifo_initialized - Check if the fifo is initialized
181  * @fifo: address of the fifo to check
182  *
183  * Return %true if fifo is initialized, otherwise %false.
184  * Assumes the fifo was 0 before.
185  */
186 #define kfifo_initialized(fifo) ((fifo)->kfifo.mask)
187 
188 /**
189  * kfifo_esize - returns the size of the element managed by the fifo
190  * @fifo: address of the fifo to be used
191  */
192 #define kfifo_esize(fifo)	((fifo)->kfifo.esize)
193 
194 /**
195  * kfifo_recsize - returns the size of the record length field
196  * @fifo: address of the fifo to be used
197  */
198 #define kfifo_recsize(fifo)	(sizeof(*(fifo)->rectype))
199 
200 /**
201  * kfifo_size - returns the size of the fifo in elements
202  * @fifo: address of the fifo to be used
203  */
204 #define kfifo_size(fifo)	((fifo)->kfifo.mask + 1)
205 
206 /**
207  * kfifo_reset - removes the entire fifo content
208  * @fifo: address of the fifo to be used
209  *
210  * Note: usage of kfifo_reset() is dangerous. It should be only called when the
211  * fifo is exclusived locked or when it is secured that no other thread is
212  * accessing the fifo.
213  */
214 #define kfifo_reset(fifo) \
215 (void)({ \
216 	typeof((fifo) + 1) __tmp = (fifo); \
217 	__tmp->kfifo.in = __tmp->kfifo.out = 0; \
218 })
219 
220 /**
221  * kfifo_reset_out - skip fifo content
222  * @fifo: address of the fifo to be used
223  *
224  * Note: The usage of kfifo_reset_out() is safe until it will be only called
225  * from the reader thread and there is only one concurrent reader. Otherwise
226  * it is dangerous and must be handled in the same way as kfifo_reset().
227  */
228 #define kfifo_reset_out(fifo)	\
229 (void)({ \
230 	typeof((fifo) + 1) __tmp = (fifo); \
231 	__tmp->kfifo.out = __tmp->kfifo.in; \
232 })
233 
234 /**
235  * kfifo_len - returns the number of used elements in the fifo
236  * @fifo: address of the fifo to be used
237  */
238 #define kfifo_len(fifo) \
239 ({ \
240 	typeof((fifo) + 1) __tmpl = (fifo); \
241 	__tmpl->kfifo.in - __tmpl->kfifo.out; \
242 })
243 
244 /**
245  * kfifo_is_empty - returns true if the fifo is empty
246  * @fifo: address of the fifo to be used
247  */
248 #define	kfifo_is_empty(fifo) \
249 ({ \
250 	typeof((fifo) + 1) __tmpq = (fifo); \
251 	__tmpq->kfifo.in == __tmpq->kfifo.out; \
252 })
253 
254 /**
255  * kfifo_is_empty_spinlocked - returns true if the fifo is empty using
256  * a spinlock for locking
257  * @fifo: address of the fifo to be used
258  * @lock: spinlock to be used for locking
259  */
260 #define kfifo_is_empty_spinlocked(fifo, lock) \
261 ({ \
262 	unsigned long __flags; \
263 	bool __ret; \
264 	spin_lock_irqsave(lock, __flags); \
265 	__ret = kfifo_is_empty(fifo); \
266 	spin_unlock_irqrestore(lock, __flags); \
267 	__ret; \
268 })
269 
270 /**
271  * kfifo_is_empty_spinlocked_noirqsave  - returns true if the fifo is empty
272  * using a spinlock for locking, doesn't disable interrupts
273  * @fifo: address of the fifo to be used
274  * @lock: spinlock to be used for locking
275  */
276 #define kfifo_is_empty_spinlocked_noirqsave(fifo, lock) \
277 ({ \
278 	bool __ret; \
279 	spin_lock(lock); \
280 	__ret = kfifo_is_empty(fifo); \
281 	spin_unlock(lock); \
282 	__ret; \
283 })
284 
285 /**
286  * kfifo_is_full - returns true if the fifo is full
287  * @fifo: address of the fifo to be used
288  */
289 #define	kfifo_is_full(fifo) \
290 ({ \
291 	typeof((fifo) + 1) __tmpq = (fifo); \
292 	kfifo_len(__tmpq) > __tmpq->kfifo.mask; \
293 })
294 
295 /**
296  * kfifo_avail - returns the number of unused elements in the fifo
297  * @fifo: address of the fifo to be used
298  */
299 #define	kfifo_avail(fifo) \
300 __kfifo_uint_must_check_helper( \
301 ({ \
302 	typeof((fifo) + 1) __tmpq = (fifo); \
303 	const size_t __recsize = sizeof(*__tmpq->rectype); \
304 	unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq); \
305 	(__recsize) ? ((__avail <= __recsize) ? 0 : \
306 	__kfifo_max_r(__avail - __recsize, __recsize)) : \
307 	__avail; \
308 }) \
309 )
310 
311 /**
312  * kfifo_skip - skip output data
313  * @fifo: address of the fifo to be used
314  */
315 #define	kfifo_skip(fifo) \
316 (void)({ \
317 	typeof((fifo) + 1) __tmp = (fifo); \
318 	const size_t __recsize = sizeof(*__tmp->rectype); \
319 	struct __kfifo *__kfifo = &__tmp->kfifo; \
320 	if (__recsize) \
321 		__kfifo_skip_r(__kfifo, __recsize); \
322 	else \
323 		__kfifo->out++; \
324 })
325 
326 /**
327  * kfifo_peek_len - gets the size of the next fifo record
328  * @fifo: address of the fifo to be used
329  *
330  * This function returns the size of the next fifo record in number of bytes.
331  */
332 #define kfifo_peek_len(fifo) \
333 __kfifo_uint_must_check_helper( \
334 ({ \
335 	typeof((fifo) + 1) __tmp = (fifo); \
336 	const size_t __recsize = sizeof(*__tmp->rectype); \
337 	struct __kfifo *__kfifo = &__tmp->kfifo; \
338 	(!__recsize) ? kfifo_len(__tmp) * sizeof(*__tmp->type) : \
339 	__kfifo_len_r(__kfifo, __recsize); \
340 }) \
341 )
342 
343 /**
344  * kfifo_alloc - dynamically allocates a new fifo buffer
345  * @fifo: pointer to the fifo
346  * @size: the number of elements in the fifo, this must be a power of 2
347  * @gfp_mask: get_free_pages mask, passed to kmalloc()
348  *
349  * This macro dynamically allocates a new fifo buffer.
350  *
351  * The number of elements will be rounded-up to a power of 2.
352  * The fifo will be release with kfifo_free().
353  * Return 0 if no error, otherwise an error code.
354  */
355 #define kfifo_alloc(fifo, size, gfp_mask) \
356 __kfifo_int_must_check_helper( \
357 ({ \
358 	typeof((fifo) + 1) __tmp = (fifo); \
359 	struct __kfifo *__kfifo = &__tmp->kfifo; \
360 	__is_kfifo_ptr(__tmp) ? \
361 	__kfifo_alloc(__kfifo, size, sizeof(*__tmp->type), gfp_mask) : \
362 	-EINVAL; \
363 }) \
364 )
365 
366 /**
367  * kfifo_free - frees the fifo
368  * @fifo: the fifo to be freed
369  */
370 #define kfifo_free(fifo) \
371 ({ \
372 	typeof((fifo) + 1) __tmp = (fifo); \
373 	struct __kfifo *__kfifo = &__tmp->kfifo; \
374 	if (__is_kfifo_ptr(__tmp)) \
375 		__kfifo_free(__kfifo); \
376 })
377 
378 /**
379  * kfifo_init - initialize a fifo using a preallocated buffer
380  * @fifo: the fifo to assign the buffer
381  * @buffer: the preallocated buffer to be used
382  * @size: the size of the internal buffer, this have to be a power of 2
383  *
384  * This macro initializes a fifo using a preallocated buffer.
385  *
386  * The number of elements will be rounded-up to a power of 2.
387  * Return 0 if no error, otherwise an error code.
388  */
389 #define kfifo_init(fifo, buffer, size) \
390 ({ \
391 	typeof((fifo) + 1) __tmp = (fifo); \
392 	struct __kfifo *__kfifo = &__tmp->kfifo; \
393 	__is_kfifo_ptr(__tmp) ? \
394 	__kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \
395 	-EINVAL; \
396 })
397 
398 /**
399  * kfifo_put - put data into the fifo
400  * @fifo: address of the fifo to be used
401  * @val: the data to be added
402  *
403  * This macro copies the given value into the fifo.
404  * It returns 0 if the fifo was full. Otherwise it returns the number
405  * processed elements.
406  *
407  * Note that with only one concurrent reader and one concurrent
408  * writer, you don't need extra locking to use these macro.
409  */
410 #define	kfifo_put(fifo, val) \
411 ({ \
412 	typeof((fifo) + 1) __tmp = (fifo); \
413 	typeof(*__tmp->const_type) __val = (val); \
414 	unsigned int __ret; \
415 	size_t __recsize = sizeof(*__tmp->rectype); \
416 	struct __kfifo *__kfifo = &__tmp->kfifo; \
417 	if (__recsize) \
418 		__ret = __kfifo_in_r(__kfifo, &__val, sizeof(__val), \
419 			__recsize); \
420 	else { \
421 		__ret = !kfifo_is_full(__tmp); \
422 		if (__ret) { \
423 			(__is_kfifo_ptr(__tmp) ? \
424 			((typeof(__tmp->type))__kfifo->data) : \
425 			(__tmp->buf) \
426 			)[__kfifo->in & __tmp->kfifo.mask] = \
427 				*(typeof(__tmp->type))&__val; \
428 			smp_wmb(); \
429 			__kfifo->in++; \
430 		} \
431 	} \
432 	__ret; \
433 })
434 
435 /**
436  * kfifo_get - get data from the fifo
437  * @fifo: address of the fifo to be used
438  * @val: address where to store the data
439  *
440  * This macro reads the data from the fifo.
441  * It returns 0 if the fifo was empty. Otherwise it returns the number
442  * processed elements.
443  *
444  * Note that with only one concurrent reader and one concurrent
445  * writer, you don't need extra locking to use these macro.
446  */
447 #define	kfifo_get(fifo, val) \
448 __kfifo_uint_must_check_helper( \
449 ({ \
450 	typeof((fifo) + 1) __tmp = (fifo); \
451 	typeof(__tmp->ptr) __val = (val); \
452 	unsigned int __ret; \
453 	const size_t __recsize = sizeof(*__tmp->rectype); \
454 	struct __kfifo *__kfifo = &__tmp->kfifo; \
455 	if (__recsize) \
456 		__ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \
457 			__recsize); \
458 	else { \
459 		__ret = !kfifo_is_empty(__tmp); \
460 		if (__ret) { \
461 			*(typeof(__tmp->type))__val = \
462 				(__is_kfifo_ptr(__tmp) ? \
463 				((typeof(__tmp->type))__kfifo->data) : \
464 				(__tmp->buf) \
465 				)[__kfifo->out & __tmp->kfifo.mask]; \
466 			smp_wmb(); \
467 			__kfifo->out++; \
468 		} \
469 	} \
470 	__ret; \
471 }) \
472 )
473 
474 /**
475  * kfifo_peek - get data from the fifo without removing
476  * @fifo: address of the fifo to be used
477  * @val: address where to store the data
478  *
479  * This reads the data from the fifo without removing it from the fifo.
480  * It returns 0 if the fifo was empty. Otherwise it returns the number
481  * processed elements.
482  *
483  * Note that with only one concurrent reader and one concurrent
484  * writer, you don't need extra locking to use these macro.
485  */
486 #define	kfifo_peek(fifo, val) \
487 __kfifo_uint_must_check_helper( \
488 ({ \
489 	typeof((fifo) + 1) __tmp = (fifo); \
490 	typeof(__tmp->ptr) __val = (val); \
491 	unsigned int __ret; \
492 	const size_t __recsize = sizeof(*__tmp->rectype); \
493 	struct __kfifo *__kfifo = &__tmp->kfifo; \
494 	if (__recsize) \
495 		__ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \
496 			__recsize); \
497 	else { \
498 		__ret = !kfifo_is_empty(__tmp); \
499 		if (__ret) { \
500 			*(typeof(__tmp->type))__val = \
501 				(__is_kfifo_ptr(__tmp) ? \
502 				((typeof(__tmp->type))__kfifo->data) : \
503 				(__tmp->buf) \
504 				)[__kfifo->out & __tmp->kfifo.mask]; \
505 			smp_wmb(); \
506 		} \
507 	} \
508 	__ret; \
509 }) \
510 )
511 
512 /**
513  * kfifo_in - put data into the fifo
514  * @fifo: address of the fifo to be used
515  * @buf: the data to be added
516  * @n: number of elements to be added
517  *
518  * This macro copies the given buffer into the fifo and returns the
519  * number of copied elements.
520  *
521  * Note that with only one concurrent reader and one concurrent
522  * writer, you don't need extra locking to use these macro.
523  */
524 #define	kfifo_in(fifo, buf, n) \
525 ({ \
526 	typeof((fifo) + 1) __tmp = (fifo); \
527 	typeof(__tmp->ptr_const) __buf = (buf); \
528 	unsigned long __n = (n); \
529 	const size_t __recsize = sizeof(*__tmp->rectype); \
530 	struct __kfifo *__kfifo = &__tmp->kfifo; \
531 	(__recsize) ?\
532 	__kfifo_in_r(__kfifo, __buf, __n, __recsize) : \
533 	__kfifo_in(__kfifo, __buf, __n); \
534 })
535 
536 /**
537  * kfifo_in_spinlocked - put data into the fifo using a spinlock for locking
538  * @fifo: address of the fifo to be used
539  * @buf: the data to be added
540  * @n: number of elements to be added
541  * @lock: pointer to the spinlock to use for locking
542  *
543  * This macro copies the given values buffer into the fifo and returns the
544  * number of copied elements.
545  */
546 #define	kfifo_in_spinlocked(fifo, buf, n, lock) \
547 ({ \
548 	unsigned long __flags; \
549 	unsigned int __ret; \
550 	spin_lock_irqsave(lock, __flags); \
551 	__ret = kfifo_in(fifo, buf, n); \
552 	spin_unlock_irqrestore(lock, __flags); \
553 	__ret; \
554 })
555 
556 /**
557  * kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for
558  * locking, don't disable interrupts
559  * @fifo: address of the fifo to be used
560  * @buf: the data to be added
561  * @n: number of elements to be added
562  * @lock: pointer to the spinlock to use for locking
563  *
564  * This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock()
565  * for locking and doesn't disable interrupts.
566  */
567 #define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \
568 ({ \
569 	unsigned int __ret; \
570 	spin_lock(lock); \
571 	__ret = kfifo_in(fifo, buf, n); \
572 	spin_unlock(lock); \
573 	__ret; \
574 })
575 
576 /* alias for kfifo_in_spinlocked, will be removed in a future release */
577 #define kfifo_in_locked(fifo, buf, n, lock) \
578 		kfifo_in_spinlocked(fifo, buf, n, lock)
579 
580 /**
581  * kfifo_out - get data from the fifo
582  * @fifo: address of the fifo to be used
583  * @buf: pointer to the storage buffer
584  * @n: max. number of elements to get
585  *
586  * This macro get some data from the fifo and return the numbers of elements
587  * copied.
588  *
589  * Note that with only one concurrent reader and one concurrent
590  * writer, you don't need extra locking to use these macro.
591  */
592 #define	kfifo_out(fifo, buf, n) \
593 __kfifo_uint_must_check_helper( \
594 ({ \
595 	typeof((fifo) + 1) __tmp = (fifo); \
596 	typeof(__tmp->ptr) __buf = (buf); \
597 	unsigned long __n = (n); \
598 	const size_t __recsize = sizeof(*__tmp->rectype); \
599 	struct __kfifo *__kfifo = &__tmp->kfifo; \
600 	(__recsize) ?\
601 	__kfifo_out_r(__kfifo, __buf, __n, __recsize) : \
602 	__kfifo_out(__kfifo, __buf, __n); \
603 }) \
604 )
605 
606 /**
607  * kfifo_out_spinlocked - get data from the fifo using a spinlock for locking
608  * @fifo: address of the fifo to be used
609  * @buf: pointer to the storage buffer
610  * @n: max. number of elements to get
611  * @lock: pointer to the spinlock to use for locking
612  *
613  * This macro get the data from the fifo and return the numbers of elements
614  * copied.
615  */
616 #define	kfifo_out_spinlocked(fifo, buf, n, lock) \
617 __kfifo_uint_must_check_helper( \
618 ({ \
619 	unsigned long __flags; \
620 	unsigned int __ret; \
621 	spin_lock_irqsave(lock, __flags); \
622 	__ret = kfifo_out(fifo, buf, n); \
623 	spin_unlock_irqrestore(lock, __flags); \
624 	__ret; \
625 }) \
626 )
627 
628 /**
629  * kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock
630  * for locking, don't disable interrupts
631  * @fifo: address of the fifo to be used
632  * @buf: pointer to the storage buffer
633  * @n: max. number of elements to get
634  * @lock: pointer to the spinlock to use for locking
635  *
636  * This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock()
637  * for locking and doesn't disable interrupts.
638  */
639 #define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \
640 __kfifo_uint_must_check_helper( \
641 ({ \
642 	unsigned int __ret; \
643 	spin_lock(lock); \
644 	__ret = kfifo_out(fifo, buf, n); \
645 	spin_unlock(lock); \
646 	__ret; \
647 }) \
648 )
649 
650 /* alias for kfifo_out_spinlocked, will be removed in a future release */
651 #define kfifo_out_locked(fifo, buf, n, lock) \
652 		kfifo_out_spinlocked(fifo, buf, n, lock)
653 
654 /**
655  * kfifo_from_user - puts some data from user space into the fifo
656  * @fifo: address of the fifo to be used
657  * @from: pointer to the data to be added
658  * @len: the length of the data to be added
659  * @copied: pointer to output variable to store the number of copied bytes
660  *
661  * This macro copies at most @len bytes from the @from into the
662  * fifo, depending of the available space and returns -EFAULT/0.
663  *
664  * Note that with only one concurrent reader and one concurrent
665  * writer, you don't need extra locking to use these macro.
666  */
667 #define	kfifo_from_user(fifo, from, len, copied) \
668 __kfifo_uint_must_check_helper( \
669 ({ \
670 	typeof((fifo) + 1) __tmp = (fifo); \
671 	const void __user *__from = (from); \
672 	unsigned int __len = (len); \
673 	unsigned int *__copied = (copied); \
674 	const size_t __recsize = sizeof(*__tmp->rectype); \
675 	struct __kfifo *__kfifo = &__tmp->kfifo; \
676 	(__recsize) ? \
677 	__kfifo_from_user_r(__kfifo, __from, __len,  __copied, __recsize) : \
678 	__kfifo_from_user(__kfifo, __from, __len, __copied); \
679 }) \
680 )
681 
682 /**
683  * kfifo_to_user - copies data from the fifo into user space
684  * @fifo: address of the fifo to be used
685  * @to: where the data must be copied
686  * @len: the size of the destination buffer
687  * @copied: pointer to output variable to store the number of copied bytes
688  *
689  * This macro copies at most @len bytes from the fifo into the
690  * @to buffer and returns -EFAULT/0.
691  *
692  * Note that with only one concurrent reader and one concurrent
693  * writer, you don't need extra locking to use these macro.
694  */
695 #define	kfifo_to_user(fifo, to, len, copied) \
696 __kfifo_int_must_check_helper( \
697 ({ \
698 	typeof((fifo) + 1) __tmp = (fifo); \
699 	void __user *__to = (to); \
700 	unsigned int __len = (len); \
701 	unsigned int *__copied = (copied); \
702 	const size_t __recsize = sizeof(*__tmp->rectype); \
703 	struct __kfifo *__kfifo = &__tmp->kfifo; \
704 	(__recsize) ? \
705 	__kfifo_to_user_r(__kfifo, __to, __len, __copied, __recsize) : \
706 	__kfifo_to_user(__kfifo, __to, __len, __copied); \
707 }) \
708 )
709 
710 /**
711  * kfifo_dma_in_prepare - setup a scatterlist for DMA input
712  * @fifo: address of the fifo to be used
713  * @sgl: pointer to the scatterlist array
714  * @nents: number of entries in the scatterlist array
715  * @len: number of elements to transfer
716  *
717  * This macro fills a scatterlist for DMA input.
718  * It returns the number entries in the scatterlist array.
719  *
720  * Note that with only one concurrent reader and one concurrent
721  * writer, you don't need extra locking to use these macros.
722  */
723 #define	kfifo_dma_in_prepare(fifo, sgl, nents, len) \
724 ({ \
725 	typeof((fifo) + 1) __tmp = (fifo); \
726 	struct scatterlist *__sgl = (sgl); \
727 	int __nents = (nents); \
728 	unsigned int __len = (len); \
729 	const size_t __recsize = sizeof(*__tmp->rectype); \
730 	struct __kfifo *__kfifo = &__tmp->kfifo; \
731 	(__recsize) ? \
732 	__kfifo_dma_in_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \
733 	__kfifo_dma_in_prepare(__kfifo, __sgl, __nents, __len); \
734 })
735 
736 /**
737  * kfifo_dma_in_finish - finish a DMA IN operation
738  * @fifo: address of the fifo to be used
739  * @len: number of bytes to received
740  *
741  * This macro finish a DMA IN operation. The in counter will be updated by
742  * the len parameter. No error checking will be done.
743  *
744  * Note that with only one concurrent reader and one concurrent
745  * writer, you don't need extra locking to use these macros.
746  */
747 #define kfifo_dma_in_finish(fifo, len) \
748 (void)({ \
749 	typeof((fifo) + 1) __tmp = (fifo); \
750 	unsigned int __len = (len); \
751 	const size_t __recsize = sizeof(*__tmp->rectype); \
752 	struct __kfifo *__kfifo = &__tmp->kfifo; \
753 	if (__recsize) \
754 		__kfifo_dma_in_finish_r(__kfifo, __len, __recsize); \
755 	else \
756 		__kfifo->in += __len / sizeof(*__tmp->type); \
757 })
758 
759 /**
760  * kfifo_dma_out_prepare - setup a scatterlist for DMA output
761  * @fifo: address of the fifo to be used
762  * @sgl: pointer to the scatterlist array
763  * @nents: number of entries in the scatterlist array
764  * @len: number of elements to transfer
765  *
766  * This macro fills a scatterlist for DMA output which at most @len bytes
767  * to transfer.
768  * It returns the number entries in the scatterlist array.
769  * A zero means there is no space available and the scatterlist is not filled.
770  *
771  * Note that with only one concurrent reader and one concurrent
772  * writer, you don't need extra locking to use these macros.
773  */
774 #define	kfifo_dma_out_prepare(fifo, sgl, nents, len) \
775 ({ \
776 	typeof((fifo) + 1) __tmp = (fifo);  \
777 	struct scatterlist *__sgl = (sgl); \
778 	int __nents = (nents); \
779 	unsigned int __len = (len); \
780 	const size_t __recsize = sizeof(*__tmp->rectype); \
781 	struct __kfifo *__kfifo = &__tmp->kfifo; \
782 	(__recsize) ? \
783 	__kfifo_dma_out_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \
784 	__kfifo_dma_out_prepare(__kfifo, __sgl, __nents, __len); \
785 })
786 
787 /**
788  * kfifo_dma_out_finish - finish a DMA OUT operation
789  * @fifo: address of the fifo to be used
790  * @len: number of bytes transferred
791  *
792  * This macro finish a DMA OUT operation. The out counter will be updated by
793  * the len parameter. No error checking will be done.
794  *
795  * Note that with only one concurrent reader and one concurrent
796  * writer, you don't need extra locking to use these macros.
797  */
798 #define kfifo_dma_out_finish(fifo, len) \
799 (void)({ \
800 	typeof((fifo) + 1) __tmp = (fifo); \
801 	unsigned int __len = (len); \
802 	const size_t __recsize = sizeof(*__tmp->rectype); \
803 	struct __kfifo *__kfifo = &__tmp->kfifo; \
804 	if (__recsize) \
805 		__kfifo_dma_out_finish_r(__kfifo, __recsize); \
806 	else \
807 		__kfifo->out += __len / sizeof(*__tmp->type); \
808 })
809 
810 /**
811  * kfifo_out_peek - gets some data from the fifo
812  * @fifo: address of the fifo to be used
813  * @buf: pointer to the storage buffer
814  * @n: max. number of elements to get
815  *
816  * This macro get the data from the fifo and return the numbers of elements
817  * copied. The data is not removed from the fifo.
818  *
819  * Note that with only one concurrent reader and one concurrent
820  * writer, you don't need extra locking to use these macro.
821  */
822 #define	kfifo_out_peek(fifo, buf, n) \
823 __kfifo_uint_must_check_helper( \
824 ({ \
825 	typeof((fifo) + 1) __tmp = (fifo); \
826 	typeof(__tmp->ptr) __buf = (buf); \
827 	unsigned long __n = (n); \
828 	const size_t __recsize = sizeof(*__tmp->rectype); \
829 	struct __kfifo *__kfifo = &__tmp->kfifo; \
830 	(__recsize) ? \
831 	__kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \
832 	__kfifo_out_peek(__kfifo, __buf, __n); \
833 }) \
834 )
835 
836 extern int __kfifo_alloc(struct __kfifo *fifo, unsigned int size,
837 	size_t esize, gfp_t gfp_mask);
838 
839 extern void __kfifo_free(struct __kfifo *fifo);
840 
841 extern int __kfifo_init(struct __kfifo *fifo, void *buffer,
842 	unsigned int size, size_t esize);
843 
844 extern unsigned int __kfifo_in(struct __kfifo *fifo,
845 	const void *buf, unsigned int len);
846 
847 extern unsigned int __kfifo_out(struct __kfifo *fifo,
848 	void *buf, unsigned int len);
849 
850 extern int __kfifo_from_user(struct __kfifo *fifo,
851 	const void __user *from, unsigned long len, unsigned int *copied);
852 
853 extern int __kfifo_to_user(struct __kfifo *fifo,
854 	void __user *to, unsigned long len, unsigned int *copied);
855 
856 extern unsigned int __kfifo_dma_in_prepare(struct __kfifo *fifo,
857 	struct scatterlist *sgl, int nents, unsigned int len);
858 
859 extern unsigned int __kfifo_dma_out_prepare(struct __kfifo *fifo,
860 	struct scatterlist *sgl, int nents, unsigned int len);
861 
862 extern unsigned int __kfifo_out_peek(struct __kfifo *fifo,
863 	void *buf, unsigned int len);
864 
865 extern unsigned int __kfifo_in_r(struct __kfifo *fifo,
866 	const void *buf, unsigned int len, size_t recsize);
867 
868 extern unsigned int __kfifo_out_r(struct __kfifo *fifo,
869 	void *buf, unsigned int len, size_t recsize);
870 
871 extern int __kfifo_from_user_r(struct __kfifo *fifo,
872 	const void __user *from, unsigned long len, unsigned int *copied,
873 	size_t recsize);
874 
875 extern int __kfifo_to_user_r(struct __kfifo *fifo, void __user *to,
876 	unsigned long len, unsigned int *copied, size_t recsize);
877 
878 extern unsigned int __kfifo_dma_in_prepare_r(struct __kfifo *fifo,
879 	struct scatterlist *sgl, int nents, unsigned int len, size_t recsize);
880 
881 extern void __kfifo_dma_in_finish_r(struct __kfifo *fifo,
882 	unsigned int len, size_t recsize);
883 
884 extern unsigned int __kfifo_dma_out_prepare_r(struct __kfifo *fifo,
885 	struct scatterlist *sgl, int nents, unsigned int len, size_t recsize);
886 
887 extern void __kfifo_dma_out_finish_r(struct __kfifo *fifo, size_t recsize);
888 
889 extern unsigned int __kfifo_len_r(struct __kfifo *fifo, size_t recsize);
890 
891 extern void __kfifo_skip_r(struct __kfifo *fifo, size_t recsize);
892 
893 extern unsigned int __kfifo_out_peek_r(struct __kfifo *fifo,
894 	void *buf, unsigned int len, size_t recsize);
895 
896 extern unsigned int __kfifo_max_r(unsigned int len, size_t recsize);
897 
898 #endif
899