diff options
author | Dave Jones <davej@redhat.com> | 2006-12-12 17:41:41 -0500 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2006-12-12 17:41:41 -0500 |
commit | c4366889dda8110247be59ca41fddb82951a8c26 (patch) | |
tree | 705c1a996bed8fd48ce94ff33ec9fd00f9b94875 /arch/x86_64/lib | |
parent | db2fb9db5735cc532fd4fc55e94b9a3c3750378e (diff) | |
parent | e1036502e5263851259d147771226161e5ccc85a (diff) |
Merge ../linus
Conflicts:
drivers/cpufreq/cpufreq.c
Diffstat (limited to 'arch/x86_64/lib')
-rw-r--r-- | arch/x86_64/lib/csum-partial.c | 11 | ||||
-rw-r--r-- | arch/x86_64/lib/csum-wrappers.c | 37 | ||||
-rw-r--r-- | arch/x86_64/lib/delay.c | 4 |
3 files changed, 28 insertions, 24 deletions
diff --git a/arch/x86_64/lib/csum-partial.c b/arch/x86_64/lib/csum-partial.c index c493735218da..bc503f506903 100644 --- a/arch/x86_64/lib/csum-partial.c +++ b/arch/x86_64/lib/csum-partial.c | |||
@@ -9,8 +9,6 @@ | |||
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <asm/checksum.h> | 10 | #include <asm/checksum.h> |
11 | 11 | ||
12 | #define __force_inline inline __attribute__((always_inline)) | ||
13 | |||
14 | static inline unsigned short from32to16(unsigned a) | 12 | static inline unsigned short from32to16(unsigned a) |
15 | { | 13 | { |
16 | unsigned short b = a >> 16; | 14 | unsigned short b = a >> 16; |
@@ -33,7 +31,7 @@ static inline unsigned short from32to16(unsigned a) | |||
33 | * Unrolling to an 128 bytes inner loop. | 31 | * Unrolling to an 128 bytes inner loop. |
34 | * Using interleaving with more registers to break the carry chains. | 32 | * Using interleaving with more registers to break the carry chains. |
35 | */ | 33 | */ |
36 | static __force_inline unsigned do_csum(const unsigned char *buff, unsigned len) | 34 | static unsigned do_csum(const unsigned char *buff, unsigned len) |
37 | { | 35 | { |
38 | unsigned odd, count; | 36 | unsigned odd, count; |
39 | unsigned long result = 0; | 37 | unsigned long result = 0; |
@@ -132,9 +130,10 @@ static __force_inline unsigned do_csum(const unsigned char *buff, unsigned len) | |||
132 | * | 130 | * |
133 | * it's best to have buff aligned on a 64-bit boundary | 131 | * it's best to have buff aligned on a 64-bit boundary |
134 | */ | 132 | */ |
135 | unsigned csum_partial(const unsigned char *buff, unsigned len, unsigned sum) | 133 | __wsum csum_partial(const void *buff, int len, __wsum sum) |
136 | { | 134 | { |
137 | return add32_with_carry(do_csum(buff, len), sum); | 135 | return (__force __wsum)add32_with_carry(do_csum(buff, len), |
136 | (__force u32)sum); | ||
138 | } | 137 | } |
139 | 138 | ||
140 | EXPORT_SYMBOL(csum_partial); | 139 | EXPORT_SYMBOL(csum_partial); |
@@ -143,7 +142,7 @@ EXPORT_SYMBOL(csum_partial); | |||
143 | * this routine is used for miscellaneous IP-like checksums, mainly | 142 | * this routine is used for miscellaneous IP-like checksums, mainly |
144 | * in icmp.c | 143 | * in icmp.c |
145 | */ | 144 | */ |
146 | unsigned short ip_compute_csum(unsigned char * buff, int len) | 145 | __sum16 ip_compute_csum(const void *buff, int len) |
147 | { | 146 | { |
148 | return csum_fold(csum_partial(buff,len,0)); | 147 | return csum_fold(csum_partial(buff,len,0)); |
149 | } | 148 | } |
diff --git a/arch/x86_64/lib/csum-wrappers.c b/arch/x86_64/lib/csum-wrappers.c index b1320ec58428..fd42a4a095fc 100644 --- a/arch/x86_64/lib/csum-wrappers.c +++ b/arch/x86_64/lib/csum-wrappers.c | |||
@@ -18,9 +18,9 @@ | |||
18 | * Returns an 32bit unfolded checksum of the buffer. | 18 | * Returns an 32bit unfolded checksum of the buffer. |
19 | * src and dst are best aligned to 64bits. | 19 | * src and dst are best aligned to 64bits. |
20 | */ | 20 | */ |
21 | unsigned int | 21 | __wsum |
22 | csum_partial_copy_from_user(const unsigned char __user *src, unsigned char *dst, | 22 | csum_partial_copy_from_user(const void __user *src, void *dst, |
23 | int len, unsigned int isum, int *errp) | 23 | int len, __wsum isum, int *errp) |
24 | { | 24 | { |
25 | might_sleep(); | 25 | might_sleep(); |
26 | *errp = 0; | 26 | *errp = 0; |
@@ -34,17 +34,19 @@ csum_partial_copy_from_user(const unsigned char __user *src, unsigned char *dst, | |||
34 | if (unlikely((unsigned long)src & 6)) { | 34 | if (unlikely((unsigned long)src & 6)) { |
35 | while (((unsigned long)src & 6) && len >= 2) { | 35 | while (((unsigned long)src & 6) && len >= 2) { |
36 | __u16 val16; | 36 | __u16 val16; |
37 | *errp = __get_user(val16, (__u16 __user *)src); | 37 | *errp = __get_user(val16, (const __u16 __user *)src); |
38 | if (*errp) | 38 | if (*errp) |
39 | return isum; | 39 | return isum; |
40 | *(__u16 *)dst = val16; | 40 | *(__u16 *)dst = val16; |
41 | isum = add32_with_carry(isum, val16); | 41 | isum = (__force __wsum)add32_with_carry( |
42 | (__force unsigned)isum, val16); | ||
42 | src += 2; | 43 | src += 2; |
43 | dst += 2; | 44 | dst += 2; |
44 | len -= 2; | 45 | len -= 2; |
45 | } | 46 | } |
46 | } | 47 | } |
47 | isum = csum_partial_copy_generic((__force void *)src,dst,len,isum,errp,NULL); | 48 | isum = csum_partial_copy_generic((__force const void *)src, |
49 | dst, len, isum, errp, NULL); | ||
48 | if (likely(*errp == 0)) | 50 | if (likely(*errp == 0)) |
49 | return isum; | 51 | return isum; |
50 | } | 52 | } |
@@ -66,9 +68,9 @@ EXPORT_SYMBOL(csum_partial_copy_from_user); | |||
66 | * Returns an 32bit unfolded checksum of the buffer. | 68 | * Returns an 32bit unfolded checksum of the buffer. |
67 | * src and dst are best aligned to 64bits. | 69 | * src and dst are best aligned to 64bits. |
68 | */ | 70 | */ |
69 | unsigned int | 71 | __wsum |
70 | csum_partial_copy_to_user(unsigned const char *src, unsigned char __user *dst, | 72 | csum_partial_copy_to_user(const void *src, void __user *dst, |
71 | int len, unsigned int isum, int *errp) | 73 | int len, __wsum isum, int *errp) |
72 | { | 74 | { |
73 | might_sleep(); | 75 | might_sleep(); |
74 | if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) { | 76 | if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) { |
@@ -79,7 +81,8 @@ csum_partial_copy_to_user(unsigned const char *src, unsigned char __user *dst, | |||
79 | if (unlikely((unsigned long)dst & 6)) { | 81 | if (unlikely((unsigned long)dst & 6)) { |
80 | while (((unsigned long)dst & 6) && len >= 2) { | 82 | while (((unsigned long)dst & 6) && len >= 2) { |
81 | __u16 val16 = *(__u16 *)src; | 83 | __u16 val16 = *(__u16 *)src; |
82 | isum = add32_with_carry(isum, val16); | 84 | isum = (__force __wsum)add32_with_carry( |
85 | (__force unsigned)isum, val16); | ||
83 | *errp = __put_user(val16, (__u16 __user *)dst); | 86 | *errp = __put_user(val16, (__u16 __user *)dst); |
84 | if (*errp) | 87 | if (*errp) |
85 | return isum; | 88 | return isum; |
@@ -104,19 +107,21 @@ EXPORT_SYMBOL(csum_partial_copy_to_user); | |||
104 | * | 107 | * |
105 | * Returns an 32bit unfolded checksum of the buffer. | 108 | * Returns an 32bit unfolded checksum of the buffer. |
106 | */ | 109 | */ |
107 | unsigned int | 110 | __wsum |
108 | csum_partial_copy_nocheck(const unsigned char *src, unsigned char *dst, int len, unsigned int sum) | 111 | csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) |
109 | { | 112 | { |
110 | return csum_partial_copy_generic(src,dst,len,sum,NULL,NULL); | 113 | return csum_partial_copy_generic(src,dst,len,sum,NULL,NULL); |
111 | } | 114 | } |
112 | EXPORT_SYMBOL(csum_partial_copy_nocheck); | 115 | EXPORT_SYMBOL(csum_partial_copy_nocheck); |
113 | 116 | ||
114 | unsigned short csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, | 117 | __sum16 csum_ipv6_magic(const struct in6_addr *saddr, |
115 | __u32 len, unsigned short proto, unsigned int sum) | 118 | const struct in6_addr *daddr, |
119 | __u32 len, unsigned short proto, __wsum sum) | ||
116 | { | 120 | { |
117 | __u64 rest, sum64; | 121 | __u64 rest, sum64; |
118 | 122 | ||
119 | rest = (__u64)htonl(len) + (__u64)htons(proto) + (__u64)sum; | 123 | rest = (__force __u64)htonl(len) + (__force __u64)htons(proto) + |
124 | (__force __u64)sum; | ||
120 | asm(" addq (%[saddr]),%[sum]\n" | 125 | asm(" addq (%[saddr]),%[sum]\n" |
121 | " adcq 8(%[saddr]),%[sum]\n" | 126 | " adcq 8(%[saddr]),%[sum]\n" |
122 | " adcq (%[daddr]),%[sum]\n" | 127 | " adcq (%[daddr]),%[sum]\n" |
@@ -124,7 +129,7 @@ unsigned short csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, | |||
124 | " adcq $0,%[sum]\n" | 129 | " adcq $0,%[sum]\n" |
125 | : [sum] "=r" (sum64) | 130 | : [sum] "=r" (sum64) |
126 | : "[sum]" (rest),[saddr] "r" (saddr), [daddr] "r" (daddr)); | 131 | : "[sum]" (rest),[saddr] "r" (saddr), [daddr] "r" (daddr)); |
127 | return csum_fold(add32_with_carry(sum64 & 0xffffffff, sum64>>32)); | 132 | return csum_fold((__force __wsum)add32_with_carry(sum64 & 0xffffffff, sum64>>32)); |
128 | } | 133 | } |
129 | 134 | ||
130 | EXPORT_SYMBOL(csum_ipv6_magic); | 135 | EXPORT_SYMBOL(csum_ipv6_magic); |
diff --git a/arch/x86_64/lib/delay.c b/arch/x86_64/lib/delay.c index 50be90975d04..2dbebd308347 100644 --- a/arch/x86_64/lib/delay.c +++ b/arch/x86_64/lib/delay.c | |||
@@ -40,13 +40,13 @@ EXPORT_SYMBOL(__delay); | |||
40 | 40 | ||
41 | inline void __const_udelay(unsigned long xloops) | 41 | inline void __const_udelay(unsigned long xloops) |
42 | { | 42 | { |
43 | __delay((xloops * HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy) >> 32); | 43 | __delay(((xloops * HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy) >> 32) + 1); |
44 | } | 44 | } |
45 | EXPORT_SYMBOL(__const_udelay); | 45 | EXPORT_SYMBOL(__const_udelay); |
46 | 46 | ||
47 | void __udelay(unsigned long usecs) | 47 | void __udelay(unsigned long usecs) |
48 | { | 48 | { |
49 | __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */ | 49 | __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */ |
50 | } | 50 | } |
51 | EXPORT_SYMBOL(__udelay); | 51 | EXPORT_SYMBOL(__udelay); |
52 | 52 | ||