diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/bitmap.c | 33 | ||||
-rw-r--r-- | lib/cpumask.c | 79 | ||||
-rw-r--r-- | lib/dynamic_printk.c | 4 | ||||
-rw-r--r-- | lib/string_helpers.c | 34 | ||||
-rw-r--r-- | lib/swiotlb.c | 6 | ||||
-rw-r--r-- | lib/vsprintf.c | 49 |
7 files changed, 171 insertions, 36 deletions
diff --git a/lib/Makefile b/lib/Makefile index 16feaab057b2..7cb65d85aeb0 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for some libs needed in the kernel. | 2 | # Makefile for some libs needed in the kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | ifdef CONFIG_FTRACE | 5 | ifdef CONFIG_FUNCTION_TRACER |
6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) | 7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) |
8 | endif | 8 | endif |
diff --git a/lib/bitmap.c b/lib/bitmap.c index 06fb57c86de0..1338469ac849 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c | |||
@@ -316,17 +316,6 @@ int bitmap_scnprintf(char *buf, unsigned int buflen, | |||
316 | EXPORT_SYMBOL(bitmap_scnprintf); | 316 | EXPORT_SYMBOL(bitmap_scnprintf); |
317 | 317 | ||
318 | /** | 318 | /** |
319 | * bitmap_scnprintf_len - return buffer length needed to convert | ||
320 | * bitmap to an ASCII hex string | ||
321 | * @nr_bits: number of bits to be converted | ||
322 | */ | ||
323 | int bitmap_scnprintf_len(unsigned int nr_bits) | ||
324 | { | ||
325 | unsigned int nr_nibbles = ALIGN(nr_bits, 4) / 4; | ||
326 | return nr_nibbles + ALIGN(nr_nibbles, CHUNKSZ / 4) / (CHUNKSZ / 4) - 1; | ||
327 | } | ||
328 | |||
329 | /** | ||
330 | * __bitmap_parse - convert an ASCII hex string into a bitmap. | 319 | * __bitmap_parse - convert an ASCII hex string into a bitmap. |
331 | * @buf: pointer to buffer containing string. | 320 | * @buf: pointer to buffer containing string. |
332 | * @buflen: buffer size in bytes. If string is smaller than this | 321 | * @buflen: buffer size in bytes. If string is smaller than this |
@@ -1007,3 +996,25 @@ int bitmap_allocate_region(unsigned long *bitmap, int pos, int order) | |||
1007 | return 0; | 996 | return 0; |
1008 | } | 997 | } |
1009 | EXPORT_SYMBOL(bitmap_allocate_region); | 998 | EXPORT_SYMBOL(bitmap_allocate_region); |
999 | |||
1000 | /** | ||
1001 | * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. | ||
1002 | * @dst: destination buffer | ||
1003 | * @src: bitmap to copy | ||
1004 | * @nbits: number of bits in the bitmap | ||
1005 | * | ||
1006 | * Require nbits % BITS_PER_LONG == 0. | ||
1007 | */ | ||
1008 | void bitmap_copy_le(void *dst, const unsigned long *src, int nbits) | ||
1009 | { | ||
1010 | unsigned long *d = dst; | ||
1011 | int i; | ||
1012 | |||
1013 | for (i = 0; i < nbits/BITS_PER_LONG; i++) { | ||
1014 | if (BITS_PER_LONG == 64) | ||
1015 | d[i] = cpu_to_le64(src[i]); | ||
1016 | else | ||
1017 | d[i] = cpu_to_le32(src[i]); | ||
1018 | } | ||
1019 | } | ||
1020 | EXPORT_SYMBOL(bitmap_copy_le); | ||
diff --git a/lib/cpumask.c b/lib/cpumask.c index 5f97dc25ef9c..8d03f22c6ced 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c | |||
@@ -2,6 +2,7 @@ | |||
2 | #include <linux/bitops.h> | 2 | #include <linux/bitops.h> |
3 | #include <linux/cpumask.h> | 3 | #include <linux/cpumask.h> |
4 | #include <linux/module.h> | 4 | #include <linux/module.h> |
5 | #include <linux/bootmem.h> | ||
5 | 6 | ||
6 | int __first_cpu(const cpumask_t *srcp) | 7 | int __first_cpu(const cpumask_t *srcp) |
7 | { | 8 | { |
@@ -35,3 +36,81 @@ int __any_online_cpu(const cpumask_t *mask) | |||
35 | return cpu; | 36 | return cpu; |
36 | } | 37 | } |
37 | EXPORT_SYMBOL(__any_online_cpu); | 38 | EXPORT_SYMBOL(__any_online_cpu); |
39 | |||
40 | /** | ||
41 | * cpumask_next_and - get the next cpu in *src1p & *src2p | ||
42 | * @n: the cpu prior to the place to search (ie. return will be > @n) | ||
43 | * @src1p: the first cpumask pointer | ||
44 | * @src2p: the second cpumask pointer | ||
45 | * | ||
46 | * Returns >= nr_cpu_ids if no further cpus set in both. | ||
47 | */ | ||
48 | int cpumask_next_and(int n, const struct cpumask *src1p, | ||
49 | const struct cpumask *src2p) | ||
50 | { | ||
51 | while ((n = cpumask_next(n, src1p)) < nr_cpu_ids) | ||
52 | if (cpumask_test_cpu(n, src2p)) | ||
53 | break; | ||
54 | return n; | ||
55 | } | ||
56 | EXPORT_SYMBOL(cpumask_next_and); | ||
57 | |||
58 | /** | ||
59 | * cpumask_any_but - return a "random" in a cpumask, but not this one. | ||
60 | * @mask: the cpumask to search | ||
61 | * @cpu: the cpu to ignore. | ||
62 | * | ||
63 | * Often used to find any cpu but smp_processor_id() in a mask. | ||
64 | * Returns >= nr_cpu_ids if no cpus set. | ||
65 | */ | ||
66 | int cpumask_any_but(const struct cpumask *mask, unsigned int cpu) | ||
67 | { | ||
68 | unsigned int i; | ||
69 | |||
70 | cpumask_check(cpu); | ||
71 | for_each_cpu(i, mask) | ||
72 | if (i != cpu) | ||
73 | break; | ||
74 | return i; | ||
75 | } | ||
76 | |||
77 | /* These are not inline because of header tangles. */ | ||
78 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
79 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) | ||
80 | { | ||
81 | if (likely(slab_is_available())) | ||
82 | *mask = kmalloc(cpumask_size(), flags); | ||
83 | else { | ||
84 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
85 | printk(KERN_ERR | ||
86 | "=> alloc_cpumask_var: kmalloc not available!\n"); | ||
87 | dump_stack(); | ||
88 | #endif | ||
89 | *mask = NULL; | ||
90 | } | ||
91 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
92 | if (!*mask) { | ||
93 | printk(KERN_ERR "=> alloc_cpumask_var: failed!\n"); | ||
94 | dump_stack(); | ||
95 | } | ||
96 | #endif | ||
97 | return *mask != NULL; | ||
98 | } | ||
99 | EXPORT_SYMBOL(alloc_cpumask_var); | ||
100 | |||
101 | void __init alloc_bootmem_cpumask_var(cpumask_var_t *mask) | ||
102 | { | ||
103 | *mask = alloc_bootmem(cpumask_size()); | ||
104 | } | ||
105 | |||
106 | void free_cpumask_var(cpumask_var_t mask) | ||
107 | { | ||
108 | kfree(mask); | ||
109 | } | ||
110 | EXPORT_SYMBOL(free_cpumask_var); | ||
111 | |||
112 | void __init free_bootmem_cpumask_var(cpumask_var_t mask) | ||
113 | { | ||
114 | free_bootmem((unsigned long)mask, cpumask_size()); | ||
115 | } | ||
116 | #endif | ||
diff --git a/lib/dynamic_printk.c b/lib/dynamic_printk.c index d640f87bdc9e..d83660fd6fdd 100644 --- a/lib/dynamic_printk.c +++ b/lib/dynamic_printk.c | |||
@@ -402,6 +402,8 @@ static int __init dynamic_printk_init(void) | |||
402 | iter->logical_modname, | 402 | iter->logical_modname, |
403 | iter->flag_names, iter->hash, iter->hash2); | 403 | iter->flag_names, iter->hash, iter->hash2); |
404 | } | 404 | } |
405 | if (dynamic_enabled == DYNAMIC_ENABLED_ALL) | ||
406 | set_all(true); | ||
405 | return 0; | 407 | return 0; |
406 | } | 408 | } |
407 | module_init(dynamic_printk_init); | 409 | module_init(dynamic_printk_init); |
@@ -411,7 +413,7 @@ static int __init dynamic_printk_setup(char *str) | |||
411 | { | 413 | { |
412 | if (str) | 414 | if (str) |
413 | return -ENOENT; | 415 | return -ENOENT; |
414 | set_all(true); | 416 | dynamic_enabled = DYNAMIC_ENABLED_ALL; |
415 | return 0; | 417 | return 0; |
416 | } | 418 | } |
417 | /* Use early_param(), so we can get debug output as early as possible */ | 419 | /* Use early_param(), so we can get debug output as early as possible */ |
diff --git a/lib/string_helpers.c b/lib/string_helpers.c index 8347925030ff..ab431d4cc970 100644 --- a/lib/string_helpers.c +++ b/lib/string_helpers.c | |||
@@ -23,7 +23,7 @@ | |||
23 | int string_get_size(u64 size, const enum string_size_units units, | 23 | int string_get_size(u64 size, const enum string_size_units units, |
24 | char *buf, int len) | 24 | char *buf, int len) |
25 | { | 25 | { |
26 | const char *units_10[] = { "B", "KB", "MB", "GB", "TB", "PB", | 26 | const char *units_10[] = { "B", "kB", "MB", "GB", "TB", "PB", |
27 | "EB", "ZB", "YB", NULL}; | 27 | "EB", "ZB", "YB", NULL}; |
28 | const char *units_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB", | 28 | const char *units_2[] = {"B", "KiB", "MiB", "GiB", "TiB", "PiB", |
29 | "EiB", "ZiB", "YiB", NULL }; | 29 | "EiB", "ZiB", "YiB", NULL }; |
@@ -31,7 +31,7 @@ int string_get_size(u64 size, const enum string_size_units units, | |||
31 | [STRING_UNITS_10] = units_10, | 31 | [STRING_UNITS_10] = units_10, |
32 | [STRING_UNITS_2] = units_2, | 32 | [STRING_UNITS_2] = units_2, |
33 | }; | 33 | }; |
34 | const int divisor[] = { | 34 | const unsigned int divisor[] = { |
35 | [STRING_UNITS_10] = 1000, | 35 | [STRING_UNITS_10] = 1000, |
36 | [STRING_UNITS_2] = 1024, | 36 | [STRING_UNITS_2] = 1024, |
37 | }; | 37 | }; |
@@ -40,23 +40,27 @@ int string_get_size(u64 size, const enum string_size_units units, | |||
40 | char tmp[8]; | 40 | char tmp[8]; |
41 | 41 | ||
42 | tmp[0] = '\0'; | 42 | tmp[0] = '\0'; |
43 | i = 0; | ||
44 | if (size >= divisor[units]) { | ||
45 | while (size >= divisor[units] && units_str[units][i]) { | ||
46 | remainder = do_div(size, divisor[units]); | ||
47 | i++; | ||
48 | } | ||
43 | 49 | ||
44 | for (i = 0; size > divisor[units] && units_str[units][i]; i++) | 50 | sf_cap = size; |
45 | remainder = do_div(size, divisor[units]); | 51 | for (j = 0; sf_cap*10 < 1000; j++) |
52 | sf_cap *= 10; | ||
46 | 53 | ||
47 | sf_cap = size; | 54 | if (j) { |
48 | for (j = 0; sf_cap*10 < 1000; j++) | 55 | remainder *= 1000; |
49 | sf_cap *= 10; | 56 | do_div(remainder, divisor[units]); |
50 | 57 | snprintf(tmp, sizeof(tmp), ".%03lld", | |
51 | if (j) { | 58 | (unsigned long long)remainder); |
52 | remainder *= 1000; | 59 | tmp[j+1] = '\0'; |
53 | do_div(remainder, divisor[units]); | 60 | } |
54 | snprintf(tmp, sizeof(tmp), ".%03lld", | ||
55 | (unsigned long long)remainder); | ||
56 | tmp[j+1] = '\0'; | ||
57 | } | 61 | } |
58 | 62 | ||
59 | snprintf(buf, len, "%lld%s%s", (unsigned long long)size, | 63 | snprintf(buf, len, "%lld%s %s", (unsigned long long)size, |
60 | tmp, units_str[units][i]); | 64 | tmp, units_str[units][i]); |
61 | 65 | ||
62 | return 0; | 66 | return 0; |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index f8eebd489149..78330c37a61b 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -497,8 +497,10 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", | 497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", |
498 | (unsigned long long)*hwdev->dma_mask, | 498 | (unsigned long long)*hwdev->dma_mask, |
499 | (unsigned long long)dev_addr); | 499 | (unsigned long long)dev_addr); |
500 | panic("swiotlb_alloc_coherent: allocated memory is out of " | 500 | |
501 | "range for device"); | 501 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ |
502 | unmap_single(hwdev, ret, size, DMA_TO_DEVICE); | ||
503 | return NULL; | ||
502 | } | 504 | } |
503 | *dma_handle = dev_addr; | 505 | *dma_handle = dev_addr; |
504 | return ret; | 506 | return ret; |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index cceecb6a963d..a013bbc23717 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/kallsyms.h> | 25 | #include <linux/kallsyms.h> |
26 | #include <linux/uaccess.h> | 26 | #include <linux/uaccess.h> |
27 | #include <linux/ioport.h> | ||
27 | 28 | ||
28 | #include <asm/page.h> /* for PAGE_SIZE */ | 29 | #include <asm/page.h> /* for PAGE_SIZE */ |
29 | #include <asm/div64.h> | 30 | #include <asm/div64.h> |
@@ -550,18 +551,51 @@ static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int | |||
550 | #endif | 551 | #endif |
551 | } | 552 | } |
552 | 553 | ||
554 | static char *resource_string(char *buf, char *end, struct resource *res, int field_width, int precision, int flags) | ||
555 | { | ||
556 | #ifndef IO_RSRC_PRINTK_SIZE | ||
557 | #define IO_RSRC_PRINTK_SIZE 4 | ||
558 | #endif | ||
559 | |||
560 | #ifndef MEM_RSRC_PRINTK_SIZE | ||
561 | #define MEM_RSRC_PRINTK_SIZE 8 | ||
562 | #endif | ||
563 | |||
564 | /* room for the actual numbers, the two "0x", -, [, ] and the final zero */ | ||
565 | char sym[4*sizeof(resource_size_t) + 8]; | ||
566 | char *p = sym, *pend = sym + sizeof(sym); | ||
567 | int size = -1; | ||
568 | |||
569 | if (res->flags & IORESOURCE_IO) | ||
570 | size = IO_RSRC_PRINTK_SIZE; | ||
571 | else if (res->flags & IORESOURCE_MEM) | ||
572 | size = MEM_RSRC_PRINTK_SIZE; | ||
573 | |||
574 | *p++ = '['; | ||
575 | p = number(p, pend, res->start, 16, size, -1, SPECIAL | SMALL | ZEROPAD); | ||
576 | *p++ = '-'; | ||
577 | p = number(p, pend, res->end, 16, size, -1, SPECIAL | SMALL | ZEROPAD); | ||
578 | *p++ = ']'; | ||
579 | *p = 0; | ||
580 | |||
581 | return string(buf, end, sym, field_width, precision, flags); | ||
582 | } | ||
583 | |||
553 | /* | 584 | /* |
554 | * Show a '%p' thing. A kernel extension is that the '%p' is followed | 585 | * Show a '%p' thing. A kernel extension is that the '%p' is followed |
555 | * by an extra set of alphanumeric characters that are extended format | 586 | * by an extra set of alphanumeric characters that are extended format |
556 | * specifiers. | 587 | * specifiers. |
557 | * | 588 | * |
558 | * Right now we just handle 'F' (for symbolic Function descriptor pointers) | 589 | * Right now we handle: |
559 | * and 'S' (for Symbolic direct pointers), but this can easily be | 590 | * |
560 | * extended in the future (network address types etc). | 591 | * - 'F' For symbolic function descriptor pointers |
592 | * - 'S' For symbolic direct pointers | ||
593 | * - 'R' For a struct resource pointer, it prints the range of | ||
594 | * addresses (not the name nor the flags) | ||
561 | * | 595 | * |
562 | * The difference between 'S' and 'F' is that on ia64 and ppc64 function | 596 | * Note: The difference between 'S' and 'F' is that on ia64 and ppc64 |
563 | * pointers are really function descriptors, which contain a pointer the | 597 | * function pointers are really function descriptors, which contain a |
564 | * real address. | 598 | * pointer to the real address. |
565 | */ | 599 | */ |
566 | static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags) | 600 | static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags) |
567 | { | 601 | { |
@@ -571,6 +605,8 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field | |||
571 | /* Fallthrough */ | 605 | /* Fallthrough */ |
572 | case 'S': | 606 | case 'S': |
573 | return symbol_string(buf, end, ptr, field_width, precision, flags); | 607 | return symbol_string(buf, end, ptr, field_width, precision, flags); |
608 | case 'R': | ||
609 | return resource_string(buf, end, ptr, field_width, precision, flags); | ||
574 | } | 610 | } |
575 | flags |= SMALL; | 611 | flags |= SMALL; |
576 | if (field_width == -1) { | 612 | if (field_width == -1) { |
@@ -590,6 +626,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field | |||
590 | * This function follows C99 vsnprintf, but has some extensions: | 626 | * This function follows C99 vsnprintf, but has some extensions: |
591 | * %pS output the name of a text symbol | 627 | * %pS output the name of a text symbol |
592 | * %pF output the name of a function pointer | 628 | * %pF output the name of a function pointer |
629 | * %pR output the address range in a struct resource | ||
593 | * | 630 | * |
594 | * The return value is the number of characters which would | 631 | * The return value is the number of characters which would |
595 | * be generated for the given input, excluding the trailing | 632 | * be generated for the given input, excluding the trailing |