diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/find_next_bit.c | 27 |
2 files changed, 27 insertions, 2 deletions
diff --git a/lib/Makefile b/lib/Makefile index 58f74d2dd396..05f8fa56a1bc 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -25,7 +25,7 @@ obj-y += lockref.o | |||
25 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | 25 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
26 | bust_spinlocks.o kasprintf.o bitmap.o scatterlist.o \ | 26 | bust_spinlocks.o kasprintf.o bitmap.o scatterlist.o \ |
27 | gcd.o lcm.o list_sort.o uuid.o flex_array.o iov_iter.o clz_ctz.o \ | 27 | gcd.o lcm.o list_sort.o uuid.o flex_array.o iov_iter.o clz_ctz.o \ |
28 | bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o \ | 28 | bsearch.o find_next_bit.o llist.o memweight.o kfifo.o \ |
29 | percpu-refcount.o percpu_ida.o rhashtable.o reciprocal_div.o | 29 | percpu-refcount.o percpu_ida.o rhashtable.o reciprocal_div.o |
30 | obj-y += string_helpers.o | 30 | obj-y += string_helpers.o |
31 | obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o | 31 | obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o |
diff --git a/lib/find_next_bit.c b/lib/find_next_bit.c index cbea5ef843aa..18072ea9c20e 100644 --- a/lib/find_next_bit.c +++ b/lib/find_next_bit.c | |||
@@ -1,8 +1,12 @@ | |||
1 | /* find_next_bit.c: fallback find next bit implementation | 1 | /* bit search implementation |
2 | * | 2 | * |
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | 3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. |
4 | * Written by David Howells (dhowells@redhat.com) | 4 | * Written by David Howells (dhowells@redhat.com) |
5 | * | 5 | * |
6 | * Copyright (C) 2008 IBM Corporation | ||
7 | * 'find_last_bit' is written by Rusty Russell <rusty@rustcorp.com.au> | ||
8 | * (Inspired by David Howell's find_next_bit implementation) | ||
9 | * | ||
6 | * Rewritten by Yury Norov <yury.norov@gmail.com> to decrease | 10 | * Rewritten by Yury Norov <yury.norov@gmail.com> to decrease |
7 | * size and improve performance, 2015. | 11 | * size and improve performance, 2015. |
8 | * | 12 | * |
@@ -13,6 +17,7 @@ | |||
13 | */ | 17 | */ |
14 | 18 | ||
15 | #include <linux/bitops.h> | 19 | #include <linux/bitops.h> |
20 | #include <linux/bitmap.h> | ||
16 | #include <linux/export.h> | 21 | #include <linux/export.h> |
17 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
18 | 23 | ||
@@ -106,6 +111,26 @@ unsigned long find_first_zero_bit(const unsigned long *addr, unsigned long size) | |||
106 | EXPORT_SYMBOL(find_first_zero_bit); | 111 | EXPORT_SYMBOL(find_first_zero_bit); |
107 | #endif | 112 | #endif |
108 | 113 | ||
114 | #ifndef find_last_bit | ||
115 | unsigned long find_last_bit(const unsigned long *addr, unsigned long size) | ||
116 | { | ||
117 | if (size) { | ||
118 | unsigned long val = BITMAP_LAST_WORD_MASK(size); | ||
119 | unsigned long idx = (size-1) / BITS_PER_LONG; | ||
120 | |||
121 | do { | ||
122 | val &= addr[idx]; | ||
123 | if (val) | ||
124 | return idx * BITS_PER_LONG + __fls(val); | ||
125 | |||
126 | val = ~0ul; | ||
127 | } while (idx--); | ||
128 | } | ||
129 | return size; | ||
130 | } | ||
131 | EXPORT_SYMBOL(find_last_bit); | ||
132 | #endif | ||
133 | |||
109 | #ifdef __BIG_ENDIAN | 134 | #ifdef __BIG_ENDIAN |
110 | 135 | ||
111 | /* include/linux/byteorder does not support "unsigned long" type */ | 136 | /* include/linux/byteorder does not support "unsigned long" type */ |