diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 4 | ||||
-rw-r--r-- | lib/bitmap.c | 8 | ||||
-rw-r--r-- | lib/cmdline.c | 29 | ||||
-rw-r--r-- | lib/genalloc.c | 1 | ||||
-rw-r--r-- | lib/rhashtable.c | 10 | ||||
-rw-r--r-- | lib/scatterlist.c | 6 | ||||
-rw-r--r-- | lib/show_mem.c | 2 | ||||
-rw-r--r-- | lib/string.c | 16 |
8 files changed, 63 insertions, 13 deletions
diff --git a/lib/Makefile b/lib/Makefile index 7512dc978f18..0211d2bd5e17 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -10,7 +10,7 @@ endif | |||
10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ | 10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ |
11 | rbtree.o radix-tree.o dump_stack.o timerqueue.o\ | 11 | rbtree.o radix-tree.o dump_stack.o timerqueue.o\ |
12 | idr.o int_sqrt.o extable.o \ | 12 | idr.o int_sqrt.o extable.o \ |
13 | sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \ | 13 | sha1.o md5.o irq_regs.o argv_split.o \ |
14 | proportions.o flex_proportions.o ratelimit.o show_mem.o \ | 14 | proportions.o flex_proportions.o ratelimit.o show_mem.o \ |
15 | is_single_threaded.o plist.o decompress.o kobject_uevent.o \ | 15 | is_single_threaded.o plist.o decompress.o kobject_uevent.o \ |
16 | earlycpio.o | 16 | earlycpio.o |
@@ -26,7 +26,7 @@ obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | |||
26 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ | 26 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ |
27 | gcd.o lcm.o list_sort.o uuid.o flex_array.o iovec.o clz_ctz.o \ | 27 | gcd.o lcm.o list_sort.o uuid.o flex_array.o iovec.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_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o \ |
29 | percpu-refcount.o percpu_ida.o hash.o rhashtable.o | 29 | percpu-refcount.o percpu_ida.o hash.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 |
32 | obj-y += kstrtox.o | 32 | obj-y += kstrtox.o |
diff --git a/lib/bitmap.c b/lib/bitmap.c index cd250a2e14cb..b499ab6ada29 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c | |||
@@ -131,7 +131,9 @@ void __bitmap_shift_right(unsigned long *dst, | |||
131 | lower = src[off + k]; | 131 | lower = src[off + k]; |
132 | if (left && off + k == lim - 1) | 132 | if (left && off + k == lim - 1) |
133 | lower &= mask; | 133 | lower &= mask; |
134 | dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem; | 134 | dst[k] = lower >> rem; |
135 | if (rem) | ||
136 | dst[k] |= upper << (BITS_PER_LONG - rem); | ||
135 | if (left && k == lim - 1) | 137 | if (left && k == lim - 1) |
136 | dst[k] &= mask; | 138 | dst[k] &= mask; |
137 | } | 139 | } |
@@ -172,7 +174,9 @@ void __bitmap_shift_left(unsigned long *dst, | |||
172 | upper = src[k]; | 174 | upper = src[k]; |
173 | if (left && k == lim - 1) | 175 | if (left && k == lim - 1) |
174 | upper &= (1UL << left) - 1; | 176 | upper &= (1UL << left) - 1; |
175 | dst[k + off] = lower >> (BITS_PER_LONG - rem) | upper << rem; | 177 | dst[k + off] = upper << rem; |
178 | if (rem) | ||
179 | dst[k + off] |= lower >> (BITS_PER_LONG - rem); | ||
176 | if (left && k + off == lim - 1) | 180 | if (left && k + off == lim - 1) |
177 | dst[k + off] &= (1UL << left) - 1; | 181 | dst[k + off] &= (1UL << left) - 1; |
178 | } | 182 | } |
diff --git a/lib/cmdline.c b/lib/cmdline.c index 76a712e6e20e..8f13cf73c2ec 100644 --- a/lib/cmdline.c +++ b/lib/cmdline.c | |||
@@ -160,3 +160,32 @@ unsigned long long memparse(const char *ptr, char **retptr) | |||
160 | return ret; | 160 | return ret; |
161 | } | 161 | } |
162 | EXPORT_SYMBOL(memparse); | 162 | EXPORT_SYMBOL(memparse); |
163 | |||
164 | /** | ||
165 | * parse_option_str - Parse a string and check an option is set or not | ||
166 | * @str: String to be parsed | ||
167 | * @option: option name | ||
168 | * | ||
169 | * This function parses a string containing a comma-separated list of | ||
170 | * strings like a=b,c. | ||
171 | * | ||
172 | * Return true if there's such option in the string, or return false. | ||
173 | */ | ||
174 | bool parse_option_str(const char *str, const char *option) | ||
175 | { | ||
176 | while (*str) { | ||
177 | if (!strncmp(str, option, strlen(option))) { | ||
178 | str += strlen(option); | ||
179 | if (!*str || *str == ',') | ||
180 | return true; | ||
181 | } | ||
182 | |||
183 | while (*str && *str != ',') | ||
184 | str++; | ||
185 | |||
186 | if (*str == ',') | ||
187 | str++; | ||
188 | } | ||
189 | |||
190 | return false; | ||
191 | } | ||
diff --git a/lib/genalloc.c b/lib/genalloc.c index cce4dd68c40d..2e65d206b01c 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c | |||
@@ -598,6 +598,7 @@ struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order, | |||
598 | 598 | ||
599 | return pool; | 599 | return pool; |
600 | } | 600 | } |
601 | EXPORT_SYMBOL(devm_gen_pool_create); | ||
601 | 602 | ||
602 | /** | 603 | /** |
603 | * dev_get_gen_pool - Obtain the gen_pool (if any) for a device | 604 | * dev_get_gen_pool - Obtain the gen_pool (if any) for a device |
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index 081be3ba9ea8..624a0b7c05ef 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c | |||
@@ -230,7 +230,7 @@ int rhashtable_expand(struct rhashtable *ht, gfp_t flags) | |||
230 | ht->shift++; | 230 | ht->shift++; |
231 | 231 | ||
232 | /* For each new bucket, search the corresponding old bucket | 232 | /* For each new bucket, search the corresponding old bucket |
233 | * for the first entry that hashes to the new bucket, and | 233 | * for the first entry that hashes to the new bucket, and |
234 | * link the new bucket to that entry. Since all the entries | 234 | * link the new bucket to that entry. Since all the entries |
235 | * which will end up in the new bucket appear in the same | 235 | * which will end up in the new bucket appear in the same |
236 | * old bucket, this constructs an entirely valid new hash | 236 | * old bucket, this constructs an entirely valid new hash |
@@ -248,8 +248,8 @@ int rhashtable_expand(struct rhashtable *ht, gfp_t flags) | |||
248 | } | 248 | } |
249 | 249 | ||
250 | /* Publish the new table pointer. Lookups may now traverse | 250 | /* Publish the new table pointer. Lookups may now traverse |
251 | * the new table, but they will not benefit from any | 251 | * the new table, but they will not benefit from any |
252 | * additional efficiency until later steps unzip the buckets. | 252 | * additional efficiency until later steps unzip the buckets. |
253 | */ | 253 | */ |
254 | rcu_assign_pointer(ht->tbl, new_tbl); | 254 | rcu_assign_pointer(ht->tbl, new_tbl); |
255 | 255 | ||
@@ -306,14 +306,14 @@ int rhashtable_shrink(struct rhashtable *ht, gfp_t flags) | |||
306 | 306 | ||
307 | ht->shift--; | 307 | ht->shift--; |
308 | 308 | ||
309 | /* Link each bucket in the new table to the first bucket | 309 | /* Link each bucket in the new table to the first bucket |
310 | * in the old table that contains entries which will hash | 310 | * in the old table that contains entries which will hash |
311 | * to the new bucket. | 311 | * to the new bucket. |
312 | */ | 312 | */ |
313 | for (i = 0; i < ntbl->size; i++) { | 313 | for (i = 0; i < ntbl->size; i++) { |
314 | ntbl->buckets[i] = tbl->buckets[i]; | 314 | ntbl->buckets[i] = tbl->buckets[i]; |
315 | 315 | ||
316 | /* Link each bucket in the new table to the first bucket | 316 | /* Link each bucket in the new table to the first bucket |
317 | * in the old table that contains entries which will hash | 317 | * in the old table that contains entries which will hash |
318 | * to the new bucket. | 318 | * to the new bucket. |
319 | */ | 319 | */ |
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 9cdf62f8accd..c9f2e8c6ccc9 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
@@ -203,10 +203,10 @@ void __sg_free_table(struct sg_table *table, unsigned int max_ents, | |||
203 | } | 203 | } |
204 | 204 | ||
205 | table->orig_nents -= sg_size; | 205 | table->orig_nents -= sg_size; |
206 | if (!skip_first_chunk) { | 206 | if (skip_first_chunk) |
207 | free_fn(sgl, alloc_size); | ||
208 | skip_first_chunk = false; | 207 | skip_first_chunk = false; |
209 | } | 208 | else |
209 | free_fn(sgl, alloc_size); | ||
210 | sgl = next; | 210 | sgl = next; |
211 | } | 211 | } |
212 | 212 | ||
diff --git a/lib/show_mem.c b/lib/show_mem.c index 09225796991a..5e256271b47b 100644 --- a/lib/show_mem.c +++ b/lib/show_mem.c | |||
@@ -28,7 +28,7 @@ void show_mem(unsigned int filter) | |||
28 | continue; | 28 | continue; |
29 | 29 | ||
30 | total += zone->present_pages; | 30 | total += zone->present_pages; |
31 | reserved = zone->present_pages - zone->managed_pages; | 31 | reserved += zone->present_pages - zone->managed_pages; |
32 | 32 | ||
33 | if (is_highmem_idx(zoneid)) | 33 | if (is_highmem_idx(zoneid)) |
34 | highmem += zone->present_pages; | 34 | highmem += zone->present_pages; |
diff --git a/lib/string.c b/lib/string.c index 2fc20aa06f84..10063300b830 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -598,6 +598,22 @@ void *memset(void *s, int c, size_t count) | |||
598 | EXPORT_SYMBOL(memset); | 598 | EXPORT_SYMBOL(memset); |
599 | #endif | 599 | #endif |
600 | 600 | ||
601 | /** | ||
602 | * memzero_explicit - Fill a region of memory (e.g. sensitive | ||
603 | * keying data) with 0s. | ||
604 | * @s: Pointer to the start of the area. | ||
605 | * @count: The size of the area. | ||
606 | * | ||
607 | * memzero_explicit() doesn't need an arch-specific version as | ||
608 | * it just invokes the one of memset() implicitly. | ||
609 | */ | ||
610 | void memzero_explicit(void *s, size_t count) | ||
611 | { | ||
612 | memset(s, 0, count); | ||
613 | OPTIMIZER_HIDE_VAR(s); | ||
614 | } | ||
615 | EXPORT_SYMBOL(memzero_explicit); | ||
616 | |||
601 | #ifndef __HAVE_ARCH_MEMCPY | 617 | #ifndef __HAVE_ARCH_MEMCPY |
602 | /** | 618 | /** |
603 | * memcpy - Copy one area of memory to another | 619 | * memcpy - Copy one area of memory to another |