cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kfifo.h (26805B)


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