is_power_of_2(size) will be failed if size is 0, and then it calls roundup_pow_of_two(0), then will return a quite *huge* value(well, the comments at roundup_pow_of_two macro says: the result is undefined when n == 0).
Moving the size check before power of 2 testing and rounding will fix this "not really happened yet" issue. Cc: Stefani Seibold <stef...@seibold.net> Cc: Andrew Morton <a...@linux-foundation.org> Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com> --- kernel/kfifo.c | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) diff --git a/kernel/kfifo.c b/kernel/kfifo.c index 0f78378..e3a63c6 100644 --- a/kernel/kfifo.c +++ b/kernel/kfifo.c @@ -38,13 +38,6 @@ static inline unsigned int kfifo_unused(struct __kfifo *fifo) int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, size_t esize, gfp_t gfp_mask) { - /* - * round up to the next power of 2, since our 'let the indices - * wrap' technique works only in this case. - */ - if (!is_power_of_2(size)) - size = roundup_pow_of_two(size); - fifo->in = 0; fifo->out = 0; fifo->esize = esize; @@ -54,6 +47,12 @@ int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, fifo->mask = 0; return -EINVAL; } + /* + * round up to the next power of 2, since our 'let the indices + * wrap' technique works only in this case. + */ + if (!is_power_of_2(size)) + size = roundup_pow_of_two(size); fifo->data = kmalloc(size * esize, gfp_mask); @@ -81,20 +80,19 @@ EXPORT_SYMBOL(__kfifo_free); int __kfifo_init(struct __kfifo *fifo, void *buffer, unsigned int size, size_t esize) { - size /= esize; - - if (!is_power_of_2(size)) - size = roundup_pow_of_two(size); - fifo->in = 0; fifo->out = 0; fifo->esize = esize; fifo->data = buffer; + size /= esize; if (size < 2) { fifo->mask = 0; return -EINVAL; } + if (!is_power_of_2(size)) + size = roundup_pow_of_two(size); + fifo->mask = size - 1; return 0; -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/