Release 4.9 lib/find_bit.c
/* bit search implementation
*
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
* Written by David Howells (dhowells@redhat.com)
*
* Copyright (C) 2008 IBM Corporation
* 'find_last_bit' is written by Rusty Russell <rusty@rustcorp.com.au>
* (Inspired by David Howell's find_next_bit implementation)
*
* Rewritten by Yury Norov <yury.norov@gmail.com> to decrease
* size and improve performance, 2015.
*
* 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 the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/export.h>
#include <linux/kernel.h>
#if !defined(find_next_bit) || !defined(find_next_zero_bit)
/*
* This is a common helper function for find_next_bit and
* find_next_zero_bit. The difference is the "invert" argument, which
* is XORed with each fetched word before searching it for one bits.
*/
static unsigned long _find_next_bit(const unsigned long *addr,
unsigned long nbits, unsigned long start, unsigned long invert)
{
unsigned long tmp;
if (!nbits || start >= nbits)
return nbits;
tmp = addr[start / BITS_PER_LONG] ^ invert;
/* Handle 1st word. */
tmp &= BITMAP_FIRST_WORD_MASK(start);
start = round_down(start, BITS_PER_LONG);
while (!tmp) {
start += BITS_PER_LONG;
if (start >= nbits)
return nbits;
tmp = addr[start / BITS_PER_LONG] ^ invert;
}
return min(start + __ffs(tmp), nbits);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 57 | 50.44% | 1 | 33.33% |
akinobu mita | akinobu mita | 29 | 25.66% | 1 | 33.33% |
david howells | david howells | 27 | 23.89% | 1 | 33.33% |
| Total | 113 | 100.00% | 3 | 100.00% |
#endif
#ifndef find_next_bit
/*
* Find the next set bit in a memory region.
*/
unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
unsigned long offset)
{
return _find_next_bit(addr, size, offset, 0UL);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 30 | 93.75% | 1 | 50.00% |
akinobu mita | akinobu mita | 2 | 6.25% | 1 | 50.00% |
| Total | 32 | 100.00% | 2 | 100.00% |
EXPORT_SYMBOL(find_next_bit);
#endif
#ifndef find_next_zero_bit
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
unsigned long offset)
{
return _find_next_bit(addr, size, offset, ~0UL);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
akinobu mita | akinobu mita | 18 | 54.55% | 1 | 33.33% |
yury norov | yury norov | 14 | 42.42% | 1 | 33.33% |
thomas gleixner | thomas gleixner | 1 | 3.03% | 1 | 33.33% |
| Total | 33 | 100.00% | 3 | 100.00% |
EXPORT_SYMBOL(find_next_zero_bit);
#endif
#ifndef find_first_bit
/*
* Find the first set bit in a memory region.
*/
unsigned long find_first_bit(const unsigned long *addr, unsigned long size)
{
unsigned long idx;
for (idx = 0; idx * BITS_PER_LONG < size; idx++) {
if (addr[idx])
return min(idx * BITS_PER_LONG + __ffs(addr[idx]), size);
}
return size;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 43 | 66.15% | 1 | 33.33% |
akinobu mita | akinobu mita | 20 | 30.77% | 1 | 33.33% |
david howells | david howells | 2 | 3.08% | 1 | 33.33% |
| Total | 65 | 100.00% | 3 | 100.00% |
EXPORT_SYMBOL(find_first_bit);
#endif
#ifndef find_first_zero_bit
/*
* Find the first cleared bit in a memory region.
*/
unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size)
{
unsigned long idx;
for (idx = 0; idx * BITS_PER_LONG < size; idx++) {
if (addr[idx] != ~0UL)
return min(idx * BITS_PER_LONG + ffz(addr[idx]), size);
}
return size;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 35 | 51.47% | 1 | 50.00% |
alexander van heukelum | alexander van heukelum | 33 | 48.53% | 1 | 50.00% |
| Total | 68 | 100.00% | 2 | 100.00% |
EXPORT_SYMBOL(find_first_zero_bit);
#endif
#ifndef find_last_bit
unsigned long find_last_bit(const unsigned long *addr, unsigned long size)
{
if (size) {
unsigned long val = BITMAP_LAST_WORD_MASK(size);
unsigned long idx = (size-1) / BITS_PER_LONG;
do {
val &= addr[idx];
if (val)
return idx * BITS_PER_LONG + __fls(val);
val = ~0ul;
} while (idx--);
}
return size;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 81 | 100.00% | 1 | 100.00% |
| Total | 81 | 100.00% | 1 | 100.00% |
EXPORT_SYMBOL(find_last_bit);
#endif
#ifdef __BIG_ENDIAN
/* include/linux/byteorder does not support "unsigned long" type */
static inline unsigned long ext2_swab(const unsigned long y)
{
#if BITS_PER_LONG == 64
return (unsigned long) __swab64((u64) y);
#elif BITS_PER_LONG == 32
return (unsigned long) __swab32((u32) y);
#else
#error BITS_PER_LONG not defined
#endif
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
akinobu mita | akinobu mita | 29 | 51.79% | 1 | 33.33% |
yury norov | yury norov | 16 | 28.57% | 1 | 33.33% |
alexander van heukelum | alexander van heukelum | 11 | 19.64% | 1 | 33.33% |
| Total | 56 | 100.00% | 3 | 100.00% |
#if !defined(find_next_bit_le) || !defined(find_next_zero_bit_le)
static unsigned long _find_next_bit_le(const unsigned long *addr,
unsigned long nbits, unsigned long start, unsigned long invert)
{
unsigned long tmp;
if (!nbits || start >= nbits)
return nbits;
tmp = addr[start / BITS_PER_LONG] ^ invert;
/* Handle 1st word. */
tmp &= ext2_swab(BITMAP_FIRST_WORD_MASK(start));
start = round_down(start, BITS_PER_LONG);
while (!tmp) {
start += BITS_PER_LONG;
if (start >= nbits)
return nbits;
tmp = addr[start / BITS_PER_LONG] ^ invert;
}
return min(start + __ffs(ext2_swab(tmp)), nbits);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 63 | 52.94% | 1 | 50.00% |
akinobu mita | akinobu mita | 56 | 47.06% | 1 | 50.00% |
| Total | 119 | 100.00% | 2 | 100.00% |
#endif
#ifndef find_next_zero_bit_le
unsigned long find_next_zero_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
return _find_next_bit_le(addr, size, offset, ~0UL);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 30 | 93.75% | 1 | 50.00% |
akinobu mita | akinobu mita | 2 | 6.25% | 1 | 50.00% |
| Total | 32 | 100.00% | 2 | 100.00% |
EXPORT_SYMBOL(find_next_zero_bit_le);
#endif
#ifndef find_next_bit_le
unsigned long find_next_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
return _find_next_bit_le(addr, size, offset, 0UL);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
aneesh kumar | aneesh kumar | 23 | 74.19% | 1 | 25.00% |
yury norov | yury norov | 5 | 16.13% | 1 | 25.00% |
akinobu mita | akinobu mita | 3 | 9.68% | 2 | 50.00% |
| Total | 31 | 100.00% | 4 | 100.00% |
EXPORT_SYMBOL(find_next_bit_le);
#endif
#endif /* __BIG_ENDIAN */
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
yury norov | yury norov | 439 | 58.22% | 2 | 15.38% |
akinobu mita | akinobu mita | 197 | 26.13% | 5 | 38.46% |
alexander van heukelum | alexander van heukelum | 50 | 6.63% | 1 | 7.69% |
david howells | david howells | 38 | 5.04% | 2 | 15.38% |
aneesh kumar | aneesh kumar | 27 | 3.58% | 1 | 7.69% |
thomas gleixner | thomas gleixner | 2 | 0.27% | 1 | 7.69% |
paul gortmaker | paul gortmaker | 1 | 0.13% | 1 | 7.69% |
| Total | 754 | 100.00% | 13 | 100.00% |