Annotation of /trunk/kernel26-alx/patches-2.6.33-r1/0104-2.6.33.5-all-fixes.patch
Parent Directory | Revision Log
Revision 1178 -
(hide annotations)
(download)
Thu Oct 14 20:10:01 2010 UTC (13 years, 11 months ago) by niro
File size: 52581 byte(s)
Thu Oct 14 20:10:01 2010 UTC (13 years, 11 months ago) by niro
File size: 52581 byte(s)
-2.6.33-alx-r1: new magellan 0.5.2 kernel
1 | niro | 1178 | diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt |
2 | index 0d07513..bf241be 100644 | ||
3 | --- a/Documentation/filesystems/proc.txt | ||
4 | +++ b/Documentation/filesystems/proc.txt | ||
5 | @@ -308,7 +308,7 @@ address perms offset dev inode pathname | ||
6 | 08049000-0804a000 rw-p 00001000 03:00 8312 /opt/test | ||
7 | 0804a000-0806b000 rw-p 00000000 00:00 0 [heap] | ||
8 | a7cb1000-a7cb2000 ---p 00000000 00:00 0 | ||
9 | -a7cb2000-a7eb2000 rw-p 00000000 00:00 0 [threadstack:001ff4b4] | ||
10 | +a7cb2000-a7eb2000 rw-p 00000000 00:00 0 | ||
11 | a7eb2000-a7eb3000 ---p 00000000 00:00 0 | ||
12 | a7eb3000-a7ed5000 rw-p 00000000 00:00 0 | ||
13 | a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6 | ||
14 | @@ -344,7 +344,6 @@ is not associated with a file: | ||
15 | [stack] = the stack of the main process | ||
16 | [vdso] = the "virtual dynamic shared object", | ||
17 | the kernel system call handler | ||
18 | - [threadstack:xxxxxxxx] = the stack of the thread, xxxxxxxx is the stack size | ||
19 | |||
20 | or if empty, the mapping is anonymous. | ||
21 | |||
22 | diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h | ||
23 | index 9f4c9d4..bd100fc 100644 | ||
24 | --- a/arch/powerpc/include/asm/hw_irq.h | ||
25 | +++ b/arch/powerpc/include/asm/hw_irq.h | ||
26 | @@ -130,43 +130,5 @@ static inline int irqs_disabled_flags(unsigned long flags) | ||
27 | */ | ||
28 | struct irq_chip; | ||
29 | |||
30 | -#ifdef CONFIG_PERF_EVENTS | ||
31 | - | ||
32 | -#ifdef CONFIG_PPC64 | ||
33 | -static inline unsigned long test_perf_event_pending(void) | ||
34 | -{ | ||
35 | - unsigned long x; | ||
36 | - | ||
37 | - asm volatile("lbz %0,%1(13)" | ||
38 | - : "=r" (x) | ||
39 | - : "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
40 | - return x; | ||
41 | -} | ||
42 | - | ||
43 | -static inline void set_perf_event_pending(void) | ||
44 | -{ | ||
45 | - asm volatile("stb %0,%1(13)" : : | ||
46 | - "r" (1), | ||
47 | - "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
48 | -} | ||
49 | - | ||
50 | -static inline void clear_perf_event_pending(void) | ||
51 | -{ | ||
52 | - asm volatile("stb %0,%1(13)" : : | ||
53 | - "r" (0), | ||
54 | - "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
55 | -} | ||
56 | -#endif /* CONFIG_PPC64 */ | ||
57 | - | ||
58 | -#else /* CONFIG_PERF_EVENTS */ | ||
59 | - | ||
60 | -static inline unsigned long test_perf_event_pending(void) | ||
61 | -{ | ||
62 | - return 0; | ||
63 | -} | ||
64 | - | ||
65 | -static inline void clear_perf_event_pending(void) {} | ||
66 | -#endif /* CONFIG_PERF_EVENTS */ | ||
67 | - | ||
68 | #endif /* __KERNEL__ */ | ||
69 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | ||
70 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c | ||
71 | index a6c2b63..11d0668 100644 | ||
72 | --- a/arch/powerpc/kernel/asm-offsets.c | ||
73 | +++ b/arch/powerpc/kernel/asm-offsets.c | ||
74 | @@ -133,7 +133,6 @@ int main(void) | ||
75 | DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr)); | ||
76 | DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled)); | ||
77 | DEFINE(PACAHARDIRQEN, offsetof(struct paca_struct, hard_enabled)); | ||
78 | - DEFINE(PACAPERFPEND, offsetof(struct paca_struct, perf_event_pending)); | ||
79 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); | ||
80 | #ifdef CONFIG_PPC_MM_SLICES | ||
81 | DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, | ||
82 | diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S | ||
83 | index bdcb557..afbf400 100644 | ||
84 | --- a/arch/powerpc/kernel/entry_64.S | ||
85 | +++ b/arch/powerpc/kernel/entry_64.S | ||
86 | @@ -556,15 +556,6 @@ ALT_FW_FTR_SECTION_END_IFCLR(FW_FEATURE_ISERIES) | ||
87 | 2: | ||
88 | TRACE_AND_RESTORE_IRQ(r5); | ||
89 | |||
90 | -#ifdef CONFIG_PERF_EVENTS | ||
91 | - /* check paca->perf_event_pending if we're enabling ints */ | ||
92 | - lbz r3,PACAPERFPEND(r13) | ||
93 | - and. r3,r3,r5 | ||
94 | - beq 27f | ||
95 | - bl .perf_event_do_pending | ||
96 | -27: | ||
97 | -#endif /* CONFIG_PERF_EVENTS */ | ||
98 | - | ||
99 | /* extract EE bit and use it to restore paca->hard_enabled */ | ||
100 | ld r3,_MSR(r1) | ||
101 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ | ||
102 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c | ||
103 | index 9040330..dee83b8 100644 | ||
104 | --- a/arch/powerpc/kernel/irq.c | ||
105 | +++ b/arch/powerpc/kernel/irq.c | ||
106 | @@ -53,7 +53,6 @@ | ||
107 | #include <linux/bootmem.h> | ||
108 | #include <linux/pci.h> | ||
109 | #include <linux/debugfs.h> | ||
110 | -#include <linux/perf_event.h> | ||
111 | |||
112 | #include <asm/uaccess.h> | ||
113 | #include <asm/system.h> | ||
114 | @@ -143,11 +142,6 @@ notrace void raw_local_irq_restore(unsigned long en) | ||
115 | } | ||
116 | #endif /* CONFIG_PPC_STD_MMU_64 */ | ||
117 | |||
118 | - if (test_perf_event_pending()) { | ||
119 | - clear_perf_event_pending(); | ||
120 | - perf_event_do_pending(); | ||
121 | - } | ||
122 | - | ||
123 | /* | ||
124 | * if (get_paca()->hard_enabled) return; | ||
125 | * But again we need to take care that gcc gets hard_enabled directly | ||
126 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
127 | index 6c6093d..6f174e7 100644 | ||
128 | --- a/arch/powerpc/kernel/time.c | ||
129 | +++ b/arch/powerpc/kernel/time.c | ||
130 | @@ -532,25 +532,60 @@ void __init iSeries_time_init_early(void) | ||
131 | } | ||
132 | #endif /* CONFIG_PPC_ISERIES */ | ||
133 | |||
134 | -#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_PPC32) | ||
135 | -DEFINE_PER_CPU(u8, perf_event_pending); | ||
136 | +#ifdef CONFIG_PERF_EVENTS | ||
137 | |||
138 | -void set_perf_event_pending(void) | ||
139 | +/* | ||
140 | + * 64-bit uses a byte in the PACA, 32-bit uses a per-cpu variable... | ||
141 | + */ | ||
142 | +#ifdef CONFIG_PPC64 | ||
143 | +static inline unsigned long test_perf_event_pending(void) | ||
144 | { | ||
145 | - get_cpu_var(perf_event_pending) = 1; | ||
146 | - set_dec(1); | ||
147 | - put_cpu_var(perf_event_pending); | ||
148 | + unsigned long x; | ||
149 | + | ||
150 | + asm volatile("lbz %0,%1(13)" | ||
151 | + : "=r" (x) | ||
152 | + : "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
153 | + return x; | ||
154 | } | ||
155 | |||
156 | +static inline void set_perf_event_pending_flag(void) | ||
157 | +{ | ||
158 | + asm volatile("stb %0,%1(13)" : : | ||
159 | + "r" (1), | ||
160 | + "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
161 | +} | ||
162 | + | ||
163 | +static inline void clear_perf_event_pending(void) | ||
164 | +{ | ||
165 | + asm volatile("stb %0,%1(13)" : : | ||
166 | + "r" (0), | ||
167 | + "i" (offsetof(struct paca_struct, perf_event_pending))); | ||
168 | +} | ||
169 | + | ||
170 | +#else /* 32-bit */ | ||
171 | + | ||
172 | +DEFINE_PER_CPU(u8, perf_event_pending); | ||
173 | + | ||
174 | +#define set_perf_event_pending_flag() __get_cpu_var(perf_event_pending) = 1 | ||
175 | #define test_perf_event_pending() __get_cpu_var(perf_event_pending) | ||
176 | #define clear_perf_event_pending() __get_cpu_var(perf_event_pending) = 0 | ||
177 | |||
178 | -#else /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */ | ||
179 | +#endif /* 32 vs 64 bit */ | ||
180 | + | ||
181 | +void set_perf_event_pending(void) | ||
182 | +{ | ||
183 | + preempt_disable(); | ||
184 | + set_perf_event_pending_flag(); | ||
185 | + set_dec(1); | ||
186 | + preempt_enable(); | ||
187 | +} | ||
188 | + | ||
189 | +#else /* CONFIG_PERF_EVENTS */ | ||
190 | |||
191 | #define test_perf_event_pending() 0 | ||
192 | #define clear_perf_event_pending() | ||
193 | |||
194 | -#endif /* CONFIG_PERF_EVENTS && CONFIG_PPC32 */ | ||
195 | +#endif /* CONFIG_PERF_EVENTS */ | ||
196 | |||
197 | /* | ||
198 | * For iSeries shared processors, we have to let the hypervisor | ||
199 | @@ -580,10 +615,6 @@ void timer_interrupt(struct pt_regs * regs) | ||
200 | set_dec(DECREMENTER_MAX); | ||
201 | |||
202 | #ifdef CONFIG_PPC32 | ||
203 | - if (test_perf_event_pending()) { | ||
204 | - clear_perf_event_pending(); | ||
205 | - perf_event_do_pending(); | ||
206 | - } | ||
207 | if (atomic_read(&ppc_n_lost_interrupts) != 0) | ||
208 | do_IRQ(regs); | ||
209 | #endif | ||
210 | @@ -602,6 +633,11 @@ void timer_interrupt(struct pt_regs * regs) | ||
211 | |||
212 | calculate_steal_time(); | ||
213 | |||
214 | + if (test_perf_event_pending()) { | ||
215 | + clear_perf_event_pending(); | ||
216 | + perf_event_do_pending(); | ||
217 | + } | ||
218 | + | ||
219 | #ifdef CONFIG_PPC_ISERIES | ||
220 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
221 | get_lppaca()->int_dword.fields.decr_int = 0; | ||
222 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c | ||
223 | index 7cf4642..11e94de 100644 | ||
224 | --- a/arch/s390/kernel/ptrace.c | ||
225 | +++ b/arch/s390/kernel/ptrace.c | ||
226 | @@ -640,7 +640,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | ||
227 | |||
228 | asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | ||
229 | { | ||
230 | - long ret; | ||
231 | + long ret = 0; | ||
232 | |||
233 | /* Do the secure computing check first. */ | ||
234 | secure_computing(regs->gprs[2]); | ||
235 | @@ -649,7 +649,6 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | ||
236 | * The sysc_tracesys code in entry.S stored the system | ||
237 | * call number to gprs[2]. | ||
238 | */ | ||
239 | - ret = regs->gprs[2]; | ||
240 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | ||
241 | (tracehook_report_syscall_entry(regs) || | ||
242 | regs->gprs[2] >= NR_syscalls)) { | ||
243 | @@ -671,7 +670,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | ||
244 | regs->gprs[2], regs->orig_gpr2, | ||
245 | regs->gprs[3], regs->gprs[4], | ||
246 | regs->gprs[5]); | ||
247 | - return ret; | ||
248 | + return ret ?: regs->gprs[2]; | ||
249 | } | ||
250 | |||
251 | asmlinkage void do_syscall_trace_exit(struct pt_regs *regs) | ||
252 | diff --git a/arch/x86/include/asm/k8.h b/arch/x86/include/asm/k8.h | ||
253 | index f70e600..af00bd1 100644 | ||
254 | --- a/arch/x86/include/asm/k8.h | ||
255 | +++ b/arch/x86/include/asm/k8.h | ||
256 | @@ -16,11 +16,16 @@ extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn); | ||
257 | extern int k8_scan_nodes(void); | ||
258 | |||
259 | #ifdef CONFIG_K8_NB | ||
260 | +extern int num_k8_northbridges; | ||
261 | + | ||
262 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | ||
263 | { | ||
264 | return (node < num_k8_northbridges) ? k8_northbridges[node] : NULL; | ||
265 | } | ||
266 | + | ||
267 | #else | ||
268 | +#define num_k8_northbridges 0 | ||
269 | + | ||
270 | static inline struct pci_dev *node_to_k8_nb_misc(int node) | ||
271 | { | ||
272 | return NULL; | ||
273 | diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c | ||
274 | index d440123..581924b 100644 | ||
275 | --- a/arch/x86/kernel/cpu/intel_cacheinfo.c | ||
276 | +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | ||
277 | @@ -338,6 +338,10 @@ amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf) | ||
278 | (boot_cpu_data.x86_mask < 0x1))) | ||
279 | return; | ||
280 | |||
281 | + /* not in virtualized environments */ | ||
282 | + if (num_k8_northbridges == 0) | ||
283 | + return; | ||
284 | + | ||
285 | this_leaf->can_disable = true; | ||
286 | this_leaf->l3_indices = amd_calc_l3_indices(); | ||
287 | } | ||
288 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c | ||
289 | index 999c8a6..0571b72 100644 | ||
290 | --- a/arch/x86/kernel/process.c | ||
291 | +++ b/arch/x86/kernel/process.c | ||
292 | @@ -539,11 +539,13 @@ static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c) | ||
293 | * check OSVW bit for CPUs that are not affected | ||
294 | * by erratum #400 | ||
295 | */ | ||
296 | - rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); | ||
297 | - if (val >= 2) { | ||
298 | - rdmsrl(MSR_AMD64_OSVW_STATUS, val); | ||
299 | - if (!(val & BIT(1))) | ||
300 | - goto no_c1e_idle; | ||
301 | + if (cpu_has(c, X86_FEATURE_OSVW)) { | ||
302 | + rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); | ||
303 | + if (val >= 2) { | ||
304 | + rdmsrl(MSR_AMD64_OSVW_STATUS, val); | ||
305 | + if (!(val & BIT(1))) | ||
306 | + goto no_c1e_idle; | ||
307 | + } | ||
308 | } | ||
309 | return 1; | ||
310 | } | ||
311 | diff --git a/crypto/authenc.c b/crypto/authenc.c | ||
312 | index 4d6f49a..0d54de9 100644 | ||
313 | --- a/crypto/authenc.c | ||
314 | +++ b/crypto/authenc.c | ||
315 | @@ -46,6 +46,12 @@ struct authenc_request_ctx { | ||
316 | char tail[]; | ||
317 | }; | ||
318 | |||
319 | +static void authenc_request_complete(struct aead_request *req, int err) | ||
320 | +{ | ||
321 | + if (err != -EINPROGRESS) | ||
322 | + aead_request_complete(req, err); | ||
323 | +} | ||
324 | + | ||
325 | static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key, | ||
326 | unsigned int keylen) | ||
327 | { | ||
328 | @@ -142,7 +148,7 @@ static void authenc_geniv_ahash_update_done(struct crypto_async_request *areq, | ||
329 | crypto_aead_authsize(authenc), 1); | ||
330 | |||
331 | out: | ||
332 | - aead_request_complete(req, err); | ||
333 | + authenc_request_complete(req, err); | ||
334 | } | ||
335 | |||
336 | static void authenc_geniv_ahash_done(struct crypto_async_request *areq, int err) | ||
337 | @@ -208,7 +214,7 @@ static void authenc_verify_ahash_update_done(struct crypto_async_request *areq, | ||
338 | err = crypto_ablkcipher_decrypt(abreq); | ||
339 | |||
340 | out: | ||
341 | - aead_request_complete(req, err); | ||
342 | + authenc_request_complete(req, err); | ||
343 | } | ||
344 | |||
345 | static void authenc_verify_ahash_done(struct crypto_async_request *areq, | ||
346 | @@ -245,7 +251,7 @@ static void authenc_verify_ahash_done(struct crypto_async_request *areq, | ||
347 | err = crypto_ablkcipher_decrypt(abreq); | ||
348 | |||
349 | out: | ||
350 | - aead_request_complete(req, err); | ||
351 | + authenc_request_complete(req, err); | ||
352 | } | ||
353 | |||
354 | static u8 *crypto_authenc_ahash_fb(struct aead_request *req, unsigned int flags) | ||
355 | @@ -379,7 +385,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | ||
356 | err = crypto_authenc_genicv(areq, iv, 0); | ||
357 | } | ||
358 | |||
359 | - aead_request_complete(areq, err); | ||
360 | + authenc_request_complete(areq, err); | ||
361 | } | ||
362 | |||
363 | static int crypto_authenc_encrypt(struct aead_request *req) | ||
364 | @@ -418,7 +424,7 @@ static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, | ||
365 | err = crypto_authenc_genicv(areq, greq->giv, 0); | ||
366 | } | ||
367 | |||
368 | - aead_request_complete(areq, err); | ||
369 | + authenc_request_complete(areq, err); | ||
370 | } | ||
371 | |||
372 | static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) | ||
373 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c | ||
374 | index 7c85265..9ed9292 100644 | ||
375 | --- a/drivers/acpi/sleep.c | ||
376 | +++ b/drivers/acpi/sleep.c | ||
377 | @@ -475,101 +475,13 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | ||
378 | }, | ||
379 | { | ||
380 | .callback = init_set_sci_en_on_resume, | ||
381 | - .ident = "Lenovo ThinkPad X201", | ||
382 | + .ident = "Lenovo ThinkPad X201[s]", | ||
383 | .matches = { | ||
384 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
385 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
386 | }, | ||
387 | }, | ||
388 | { | ||
389 | - .callback = init_set_sci_en_on_resume, | ||
390 | - .ident = "Lenovo ThinkPad X201", | ||
391 | - .matches = { | ||
392 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
393 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
394 | - }, | ||
395 | - }, | ||
396 | - { | ||
397 | - .callback = init_set_sci_en_on_resume, | ||
398 | - .ident = "Lenovo ThinkPad T410", | ||
399 | - .matches = { | ||
400 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
401 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
402 | - }, | ||
403 | - }, | ||
404 | - { | ||
405 | - .callback = init_set_sci_en_on_resume, | ||
406 | - .ident = "Lenovo ThinkPad T510", | ||
407 | - .matches = { | ||
408 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
409 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
410 | - }, | ||
411 | - }, | ||
412 | - { | ||
413 | - .callback = init_set_sci_en_on_resume, | ||
414 | - .ident = "Lenovo ThinkPad W510", | ||
415 | - .matches = { | ||
416 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
417 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
418 | - }, | ||
419 | - }, | ||
420 | - { | ||
421 | - .callback = init_set_sci_en_on_resume, | ||
422 | - .ident = "Lenovo ThinkPad X201", | ||
423 | - .matches = { | ||
424 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
425 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
426 | - }, | ||
427 | - }, | ||
428 | - { | ||
429 | - .callback = init_set_sci_en_on_resume, | ||
430 | - .ident = "Lenovo ThinkPad X201", | ||
431 | - .matches = { | ||
432 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
433 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
434 | - }, | ||
435 | - }, | ||
436 | - { | ||
437 | - .callback = init_set_sci_en_on_resume, | ||
438 | - .ident = "Lenovo ThinkPad T410", | ||
439 | - .matches = { | ||
440 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
441 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
442 | - }, | ||
443 | - }, | ||
444 | - { | ||
445 | - .callback = init_set_sci_en_on_resume, | ||
446 | - .ident = "Lenovo ThinkPad T510", | ||
447 | - .matches = { | ||
448 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
449 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
450 | - }, | ||
451 | - }, | ||
452 | - { | ||
453 | - .callback = init_set_sci_en_on_resume, | ||
454 | - .ident = "Lenovo ThinkPad W510", | ||
455 | - .matches = { | ||
456 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
457 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
458 | - }, | ||
459 | - }, | ||
460 | - { | ||
461 | - .callback = init_set_sci_en_on_resume, | ||
462 | - .ident = "Lenovo ThinkPad X201", | ||
463 | - .matches = { | ||
464 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
465 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
466 | - }, | ||
467 | - }, | ||
468 | - { | ||
469 | - .callback = init_set_sci_en_on_resume, | ||
470 | - .ident = "Lenovo ThinkPad X201", | ||
471 | - .matches = { | ||
472 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
473 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
474 | - }, | ||
475 | - }, | ||
476 | - { | ||
477 | .callback = init_old_suspend_ordering, | ||
478 | .ident = "Panasonic CF51-2L", | ||
479 | .matches = { | ||
480 | diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c | ||
481 | index 76253cf..9af6766 100644 | ||
482 | --- a/drivers/char/tty_io.c | ||
483 | +++ b/drivers/char/tty_io.c | ||
484 | @@ -1875,6 +1875,7 @@ got_driver: | ||
485 | */ | ||
486 | if (filp->f_op == &hung_up_tty_fops) | ||
487 | filp->f_op = &tty_fops; | ||
488 | + unlock_kernel(); | ||
489 | goto retry_open; | ||
490 | } | ||
491 | unlock_kernel(); | ||
492 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
493 | index cf4cb3e..4746bfe 100644 | ||
494 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
495 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
496 | @@ -79,14 +79,14 @@ const static struct intel_device_info intel_i915g_info = { | ||
497 | .is_i915g = 1, .is_i9xx = 1, .cursor_needs_physical = 1, | ||
498 | }; | ||
499 | const static struct intel_device_info intel_i915gm_info = { | ||
500 | - .is_i9xx = 1, .is_mobile = 1, .has_fbc = 1, | ||
501 | + .is_i9xx = 1, .is_mobile = 1, | ||
502 | .cursor_needs_physical = 1, | ||
503 | }; | ||
504 | const static struct intel_device_info intel_i945g_info = { | ||
505 | .is_i9xx = 1, .has_hotplug = 1, .cursor_needs_physical = 1, | ||
506 | }; | ||
507 | const static struct intel_device_info intel_i945gm_info = { | ||
508 | - .is_i945gm = 1, .is_i9xx = 1, .is_mobile = 1, .has_fbc = 1, | ||
509 | + .is_i945gm = 1, .is_i9xx = 1, .is_mobile = 1, | ||
510 | .has_hotplug = 1, .cursor_needs_physical = 1, | ||
511 | }; | ||
512 | |||
513 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
514 | index 16ce3ba..0b33757 100644 | ||
515 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
516 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
517 | @@ -206,11 +206,14 @@ typedef struct drm_i915_private { | ||
518 | |||
519 | drm_dma_handle_t *status_page_dmah; | ||
520 | void *hw_status_page; | ||
521 | + void *seqno_page; | ||
522 | dma_addr_t dma_status_page; | ||
523 | uint32_t counter; | ||
524 | unsigned int status_gfx_addr; | ||
525 | + unsigned int seqno_gfx_addr; | ||
526 | drm_local_map_t hws_map; | ||
527 | struct drm_gem_object *hws_obj; | ||
528 | + struct drm_gem_object *seqno_obj; | ||
529 | struct drm_gem_object *pwrctx; | ||
530 | |||
531 | struct resource mch_res; | ||
532 | @@ -1090,6 +1093,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); | ||
533 | |||
534 | #define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \ | ||
535 | IS_GEN6(dev)) | ||
536 | +#define HAS_PIPE_CONTROL(dev) (IS_IRONLAKE(dev) || IS_GEN6(dev)) | ||
537 | |||
538 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) | ||
539 | |||
540 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
541 | index 6458400..c00c978 100644 | ||
542 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
543 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
544 | @@ -1559,6 +1559,13 @@ i915_gem_object_move_to_inactive(struct drm_gem_object *obj) | ||
545 | i915_verify_inactive(dev, __FILE__, __LINE__); | ||
546 | } | ||
547 | |||
548 | +#define PIPE_CONTROL_FLUSH(addr) \ | ||
549 | + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \ | ||
550 | + PIPE_CONTROL_DEPTH_STALL); \ | ||
551 | + OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \ | ||
552 | + OUT_RING(0); \ | ||
553 | + OUT_RING(0); \ | ||
554 | + | ||
555 | /** | ||
556 | * Creates a new sequence number, emitting a write of it to the status page | ||
557 | * plus an interrupt, which will trigger i915_user_interrupt_handler. | ||
558 | @@ -1593,13 +1600,47 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv, | ||
559 | if (dev_priv->mm.next_gem_seqno == 0) | ||
560 | dev_priv->mm.next_gem_seqno++; | ||
561 | |||
562 | - BEGIN_LP_RING(4); | ||
563 | - OUT_RING(MI_STORE_DWORD_INDEX); | ||
564 | - OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); | ||
565 | - OUT_RING(seqno); | ||
566 | + if (HAS_PIPE_CONTROL(dev)) { | ||
567 | + u32 scratch_addr = dev_priv->seqno_gfx_addr + 128; | ||
568 | |||
569 | - OUT_RING(MI_USER_INTERRUPT); | ||
570 | - ADVANCE_LP_RING(); | ||
571 | + /* | ||
572 | + * Workaround qword write incoherence by flushing the | ||
573 | + * PIPE_NOTIFY buffers out to memory before requesting | ||
574 | + * an interrupt. | ||
575 | + */ | ||
576 | + BEGIN_LP_RING(32); | ||
577 | + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | | ||
578 | + PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH); | ||
579 | + OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT); | ||
580 | + OUT_RING(seqno); | ||
581 | + OUT_RING(0); | ||
582 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
583 | + scratch_addr += 128; /* write to separate cachelines */ | ||
584 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
585 | + scratch_addr += 128; | ||
586 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
587 | + scratch_addr += 128; | ||
588 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
589 | + scratch_addr += 128; | ||
590 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
591 | + scratch_addr += 128; | ||
592 | + PIPE_CONTROL_FLUSH(scratch_addr); | ||
593 | + OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | | ||
594 | + PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH | | ||
595 | + PIPE_CONTROL_NOTIFY); | ||
596 | + OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT); | ||
597 | + OUT_RING(seqno); | ||
598 | + OUT_RING(0); | ||
599 | + ADVANCE_LP_RING(); | ||
600 | + } else { | ||
601 | + BEGIN_LP_RING(4); | ||
602 | + OUT_RING(MI_STORE_DWORD_INDEX); | ||
603 | + OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); | ||
604 | + OUT_RING(seqno); | ||
605 | + | ||
606 | + OUT_RING(MI_USER_INTERRUPT); | ||
607 | + ADVANCE_LP_RING(); | ||
608 | + } | ||
609 | |||
610 | DRM_DEBUG_DRIVER("%d\n", seqno); | ||
611 | |||
612 | @@ -1744,7 +1785,10 @@ i915_get_gem_seqno(struct drm_device *dev) | ||
613 | { | ||
614 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
615 | |||
616 | - return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX); | ||
617 | + if (HAS_PIPE_CONTROL(dev)) | ||
618 | + return ((volatile u32 *)(dev_priv->seqno_page))[0]; | ||
619 | + else | ||
620 | + return READ_HWSP(dev_priv, I915_GEM_HWS_INDEX); | ||
621 | } | ||
622 | |||
623 | /** | ||
624 | @@ -4576,6 +4620,49 @@ i915_gem_idle(struct drm_device *dev) | ||
625 | return 0; | ||
626 | } | ||
627 | |||
628 | +/* | ||
629 | + * 965+ support PIPE_CONTROL commands, which provide finer grained control | ||
630 | + * over cache flushing. | ||
631 | + */ | ||
632 | +static int | ||
633 | +i915_gem_init_pipe_control(struct drm_device *dev) | ||
634 | +{ | ||
635 | + drm_i915_private_t *dev_priv = dev->dev_private; | ||
636 | + struct drm_gem_object *obj; | ||
637 | + struct drm_i915_gem_object *obj_priv; | ||
638 | + int ret; | ||
639 | + | ||
640 | + obj = drm_gem_object_alloc(dev, 4096); | ||
641 | + if (obj == NULL) { | ||
642 | + DRM_ERROR("Failed to allocate seqno page\n"); | ||
643 | + ret = -ENOMEM; | ||
644 | + goto err; | ||
645 | + } | ||
646 | + obj_priv = obj->driver_private; | ||
647 | + obj_priv->agp_type = AGP_USER_CACHED_MEMORY; | ||
648 | + | ||
649 | + ret = i915_gem_object_pin(obj, 4096); | ||
650 | + if (ret) | ||
651 | + goto err_unref; | ||
652 | + | ||
653 | + dev_priv->seqno_gfx_addr = obj_priv->gtt_offset; | ||
654 | + dev_priv->seqno_page = kmap(obj_priv->pages[0]); | ||
655 | + if (dev_priv->seqno_page == NULL) | ||
656 | + goto err_unpin; | ||
657 | + | ||
658 | + dev_priv->seqno_obj = obj; | ||
659 | + memset(dev_priv->seqno_page, 0, PAGE_SIZE); | ||
660 | + | ||
661 | + return 0; | ||
662 | + | ||
663 | +err_unpin: | ||
664 | + i915_gem_object_unpin(obj); | ||
665 | +err_unref: | ||
666 | + drm_gem_object_unreference(obj); | ||
667 | +err: | ||
668 | + return ret; | ||
669 | +} | ||
670 | + | ||
671 | static int | ||
672 | i915_gem_init_hws(struct drm_device *dev) | ||
673 | { | ||
674 | @@ -4593,7 +4680,8 @@ i915_gem_init_hws(struct drm_device *dev) | ||
675 | obj = drm_gem_object_alloc(dev, 4096); | ||
676 | if (obj == NULL) { | ||
677 | DRM_ERROR("Failed to allocate status page\n"); | ||
678 | - return -ENOMEM; | ||
679 | + ret = -ENOMEM; | ||
680 | + goto err; | ||
681 | } | ||
682 | obj_priv = obj->driver_private; | ||
683 | obj_priv->agp_type = AGP_USER_CACHED_MEMORY; | ||
684 | @@ -4601,7 +4689,7 @@ i915_gem_init_hws(struct drm_device *dev) | ||
685 | ret = i915_gem_object_pin(obj, 4096); | ||
686 | if (ret != 0) { | ||
687 | drm_gem_object_unreference(obj); | ||
688 | - return ret; | ||
689 | + goto err_unref; | ||
690 | } | ||
691 | |||
692 | dev_priv->status_gfx_addr = obj_priv->gtt_offset; | ||
693 | @@ -4610,10 +4698,16 @@ i915_gem_init_hws(struct drm_device *dev) | ||
694 | if (dev_priv->hw_status_page == NULL) { | ||
695 | DRM_ERROR("Failed to map status page.\n"); | ||
696 | memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); | ||
697 | - i915_gem_object_unpin(obj); | ||
698 | - drm_gem_object_unreference(obj); | ||
699 | - return -EINVAL; | ||
700 | + ret = -EINVAL; | ||
701 | + goto err_unpin; | ||
702 | } | ||
703 | + | ||
704 | + if (HAS_PIPE_CONTROL(dev)) { | ||
705 | + ret = i915_gem_init_pipe_control(dev); | ||
706 | + if (ret) | ||
707 | + goto err_unpin; | ||
708 | + } | ||
709 | + | ||
710 | dev_priv->hws_obj = obj; | ||
711 | memset(dev_priv->hw_status_page, 0, PAGE_SIZE); | ||
712 | I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr); | ||
713 | @@ -4621,6 +4715,30 @@ i915_gem_init_hws(struct drm_device *dev) | ||
714 | DRM_DEBUG_DRIVER("hws offset: 0x%08x\n", dev_priv->status_gfx_addr); | ||
715 | |||
716 | return 0; | ||
717 | + | ||
718 | +err_unpin: | ||
719 | + i915_gem_object_unpin(obj); | ||
720 | +err_unref: | ||
721 | + drm_gem_object_unreference(obj); | ||
722 | +err: | ||
723 | + return 0; | ||
724 | +} | ||
725 | + | ||
726 | +static void | ||
727 | +i915_gem_cleanup_pipe_control(struct drm_device *dev) | ||
728 | +{ | ||
729 | + drm_i915_private_t *dev_priv = dev->dev_private; | ||
730 | + struct drm_gem_object *obj; | ||
731 | + struct drm_i915_gem_object *obj_priv; | ||
732 | + | ||
733 | + obj = dev_priv->seqno_obj; | ||
734 | + obj_priv = obj->driver_private; | ||
735 | + kunmap(obj_priv->pages[0]); | ||
736 | + i915_gem_object_unpin(obj); | ||
737 | + drm_gem_object_unreference(obj); | ||
738 | + dev_priv->seqno_obj = NULL; | ||
739 | + | ||
740 | + dev_priv->seqno_page = NULL; | ||
741 | } | ||
742 | |||
743 | static void | ||
744 | @@ -4644,6 +4762,9 @@ i915_gem_cleanup_hws(struct drm_device *dev) | ||
745 | memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); | ||
746 | dev_priv->hw_status_page = NULL; | ||
747 | |||
748 | + if (HAS_PIPE_CONTROL(dev)) | ||
749 | + i915_gem_cleanup_pipe_control(dev); | ||
750 | + | ||
751 | /* Write high address into HWS_PGA when disabling. */ | ||
752 | I915_WRITE(HWS_PGA, 0x1ffff000); | ||
753 | } | ||
754 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
755 | index 032f667..d6466d5 100644 | ||
756 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
757 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
758 | @@ -297,7 +297,7 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev) | ||
759 | READ_BREADCRUMB(dev_priv); | ||
760 | } | ||
761 | |||
762 | - if (gt_iir & GT_USER_INTERRUPT) { | ||
763 | + if (gt_iir & GT_PIPE_NOTIFY) { | ||
764 | u32 seqno = i915_get_gem_seqno(dev); | ||
765 | dev_priv->mm.irq_gem_seqno = seqno; | ||
766 | trace_i915_gem_request_complete(dev, seqno); | ||
767 | @@ -738,7 +738,7 @@ void i915_user_irq_get(struct drm_device *dev) | ||
768 | spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); | ||
769 | if (dev->irq_enabled && (++dev_priv->user_irq_refcount == 1)) { | ||
770 | if (HAS_PCH_SPLIT(dev)) | ||
771 | - ironlake_enable_graphics_irq(dev_priv, GT_USER_INTERRUPT); | ||
772 | + ironlake_enable_graphics_irq(dev_priv, GT_PIPE_NOTIFY); | ||
773 | else | ||
774 | i915_enable_irq(dev_priv, I915_USER_INTERRUPT); | ||
775 | } | ||
776 | @@ -754,7 +754,7 @@ void i915_user_irq_put(struct drm_device *dev) | ||
777 | BUG_ON(dev->irq_enabled && dev_priv->user_irq_refcount <= 0); | ||
778 | if (dev->irq_enabled && (--dev_priv->user_irq_refcount == 0)) { | ||
779 | if (HAS_PCH_SPLIT(dev)) | ||
780 | - ironlake_disable_graphics_irq(dev_priv, GT_USER_INTERRUPT); | ||
781 | + ironlake_disable_graphics_irq(dev_priv, GT_PIPE_NOTIFY); | ||
782 | else | ||
783 | i915_disable_irq(dev_priv, I915_USER_INTERRUPT); | ||
784 | } | ||
785 | @@ -1034,7 +1034,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | ||
786 | /* enable kind of interrupts always enabled */ | ||
787 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | | ||
788 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; | ||
789 | - u32 render_mask = GT_USER_INTERRUPT; | ||
790 | + u32 render_mask = GT_PIPE_NOTIFY; | ||
791 | u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | | ||
792 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; | ||
793 | |||
794 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
795 | index fd95bdf..30a2322 100644 | ||
796 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
797 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
798 | @@ -210,6 +210,16 @@ | ||
799 | #define ASYNC_FLIP (1<<22) | ||
800 | #define DISPLAY_PLANE_A (0<<20) | ||
801 | #define DISPLAY_PLANE_B (1<<20) | ||
802 | +#define GFX_OP_PIPE_CONTROL ((0x3<<29)|(0x3<<27)|(0x2<<24)|2) | ||
803 | +#define PIPE_CONTROL_QW_WRITE (1<<14) | ||
804 | +#define PIPE_CONTROL_DEPTH_STALL (1<<13) | ||
805 | +#define PIPE_CONTROL_WC_FLUSH (1<<12) | ||
806 | +#define PIPE_CONTROL_IS_FLUSH (1<<11) /* MBZ on Ironlake */ | ||
807 | +#define PIPE_CONTROL_TC_FLUSH (1<<10) /* GM45+ only */ | ||
808 | +#define PIPE_CONTROL_ISP_DIS (1<<9) | ||
809 | +#define PIPE_CONTROL_NOTIFY (1<<8) | ||
810 | +#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */ | ||
811 | +#define PIPE_CONTROL_STALL_EN (1<<1) /* in addr word, Ironlake+ only */ | ||
812 | |||
813 | /* | ||
814 | * Fence registers | ||
815 | @@ -2111,6 +2121,7 @@ | ||
816 | #define DEIER 0x4400c | ||
817 | |||
818 | /* GT interrupt */ | ||
819 | +#define GT_PIPE_NOTIFY (1 << 4) | ||
820 | #define GT_SYNC_STATUS (1 << 2) | ||
821 | #define GT_USER_INTERRUPT (1 << 0) | ||
822 | |||
823 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
824 | index 4b2458d..3f00902 100644 | ||
825 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
826 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
827 | @@ -4683,7 +4683,7 @@ static void intel_init_display(struct drm_device *dev) | ||
828 | dev_priv->display.fbc_enabled = g4x_fbc_enabled; | ||
829 | dev_priv->display.enable_fbc = g4x_enable_fbc; | ||
830 | dev_priv->display.disable_fbc = g4x_disable_fbc; | ||
831 | - } else if (IS_I965GM(dev) || IS_I945GM(dev) || IS_I915GM(dev)) { | ||
832 | + } else if (IS_I965GM(dev)) { | ||
833 | dev_priv->display.fbc_enabled = i8xx_fbc_enabled; | ||
834 | dev_priv->display.enable_fbc = i8xx_enable_fbc; | ||
835 | dev_priv->display.disable_fbc = i8xx_disable_fbc; | ||
836 | diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c | ||
837 | index be475e8..f16d60f 100644 | ||
838 | --- a/drivers/hwmon/hp_accel.c | ||
839 | +++ b/drivers/hwmon/hp_accel.c | ||
840 | @@ -324,8 +324,8 @@ static int lis3lv02d_remove(struct acpi_device *device, int type) | ||
841 | lis3lv02d_joystick_disable(); | ||
842 | lis3lv02d_poweroff(&lis3_dev); | ||
843 | |||
844 | - flush_work(&hpled_led.work); | ||
845 | led_classdev_unregister(&hpled_led.led_classdev); | ||
846 | + flush_work(&hpled_led.work); | ||
847 | |||
848 | return lis3lv02d_remove_fs(&lis3_dev); | ||
849 | } | ||
850 | diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c | ||
851 | index 8072128..ee337df 100644 | ||
852 | --- a/drivers/mmc/host/atmel-mci.c | ||
853 | +++ b/drivers/mmc/host/atmel-mci.c | ||
854 | @@ -568,9 +568,10 @@ static void atmci_dma_cleanup(struct atmel_mci *host) | ||
855 | { | ||
856 | struct mmc_data *data = host->data; | ||
857 | |||
858 | - dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, | ||
859 | - ((data->flags & MMC_DATA_WRITE) | ||
860 | - ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | ||
861 | + if (data) | ||
862 | + dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, | ||
863 | + ((data->flags & MMC_DATA_WRITE) | ||
864 | + ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | ||
865 | } | ||
866 | |||
867 | static void atmci_stop_dma(struct atmel_mci *host) | ||
868 | @@ -1098,8 +1099,8 @@ static void atmci_command_complete(struct atmel_mci *host, | ||
869 | "command error: status=0x%08x\n", status); | ||
870 | |||
871 | if (cmd->data) { | ||
872 | - host->data = NULL; | ||
873 | atmci_stop_dma(host); | ||
874 | + host->data = NULL; | ||
875 | mci_writel(host, IDR, MCI_NOTBUSY | ||
876 | | MCI_TXRDY | MCI_RXRDY | ||
877 | | ATMCI_DATA_ERROR_FLAGS); | ||
878 | @@ -1292,6 +1293,7 @@ static void atmci_tasklet_func(unsigned long priv) | ||
879 | } else { | ||
880 | data->bytes_xfered = data->blocks * data->blksz; | ||
881 | data->error = 0; | ||
882 | + mci_writel(host, IDR, ATMCI_DATA_ERROR_FLAGS); | ||
883 | } | ||
884 | |||
885 | if (!data->stop) { | ||
886 | @@ -1750,13 +1752,13 @@ static int __init atmci_probe(struct platform_device *pdev) | ||
887 | ret = -ENODEV; | ||
888 | if (pdata->slot[0].bus_width) { | ||
889 | ret = atmci_init_slot(host, &pdata->slot[0], | ||
890 | - MCI_SDCSEL_SLOT_A, 0); | ||
891 | + 0, MCI_SDCSEL_SLOT_A); | ||
892 | if (!ret) | ||
893 | nr_slots++; | ||
894 | } | ||
895 | if (pdata->slot[1].bus_width) { | ||
896 | ret = atmci_init_slot(host, &pdata->slot[1], | ||
897 | - MCI_SDCSEL_SLOT_B, 1); | ||
898 | + 1, MCI_SDCSEL_SLOT_B); | ||
899 | if (!ret) | ||
900 | nr_slots++; | ||
901 | } | ||
902 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c | ||
903 | index c3ce920..8b7c267 100644 | ||
904 | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||
905 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||
906 | @@ -2244,7 +2244,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) | ||
907 | if (ATH_TXQ_SETUP(sc, i)) { | ||
908 | txq = &sc->tx.txq[i]; | ||
909 | |||
910 | - spin_lock_bh(&txq->axq_lock); | ||
911 | + spin_lock(&txq->axq_lock); | ||
912 | |||
913 | list_for_each_entry_safe(ac, | ||
914 | ac_tmp, &txq->axq_acq, list) { | ||
915 | @@ -2265,7 +2265,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) | ||
916 | } | ||
917 | } | ||
918 | |||
919 | - spin_unlock_bh(&txq->axq_lock); | ||
920 | + spin_unlock(&txq->axq_lock); | ||
921 | } | ||
922 | } | ||
923 | } | ||
924 | diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c | ||
925 | index 3b4c5a4..82c1d2e 100644 | ||
926 | --- a/drivers/net/wireless/iwlwifi/iwl-4965.c | ||
927 | +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | ||
928 | @@ -581,6 +581,11 @@ static int iwl4965_alive_notify(struct iwl_priv *priv) | ||
929 | |||
930 | iwl4965_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0); | ||
931 | |||
932 | + /* make sure all queue are not stopped */ | ||
933 | + memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped)); | ||
934 | + for (i = 0; i < 4; i++) | ||
935 | + atomic_set(&priv->queue_stop_count[i], 0); | ||
936 | + | ||
937 | /* reset to 0 to enable all the queue first */ | ||
938 | priv->txq_ctx_active_msk = 0; | ||
939 | /* Map each Tx/cmd queue to its corresponding fifo */ | ||
940 | diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c | ||
941 | index c610e5f..f7d41c7 100644 | ||
942 | --- a/drivers/net/wireless/iwlwifi/iwl-5000.c | ||
943 | +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | ||
944 | @@ -657,6 +657,11 @@ int iwl5000_alive_notify(struct iwl_priv *priv) | ||
945 | |||
946 | iwl5000_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0); | ||
947 | |||
948 | + /* make sure all queue are not stopped */ | ||
949 | + memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped)); | ||
950 | + for (i = 0; i < 4; i++) | ||
951 | + atomic_set(&priv->queue_stop_count[i], 0); | ||
952 | + | ||
953 | /* reset to 0 to enable all the queue first */ | ||
954 | priv->txq_ctx_active_msk = 0; | ||
955 | /* map qos queues to fifos one-to-one */ | ||
956 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
957 | index b93e491..3534d86 100644 | ||
958 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
959 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
960 | @@ -298,10 +298,23 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | ||
961 | struct iwl_lq_sta *lq_data, u8 tid, | ||
962 | struct ieee80211_sta *sta) | ||
963 | { | ||
964 | + int ret; | ||
965 | + | ||
966 | if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) { | ||
967 | IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", | ||
968 | sta->addr, tid); | ||
969 | - ieee80211_start_tx_ba_session(sta, tid); | ||
970 | + ret = ieee80211_start_tx_ba_session(sta, tid); | ||
971 | + if (ret == -EAGAIN) { | ||
972 | + /* | ||
973 | + * driver and mac80211 is out of sync | ||
974 | + * this might be cause by reloading firmware | ||
975 | + * stop the tx ba session here | ||
976 | + */ | ||
977 | + IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n", | ||
978 | + tid); | ||
979 | + ret = ieee80211_stop_tx_ba_session(sta, tid, | ||
980 | + WLAN_BACK_INITIATOR); | ||
981 | + } | ||
982 | } | ||
983 | } | ||
984 | |||
985 | diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
986 | index 88470fb..e0ce039 100644 | ||
987 | --- a/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
988 | +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
989 | @@ -821,8 +821,10 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | ||
990 | hdr->seq_ctrl |= cpu_to_le16(seq_number); | ||
991 | seq_number += 0x10; | ||
992 | /* aggregation is on for this <sta,tid> */ | ||
993 | - if (info->flags & IEEE80211_TX_CTL_AMPDU) | ||
994 | + if (info->flags & IEEE80211_TX_CTL_AMPDU && | ||
995 | + priv->stations[sta_id].tid[tid].agg.state == IWL_AGG_ON) { | ||
996 | txq_id = priv->stations[sta_id].tid[tid].agg.txq_id; | ||
997 | + } | ||
998 | } | ||
999 | |||
1000 | txq = &priv->txq[txq_id]; | ||
1001 | @@ -1347,7 +1349,7 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) | ||
1002 | { | ||
1003 | int tx_fifo_id, txq_id, sta_id, ssn = -1; | ||
1004 | struct iwl_tid_data *tid_data; | ||
1005 | - int ret, write_ptr, read_ptr; | ||
1006 | + int write_ptr, read_ptr; | ||
1007 | unsigned long flags; | ||
1008 | |||
1009 | if (!ra) { | ||
1010 | @@ -1399,13 +1401,17 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) | ||
1011 | priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF; | ||
1012 | |||
1013 | spin_lock_irqsave(&priv->lock, flags); | ||
1014 | - ret = priv->cfg->ops->lib->txq_agg_disable(priv, txq_id, ssn, | ||
1015 | + /* | ||
1016 | + * the only reason this call can fail is queue number out of range, | ||
1017 | + * which can happen if uCode is reloaded and all the station | ||
1018 | + * information are lost. if it is outside the range, there is no need | ||
1019 | + * to deactivate the uCode queue, just return "success" to allow | ||
1020 | + * mac80211 to clean up it own data. | ||
1021 | + */ | ||
1022 | + priv->cfg->ops->lib->txq_agg_disable(priv, txq_id, ssn, | ||
1023 | tx_fifo_id); | ||
1024 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1025 | |||
1026 | - if (ret) | ||
1027 | - return ret; | ||
1028 | - | ||
1029 | ieee80211_stop_tx_ba_cb_irqsafe(priv->vif, ra, tid); | ||
1030 | |||
1031 | return 0; | ||
1032 | diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c | ||
1033 | index 5905936..e4bd795 100644 | ||
1034 | --- a/drivers/s390/block/dasd.c | ||
1035 | +++ b/drivers/s390/block/dasd.c | ||
1036 | @@ -35,6 +35,9 @@ | ||
1037 | */ | ||
1038 | #define DASD_CHANQ_MAX_SIZE 4 | ||
1039 | |||
1040 | +#define DASD_SLEEPON_START_TAG (void *) 1 | ||
1041 | +#define DASD_SLEEPON_END_TAG (void *) 2 | ||
1042 | + | ||
1043 | /* | ||
1044 | * SECTION: exported variables of dasd.c | ||
1045 | */ | ||
1046 | @@ -1460,7 +1463,10 @@ void dasd_add_request_tail(struct dasd_ccw_req *cqr) | ||
1047 | */ | ||
1048 | static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) | ||
1049 | { | ||
1050 | - wake_up((wait_queue_head_t *) data); | ||
1051 | + spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); | ||
1052 | + cqr->callback_data = DASD_SLEEPON_END_TAG; | ||
1053 | + spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); | ||
1054 | + wake_up(&generic_waitq); | ||
1055 | } | ||
1056 | |||
1057 | static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | ||
1058 | @@ -1470,10 +1476,7 @@ static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | ||
1059 | |||
1060 | device = cqr->startdev; | ||
1061 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | ||
1062 | - rc = ((cqr->status == DASD_CQR_DONE || | ||
1063 | - cqr->status == DASD_CQR_NEED_ERP || | ||
1064 | - cqr->status == DASD_CQR_TERMINATED) && | ||
1065 | - list_empty(&cqr->devlist)); | ||
1066 | + rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); | ||
1067 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | ||
1068 | return rc; | ||
1069 | } | ||
1070 | @@ -1561,7 +1564,7 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible) | ||
1071 | wait_event(generic_waitq, !(device->stopped)); | ||
1072 | |||
1073 | cqr->callback = dasd_wakeup_cb; | ||
1074 | - cqr->callback_data = (void *) &generic_waitq; | ||
1075 | + cqr->callback_data = DASD_SLEEPON_START_TAG; | ||
1076 | dasd_add_request_tail(cqr); | ||
1077 | if (interruptible) { | ||
1078 | rc = wait_event_interruptible( | ||
1079 | @@ -1640,7 +1643,7 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) | ||
1080 | } | ||
1081 | |||
1082 | cqr->callback = dasd_wakeup_cb; | ||
1083 | - cqr->callback_data = (void *) &generic_waitq; | ||
1084 | + cqr->callback_data = DASD_SLEEPON_START_TAG; | ||
1085 | cqr->status = DASD_CQR_QUEUED; | ||
1086 | list_add(&cqr->devlist, &device->ccw_queue); | ||
1087 | |||
1088 | diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c | ||
1089 | index d00fcf8..fd6b135 100644 | ||
1090 | --- a/drivers/serial/imx.c | ||
1091 | +++ b/drivers/serial/imx.c | ||
1092 | @@ -119,7 +119,8 @@ | ||
1093 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ | ||
1094 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ | ||
1095 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ | ||
1096 | -#define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */ | ||
1097 | +#define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */ | ||
1098 | +#define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */ | ||
1099 | #define UCR4_INVR (1<<9) /* Inverted infrared reception */ | ||
1100 | #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ | ||
1101 | #define UCR4_WKEN (1<<7) /* Wake interrupt enable */ | ||
1102 | @@ -590,6 +591,9 @@ static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) | ||
1103 | return 0; | ||
1104 | } | ||
1105 | |||
1106 | +/* half the RX buffer size */ | ||
1107 | +#define CTSTL 16 | ||
1108 | + | ||
1109 | static int imx_startup(struct uart_port *port) | ||
1110 | { | ||
1111 | struct imx_port *sport = (struct imx_port *)port; | ||
1112 | @@ -606,6 +610,10 @@ static int imx_startup(struct uart_port *port) | ||
1113 | if (USE_IRDA(sport)) | ||
1114 | temp |= UCR4_IRSC; | ||
1115 | |||
1116 | + /* set the trigger level for CTS */ | ||
1117 | + temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF); | ||
1118 | + temp |= CTSTL<< UCR4_CTSTL_SHF; | ||
1119 | + | ||
1120 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); | ||
1121 | |||
1122 | if (USE_IRDA(sport)) { | ||
1123 | diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c | ||
1124 | index 2549c53..6c8b6b6 100644 | ||
1125 | --- a/drivers/video/bfin-t350mcqb-fb.c | ||
1126 | +++ b/drivers/video/bfin-t350mcqb-fb.c | ||
1127 | @@ -515,9 +515,9 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) | ||
1128 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; | ||
1129 | fbinfo->flags = FBINFO_FLAG_DEFAULT; | ||
1130 | |||
1131 | - info->fb_buffer = | ||
1132 | - dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle, | ||
1133 | - GFP_KERNEL); | ||
1134 | + info->fb_buffer = dma_alloc_coherent(NULL, fbinfo->fix.smem_len + | ||
1135 | + ACTIVE_VIDEO_MEM_OFFSET, | ||
1136 | + &info->dma_handle, GFP_KERNEL); | ||
1137 | |||
1138 | if (NULL == info->fb_buffer) { | ||
1139 | printk(KERN_ERR DRIVER_NAME | ||
1140 | @@ -587,8 +587,8 @@ out7: | ||
1141 | out6: | ||
1142 | fb_dealloc_cmap(&fbinfo->cmap); | ||
1143 | out4: | ||
1144 | - dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | ||
1145 | - info->dma_handle); | ||
1146 | + dma_free_coherent(NULL, fbinfo->fix.smem_len + ACTIVE_VIDEO_MEM_OFFSET, | ||
1147 | + info->fb_buffer, info->dma_handle); | ||
1148 | out3: | ||
1149 | framebuffer_release(fbinfo); | ||
1150 | out2: | ||
1151 | @@ -611,8 +611,9 @@ static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev) | ||
1152 | free_irq(info->irq, info); | ||
1153 | |||
1154 | if (info->fb_buffer != NULL) | ||
1155 | - dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | ||
1156 | - info->dma_handle); | ||
1157 | + dma_free_coherent(NULL, fbinfo->fix.smem_len + | ||
1158 | + ACTIVE_VIDEO_MEM_OFFSET, info->fb_buffer, | ||
1159 | + info->dma_handle); | ||
1160 | |||
1161 | fb_dealloc_cmap(&fbinfo->cmap); | ||
1162 | |||
1163 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
1164 | index 645a179..2c6ee6a 100644 | ||
1165 | --- a/fs/btrfs/ioctl.c | ||
1166 | +++ b/fs/btrfs/ioctl.c | ||
1167 | @@ -964,12 +964,17 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | ||
1168 | ret = -EBADF; | ||
1169 | goto out_drop_write; | ||
1170 | } | ||
1171 | + | ||
1172 | src = src_file->f_dentry->d_inode; | ||
1173 | |||
1174 | ret = -EINVAL; | ||
1175 | if (src == inode) | ||
1176 | goto out_fput; | ||
1177 | |||
1178 | + /* the src must be open for reading */ | ||
1179 | + if (!(src_file->f_mode & FMODE_READ)) | ||
1180 | + goto out_fput; | ||
1181 | + | ||
1182 | ret = -EISDIR; | ||
1183 | if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode)) | ||
1184 | goto out_fput; | ||
1185 | diff --git a/fs/cachefiles/security.c b/fs/cachefiles/security.c | ||
1186 | index b5808cd..039b501 100644 | ||
1187 | --- a/fs/cachefiles/security.c | ||
1188 | +++ b/fs/cachefiles/security.c | ||
1189 | @@ -77,6 +77,8 @@ static int cachefiles_check_cache_dir(struct cachefiles_cache *cache, | ||
1190 | /* | ||
1191 | * check the security details of the on-disk cache | ||
1192 | * - must be called with security override in force | ||
1193 | + * - must return with a security override in force - even in the case of an | ||
1194 | + * error | ||
1195 | */ | ||
1196 | int cachefiles_determine_cache_security(struct cachefiles_cache *cache, | ||
1197 | struct dentry *root, | ||
1198 | @@ -99,6 +101,8 @@ int cachefiles_determine_cache_security(struct cachefiles_cache *cache, | ||
1199 | * which create files */ | ||
1200 | ret = set_create_files_as(new, root->d_inode); | ||
1201 | if (ret < 0) { | ||
1202 | + abort_creds(new); | ||
1203 | + cachefiles_begin_secure(cache, _saved_cred); | ||
1204 | _leave(" = %d [cfa]", ret); | ||
1205 | return ret; | ||
1206 | } | ||
1207 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h | ||
1208 | index ed751bb..2568889 100644 | ||
1209 | --- a/fs/cifs/cifsglob.h | ||
1210 | +++ b/fs/cifs/cifsglob.h | ||
1211 | @@ -500,6 +500,7 @@ struct dfs_info3_param { | ||
1212 | #define CIFS_FATTR_DFS_REFERRAL 0x1 | ||
1213 | #define CIFS_FATTR_DELETE_PENDING 0x2 | ||
1214 | #define CIFS_FATTR_NEED_REVAL 0x4 | ||
1215 | +#define CIFS_FATTR_INO_COLLISION 0x8 | ||
1216 | |||
1217 | struct cifs_fattr { | ||
1218 | u32 cf_flags; | ||
1219 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
1220 | index e3fda97..7ec8555 100644 | ||
1221 | --- a/fs/cifs/inode.c | ||
1222 | +++ b/fs/cifs/inode.c | ||
1223 | @@ -610,6 +610,16 @@ cifs_find_inode(struct inode *inode, void *opaque) | ||
1224 | if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) | ||
1225 | return 0; | ||
1226 | |||
1227 | + /* | ||
1228 | + * uh oh -- it's a directory. We can't use it since hardlinked dirs are | ||
1229 | + * verboten. Disable serverino and return it as if it were found, the | ||
1230 | + * caller can discard it, generate a uniqueid and retry the find | ||
1231 | + */ | ||
1232 | + if (S_ISDIR(inode->i_mode) && !list_empty(&inode->i_dentry)) { | ||
1233 | + fattr->cf_flags |= CIFS_FATTR_INO_COLLISION; | ||
1234 | + cifs_autodisable_serverino(CIFS_SB(inode->i_sb)); | ||
1235 | + } | ||
1236 | + | ||
1237 | return 1; | ||
1238 | } | ||
1239 | |||
1240 | @@ -629,15 +639,22 @@ cifs_iget(struct super_block *sb, struct cifs_fattr *fattr) | ||
1241 | unsigned long hash; | ||
1242 | struct inode *inode; | ||
1243 | |||
1244 | +retry_iget5_locked: | ||
1245 | cFYI(1, ("looking for uniqueid=%llu", fattr->cf_uniqueid)); | ||
1246 | |||
1247 | /* hash down to 32-bits on 32-bit arch */ | ||
1248 | hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); | ||
1249 | |||
1250 | inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr); | ||
1251 | - | ||
1252 | - /* we have fattrs in hand, update the inode */ | ||
1253 | if (inode) { | ||
1254 | + /* was there a problematic inode number collision? */ | ||
1255 | + if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) { | ||
1256 | + iput(inode); | ||
1257 | + fattr->cf_uniqueid = iunique(sb, ROOT_I); | ||
1258 | + fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION; | ||
1259 | + goto retry_iget5_locked; | ||
1260 | + } | ||
1261 | + | ||
1262 | cifs_fattr_to_inode(inode, fattr); | ||
1263 | if (sb->s_flags & MS_NOATIME) | ||
1264 | inode->i_flags |= S_NOATIME | S_NOCMTIME; | ||
1265 | diff --git a/fs/compat.c b/fs/compat.c | ||
1266 | index 00d90c2..514b623 100644 | ||
1267 | --- a/fs/compat.c | ||
1268 | +++ b/fs/compat.c | ||
1269 | @@ -1530,8 +1530,6 @@ int compat_do_execve(char * filename, | ||
1270 | if (retval < 0) | ||
1271 | goto out; | ||
1272 | |||
1273 | - current->stack_start = current->mm->start_stack; | ||
1274 | - | ||
1275 | /* execve succeeded */ | ||
1276 | current->fs->in_exec = 0; | ||
1277 | current->in_execve = 0; | ||
1278 | diff --git a/fs/exec.c b/fs/exec.c | ||
1279 | index 9071360..332f781 100644 | ||
1280 | --- a/fs/exec.c | ||
1281 | +++ b/fs/exec.c | ||
1282 | @@ -1386,8 +1386,6 @@ int do_execve(char * filename, | ||
1283 | if (retval < 0) | ||
1284 | goto out; | ||
1285 | |||
1286 | - current->stack_start = current->mm->start_stack; | ||
1287 | - | ||
1288 | /* execve succeeded */ | ||
1289 | current->fs->in_exec = 0; | ||
1290 | current->in_execve = 0; | ||
1291 | diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c | ||
1292 | index 8173fae..4d3ddcc 100644 | ||
1293 | --- a/fs/nilfs2/super.c | ||
1294 | +++ b/fs/nilfs2/super.c | ||
1295 | @@ -746,6 +746,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent, | ||
1296 | sb->s_export_op = &nilfs_export_ops; | ||
1297 | sb->s_root = NULL; | ||
1298 | sb->s_time_gran = 1; | ||
1299 | + sb->s_bdi = nilfs->ns_bdi; | ||
1300 | |||
1301 | err = load_nilfs(nilfs, sbi); | ||
1302 | if (err) | ||
1303 | diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c | ||
1304 | index 1afb0a1..e27960c 100644 | ||
1305 | --- a/fs/notify/inotify/inotify_fsnotify.c | ||
1306 | +++ b/fs/notify/inotify/inotify_fsnotify.c | ||
1307 | @@ -28,6 +28,7 @@ | ||
1308 | #include <linux/path.h> /* struct path */ | ||
1309 | #include <linux/slab.h> /* kmem_* */ | ||
1310 | #include <linux/types.h> | ||
1311 | +#include <linux/sched.h> | ||
1312 | |||
1313 | #include "inotify.h" | ||
1314 | |||
1315 | @@ -146,6 +147,7 @@ static void inotify_free_group_priv(struct fsnotify_group *group) | ||
1316 | idr_for_each(&group->inotify_data.idr, idr_callback, group); | ||
1317 | idr_remove_all(&group->inotify_data.idr); | ||
1318 | idr_destroy(&group->inotify_data.idr); | ||
1319 | + free_uid(group->inotify_data.user); | ||
1320 | } | ||
1321 | |||
1322 | void inotify_free_event_priv(struct fsnotify_event_private_data *fsn_event_priv) | ||
1323 | diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c | ||
1324 | index a94e8bd..75aa15a 100644 | ||
1325 | --- a/fs/notify/inotify/inotify_user.c | ||
1326 | +++ b/fs/notify/inotify/inotify_user.c | ||
1327 | @@ -550,21 +550,24 @@ retry: | ||
1328 | if (unlikely(!idr_pre_get(&group->inotify_data.idr, GFP_KERNEL))) | ||
1329 | goto out_err; | ||
1330 | |||
1331 | + /* we are putting the mark on the idr, take a reference */ | ||
1332 | + fsnotify_get_mark(&tmp_ientry->fsn_entry); | ||
1333 | + | ||
1334 | spin_lock(&group->inotify_data.idr_lock); | ||
1335 | ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, | ||
1336 | group->inotify_data.last_wd+1, | ||
1337 | &tmp_ientry->wd); | ||
1338 | spin_unlock(&group->inotify_data.idr_lock); | ||
1339 | if (ret) { | ||
1340 | + /* we didn't get on the idr, drop the idr reference */ | ||
1341 | + fsnotify_put_mark(&tmp_ientry->fsn_entry); | ||
1342 | + | ||
1343 | /* idr was out of memory allocate and try again */ | ||
1344 | if (ret == -EAGAIN) | ||
1345 | goto retry; | ||
1346 | goto out_err; | ||
1347 | } | ||
1348 | |||
1349 | - /* we put the mark on the idr, take a reference */ | ||
1350 | - fsnotify_get_mark(&tmp_ientry->fsn_entry); | ||
1351 | - | ||
1352 | /* we are on the idr, now get on the inode */ | ||
1353 | ret = fsnotify_add_mark(&tmp_ientry->fsn_entry, group, inode); | ||
1354 | if (ret) { | ||
1355 | diff --git a/fs/proc/array.c b/fs/proc/array.c | ||
1356 | index 13b5d07..69eb4c4 100644 | ||
1357 | --- a/fs/proc/array.c | ||
1358 | +++ b/fs/proc/array.c | ||
1359 | @@ -82,7 +82,6 @@ | ||
1360 | #include <linux/pid_namespace.h> | ||
1361 | #include <linux/ptrace.h> | ||
1362 | #include <linux/tracehook.h> | ||
1363 | -#include <linux/swapops.h> | ||
1364 | |||
1365 | #include <asm/pgtable.h> | ||
1366 | #include <asm/processor.h> | ||
1367 | @@ -494,7 +493,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | ||
1368 | rsslim, | ||
1369 | mm ? mm->start_code : 0, | ||
1370 | mm ? mm->end_code : 0, | ||
1371 | - (permitted && mm) ? task->stack_start : 0, | ||
1372 | + (permitted && mm) ? mm->start_stack : 0, | ||
1373 | esp, | ||
1374 | eip, | ||
1375 | /* The signal information here is obsolete. | ||
1376 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
1377 | index f277c4a..9df34a5 100644 | ||
1378 | --- a/fs/proc/task_mmu.c | ||
1379 | +++ b/fs/proc/task_mmu.c | ||
1380 | @@ -243,25 +243,6 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) | ||
1381 | } else if (vma->vm_start <= mm->start_stack && | ||
1382 | vma->vm_end >= mm->start_stack) { | ||
1383 | name = "[stack]"; | ||
1384 | - } else { | ||
1385 | - unsigned long stack_start; | ||
1386 | - struct proc_maps_private *pmp; | ||
1387 | - | ||
1388 | - pmp = m->private; | ||
1389 | - stack_start = pmp->task->stack_start; | ||
1390 | - | ||
1391 | - if (vma->vm_start <= stack_start && | ||
1392 | - vma->vm_end >= stack_start) { | ||
1393 | - pad_len_spaces(m, len); | ||
1394 | - seq_printf(m, | ||
1395 | - "[threadstack:%08lx]", | ||
1396 | -#ifdef CONFIG_STACK_GROWSUP | ||
1397 | - vma->vm_end - stack_start | ||
1398 | -#else | ||
1399 | - stack_start - vma->vm_start | ||
1400 | -#endif | ||
1401 | - ); | ||
1402 | - } | ||
1403 | } | ||
1404 | } else { | ||
1405 | name = "[vdso]"; | ||
1406 | diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h | ||
1407 | index e694263..6920695 100644 | ||
1408 | --- a/include/asm-generic/dma-mapping-common.h | ||
1409 | +++ b/include/asm-generic/dma-mapping-common.h | ||
1410 | @@ -131,7 +131,7 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, | ||
1411 | debug_dma_sync_single_range_for_cpu(dev, addr, offset, size, dir); | ||
1412 | |||
1413 | } else | ||
1414 | - dma_sync_single_for_cpu(dev, addr, size, dir); | ||
1415 | + dma_sync_single_for_cpu(dev, addr + offset, size, dir); | ||
1416 | } | ||
1417 | |||
1418 | static inline void dma_sync_single_range_for_device(struct device *dev, | ||
1419 | @@ -148,7 +148,7 @@ static inline void dma_sync_single_range_for_device(struct device *dev, | ||
1420 | debug_dma_sync_single_range_for_device(dev, addr, offset, size, dir); | ||
1421 | |||
1422 | } else | ||
1423 | - dma_sync_single_for_device(dev, addr, size, dir); | ||
1424 | + dma_sync_single_for_device(dev, addr + offset, size, dir); | ||
1425 | } | ||
1426 | |||
1427 | static inline void | ||
1428 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
1429 | index 1f5fa53..db821a4 100644 | ||
1430 | --- a/include/linux/sched.h | ||
1431 | +++ b/include/linux/sched.h | ||
1432 | @@ -1560,7 +1560,6 @@ struct task_struct { | ||
1433 | /* bitmask of trace recursion */ | ||
1434 | unsigned long trace_recursion; | ||
1435 | #endif /* CONFIG_TRACING */ | ||
1436 | - unsigned long stack_start; | ||
1437 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */ | ||
1438 | struct memcg_batch_info { | ||
1439 | int do_batch; /* incremented when batch uncharge started */ | ||
1440 | diff --git a/kernel/fork.c b/kernel/fork.c | ||
1441 | index f88bd98..0ea67a3 100644 | ||
1442 | --- a/kernel/fork.c | ||
1443 | +++ b/kernel/fork.c | ||
1444 | @@ -1134,8 +1134,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | ||
1445 | |||
1446 | p->bts = NULL; | ||
1447 | |||
1448 | - p->stack_start = stack_start; | ||
1449 | - | ||
1450 | /* Perform scheduler related setup. Assign this task to a CPU. */ | ||
1451 | sched_fork(p, clone_flags); | ||
1452 | |||
1453 | diff --git a/kernel/profile.c b/kernel/profile.c | ||
1454 | index a55d3a3..dfadc5b 100644 | ||
1455 | --- a/kernel/profile.c | ||
1456 | +++ b/kernel/profile.c | ||
1457 | @@ -127,8 +127,10 @@ int __ref profile_init(void) | ||
1458 | return 0; | ||
1459 | |||
1460 | prof_buffer = vmalloc(buffer_bytes); | ||
1461 | - if (prof_buffer) | ||
1462 | + if (prof_buffer) { | ||
1463 | + memset(prof_buffer, 0, buffer_bytes); | ||
1464 | return 0; | ||
1465 | + } | ||
1466 | |||
1467 | free_cpumask_var(prof_cpu_mask); | ||
1468 | return -ENOMEM; | ||
1469 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
1470 | index fd9ba95..e8d9544 100644 | ||
1471 | --- a/mm/hugetlb.c | ||
1472 | +++ b/mm/hugetlb.c | ||
1473 | @@ -1039,7 +1039,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, | ||
1474 | page = alloc_buddy_huge_page(h, vma, addr); | ||
1475 | if (!page) { | ||
1476 | hugetlb_put_quota(inode->i_mapping, chg); | ||
1477 | - return ERR_PTR(-VM_FAULT_OOM); | ||
1478 | + return ERR_PTR(-VM_FAULT_SIGBUS); | ||
1479 | } | ||
1480 | } | ||
1481 | |||
1482 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c | ||
1483 | index 16190ca..955f0b2 100644 | ||
1484 | --- a/net/ipv4/udp.c | ||
1485 | +++ b/net/ipv4/udp.c | ||
1486 | @@ -1527,6 +1527,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | ||
1487 | |||
1488 | uh = udp_hdr(skb); | ||
1489 | ulen = ntohs(uh->len); | ||
1490 | + saddr = ip_hdr(skb)->saddr; | ||
1491 | + daddr = ip_hdr(skb)->daddr; | ||
1492 | + | ||
1493 | if (ulen > skb->len) | ||
1494 | goto short_packet; | ||
1495 | |||
1496 | @@ -1540,9 +1543,6 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | ||
1497 | if (udp4_csum_init(skb, uh, proto)) | ||
1498 | goto csum_error; | ||
1499 | |||
1500 | - saddr = ip_hdr(skb)->saddr; | ||
1501 | - daddr = ip_hdr(skb)->daddr; | ||
1502 | - | ||
1503 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) | ||
1504 | return __udp4_lib_mcast_deliver(net, skb, uh, | ||
1505 | saddr, daddr, udptable); | ||
1506 | diff --git a/security/min_addr.c b/security/min_addr.c | ||
1507 | index e86f297..f728728 100644 | ||
1508 | --- a/security/min_addr.c | ||
1509 | +++ b/security/min_addr.c | ||
1510 | @@ -33,7 +33,7 @@ int mmap_min_addr_handler(struct ctl_table *table, int write, | ||
1511 | { | ||
1512 | int ret; | ||
1513 | |||
1514 | - if (!capable(CAP_SYS_RAWIO)) | ||
1515 | + if (write && !capable(CAP_SYS_RAWIO)) | ||
1516 | return -EPERM; | ||
1517 | |||
1518 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); | ||
1519 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
1520 | index fd831bd..a747871 100644 | ||
1521 | --- a/sound/pci/hda/hda_intel.c | ||
1522 | +++ b/sound/pci/hda/hda_intel.c | ||
1523 | @@ -2718,6 +2718,7 @@ static struct pci_device_id azx_ids[] = { | ||
1524 | { PCI_DEVICE(0x8086, 0x3a6e), .driver_data = AZX_DRIVER_ICH }, | ||
1525 | /* PCH */ | ||
1526 | { PCI_DEVICE(0x8086, 0x3b56), .driver_data = AZX_DRIVER_ICH }, | ||
1527 | + { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, | ||
1528 | /* CPT */ | ||
1529 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | ||
1530 | /* SCH */ | ||
1531 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
1532 | index 1a97c81..a978645 100644 | ||
1533 | --- a/sound/pci/hda/patch_conexant.c | ||
1534 | +++ b/sound/pci/hda/patch_conexant.c | ||
1535 | @@ -1176,9 +1176,10 @@ static int patch_cxt5045(struct hda_codec *codec) | ||
1536 | case 0x103c: | ||
1537 | case 0x1631: | ||
1538 | case 0x1734: | ||
1539 | - /* HP, Packard Bell, & Fujitsu-Siemens laptops have really bad | ||
1540 | - * sound over 0dB on NID 0x17. Fix max PCM level to 0 dB | ||
1541 | - * (originally it has 0x2b steps with 0dB offset 0x14) | ||
1542 | + case 0x17aa: | ||
1543 | + /* HP, Packard Bell, Fujitsu-Siemens & Lenovo laptops have | ||
1544 | + * really bad sound over 0dB on NID 0x17. Fix max PCM level to | ||
1545 | + * 0 dB (originally it has 0x2b steps with 0dB offset 0x14) | ||
1546 | */ | ||
1547 | snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, | ||
1548 | (0x14 << AC_AMPCAP_OFFSET_SHIFT) | | ||
1549 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
1550 | index b486daa..abfc558 100644 | ||
1551 | --- a/sound/pci/hda/patch_realtek.c | ||
1552 | +++ b/sound/pci/hda/patch_realtek.c | ||
1553 | @@ -17348,7 +17348,6 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | ||
1554 | ALC662_3ST_6ch_DIG), | ||
1555 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", | ||
1556 | ALC663_ASUS_H13), | ||
1557 | - SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG), | ||
1558 | {} | ||
1559 | }; | ||
1560 | |||
1561 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c | ||
1562 | index ac2d528..cb474c0 100644 | ||
1563 | --- a/sound/pci/hda/patch_sigmatel.c | ||
1564 | +++ b/sound/pci/hda/patch_sigmatel.c | ||
1565 | @@ -1539,11 +1539,9 @@ static unsigned int alienware_m17x_pin_configs[13] = { | ||
1566 | 0x904601b0, | ||
1567 | }; | ||
1568 | |||
1569 | -static unsigned int intel_dg45id_pin_configs[14] = { | ||
1570 | +static unsigned int intel_dg45id_pin_configs[13] = { | ||
1571 | 0x02214230, 0x02A19240, 0x01013214, 0x01014210, | ||
1572 | - 0x01A19250, 0x01011212, 0x01016211, 0x40f000f0, | ||
1573 | - 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x014510A0, | ||
1574 | - 0x074510B0, 0x40f000f0 | ||
1575 | + 0x01A19250, 0x01011212, 0x01016211 | ||
1576 | }; | ||
1577 | |||
1578 | static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | ||
1579 | diff --git a/sound/pci/ice1712/maya44.c b/sound/pci/ice1712/maya44.c | ||
1580 | index 3e1c20a..726fd4b 100644 | ||
1581 | --- a/sound/pci/ice1712/maya44.c | ||
1582 | +++ b/sound/pci/ice1712/maya44.c | ||
1583 | @@ -347,7 +347,7 @@ static int maya_gpio_sw_put(struct snd_kcontrol *kcontrol, | ||
1584 | |||
1585 | /* known working input slots (0-4) */ | ||
1586 | #define MAYA_LINE_IN 1 /* in-2 */ | ||
1587 | -#define MAYA_MIC_IN 4 /* in-5 */ | ||
1588 | +#define MAYA_MIC_IN 3 /* in-4 */ | ||
1589 | |||
1590 | static void wm8776_select_input(struct snd_maya44 *chip, int idx, int line) | ||
1591 | { | ||
1592 | @@ -393,8 +393,8 @@ static int maya_rec_src_put(struct snd_kcontrol *kcontrol, | ||
1593 | int changed; | ||
1594 | |||
1595 | mutex_lock(&chip->mutex); | ||
1596 | - changed = maya_set_gpio_bits(chip->ice, GPIO_MIC_RELAY, | ||
1597 | - sel ? GPIO_MIC_RELAY : 0); | ||
1598 | + changed = maya_set_gpio_bits(chip->ice, 1 << GPIO_MIC_RELAY, | ||
1599 | + sel ? (1 << GPIO_MIC_RELAY) : 0); | ||
1600 | wm8776_select_input(chip, 0, sel ? MAYA_MIC_IN : MAYA_LINE_IN); | ||
1601 | mutex_unlock(&chip->mutex); | ||
1602 | return changed; | ||
1603 | diff --git a/sound/pci/oxygen/xonar_cs43xx.c b/sound/pci/oxygen/xonar_cs43xx.c | ||
1604 | index 16c226b..7c4986b 100644 | ||
1605 | --- a/sound/pci/oxygen/xonar_cs43xx.c | ||
1606 | +++ b/sound/pci/oxygen/xonar_cs43xx.c | ||
1607 | @@ -56,6 +56,7 @@ | ||
1608 | #include <sound/pcm_params.h> | ||
1609 | #include <sound/tlv.h> | ||
1610 | #include "xonar.h" | ||
1611 | +#include "cm9780.h" | ||
1612 | #include "cs4398.h" | ||
1613 | #include "cs4362a.h" | ||
1614 | |||
1615 | @@ -172,6 +173,8 @@ static void xonar_d1_init(struct oxygen *chip) | ||
1616 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, | ||
1617 | GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); | ||
1618 | |||
1619 | + oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); | ||
1620 | + | ||
1621 | xonar_init_cs53x1(chip); | ||
1622 | xonar_enable_output(chip); | ||
1623 |