diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/dma-debug.c | 2 | ||||
-rw-r--r-- | lib/list_sort.c | 102 | ||||
-rw-r--r-- | lib/string.c | 27 | ||||
-rw-r--r-- | lib/zlib_inflate/inffast.c | 32 |
5 files changed, 160 insertions, 5 deletions
diff --git a/lib/Makefile b/lib/Makefile index 911b25aed1e7..3b0b4a696db9 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -21,7 +21,7 @@ lib-y += kobject.o kref.o klist.o | |||
21 | 21 | ||
22 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ | 22 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
23 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ | 23 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ |
24 | string_helpers.o gcd.o | 24 | string_helpers.o gcd.o list_sort.o |
25 | 25 | ||
26 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | 26 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) |
27 | CFLAGS_kobject.o += -DDEBUG | 27 | CFLAGS_kobject.o += -DDEBUG |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 7d2f0b33e5a8..ba8b67039d13 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
@@ -587,7 +587,7 @@ out_unlock: | |||
587 | return count; | 587 | return count; |
588 | } | 588 | } |
589 | 589 | ||
590 | const struct file_operations filter_fops = { | 590 | static const struct file_operations filter_fops = { |
591 | .read = filter_read, | 591 | .read = filter_read, |
592 | .write = filter_write, | 592 | .write = filter_write, |
593 | }; | 593 | }; |
diff --git a/lib/list_sort.c b/lib/list_sort.c new file mode 100644 index 000000000000..19d11e0bb958 --- /dev/null +++ b/lib/list_sort.c | |||
@@ -0,0 +1,102 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/list_sort.h> | ||
4 | #include <linux/slab.h> | ||
5 | #include <linux/list.h> | ||
6 | |||
7 | /** | ||
8 | * list_sort - sort a list. | ||
9 | * @priv: private data, passed to @cmp | ||
10 | * @head: the list to sort | ||
11 | * @cmp: the elements comparison function | ||
12 | * | ||
13 | * This function has been implemented by Mark J Roberts <mjr@znex.org>. It | ||
14 | * implements "merge sort" which has O(nlog(n)) complexity. The list is sorted | ||
15 | * in ascending order. | ||
16 | * | ||
17 | * The comparison function @cmp is supposed to return a negative value if @a is | ||
18 | * less than @b, and a positive value if @a is greater than @b. If @a and @b | ||
19 | * are equivalent, then it does not matter what this function returns. | ||
20 | */ | ||
21 | void list_sort(void *priv, struct list_head *head, | ||
22 | int (*cmp)(void *priv, struct list_head *a, | ||
23 | struct list_head *b)) | ||
24 | { | ||
25 | struct list_head *p, *q, *e, *list, *tail, *oldhead; | ||
26 | int insize, nmerges, psize, qsize, i; | ||
27 | |||
28 | if (list_empty(head)) | ||
29 | return; | ||
30 | |||
31 | list = head->next; | ||
32 | list_del(head); | ||
33 | insize = 1; | ||
34 | for (;;) { | ||
35 | p = oldhead = list; | ||
36 | list = tail = NULL; | ||
37 | nmerges = 0; | ||
38 | |||
39 | while (p) { | ||
40 | nmerges++; | ||
41 | q = p; | ||
42 | psize = 0; | ||
43 | for (i = 0; i < insize; i++) { | ||
44 | psize++; | ||
45 | q = q->next == oldhead ? NULL : q->next; | ||
46 | if (!q) | ||
47 | break; | ||
48 | } | ||
49 | |||
50 | qsize = insize; | ||
51 | while (psize > 0 || (qsize > 0 && q)) { | ||
52 | if (!psize) { | ||
53 | e = q; | ||
54 | q = q->next; | ||
55 | qsize--; | ||
56 | if (q == oldhead) | ||
57 | q = NULL; | ||
58 | } else if (!qsize || !q) { | ||
59 | e = p; | ||
60 | p = p->next; | ||
61 | psize--; | ||
62 | if (p == oldhead) | ||
63 | p = NULL; | ||
64 | } else if (cmp(priv, p, q) <= 0) { | ||
65 | e = p; | ||
66 | p = p->next; | ||
67 | psize--; | ||
68 | if (p == oldhead) | ||
69 | p = NULL; | ||
70 | } else { | ||
71 | e = q; | ||
72 | q = q->next; | ||
73 | qsize--; | ||
74 | if (q == oldhead) | ||
75 | q = NULL; | ||
76 | } | ||
77 | if (tail) | ||
78 | tail->next = e; | ||
79 | else | ||
80 | list = e; | ||
81 | e->prev = tail; | ||
82 | tail = e; | ||
83 | } | ||
84 | p = q; | ||
85 | } | ||
86 | |||
87 | tail->next = list; | ||
88 | list->prev = tail; | ||
89 | |||
90 | if (nmerges <= 1) | ||
91 | break; | ||
92 | |||
93 | insize *= 2; | ||
94 | } | ||
95 | |||
96 | head->next = list; | ||
97 | head->prev = list->prev; | ||
98 | list->prev->next = head; | ||
99 | list->prev = head; | ||
100 | } | ||
101 | |||
102 | EXPORT_SYMBOL(list_sort); | ||
diff --git a/lib/string.c b/lib/string.c index 9f75b4ec50b8..a1cdcfcc42d0 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -667,7 +667,7 @@ EXPORT_SYMBOL(memscan); | |||
667 | */ | 667 | */ |
668 | char *strstr(const char *s1, const char *s2) | 668 | char *strstr(const char *s1, const char *s2) |
669 | { | 669 | { |
670 | int l1, l2; | 670 | size_t l1, l2; |
671 | 671 | ||
672 | l2 = strlen(s2); | 672 | l2 = strlen(s2); |
673 | if (!l2) | 673 | if (!l2) |
@@ -684,6 +684,31 @@ char *strstr(const char *s1, const char *s2) | |||
684 | EXPORT_SYMBOL(strstr); | 684 | EXPORT_SYMBOL(strstr); |
685 | #endif | 685 | #endif |
686 | 686 | ||
687 | #ifndef __HAVE_ARCH_STRNSTR | ||
688 | /** | ||
689 | * strnstr - Find the first substring in a length-limited string | ||
690 | * @s1: The string to be searched | ||
691 | * @s2: The string to search for | ||
692 | * @len: the maximum number of characters to search | ||
693 | */ | ||
694 | char *strnstr(const char *s1, const char *s2, size_t len) | ||
695 | { | ||
696 | size_t l1 = len, l2; | ||
697 | |||
698 | l2 = strlen(s2); | ||
699 | if (!l2) | ||
700 | return (char *)s1; | ||
701 | while (l1 >= l2) { | ||
702 | l1--; | ||
703 | if (!memcmp(s1, s2, l2)) | ||
704 | return (char *)s1; | ||
705 | s1++; | ||
706 | } | ||
707 | return NULL; | ||
708 | } | ||
709 | EXPORT_SYMBOL(strnstr); | ||
710 | #endif | ||
711 | |||
687 | #ifndef __HAVE_ARCH_MEMCHR | 712 | #ifndef __HAVE_ARCH_MEMCHR |
688 | /** | 713 | /** |
689 | * memchr - Find a character in an area of memory. | 714 | * memchr - Find a character in an area of memory. |
diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c index 05e1559fa156..215447c55261 100644 --- a/lib/zlib_inflate/inffast.c +++ b/lib/zlib_inflate/inffast.c | |||
@@ -4,12 +4,25 @@ | |||
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/zutil.h> | 6 | #include <linux/zutil.h> |
7 | #include <asm/unaligned.h> | ||
8 | #include <asm/byteorder.h> | ||
9 | #include "inftrees.h" | 7 | #include "inftrees.h" |
10 | #include "inflate.h" | 8 | #include "inflate.h" |
11 | #include "inffast.h" | 9 | #include "inffast.h" |
12 | 10 | ||
11 | /* Only do the unaligned "Faster" variant when | ||
12 | * CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is set | ||
13 | * | ||
14 | * On powerpc, it won't be as we don't include autoconf.h | ||
15 | * automatically for the boot wrapper, which is intended as | ||
16 | * we run in an environment where we may not be able to deal | ||
17 | * with (even rare) alignment faults. In addition, we do not | ||
18 | * define __KERNEL__ for arch/powerpc/boot unlike x86 | ||
19 | */ | ||
20 | |||
21 | #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
22 | #include <asm/unaligned.h> | ||
23 | #include <asm/byteorder.h> | ||
24 | #endif | ||
25 | |||
13 | #ifndef ASMINF | 26 | #ifndef ASMINF |
14 | 27 | ||
15 | /* Allow machine dependent optimization for post-increment or pre-increment. | 28 | /* Allow machine dependent optimization for post-increment or pre-increment. |
@@ -243,6 +256,7 @@ void inflate_fast(z_streamp strm, unsigned start) | |||
243 | } | 256 | } |
244 | } | 257 | } |
245 | else { | 258 | else { |
259 | #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
246 | unsigned short *sout; | 260 | unsigned short *sout; |
247 | unsigned long loops; | 261 | unsigned long loops; |
248 | 262 | ||
@@ -284,6 +298,20 @@ void inflate_fast(z_streamp strm, unsigned start) | |||
284 | } | 298 | } |
285 | if (len & 1) | 299 | if (len & 1) |
286 | PUP(out) = PUP(from); | 300 | PUP(out) = PUP(from); |
301 | #else /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */ | ||
302 | from = out - dist; /* copy direct from output */ | ||
303 | do { /* minimum length is three */ | ||
304 | PUP(out) = PUP(from); | ||
305 | PUP(out) = PUP(from); | ||
306 | PUP(out) = PUP(from); | ||
307 | len -= 3; | ||
308 | } while (len > 2); | ||
309 | if (len) { | ||
310 | PUP(out) = PUP(from); | ||
311 | if (len > 1) | ||
312 | PUP(out) = PUP(from); | ||
313 | } | ||
314 | #endif /* !CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */ | ||
287 | } | 315 | } |
288 | } | 316 | } |
289 | else if ((op & 64) == 0) { /* 2nd level distance code */ | 317 | else if ((op & 64) == 0) { /* 2nd level distance code */ |