forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch enhances the type safety for the kfifo API. It is now safe to put const data into a non const FIFO and the API will now generate a compiler warning when reading from the fifo where the destination address is pointing to a const variable. As a side effect the kfifo_put() does now expect the value of an element instead a pointer to the element. This was suggested Russell King. It make the handling of the kfifo_put easier since there is no need to create a helper variable for getting the address of a pointer or to pass integers of different sizes. IMHO the API break is okay, since there are currently only six users of kfifo_put(). The code is also cleaner by kicking out the "if (0)" expressions. [[email protected]: coding-style fixes] Signed-off-by: Stefani Seibold <[email protected]> Cc: Russell King <[email protected]> Cc: Hauke Mehrtens <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
10 changed files
with
25 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
/* | ||
* A generic kernel FIFO implementation | ||
* | ||
* Copyright (C) 2009/2010 Stefani Seibold <[email protected]> | ||
* Copyright (C) 2013 Stefani Seibold <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
|
@@ -67,9 +67,10 @@ struct __kfifo { | |
union { \ | ||
struct __kfifo kfifo; \ | ||
datatype *type; \ | ||
const datatype *const_type; \ | ||
char (*rectype)[recsize]; \ | ||
ptrtype *ptr; \ | ||
const ptrtype *ptr_const; \ | ||
ptrtype const *ptr_const; \ | ||
} | ||
|
||
#define __STRUCT_KFIFO(type, size, recsize, ptrtype) \ | ||
|
@@ -386,16 +387,12 @@ __kfifo_int_must_check_helper( \ | |
#define kfifo_put(fifo, val) \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((val) + 1) __val = (val); \ | ||
typeof(*__tmp->const_type) __val = (val); \ | ||
unsigned int __ret; \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) { \ | ||
typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ | ||
__dummy = (typeof(__val))NULL; \ | ||
} \ | ||
if (__recsize) \ | ||
__ret = __kfifo_in_r(__kfifo, __val, sizeof(*__val), \ | ||
__ret = __kfifo_in_r(__kfifo, &__val, sizeof(__val), \ | ||
__recsize); \ | ||
else { \ | ||
__ret = !kfifo_is_full(__tmp); \ | ||
|
@@ -404,7 +401,7 @@ __kfifo_int_must_check_helper( \ | |
((typeof(__tmp->type))__kfifo->data) : \ | ||
(__tmp->buf) \ | ||
)[__kfifo->in & __tmp->kfifo.mask] = \ | ||
*(typeof(__tmp->type))__val; \ | ||
(typeof(*__tmp->type))__val; \ | ||
smp_wmb(); \ | ||
__kfifo->in++; \ | ||
} \ | ||
|
@@ -415,7 +412,7 @@ __kfifo_int_must_check_helper( \ | |
/** | ||
* kfifo_get - get data from the fifo | ||
* @fifo: address of the fifo to be used | ||
* @val: the var where to store the data to be added | ||
* @val: address where to store the data | ||
* | ||
* This macro reads the data from the fifo. | ||
* It returns 0 if the fifo was empty. Otherwise it returns the number | ||
|
@@ -428,12 +425,10 @@ __kfifo_int_must_check_helper( \ | |
__kfifo_uint_must_check_helper( \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((val) + 1) __val = (val); \ | ||
typeof(__tmp->ptr) __val = (val); \ | ||
unsigned int __ret; \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) \ | ||
__val = (typeof(__tmp->ptr))0; \ | ||
if (__recsize) \ | ||
__ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \ | ||
__recsize); \ | ||
|
@@ -456,7 +451,7 @@ __kfifo_uint_must_check_helper( \ | |
/** | ||
* kfifo_peek - get data from the fifo without removing | ||
* @fifo: address of the fifo to be used | ||
* @val: the var where to store the data to be added | ||
* @val: address where to store the data | ||
* | ||
* This reads the data from the fifo without removing it from the fifo. | ||
* It returns 0 if the fifo was empty. Otherwise it returns the number | ||
|
@@ -469,12 +464,10 @@ __kfifo_uint_must_check_helper( \ | |
__kfifo_uint_must_check_helper( \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((val) + 1) __val = (val); \ | ||
typeof(__tmp->ptr) __val = (val); \ | ||
unsigned int __ret; \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) \ | ||
__val = (typeof(__tmp->ptr))NULL; \ | ||
if (__recsize) \ | ||
__ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \ | ||
__recsize); \ | ||
|
@@ -508,14 +501,10 @@ __kfifo_uint_must_check_helper( \ | |
#define kfifo_in(fifo, buf, n) \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((buf) + 1) __buf = (buf); \ | ||
typeof(__tmp->ptr_const) __buf = (buf); \ | ||
unsigned long __n = (n); \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) { \ | ||
typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ | ||
__dummy = (typeof(__buf))NULL; \ | ||
} \ | ||
(__recsize) ?\ | ||
__kfifo_in_r(__kfifo, __buf, __n, __recsize) : \ | ||
__kfifo_in(__kfifo, __buf, __n); \ | ||
|
@@ -561,14 +550,10 @@ __kfifo_uint_must_check_helper( \ | |
__kfifo_uint_must_check_helper( \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((buf) + 1) __buf = (buf); \ | ||
typeof(__tmp->ptr) __buf = (buf); \ | ||
unsigned long __n = (n); \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) { \ | ||
typeof(__tmp->ptr) __dummy = NULL; \ | ||
__buf = __dummy; \ | ||
} \ | ||
(__recsize) ?\ | ||
__kfifo_out_r(__kfifo, __buf, __n, __recsize) : \ | ||
__kfifo_out(__kfifo, __buf, __n); \ | ||
|
@@ -773,14 +758,10 @@ __kfifo_uint_must_check_helper( \ | |
__kfifo_uint_must_check_helper( \ | ||
({ \ | ||
typeof((fifo) + 1) __tmp = (fifo); \ | ||
typeof((buf) + 1) __buf = (buf); \ | ||
typeof(__tmp->ptr) __buf = (buf); \ | ||
unsigned long __n = (n); \ | ||
const size_t __recsize = sizeof(*__tmp->rectype); \ | ||
struct __kfifo *__kfifo = &__tmp->kfifo; \ | ||
if (0) { \ | ||
typeof(__tmp->ptr) __dummy __attribute__ ((unused)) = NULL; \ | ||
__buf = __dummy; \ | ||
} \ | ||
(__recsize) ? \ | ||
__kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \ | ||
__kfifo_out_peek(__kfifo, __buf, __n); \ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters