Contents of /trunk/kernel26-mcore/patches-2.6.33-r2/0101-2.6.33.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1115 -
(show annotations)
(download)
Sun Aug 22 18:37:54 2010 UTC (14 years, 1 month ago) by niro
File size: 204495 byte(s)
Sun Aug 22 18:37:54 2010 UTC (14 years, 1 month ago) by niro
File size: 204495 byte(s)
-added
1 | diff --git a/Documentation/filesystems/tmpfs.txt b/Documentation/filesystems/tmpfs.txt |
2 | index 3015da0..fe09a2c 100644 |
3 | --- a/Documentation/filesystems/tmpfs.txt |
4 | +++ b/Documentation/filesystems/tmpfs.txt |
5 | @@ -82,11 +82,13 @@ tmpfs has a mount option to set the NUMA memory allocation policy for |
6 | all files in that instance (if CONFIG_NUMA is enabled) - which can be |
7 | adjusted on the fly via 'mount -o remount ...' |
8 | |
9 | -mpol=default prefers to allocate memory from the local node |
10 | +mpol=default use the process allocation policy |
11 | + (see set_mempolicy(2)) |
12 | mpol=prefer:Node prefers to allocate memory from the given Node |
13 | mpol=bind:NodeList allocates memory only from nodes in NodeList |
14 | mpol=interleave prefers to allocate from each node in turn |
15 | mpol=interleave:NodeList allocates from each node of NodeList in turn |
16 | +mpol=local prefers to allocate memory from the local node |
17 | |
18 | NodeList format is a comma-separated list of decimal numbers and ranges, |
19 | a range being two hyphen-separated decimal numbers, the smallest and |
20 | @@ -134,3 +136,5 @@ Author: |
21 | Christoph Rohland <cr@sap.com>, 1.12.01 |
22 | Updated: |
23 | Hugh Dickins, 4 June 2007 |
24 | +Updated: |
25 | + KOSAKI Motohiro, 16 Mar 2010 |
26 | diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S |
27 | index 4fddc50..6b84a04 100644 |
28 | --- a/arch/arm/boot/compressed/head.S |
29 | +++ b/arch/arm/boot/compressed/head.S |
30 | @@ -170,8 +170,8 @@ not_angel: |
31 | |
32 | .text |
33 | adr r0, LC0 |
34 | - ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp} ) |
35 | - THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, ip} ) |
36 | + ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip, sp}) |
37 | + THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip} ) |
38 | THUMB( ldr sp, [r0, #28] ) |
39 | subs r0, r0, r1 @ calculate the delta offset |
40 | |
41 | @@ -182,12 +182,13 @@ not_angel: |
42 | /* |
43 | * We're running at a different address. We need to fix |
44 | * up various pointers: |
45 | - * r5 - zImage base address |
46 | - * r6 - GOT start |
47 | + * r5 - zImage base address (_start) |
48 | + * r6 - size of decompressed image |
49 | + * r11 - GOT start |
50 | * ip - GOT end |
51 | */ |
52 | add r5, r5, r0 |
53 | - add r6, r6, r0 |
54 | + add r11, r11, r0 |
55 | add ip, ip, r0 |
56 | |
57 | #ifndef CONFIG_ZBOOT_ROM |
58 | @@ -205,10 +206,10 @@ not_angel: |
59 | /* |
60 | * Relocate all entries in the GOT table. |
61 | */ |
62 | -1: ldr r1, [r6, #0] @ relocate entries in the GOT |
63 | +1: ldr r1, [r11, #0] @ relocate entries in the GOT |
64 | add r1, r1, r0 @ table. This fixes up the |
65 | - str r1, [r6], #4 @ C references. |
66 | - cmp r6, ip |
67 | + str r1, [r11], #4 @ C references. |
68 | + cmp r11, ip |
69 | blo 1b |
70 | #else |
71 | |
72 | @@ -216,12 +217,12 @@ not_angel: |
73 | * Relocate entries in the GOT table. We only relocate |
74 | * the entries that are outside the (relocated) BSS region. |
75 | */ |
76 | -1: ldr r1, [r6, #0] @ relocate entries in the GOT |
77 | +1: ldr r1, [r11, #0] @ relocate entries in the GOT |
78 | cmp r1, r2 @ entry < bss_start || |
79 | cmphs r3, r1 @ _end < entry |
80 | addlo r1, r1, r0 @ table. This fixes up the |
81 | - str r1, [r6], #4 @ C references. |
82 | - cmp r6, ip |
83 | + str r1, [r11], #4 @ C references. |
84 | + cmp r11, ip |
85 | blo 1b |
86 | #endif |
87 | |
88 | @@ -247,6 +248,7 @@ not_relocated: mov r0, #0 |
89 | * Check to see if we will overwrite ourselves. |
90 | * r4 = final kernel address |
91 | * r5 = start of this image |
92 | + * r6 = size of decompressed image |
93 | * r2 = end of malloc space (and therefore this image) |
94 | * We basically want: |
95 | * r4 >= r2 -> OK |
96 | @@ -254,8 +256,7 @@ not_relocated: mov r0, #0 |
97 | */ |
98 | cmp r4, r2 |
99 | bhs wont_overwrite |
100 | - sub r3, sp, r5 @ > compressed kernel size |
101 | - add r0, r4, r3, lsl #2 @ allow for 4x expansion |
102 | + add r0, r4, r6 |
103 | cmp r0, r5 |
104 | bls wont_overwrite |
105 | |
106 | @@ -271,7 +272,6 @@ not_relocated: mov r0, #0 |
107 | * r1-r3 = unused |
108 | * r4 = kernel execution address |
109 | * r5 = decompressed kernel start |
110 | - * r6 = processor ID |
111 | * r7 = architecture ID |
112 | * r8 = atags pointer |
113 | * r9-r12,r14 = corrupted |
114 | @@ -312,7 +312,8 @@ LC0: .word LC0 @ r1 |
115 | .word _end @ r3 |
116 | .word zreladdr @ r4 |
117 | .word _start @ r5 |
118 | - .word _got_start @ r6 |
119 | + .word _image_size @ r6 |
120 | + .word _got_start @ r11 |
121 | .word _got_end @ ip |
122 | .word user_stack+4096 @ sp |
123 | LC1: .word reloc_end - reloc_start |
124 | @@ -336,7 +337,6 @@ params: ldr r0, =params_phys |
125 | * |
126 | * On entry, |
127 | * r4 = kernel execution address |
128 | - * r6 = processor ID |
129 | * r7 = architecture number |
130 | * r8 = atags pointer |
131 | * r9 = run-time address of "start" (???) |
132 | @@ -542,7 +542,6 @@ __common_mmu_cache_on: |
133 | * r1-r3 = unused |
134 | * r4 = kernel execution address |
135 | * r5 = decompressed kernel start |
136 | - * r6 = processor ID |
137 | * r7 = architecture ID |
138 | * r8 = atags pointer |
139 | * r9-r12,r14 = corrupted |
140 | @@ -581,19 +580,19 @@ call_kernel: bl cache_clean_flush |
141 | * r1 = corrupted |
142 | * r2 = corrupted |
143 | * r3 = block offset |
144 | - * r6 = corrupted |
145 | + * r9 = corrupted |
146 | * r12 = corrupted |
147 | */ |
148 | |
149 | call_cache_fn: adr r12, proc_types |
150 | #ifdef CONFIG_CPU_CP15 |
151 | - mrc p15, 0, r6, c0, c0 @ get processor ID |
152 | + mrc p15, 0, r9, c0, c0 @ get processor ID |
153 | #else |
154 | - ldr r6, =CONFIG_PROCESSOR_ID |
155 | + ldr r9, =CONFIG_PROCESSOR_ID |
156 | #endif |
157 | 1: ldr r1, [r12, #0] @ get value |
158 | ldr r2, [r12, #4] @ get mask |
159 | - eor r1, r1, r6 @ (real ^ match) |
160 | + eor r1, r1, r9 @ (real ^ match) |
161 | tst r1, r2 @ & mask |
162 | ARM( addeq pc, r12, r3 ) @ call cache function |
163 | THUMB( addeq r12, r3 ) |
164 | @@ -778,8 +777,7 @@ proc_types: |
165 | * Turn off the Cache and MMU. ARMv3 does not support |
166 | * reading the control register, but ARMv4 does. |
167 | * |
168 | - * On entry, r6 = processor ID |
169 | - * On exit, r0, r1, r2, r3, r12 corrupted |
170 | + * On exit, r0, r1, r2, r3, r9, r12 corrupted |
171 | * This routine must preserve: r4, r6, r7 |
172 | */ |
173 | .align 5 |
174 | @@ -852,10 +850,8 @@ __armv3_mmu_cache_off: |
175 | /* |
176 | * Clean and flush the cache to maintain consistency. |
177 | * |
178 | - * On entry, |
179 | - * r6 = processor ID |
180 | * On exit, |
181 | - * r1, r2, r3, r11, r12 corrupted |
182 | + * r1, r2, r3, r9, r11, r12 corrupted |
183 | * This routine must preserve: |
184 | * r0, r4, r5, r6, r7 |
185 | */ |
186 | @@ -967,7 +963,7 @@ __armv4_mmu_cache_flush: |
187 | mov r2, #64*1024 @ default: 32K dcache size (*2) |
188 | mov r11, #32 @ default: 32 byte line size |
189 | mrc p15, 0, r3, c0, c0, 1 @ read cache type |
190 | - teq r3, r6 @ cache ID register present? |
191 | + teq r3, r9 @ cache ID register present? |
192 | beq no_cache_id |
193 | mov r1, r3, lsr #18 |
194 | and r1, r1, #7 |
195 | diff --git a/arch/arm/boot/compressed/vmlinux.lds.in b/arch/arm/boot/compressed/vmlinux.lds.in |
196 | index a5924b9..cbed030 100644 |
197 | --- a/arch/arm/boot/compressed/vmlinux.lds.in |
198 | +++ b/arch/arm/boot/compressed/vmlinux.lds.in |
199 | @@ -36,6 +36,9 @@ SECTIONS |
200 | |
201 | _etext = .; |
202 | |
203 | + /* Assume size of decompressed image is 4x the compressed image */ |
204 | + _image_size = (_etext - _text) * 4; |
205 | + |
206 | _got_start = .; |
207 | .got : { *(.got) } |
208 | _got_end = .; |
209 | diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c |
210 | index 1eb85fb..a3c0a32 100644 |
211 | --- a/arch/powerpc/kernel/perf_event.c |
212 | +++ b/arch/powerpc/kernel/perf_event.c |
213 | @@ -1164,10 +1164,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val, |
214 | * Finally record data if requested. |
215 | */ |
216 | if (record) { |
217 | - struct perf_sample_data data = { |
218 | - .addr = ~0ULL, |
219 | - .period = event->hw.last_period, |
220 | - }; |
221 | + struct perf_sample_data data; |
222 | + |
223 | + perf_sample_data_init(&data, ~0ULL); |
224 | + data.period = event->hw.last_period; |
225 | |
226 | if (event->attr.sample_type & PERF_SAMPLE_ADDR) |
227 | perf_get_data_addr(regs, &data.addr); |
228 | diff --git a/arch/sh/boot/compressed/misc.c b/arch/sh/boot/compressed/misc.c |
229 | index b51b1fc..d3cc94f 100644 |
230 | --- a/arch/sh/boot/compressed/misc.c |
231 | +++ b/arch/sh/boot/compressed/misc.c |
232 | @@ -132,7 +132,7 @@ void decompress_kernel(void) |
233 | output_addr = (CONFIG_MEMORY_START + 0x2000); |
234 | #else |
235 | output_addr = __pa((unsigned long)&_text+PAGE_SIZE); |
236 | -#ifdef CONFIG_29BIT |
237 | +#if defined(CONFIG_29BIT) || defined(CONFIG_PMB_LEGACY) |
238 | output_addr |= P2SEG; |
239 | #endif |
240 | #endif |
241 | diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c |
242 | index e856456..8c70d3e 100644 |
243 | --- a/arch/sparc/kernel/perf_event.c |
244 | +++ b/arch/sparc/kernel/perf_event.c |
245 | @@ -1189,7 +1189,7 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, |
246 | |
247 | regs = args->regs; |
248 | |
249 | - data.addr = 0; |
250 | + perf_sample_data_init(&data, 0); |
251 | |
252 | cpuc = &__get_cpu_var(cpu_hw_events); |
253 | |
254 | @@ -1337,7 +1337,7 @@ static void perf_callchain_user_32(struct pt_regs *regs, |
255 | callchain_store(entry, PERF_CONTEXT_USER); |
256 | callchain_store(entry, regs->tpc); |
257 | |
258 | - ufp = regs->u_regs[UREG_I6]; |
259 | + ufp = regs->u_regs[UREG_I6] & 0xffffffffUL; |
260 | do { |
261 | struct sparc_stackf32 *usf, sf; |
262 | unsigned long pc; |
263 | diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c |
264 | index 4b7c937..2d8b70d 100644 |
265 | --- a/arch/sparc/prom/p1275.c |
266 | +++ b/arch/sparc/prom/p1275.c |
267 | @@ -32,10 +32,9 @@ extern void prom_cif_interface(void); |
268 | extern void prom_cif_callback(void); |
269 | |
270 | /* |
271 | - * This provides SMP safety on the p1275buf. prom_callback() drops this lock |
272 | - * to allow recursuve acquisition. |
273 | + * This provides SMP safety on the p1275buf. |
274 | */ |
275 | -DEFINE_SPINLOCK(prom_entry_lock); |
276 | +DEFINE_RAW_SPINLOCK(prom_entry_lock); |
277 | |
278 | long p1275_cmd(const char *service, long fmt, ...) |
279 | { |
280 | @@ -47,7 +46,9 @@ long p1275_cmd(const char *service, long fmt, ...) |
281 | |
282 | p = p1275buf.prom_buffer; |
283 | |
284 | - spin_lock_irqsave(&prom_entry_lock, flags); |
285 | + raw_local_save_flags(flags); |
286 | + raw_local_irq_restore(PIL_NMI); |
287 | + raw_spin_lock(&prom_entry_lock); |
288 | |
289 | p1275buf.prom_args[0] = (unsigned long)p; /* service */ |
290 | strcpy (p, service); |
291 | @@ -139,7 +140,8 @@ long p1275_cmd(const char *service, long fmt, ...) |
292 | va_end(list); |
293 | x = p1275buf.prom_args [nargs + 3]; |
294 | |
295 | - spin_unlock_irqrestore(&prom_entry_lock, flags); |
296 | + raw_spin_unlock(&prom_entry_lock); |
297 | + raw_local_irq_restore(flags); |
298 | |
299 | return x; |
300 | } |
301 | diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h |
302 | index 14f9890..c22a164 100644 |
303 | --- a/arch/x86/include/asm/fixmap.h |
304 | +++ b/arch/x86/include/asm/fixmap.h |
305 | @@ -82,6 +82,9 @@ enum fixed_addresses { |
306 | #endif |
307 | FIX_DBGP_BASE, |
308 | FIX_EARLYCON_MEM_BASE, |
309 | +#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
310 | + FIX_OHCI1394_BASE, |
311 | +#endif |
312 | #ifdef CONFIG_X86_LOCAL_APIC |
313 | FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ |
314 | #endif |
315 | @@ -126,9 +129,6 @@ enum fixed_addresses { |
316 | FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 - |
317 | (__end_of_permanent_fixed_addresses & 255), |
318 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, |
319 | -#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
320 | - FIX_OHCI1394_BASE, |
321 | -#endif |
322 | #ifdef CONFIG_X86_32 |
323 | FIX_WP_TEST, |
324 | #endif |
325 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h |
326 | index 1cd58cd..4604e6a 100644 |
327 | --- a/arch/x86/include/asm/msr-index.h |
328 | +++ b/arch/x86/include/asm/msr-index.h |
329 | @@ -105,6 +105,8 @@ |
330 | #define MSR_AMD64_PATCH_LEVEL 0x0000008b |
331 | #define MSR_AMD64_NB_CFG 0xc001001f |
332 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 |
333 | +#define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 |
334 | +#define MSR_AMD64_OSVW_STATUS 0xc0010141 |
335 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 |
336 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 |
337 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 |
338 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
339 | index 879666f..7e1cca1 100644 |
340 | --- a/arch/x86/kernel/cpu/intel.c |
341 | +++ b/arch/x86/kernel/cpu/intel.c |
342 | @@ -70,7 +70,8 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) |
343 | if (c->x86_power & (1 << 8)) { |
344 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
345 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
346 | - sched_clock_stable = 1; |
347 | + if (!check_tsc_unstable()) |
348 | + sched_clock_stable = 1; |
349 | } |
350 | |
351 | /* |
352 | diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c |
353 | index 8c1c070..98819b3 100644 |
354 | --- a/arch/x86/kernel/cpu/perf_event.c |
355 | +++ b/arch/x86/kernel/cpu/perf_event.c |
356 | @@ -1636,10 +1636,9 @@ static void intel_pmu_drain_bts_buffer(struct cpu_hw_events *cpuc) |
357 | |
358 | ds->bts_index = ds->bts_buffer_base; |
359 | |
360 | + perf_sample_data_init(&data, 0); |
361 | |
362 | data.period = event->hw.last_period; |
363 | - data.addr = 0; |
364 | - data.raw = NULL; |
365 | regs.ip = 0; |
366 | |
367 | /* |
368 | @@ -1756,8 +1755,7 @@ static int p6_pmu_handle_irq(struct pt_regs *regs) |
369 | int idx, handled = 0; |
370 | u64 val; |
371 | |
372 | - data.addr = 0; |
373 | - data.raw = NULL; |
374 | + perf_sample_data_init(&data, 0); |
375 | |
376 | cpuc = &__get_cpu_var(cpu_hw_events); |
377 | |
378 | @@ -1802,8 +1800,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) |
379 | int bit, loops; |
380 | u64 ack, status; |
381 | |
382 | - data.addr = 0; |
383 | - data.raw = NULL; |
384 | + perf_sample_data_init(&data, 0); |
385 | |
386 | cpuc = &__get_cpu_var(cpu_hw_events); |
387 | |
388 | diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c |
389 | index 0ad9597..a6c906c 100644 |
390 | --- a/arch/x86/kernel/dumpstack_64.c |
391 | +++ b/arch/x86/kernel/dumpstack_64.c |
392 | @@ -125,9 +125,15 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack, |
393 | { |
394 | #ifdef CONFIG_FRAME_POINTER |
395 | struct stack_frame *frame = (struct stack_frame *)bp; |
396 | + unsigned long next; |
397 | |
398 | - if (!in_irq_stack(stack, irq_stack, irq_stack_end)) |
399 | - return (unsigned long)frame->next_frame; |
400 | + if (!in_irq_stack(stack, irq_stack, irq_stack_end)) { |
401 | + if (!probe_kernel_address(&frame->next_frame, next)) |
402 | + return next; |
403 | + else |
404 | + WARN_ONCE(1, "Perf: bad frame pointer = %p in " |
405 | + "callchain\n", &frame->next_frame); |
406 | + } |
407 | #endif |
408 | return bp; |
409 | } |
410 | diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c |
411 | index bb6006e..1e8cead 100644 |
412 | --- a/arch/x86/kernel/hw_breakpoint.c |
413 | +++ b/arch/x86/kernel/hw_breakpoint.c |
414 | @@ -531,8 +531,3 @@ void hw_breakpoint_pmu_read(struct perf_event *bp) |
415 | { |
416 | /* TODO */ |
417 | } |
418 | - |
419 | -void hw_breakpoint_pmu_unthrottle(struct perf_event *bp) |
420 | -{ |
421 | - /* TODO */ |
422 | -} |
423 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c |
424 | index c9b3522..999c8a6 100644 |
425 | --- a/arch/x86/kernel/process.c |
426 | +++ b/arch/x86/kernel/process.c |
427 | @@ -519,21 +519,37 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) |
428 | } |
429 | |
430 | /* |
431 | - * Check for AMD CPUs, which have potentially C1E support |
432 | + * Check for AMD CPUs, where APIC timer interrupt does not wake up CPU from C1e. |
433 | + * For more information see |
434 | + * - Erratum #400 for NPT family 0xf and family 0x10 CPUs |
435 | + * - Erratum #365 for family 0x11 (not affected because C1e not in use) |
436 | */ |
437 | static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c) |
438 | { |
439 | + u64 val; |
440 | if (c->x86_vendor != X86_VENDOR_AMD) |
441 | - return 0; |
442 | - |
443 | - if (c->x86 < 0x0F) |
444 | - return 0; |
445 | + goto no_c1e_idle; |
446 | |
447 | /* Family 0x0f models < rev F do not have C1E */ |
448 | - if (c->x86 == 0x0f && c->x86_model < 0x40) |
449 | - return 0; |
450 | + if (c->x86 == 0x0F && c->x86_model >= 0x40) |
451 | + return 1; |
452 | |
453 | - return 1; |
454 | + if (c->x86 == 0x10) { |
455 | + /* |
456 | + * check OSVW bit for CPUs that are not affected |
457 | + * by erratum #400 |
458 | + */ |
459 | + rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val); |
460 | + if (val >= 2) { |
461 | + rdmsrl(MSR_AMD64_OSVW_STATUS, val); |
462 | + if (!(val & BIT(1))) |
463 | + goto no_c1e_idle; |
464 | + } |
465 | + return 1; |
466 | + } |
467 | + |
468 | +no_c1e_idle: |
469 | + return 0; |
470 | } |
471 | |
472 | static cpumask_var_t c1e_mask; |
473 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
474 | index a1e1bc9..e900908 100644 |
475 | --- a/arch/x86/kvm/x86.c |
476 | +++ b/arch/x86/kvm/x86.c |
477 | @@ -1351,6 +1351,7 @@ int kvm_dev_ioctl_check_extension(long ext) |
478 | case KVM_CAP_XEN_HVM: |
479 | case KVM_CAP_ADJUST_CLOCK: |
480 | case KVM_CAP_VCPU_EVENTS: |
481 | + case KVM_CAP_X86_ROBUST_SINGLESTEP: |
482 | r = 1; |
483 | break; |
484 | case KVM_CAP_COALESCED_MMIO: |
485 | diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c |
486 | index 1d4eb93..cf07c26 100644 |
487 | --- a/arch/x86/mm/pageattr.c |
488 | +++ b/arch/x86/mm/pageattr.c |
489 | @@ -291,8 +291,29 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, |
490 | */ |
491 | if (kernel_set_to_readonly && |
492 | within(address, (unsigned long)_text, |
493 | - (unsigned long)__end_rodata_hpage_align)) |
494 | - pgprot_val(forbidden) |= _PAGE_RW; |
495 | + (unsigned long)__end_rodata_hpage_align)) { |
496 | + unsigned int level; |
497 | + |
498 | + /* |
499 | + * Don't enforce the !RW mapping for the kernel text mapping, |
500 | + * if the current mapping is already using small page mapping. |
501 | + * No need to work hard to preserve large page mappings in this |
502 | + * case. |
503 | + * |
504 | + * This also fixes the Linux Xen paravirt guest boot failure |
505 | + * (because of unexpected read-only mappings for kernel identity |
506 | + * mappings). In this paravirt guest case, the kernel text |
507 | + * mapping and the kernel identity mapping share the same |
508 | + * page-table pages. Thus we can't really use different |
509 | + * protections for the kernel text and identity mappings. Also, |
510 | + * these shared mappings are made of small page mappings. |
511 | + * Thus this don't enforce !RW mapping for small page kernel |
512 | + * text mapping logic will help Linux Xen parvirt guest boot |
513 | + * aswell. |
514 | + */ |
515 | + if (lookup_address(address, &level) && (level != PG_LEVEL_4K)) |
516 | + pgprot_val(forbidden) |= _PAGE_RW; |
517 | + } |
518 | #endif |
519 | |
520 | prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden)); |
521 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
522 | index a6a736a..9e2feb6 100644 |
523 | --- a/drivers/ata/ahci.c |
524 | +++ b/drivers/ata/ahci.c |
525 | @@ -2831,6 +2831,14 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
526 | * On HP dv[4-6] and HDX18 with earlier BIOSen, link |
527 | * to the harddisk doesn't become online after |
528 | * resuming from STR. Warn and fail suspend. |
529 | + * |
530 | + * http://bugzilla.kernel.org/show_bug.cgi?id=12276 |
531 | + * |
532 | + * Use dates instead of versions to match as HP is |
533 | + * apparently recycling both product and version |
534 | + * strings. |
535 | + * |
536 | + * http://bugzilla.kernel.org/show_bug.cgi?id=15462 |
537 | */ |
538 | { |
539 | .ident = "dv4", |
540 | @@ -2839,7 +2847,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
541 | DMI_MATCH(DMI_PRODUCT_NAME, |
542 | "HP Pavilion dv4 Notebook PC"), |
543 | }, |
544 | - .driver_data = "F.30", /* cutoff BIOS version */ |
545 | + .driver_data = "20090105", /* F.30 */ |
546 | }, |
547 | { |
548 | .ident = "dv5", |
549 | @@ -2848,7 +2856,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
550 | DMI_MATCH(DMI_PRODUCT_NAME, |
551 | "HP Pavilion dv5 Notebook PC"), |
552 | }, |
553 | - .driver_data = "F.16", /* cutoff BIOS version */ |
554 | + .driver_data = "20090506", /* F.16 */ |
555 | }, |
556 | { |
557 | .ident = "dv6", |
558 | @@ -2857,7 +2865,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
559 | DMI_MATCH(DMI_PRODUCT_NAME, |
560 | "HP Pavilion dv6 Notebook PC"), |
561 | }, |
562 | - .driver_data = "F.21", /* cutoff BIOS version */ |
563 | + .driver_data = "20090423", /* F.21 */ |
564 | }, |
565 | { |
566 | .ident = "HDX18", |
567 | @@ -2866,7 +2874,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
568 | DMI_MATCH(DMI_PRODUCT_NAME, |
569 | "HP HDX18 Notebook PC"), |
570 | }, |
571 | - .driver_data = "F.23", /* cutoff BIOS version */ |
572 | + .driver_data = "20090430", /* F.23 */ |
573 | }, |
574 | /* |
575 | * Acer eMachines G725 has the same problem. BIOS |
576 | @@ -2874,6 +2882,8 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
577 | * work. Inbetween, there are V1.06, V2.06 and V3.03 |
578 | * that we don't have much idea about. For now, |
579 | * blacklist anything older than V3.04. |
580 | + * |
581 | + * http://bugzilla.kernel.org/show_bug.cgi?id=15104 |
582 | */ |
583 | { |
584 | .ident = "G725", |
585 | @@ -2881,19 +2891,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) |
586 | DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), |
587 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), |
588 | }, |
589 | - .driver_data = "V3.04", /* cutoff BIOS version */ |
590 | + .driver_data = "20091216", /* V3.04 */ |
591 | }, |
592 | { } /* terminate list */ |
593 | }; |
594 | const struct dmi_system_id *dmi = dmi_first_match(sysids); |
595 | - const char *ver; |
596 | + int year, month, date; |
597 | + char buf[9]; |
598 | |
599 | if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) |
600 | return false; |
601 | |
602 | - ver = dmi_get_system_info(DMI_BIOS_VERSION); |
603 | + dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); |
604 | + snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); |
605 | |
606 | - return !ver || strcmp(ver, dmi->driver_data) < 0; |
607 | + return strcmp(buf, dmi->driver_data) < 0; |
608 | } |
609 | |
610 | static bool ahci_broken_online(struct pci_dev *pdev) |
611 | diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c |
612 | index 0d97890..be7c395 100644 |
613 | --- a/drivers/ata/pata_via.c |
614 | +++ b/drivers/ata/pata_via.c |
615 | @@ -588,6 +588,10 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
616 | u8 rev = isa->revision; |
617 | pci_dev_put(isa); |
618 | |
619 | + if ((id->device == 0x0415 || id->device == 0x3164) && |
620 | + (config->id != id->device)) |
621 | + continue; |
622 | + |
623 | if (rev >= config->rev_min && rev <= config->rev_max) |
624 | break; |
625 | } |
626 | diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c |
627 | index 66fa4e1..f27c4d6 100644 |
628 | --- a/drivers/char/tty_buffer.c |
629 | +++ b/drivers/char/tty_buffer.c |
630 | @@ -247,7 +247,8 @@ int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, |
631 | { |
632 | int copied = 0; |
633 | do { |
634 | - int space = tty_buffer_request_room(tty, size - copied); |
635 | + int goal = min(size - copied, TTY_BUFFER_PAGE); |
636 | + int space = tty_buffer_request_room(tty, goal); |
637 | struct tty_buffer *tb = tty->buf.tail; |
638 | /* If there is no space then tb may be NULL */ |
639 | if (unlikely(space == 0)) |
640 | @@ -283,7 +284,8 @@ int tty_insert_flip_string_flags(struct tty_struct *tty, |
641 | { |
642 | int copied = 0; |
643 | do { |
644 | - int space = tty_buffer_request_room(tty, size - copied); |
645 | + int goal = min(size - copied, TTY_BUFFER_PAGE); |
646 | + int space = tty_buffer_request_room(tty, goal); |
647 | struct tty_buffer *tb = tty->buf.tail; |
648 | /* If there is no space then tb may be NULL */ |
649 | if (unlikely(space == 0)) |
650 | diff --git a/drivers/edac/edac_mce_amd.c b/drivers/edac/edac_mce_amd.c |
651 | index 8fc91a0..f5b6d9f 100644 |
652 | --- a/drivers/edac/edac_mce_amd.c |
653 | +++ b/drivers/edac/edac_mce_amd.c |
654 | @@ -316,7 +316,12 @@ void amd_decode_nb_mce(int node_id, struct err_regs *regs, int handle_errors) |
655 | if (regs->nbsh & K8_NBSH_ERR_CPU_VAL) |
656 | pr_cont(", core: %u\n", (u8)(regs->nbsh & 0xf)); |
657 | } else { |
658 | - pr_cont(", core: %d\n", fls((regs->nbsh & 0xf) - 1)); |
659 | + u8 assoc_cpus = regs->nbsh & 0xf; |
660 | + |
661 | + if (assoc_cpus > 0) |
662 | + pr_cont(", core: %d", fls(assoc_cpus) - 1); |
663 | + |
664 | + pr_cont("\n"); |
665 | } |
666 | |
667 | pr_emerg("%s.\n", EXT_ERR_MSG(xec)); |
668 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
669 | index ec8a0d7..fd099a1 100644 |
670 | --- a/drivers/gpu/drm/i915/i915_gem.c |
671 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
672 | @@ -1470,9 +1470,6 @@ i915_gem_object_put_pages(struct drm_gem_object *obj) |
673 | obj_priv->dirty = 0; |
674 | |
675 | for (i = 0; i < page_count; i++) { |
676 | - if (obj_priv->pages[i] == NULL) |
677 | - break; |
678 | - |
679 | if (obj_priv->dirty) |
680 | set_page_dirty(obj_priv->pages[i]); |
681 | |
682 | @@ -2228,7 +2225,6 @@ i915_gem_object_get_pages(struct drm_gem_object *obj, |
683 | struct address_space *mapping; |
684 | struct inode *inode; |
685 | struct page *page; |
686 | - int ret; |
687 | |
688 | if (obj_priv->pages_refcount++ != 0) |
689 | return 0; |
690 | @@ -2251,11 +2247,9 @@ i915_gem_object_get_pages(struct drm_gem_object *obj, |
691 | mapping_gfp_mask (mapping) | |
692 | __GFP_COLD | |
693 | gfpmask); |
694 | - if (IS_ERR(page)) { |
695 | - ret = PTR_ERR(page); |
696 | - i915_gem_object_put_pages(obj); |
697 | - return ret; |
698 | - } |
699 | + if (IS_ERR(page)) |
700 | + goto err_pages; |
701 | + |
702 | obj_priv->pages[i] = page; |
703 | } |
704 | |
705 | @@ -2263,6 +2257,15 @@ i915_gem_object_get_pages(struct drm_gem_object *obj, |
706 | i915_gem_object_do_bit_17_swizzle(obj); |
707 | |
708 | return 0; |
709 | + |
710 | +err_pages: |
711 | + while (i--) |
712 | + page_cache_release(obj_priv->pages[i]); |
713 | + |
714 | + drm_free_large(obj_priv->pages); |
715 | + obj_priv->pages = NULL; |
716 | + obj_priv->pages_refcount--; |
717 | + return PTR_ERR(page); |
718 | } |
719 | |
720 | static void i965_write_fence_reg(struct drm_i915_fence_reg *reg) |
721 | diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c |
722 | index 2639591..63f569b 100644 |
723 | --- a/drivers/gpu/drm/i915/intel_overlay.c |
724 | +++ b/drivers/gpu/drm/i915/intel_overlay.c |
725 | @@ -1083,14 +1083,18 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, |
726 | |
727 | drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id, |
728 | DRM_MODE_OBJECT_CRTC); |
729 | - if (!drmmode_obj) |
730 | - return -ENOENT; |
731 | + if (!drmmode_obj) { |
732 | + ret = -ENOENT; |
733 | + goto out_free; |
734 | + } |
735 | crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); |
736 | |
737 | new_bo = drm_gem_object_lookup(dev, file_priv, |
738 | put_image_rec->bo_handle); |
739 | - if (!new_bo) |
740 | - return -ENOENT; |
741 | + if (!new_bo) { |
742 | + ret = -ENOENT; |
743 | + goto out_free; |
744 | + } |
745 | |
746 | mutex_lock(&dev->mode_config.mutex); |
747 | mutex_lock(&dev->struct_mutex); |
748 | @@ -1180,6 +1184,7 @@ out_unlock: |
749 | mutex_unlock(&dev->struct_mutex); |
750 | mutex_unlock(&dev->mode_config.mutex); |
751 | drm_gem_object_unreference(new_bo); |
752 | +out_free: |
753 | kfree(params); |
754 | |
755 | return ret; |
756 | diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c |
757 | index d2f6335..a378bc3 100644 |
758 | --- a/drivers/gpu/drm/nouveau/nouveau_connector.c |
759 | +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c |
760 | @@ -239,12 +239,14 @@ nouveau_connector_detect(struct drm_connector *connector) |
761 | if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) |
762 | nv_encoder = find_encoder_by_type(connector, OUTPUT_LVDS); |
763 | if (nv_encoder && nv_connector->native_mode) { |
764 | + unsigned status = connector_status_connected; |
765 | + |
766 | #ifdef CONFIG_ACPI |
767 | if (!nouveau_ignorelid && !acpi_lid_open()) |
768 | - return connector_status_disconnected; |
769 | + status = connector_status_unknown; |
770 | #endif |
771 | nouveau_connector_set_encoder(connector, nv_encoder); |
772 | - return connector_status_connected; |
773 | + return status; |
774 | } |
775 | |
776 | /* Cleanup the previous EDID block. */ |
777 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c |
778 | index 2d7bcee..cb4290a 100644 |
779 | --- a/drivers/hwmon/coretemp.c |
780 | +++ b/drivers/hwmon/coretemp.c |
781 | @@ -228,7 +228,7 @@ static int __devinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device * |
782 | if (err) { |
783 | dev_warn(dev, |
784 | "Unable to access MSR 0xEE, for Tjmax, left" |
785 | - " at default"); |
786 | + " at default\n"); |
787 | } else if (eax & 0x40000000) { |
788 | tjmax = tjmax_ee; |
789 | } |
790 | diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c |
791 | index df6ab55..5574be2 100644 |
792 | --- a/drivers/i2c/busses/i2c-i801.c |
793 | +++ b/drivers/i2c/busses/i2c-i801.c |
794 | @@ -415,9 +415,11 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write, |
795 | data->block[0] = 32; /* max for SMBus block reads */ |
796 | } |
797 | |
798 | + /* Experience has shown that the block buffer can only be used for |
799 | + SMBus (not I2C) block transactions, even though the datasheet |
800 | + doesn't mention this limitation. */ |
801 | if ((i801_features & FEATURE_BLOCK_BUFFER) |
802 | - && !(command == I2C_SMBUS_I2C_BLOCK_DATA |
803 | - && read_write == I2C_SMBUS_READ) |
804 | + && command != I2C_SMBUS_I2C_BLOCK_DATA |
805 | && i801_set_block_buffer_mode() == 0) |
806 | result = i801_block_transaction_by_block(data, read_write, |
807 | hwpec); |
808 | diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c |
809 | index 1c440a7..b289ec9 100644 |
810 | --- a/drivers/i2c/busses/i2c-powermac.c |
811 | +++ b/drivers/i2c/busses/i2c-powermac.c |
812 | @@ -122,9 +122,14 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap, |
813 | |
814 | rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len); |
815 | if (rc) { |
816 | - dev_err(&adap->dev, |
817 | - "I2C transfer at 0x%02x failed, size %d, err %d\n", |
818 | - addrdir >> 1, size, rc); |
819 | + if (rc == -ENXIO) |
820 | + dev_dbg(&adap->dev, |
821 | + "I2C transfer at 0x%02x failed, size %d, " |
822 | + "err %d\n", addrdir >> 1, size, rc); |
823 | + else |
824 | + dev_err(&adap->dev, |
825 | + "I2C transfer at 0x%02x failed, size %d, " |
826 | + "err %d\n", addrdir >> 1, size, rc); |
827 | goto bail; |
828 | } |
829 | |
830 | @@ -175,10 +180,16 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, |
831 | goto bail; |
832 | } |
833 | rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); |
834 | - if (rc < 0) |
835 | - dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n", |
836 | - addrdir & 1 ? "read from" : "write to", addrdir >> 1, |
837 | - rc); |
838 | + if (rc < 0) { |
839 | + if (rc == -ENXIO) |
840 | + dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n", |
841 | + addrdir & 1 ? "read from" : "write to", |
842 | + addrdir >> 1, rc); |
843 | + else |
844 | + dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n", |
845 | + addrdir & 1 ? "read from" : "write to", |
846 | + addrdir >> 1, rc); |
847 | + } |
848 | bail: |
849 | pmac_i2c_close(bus); |
850 | return rc < 0 ? rc : 1; |
851 | diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c |
852 | index 0f67f1a..d7e6f09 100644 |
853 | --- a/drivers/ide/icside.c |
854 | +++ b/drivers/ide/icside.c |
855 | @@ -65,6 +65,8 @@ static struct cardinfo icside_cardinfo_v6_2 = { |
856 | }; |
857 | |
858 | struct icside_state { |
859 | + unsigned int channel; |
860 | + unsigned int enabled; |
861 | void __iomem *irq_port; |
862 | void __iomem *ioc_base; |
863 | unsigned int sel; |
864 | @@ -114,11 +116,18 @@ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr) |
865 | struct icside_state *state = ec->irq_data; |
866 | void __iomem *base = state->irq_port; |
867 | |
868 | - writeb(0, base + ICS_ARCIN_V6_INTROFFSET_1); |
869 | - readb(base + ICS_ARCIN_V6_INTROFFSET_2); |
870 | + state->enabled = 1; |
871 | |
872 | - writeb(0, base + ICS_ARCIN_V6_INTROFFSET_2); |
873 | - readb(base + ICS_ARCIN_V6_INTROFFSET_1); |
874 | + switch (state->channel) { |
875 | + case 0: |
876 | + writeb(0, base + ICS_ARCIN_V6_INTROFFSET_1); |
877 | + readb(base + ICS_ARCIN_V6_INTROFFSET_2); |
878 | + break; |
879 | + case 1: |
880 | + writeb(0, base + ICS_ARCIN_V6_INTROFFSET_2); |
881 | + readb(base + ICS_ARCIN_V6_INTROFFSET_1); |
882 | + break; |
883 | + } |
884 | } |
885 | |
886 | /* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) |
887 | @@ -128,6 +137,8 @@ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) |
888 | { |
889 | struct icside_state *state = ec->irq_data; |
890 | |
891 | + state->enabled = 0; |
892 | + |
893 | readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); |
894 | readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); |
895 | } |
896 | @@ -149,6 +160,44 @@ static const expansioncard_ops_t icside_ops_arcin_v6 = { |
897 | .irqpending = icside_irqpending_arcin_v6, |
898 | }; |
899 | |
900 | +/* |
901 | + * Handle routing of interrupts. This is called before |
902 | + * we write the command to the drive. |
903 | + */ |
904 | +static void icside_maskproc(ide_drive_t *drive, int mask) |
905 | +{ |
906 | + ide_hwif_t *hwif = drive->hwif; |
907 | + struct expansion_card *ec = ECARD_DEV(hwif->dev); |
908 | + struct icside_state *state = ecard_get_drvdata(ec); |
909 | + unsigned long flags; |
910 | + |
911 | + local_irq_save(flags); |
912 | + |
913 | + state->channel = hwif->channel; |
914 | + |
915 | + if (state->enabled && !mask) { |
916 | + switch (hwif->channel) { |
917 | + case 0: |
918 | + writeb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); |
919 | + readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); |
920 | + break; |
921 | + case 1: |
922 | + writeb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); |
923 | + readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); |
924 | + break; |
925 | + } |
926 | + } else { |
927 | + readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); |
928 | + readb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); |
929 | + } |
930 | + |
931 | + local_irq_restore(flags); |
932 | +} |
933 | + |
934 | +static const struct ide_port_ops icside_v6_no_dma_port_ops = { |
935 | + .maskproc = icside_maskproc, |
936 | +}; |
937 | + |
938 | #ifdef CONFIG_BLK_DEV_IDEDMA_ICS |
939 | /* |
940 | * SG-DMA support. |
941 | @@ -228,6 +277,7 @@ static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode) |
942 | |
943 | static const struct ide_port_ops icside_v6_port_ops = { |
944 | .set_dma_mode = icside_set_dma_mode, |
945 | + .maskproc = icside_maskproc, |
946 | }; |
947 | |
948 | static void icside_dma_host_set(ide_drive_t *drive, int on) |
949 | @@ -272,6 +322,11 @@ static int icside_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd) |
950 | BUG_ON(dma_channel_active(ec->dma)); |
951 | |
952 | /* |
953 | + * Ensure that we have the right interrupt routed. |
954 | + */ |
955 | + icside_maskproc(drive, 0); |
956 | + |
957 | + /* |
958 | * Route the DMA signals to the correct interface. |
959 | */ |
960 | writeb(state->sel | hwif->channel, state->ioc_base); |
961 | @@ -399,6 +454,7 @@ err_free: |
962 | |
963 | static const struct ide_port_info icside_v6_port_info __initdata = { |
964 | .init_dma = icside_dma_off_init, |
965 | + .port_ops = &icside_v6_no_dma_port_ops, |
966 | .dma_ops = &icside_v6_dma_ops, |
967 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_MMIO, |
968 | .mwdma_mask = ATA_MWDMA2, |
969 | diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c |
970 | index 4d76ba4..0c11237 100644 |
971 | --- a/drivers/ide/ide-probe.c |
972 | +++ b/drivers/ide/ide-probe.c |
973 | @@ -695,14 +695,8 @@ static int ide_probe_port(ide_hwif_t *hwif) |
974 | if (irqd) |
975 | disable_irq(hwif->irq); |
976 | |
977 | - rc = ide_port_wait_ready(hwif); |
978 | - if (rc == -ENODEV) { |
979 | - printk(KERN_INFO "%s: no devices on the port\n", hwif->name); |
980 | - goto out; |
981 | - } else if (rc == -EBUSY) |
982 | - printk(KERN_ERR "%s: not ready before the probe\n", hwif->name); |
983 | - else |
984 | - rc = -ENODEV; |
985 | + if (ide_port_wait_ready(hwif) == -EBUSY) |
986 | + printk(KERN_DEBUG "%s: Wait for ready failed before probe !\n", hwif->name); |
987 | |
988 | /* |
989 | * Second drive should only exist if first drive was found, |
990 | @@ -713,7 +707,7 @@ static int ide_probe_port(ide_hwif_t *hwif) |
991 | if (drive->dev_flags & IDE_DFLAG_PRESENT) |
992 | rc = 0; |
993 | } |
994 | -out: |
995 | + |
996 | /* |
997 | * Use cached IRQ number. It might be (and is...) changed by probe |
998 | * code above |
999 | diff --git a/drivers/ide/pdc202xx_old.c b/drivers/ide/pdc202xx_old.c |
1000 | index 35161dd..e3bca38 100644 |
1001 | --- a/drivers/ide/pdc202xx_old.c |
1002 | +++ b/drivers/ide/pdc202xx_old.c |
1003 | @@ -100,13 +100,13 @@ static int pdc202xx_test_irq(ide_hwif_t *hwif) |
1004 | * bit 7: error, bit 6: interrupting, |
1005 | * bit 5: FIFO full, bit 4: FIFO empty |
1006 | */ |
1007 | - return ((sc1d & 0x50) == 0x40) ? 1 : 0; |
1008 | + return ((sc1d & 0x50) == 0x50) ? 1 : 0; |
1009 | } else { |
1010 | /* |
1011 | * bit 3: error, bit 2: interrupting, |
1012 | * bit 1: FIFO full, bit 0: FIFO empty |
1013 | */ |
1014 | - return ((sc1d & 0x05) == 0x04) ? 1 : 0; |
1015 | + return ((sc1d & 0x05) == 0x05) ? 1 : 0; |
1016 | } |
1017 | } |
1018 | |
1019 | diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c |
1020 | index f93c2c0..f6dad83 100644 |
1021 | --- a/drivers/input/mouse/alps.c |
1022 | +++ b/drivers/input/mouse/alps.c |
1023 | @@ -63,6 +63,8 @@ static const struct alps_model_info alps_model_data[] = { |
1024 | { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, |
1025 | ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, |
1026 | { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */ |
1027 | + { { 0x52, 0x01, 0x14 }, 0xff, 0xff, |
1028 | + ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */ |
1029 | }; |
1030 | |
1031 | /* |
1032 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
1033 | index 2a5982e..525b9b9 100644 |
1034 | --- a/drivers/input/serio/i8042-x86ia64io.h |
1035 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
1036 | @@ -442,6 +442,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { |
1037 | }, |
1038 | }, |
1039 | { |
1040 | + /* Medion Akoya E1222 */ |
1041 | + .matches = { |
1042 | + DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), |
1043 | + DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), |
1044 | + }, |
1045 | + }, |
1046 | + { |
1047 | /* Mivvy M310 */ |
1048 | .matches = { |
1049 | DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), |
1050 | diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c |
1051 | index 3f5cd06..6b6c25d 100644 |
1052 | --- a/drivers/isdn/gigaset/capi.c |
1053 | +++ b/drivers/isdn/gigaset/capi.c |
1054 | @@ -1313,7 +1313,7 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, |
1055 | } |
1056 | |
1057 | /* check parameter: CIP Value */ |
1058 | - if (cmsg->CIPValue > ARRAY_SIZE(cip2bchlc) || |
1059 | + if (cmsg->CIPValue >= ARRAY_SIZE(cip2bchlc) || |
1060 | (cmsg->CIPValue > 0 && cip2bchlc[cmsg->CIPValue].bc == NULL)) { |
1061 | dev_notice(cs->dev, "%s: unknown CIP value %d\n", |
1062 | "CONNECT_REQ", cmsg->CIPValue); |
1063 | @@ -2215,36 +2215,24 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off, |
1064 | } |
1065 | |
1066 | |
1067 | -static struct capi_driver capi_driver_gigaset = { |
1068 | - .name = "gigaset", |
1069 | - .revision = "1.0", |
1070 | -}; |
1071 | - |
1072 | /** |
1073 | - * gigaset_isdn_register() - register to LL |
1074 | + * gigaset_isdn_regdev() - register device to LL |
1075 | * @cs: device descriptor structure. |
1076 | * @isdnid: device name. |
1077 | * |
1078 | - * Called by main module to register the device with the LL. |
1079 | - * |
1080 | * Return value: 1 for success, 0 for failure |
1081 | */ |
1082 | -int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1083 | +int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) |
1084 | { |
1085 | struct gigaset_capi_ctr *iif; |
1086 | int rc; |
1087 | |
1088 | - pr_info("Kernel CAPI interface\n"); |
1089 | - |
1090 | iif = kmalloc(sizeof(*iif), GFP_KERNEL); |
1091 | if (!iif) { |
1092 | pr_err("%s: out of memory\n", __func__); |
1093 | return 0; |
1094 | } |
1095 | |
1096 | - /* register driver with CAPI (ToDo: what for?) */ |
1097 | - register_capi_driver(&capi_driver_gigaset); |
1098 | - |
1099 | /* prepare controller structure */ |
1100 | iif->ctr.owner = THIS_MODULE; |
1101 | iif->ctr.driverdata = cs; |
1102 | @@ -2265,7 +2253,6 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1103 | rc = attach_capi_ctr(&iif->ctr); |
1104 | if (rc) { |
1105 | pr_err("attach_capi_ctr failed (%d)\n", rc); |
1106 | - unregister_capi_driver(&capi_driver_gigaset); |
1107 | kfree(iif); |
1108 | return 0; |
1109 | } |
1110 | @@ -2276,17 +2263,36 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1111 | } |
1112 | |
1113 | /** |
1114 | - * gigaset_isdn_unregister() - unregister from LL |
1115 | + * gigaset_isdn_unregdev() - unregister device from LL |
1116 | * @cs: device descriptor structure. |
1117 | - * |
1118 | - * Called by main module to unregister the device from the LL. |
1119 | */ |
1120 | -void gigaset_isdn_unregister(struct cardstate *cs) |
1121 | +void gigaset_isdn_unregdev(struct cardstate *cs) |
1122 | { |
1123 | struct gigaset_capi_ctr *iif = cs->iif; |
1124 | |
1125 | detach_capi_ctr(&iif->ctr); |
1126 | kfree(iif); |
1127 | cs->iif = NULL; |
1128 | +} |
1129 | + |
1130 | +static struct capi_driver capi_driver_gigaset = { |
1131 | + .name = "gigaset", |
1132 | + .revision = "1.0", |
1133 | +}; |
1134 | + |
1135 | +/** |
1136 | + * gigaset_isdn_regdrv() - register driver to LL |
1137 | + */ |
1138 | +void gigaset_isdn_regdrv(void) |
1139 | +{ |
1140 | + pr_info("Kernel CAPI interface\n"); |
1141 | + register_capi_driver(&capi_driver_gigaset); |
1142 | +} |
1143 | + |
1144 | +/** |
1145 | + * gigaset_isdn_unregdrv() - unregister driver from LL |
1146 | + */ |
1147 | +void gigaset_isdn_unregdrv(void) |
1148 | +{ |
1149 | unregister_capi_driver(&capi_driver_gigaset); |
1150 | } |
1151 | diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c |
1152 | index 664b0c5..0427fac 100644 |
1153 | --- a/drivers/isdn/gigaset/common.c |
1154 | +++ b/drivers/isdn/gigaset/common.c |
1155 | @@ -505,7 +505,7 @@ void gigaset_freecs(struct cardstate *cs) |
1156 | case 2: /* error in initcshw */ |
1157 | /* Deregister from LL */ |
1158 | make_invalid(cs, VALID_ID); |
1159 | - gigaset_isdn_unregister(cs); |
1160 | + gigaset_isdn_unregdev(cs); |
1161 | |
1162 | /* fall through */ |
1163 | case 1: /* error when registering to LL */ |
1164 | @@ -767,7 +767,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, |
1165 | cs->cmdbytes = 0; |
1166 | |
1167 | gig_dbg(DEBUG_INIT, "setting up iif"); |
1168 | - if (!gigaset_isdn_register(cs, modulename)) { |
1169 | + if (!gigaset_isdn_regdev(cs, modulename)) { |
1170 | pr_err("error registering ISDN device\n"); |
1171 | goto error; |
1172 | } |
1173 | @@ -1214,11 +1214,13 @@ static int __init gigaset_init_module(void) |
1174 | gigaset_debuglevel = DEBUG_DEFAULT; |
1175 | |
1176 | pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n"); |
1177 | + gigaset_isdn_regdrv(); |
1178 | return 0; |
1179 | } |
1180 | |
1181 | static void __exit gigaset_exit_module(void) |
1182 | { |
1183 | + gigaset_isdn_unregdrv(); |
1184 | } |
1185 | |
1186 | module_init(gigaset_init_module); |
1187 | diff --git a/drivers/isdn/gigaset/dummyll.c b/drivers/isdn/gigaset/dummyll.c |
1188 | index 5b27c99..bd0b1ea 100644 |
1189 | --- a/drivers/isdn/gigaset/dummyll.c |
1190 | +++ b/drivers/isdn/gigaset/dummyll.c |
1191 | @@ -57,12 +57,20 @@ void gigaset_isdn_stop(struct cardstate *cs) |
1192 | { |
1193 | } |
1194 | |
1195 | -int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1196 | +int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) |
1197 | { |
1198 | - pr_info("no ISDN subsystem interface\n"); |
1199 | return 1; |
1200 | } |
1201 | |
1202 | -void gigaset_isdn_unregister(struct cardstate *cs) |
1203 | +void gigaset_isdn_unregdev(struct cardstate *cs) |
1204 | +{ |
1205 | +} |
1206 | + |
1207 | +void gigaset_isdn_regdrv(void) |
1208 | +{ |
1209 | + pr_info("no ISDN subsystem interface\n"); |
1210 | +} |
1211 | + |
1212 | +void gigaset_isdn_unregdrv(void) |
1213 | { |
1214 | } |
1215 | diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c |
1216 | index ddeb045..0304d02 100644 |
1217 | --- a/drivers/isdn/gigaset/ev-layer.c |
1218 | +++ b/drivers/isdn/gigaset/ev-layer.c |
1219 | @@ -1259,14 +1259,10 @@ static void do_action(int action, struct cardstate *cs, |
1220 | * note that bcs may be NULL if no B channel is free |
1221 | */ |
1222 | at_state2->ConState = 700; |
1223 | - kfree(at_state2->str_var[STR_NMBR]); |
1224 | - at_state2->str_var[STR_NMBR] = NULL; |
1225 | - kfree(at_state2->str_var[STR_ZCPN]); |
1226 | - at_state2->str_var[STR_ZCPN] = NULL; |
1227 | - kfree(at_state2->str_var[STR_ZBC]); |
1228 | - at_state2->str_var[STR_ZBC] = NULL; |
1229 | - kfree(at_state2->str_var[STR_ZHLC]); |
1230 | - at_state2->str_var[STR_ZHLC] = NULL; |
1231 | + for (i = 0; i < STR_NUM; ++i) { |
1232 | + kfree(at_state2->str_var[i]); |
1233 | + at_state2->str_var[i] = NULL; |
1234 | + } |
1235 | at_state2->int_var[VAR_ZCTP] = -1; |
1236 | |
1237 | spin_lock_irqsave(&cs->lock, flags); |
1238 | diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h |
1239 | index e963a6c..62909b2 100644 |
1240 | --- a/drivers/isdn/gigaset/gigaset.h |
1241 | +++ b/drivers/isdn/gigaset/gigaset.h |
1242 | @@ -674,8 +674,10 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size); |
1243 | */ |
1244 | |
1245 | /* Called from common.c for setting up/shutting down with the ISDN subsystem */ |
1246 | -int gigaset_isdn_register(struct cardstate *cs, const char *isdnid); |
1247 | -void gigaset_isdn_unregister(struct cardstate *cs); |
1248 | +void gigaset_isdn_regdrv(void); |
1249 | +void gigaset_isdn_unregdrv(void); |
1250 | +int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid); |
1251 | +void gigaset_isdn_unregdev(struct cardstate *cs); |
1252 | |
1253 | /* Called from hardware module to indicate completion of an skb */ |
1254 | void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb); |
1255 | diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c |
1256 | index c129ee4..6429a6b 100644 |
1257 | --- a/drivers/isdn/gigaset/i4l.c |
1258 | +++ b/drivers/isdn/gigaset/i4l.c |
1259 | @@ -632,15 +632,13 @@ void gigaset_isdn_stop(struct cardstate *cs) |
1260 | } |
1261 | |
1262 | /** |
1263 | - * gigaset_isdn_register() - register to LL |
1264 | + * gigaset_isdn_regdev() - register to LL |
1265 | * @cs: device descriptor structure. |
1266 | * @isdnid: device name. |
1267 | * |
1268 | - * Called by main module to register the device with the LL. |
1269 | - * |
1270 | * Return value: 1 for success, 0 for failure |
1271 | */ |
1272 | -int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1273 | +int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) |
1274 | { |
1275 | isdn_if *iif; |
1276 | |
1277 | @@ -690,15 +688,29 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) |
1278 | } |
1279 | |
1280 | /** |
1281 | - * gigaset_isdn_unregister() - unregister from LL |
1282 | + * gigaset_isdn_unregdev() - unregister device from LL |
1283 | * @cs: device descriptor structure. |
1284 | - * |
1285 | - * Called by main module to unregister the device from the LL. |
1286 | */ |
1287 | -void gigaset_isdn_unregister(struct cardstate *cs) |
1288 | +void gigaset_isdn_unregdev(struct cardstate *cs) |
1289 | { |
1290 | gig_dbg(DEBUG_CMD, "sending UNLOAD"); |
1291 | gigaset_i4l_cmd(cs, ISDN_STAT_UNLOAD); |
1292 | kfree(cs->iif); |
1293 | cs->iif = NULL; |
1294 | } |
1295 | + |
1296 | +/** |
1297 | + * gigaset_isdn_regdrv() - register driver to LL |
1298 | + */ |
1299 | +void gigaset_isdn_regdrv(void) |
1300 | +{ |
1301 | + /* nothing to do */ |
1302 | +} |
1303 | + |
1304 | +/** |
1305 | + * gigaset_isdn_unregdrv() - unregister driver from LL |
1306 | + */ |
1307 | +void gigaset_isdn_unregdrv(void) |
1308 | +{ |
1309 | + /* nothing to do */ |
1310 | +} |
1311 | diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c |
1312 | index d2260b0..07bb299 100644 |
1313 | --- a/drivers/isdn/gigaset/interface.c |
1314 | +++ b/drivers/isdn/gigaset/interface.c |
1315 | @@ -632,7 +632,6 @@ void gigaset_if_receive(struct cardstate *cs, |
1316 | if (tty == NULL) |
1317 | gig_dbg(DEBUG_ANY, "receive on closed device"); |
1318 | else { |
1319 | - tty_buffer_request_room(tty, len); |
1320 | tty_insert_flip_string(tty, buffer, len); |
1321 | tty_flip_buffer_push(tty); |
1322 | } |
1323 | diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c |
1324 | index e5225d2..0823e26 100644 |
1325 | --- a/drivers/leds/leds-gpio.c |
1326 | +++ b/drivers/leds/leds-gpio.c |
1327 | @@ -211,7 +211,6 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev, |
1328 | const struct of_device_id *match) |
1329 | { |
1330 | struct device_node *np = ofdev->node, *child; |
1331 | - struct gpio_led led; |
1332 | struct gpio_led_of_platform_data *pdata; |
1333 | int count = 0, ret; |
1334 | |
1335 | @@ -226,8 +225,8 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev, |
1336 | if (!pdata) |
1337 | return -ENOMEM; |
1338 | |
1339 | - memset(&led, 0, sizeof(led)); |
1340 | for_each_child_of_node(np, child) { |
1341 | + struct gpio_led led = {}; |
1342 | enum of_gpio_flags flags; |
1343 | const char *state; |
1344 | |
1345 | diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c |
1346 | index cc0505e..6b0a495 100644 |
1347 | --- a/drivers/media/video/em28xx/em28xx-dvb.c |
1348 | +++ b/drivers/media/video/em28xx/em28xx-dvb.c |
1349 | @@ -606,6 +606,7 @@ static int dvb_fini(struct em28xx *dev) |
1350 | |
1351 | if (dev->dvb) { |
1352 | unregister_dvb(dev->dvb); |
1353 | + kfree(dev->dvb); |
1354 | dev->dvb = NULL; |
1355 | } |
1356 | |
1357 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
1358 | index efa0e41..1f800ae 100644 |
1359 | --- a/drivers/net/bonding/bond_main.c |
1360 | +++ b/drivers/net/bonding/bond_main.c |
1361 | @@ -4935,6 +4935,8 @@ int bond_create(struct net *net, const char *name) |
1362 | } |
1363 | |
1364 | res = register_netdevice(bond_dev); |
1365 | + if (res < 0) |
1366 | + goto out_netdev; |
1367 | |
1368 | out: |
1369 | rtnl_unlock(); |
1370 | diff --git a/drivers/net/can/bfin_can.c b/drivers/net/can/bfin_can.c |
1371 | index 0ec1524..fe5e320 100644 |
1372 | --- a/drivers/net/can/bfin_can.c |
1373 | +++ b/drivers/net/can/bfin_can.c |
1374 | @@ -26,6 +26,7 @@ |
1375 | |
1376 | #define DRV_NAME "bfin_can" |
1377 | #define BFIN_CAN_TIMEOUT 100 |
1378 | +#define TX_ECHO_SKB_MAX 1 |
1379 | |
1380 | /* |
1381 | * transmit and receive channels |
1382 | @@ -590,7 +591,7 @@ struct net_device *alloc_bfin_candev(void) |
1383 | struct net_device *dev; |
1384 | struct bfin_can_priv *priv; |
1385 | |
1386 | - dev = alloc_candev(sizeof(*priv)); |
1387 | + dev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX); |
1388 | if (!dev) |
1389 | return NULL; |
1390 | |
1391 | diff --git a/drivers/net/e100.c b/drivers/net/e100.c |
1392 | index 839fb2b..a565ea1 100644 |
1393 | --- a/drivers/net/e100.c |
1394 | +++ b/drivers/net/e100.c |
1395 | @@ -2854,7 +2854,7 @@ static int __devinit e100_probe(struct pci_dev *pdev, |
1396 | } |
1397 | nic->cbs_pool = pci_pool_create(netdev->name, |
1398 | nic->pdev, |
1399 | - nic->params.cbs.count * sizeof(struct cb), |
1400 | + nic->params.cbs.max * sizeof(struct cb), |
1401 | sizeof(u32), |
1402 | 0); |
1403 | DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n", |
1404 | diff --git a/drivers/net/jme.c b/drivers/net/jme.c |
1405 | index 792b88f..981c9fb 100644 |
1406 | --- a/drivers/net/jme.c |
1407 | +++ b/drivers/net/jme.c |
1408 | @@ -946,6 +946,8 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) |
1409 | jme->jme_vlan_rx(skb, jme->vlgrp, |
1410 | le16_to_cpu(rxdesc->descwb.vlan)); |
1411 | NET_STAT(jme).rx_bytes += 4; |
1412 | + } else { |
1413 | + dev_kfree_skb(skb); |
1414 | } |
1415 | } else { |
1416 | jme->jme_rx(skb); |
1417 | @@ -2085,12 +2087,45 @@ jme_tx_timeout(struct net_device *netdev) |
1418 | jme_reset_link(jme); |
1419 | } |
1420 | |
1421 | +static inline void jme_pause_rx(struct jme_adapter *jme) |
1422 | +{ |
1423 | + atomic_dec(&jme->link_changing); |
1424 | + |
1425 | + jme_set_rx_pcc(jme, PCC_OFF); |
1426 | + if (test_bit(JME_FLAG_POLL, &jme->flags)) { |
1427 | + JME_NAPI_DISABLE(jme); |
1428 | + } else { |
1429 | + tasklet_disable(&jme->rxclean_task); |
1430 | + tasklet_disable(&jme->rxempty_task); |
1431 | + } |
1432 | +} |
1433 | + |
1434 | +static inline void jme_resume_rx(struct jme_adapter *jme) |
1435 | +{ |
1436 | + struct dynpcc_info *dpi = &(jme->dpi); |
1437 | + |
1438 | + if (test_bit(JME_FLAG_POLL, &jme->flags)) { |
1439 | + JME_NAPI_ENABLE(jme); |
1440 | + } else { |
1441 | + tasklet_hi_enable(&jme->rxclean_task); |
1442 | + tasklet_hi_enable(&jme->rxempty_task); |
1443 | + } |
1444 | + dpi->cur = PCC_P1; |
1445 | + dpi->attempt = PCC_P1; |
1446 | + dpi->cnt = 0; |
1447 | + jme_set_rx_pcc(jme, PCC_P1); |
1448 | + |
1449 | + atomic_inc(&jme->link_changing); |
1450 | +} |
1451 | + |
1452 | static void |
1453 | jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) |
1454 | { |
1455 | struct jme_adapter *jme = netdev_priv(netdev); |
1456 | |
1457 | + jme_pause_rx(jme); |
1458 | jme->vlgrp = grp; |
1459 | + jme_resume_rx(jme); |
1460 | } |
1461 | |
1462 | static void |
1463 | diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c |
1464 | index 9fbb2eb..449a982 100644 |
1465 | --- a/drivers/net/pppol2tp.c |
1466 | +++ b/drivers/net/pppol2tp.c |
1467 | @@ -756,6 +756,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) |
1468 | |
1469 | /* Try to dequeue as many skbs from reorder_q as we can. */ |
1470 | pppol2tp_recv_dequeue(session); |
1471 | + sock_put(sock); |
1472 | |
1473 | return 0; |
1474 | |
1475 | @@ -772,6 +773,7 @@ discard_bad_csum: |
1476 | UDP_INC_STATS_USER(&init_net, UDP_MIB_INERRORS, 0); |
1477 | tunnel->stats.rx_errors++; |
1478 | kfree_skb(skb); |
1479 | + sock_put(sock); |
1480 | |
1481 | return 0; |
1482 | |
1483 | @@ -1180,7 +1182,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) |
1484 | /* Calculate UDP checksum if configured to do so */ |
1485 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) |
1486 | skb->ip_summed = CHECKSUM_NONE; |
1487 | - else if (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM)) { |
1488 | + else if ((skb_dst(skb) && skb_dst(skb)->dev) && |
1489 | + (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) { |
1490 | skb->ip_summed = CHECKSUM_COMPLETE; |
1491 | csum = skb_checksum(skb, 0, udp_len, 0); |
1492 | uh->check = csum_tcpudp_magic(inet->inet_saddr, |
1493 | @@ -1661,6 +1664,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, |
1494 | if (tunnel_sock == NULL) |
1495 | goto end; |
1496 | |
1497 | + sock_hold(tunnel_sock); |
1498 | tunnel = tunnel_sock->sk_user_data; |
1499 | } else { |
1500 | tunnel = pppol2tp_tunnel_find(sock_net(sk), sp->pppol2tp.s_tunnel); |
1501 | diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c |
1502 | index 60f96c4..67d414b 100644 |
1503 | --- a/drivers/net/r8169.c |
1504 | +++ b/drivers/net/r8169.c |
1505 | @@ -186,7 +186,12 @@ static struct pci_device_id rtl8169_pci_tbl[] = { |
1506 | |
1507 | MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); |
1508 | |
1509 | -static int rx_copybreak = 200; |
1510 | +/* |
1511 | + * we set our copybreak very high so that we don't have |
1512 | + * to allocate 16k frames all the time (see note in |
1513 | + * rtl8169_open() |
1514 | + */ |
1515 | +static int rx_copybreak = 16383; |
1516 | static int use_dac; |
1517 | static struct { |
1518 | u32 msg_enable; |
1519 | @@ -3245,9 +3250,13 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) |
1520 | } |
1521 | |
1522 | static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, |
1523 | - struct net_device *dev) |
1524 | + unsigned int mtu) |
1525 | { |
1526 | - unsigned int max_frame = dev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; |
1527 | + unsigned int max_frame = mtu + VLAN_ETH_HLEN + ETH_FCS_LEN; |
1528 | + |
1529 | + if (max_frame != 16383) |
1530 | + printk(KERN_WARNING "WARNING! Changing of MTU on this NIC" |
1531 | + "May lead to frame reception errors!\n"); |
1532 | |
1533 | tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE; |
1534 | } |
1535 | @@ -3259,7 +3268,17 @@ static int rtl8169_open(struct net_device *dev) |
1536 | int retval = -ENOMEM; |
1537 | |
1538 | |
1539 | - rtl8169_set_rxbufsize(tp, dev); |
1540 | + /* |
1541 | + * Note that we use a magic value here, its wierd I know |
1542 | + * its done because, some subset of rtl8169 hardware suffers from |
1543 | + * a problem in which frames received that are longer than |
1544 | + * the size set in RxMaxSize register return garbage sizes |
1545 | + * when received. To avoid this we need to turn off filtering, |
1546 | + * which is done by setting a value of 16383 in the RxMaxSize register |
1547 | + * and allocating 16k frames to handle the largest possible rx value |
1548 | + * thats what the magic math below does. |
1549 | + */ |
1550 | + rtl8169_set_rxbufsize(tp, 16383 - VLAN_ETH_HLEN - ETH_FCS_LEN); |
1551 | |
1552 | /* |
1553 | * Rx and Tx desscriptors needs 256 bytes alignment. |
1554 | @@ -3912,7 +3931,7 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu) |
1555 | |
1556 | rtl8169_down(dev); |
1557 | |
1558 | - rtl8169_set_rxbufsize(tp, dev); |
1559 | + rtl8169_set_rxbufsize(tp, dev->mtu); |
1560 | |
1561 | ret = rtl8169_init_ring(dev); |
1562 | if (ret < 0) |
1563 | diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c |
1564 | index 7f82b02..17d1493 100644 |
1565 | --- a/drivers/net/tg3.c |
1566 | +++ b/drivers/net/tg3.c |
1567 | @@ -5223,7 +5223,7 @@ static void tg3_poll_controller(struct net_device *dev) |
1568 | struct tg3 *tp = netdev_priv(dev); |
1569 | |
1570 | for (i = 0; i < tp->irq_cnt; i++) |
1571 | - tg3_interrupt(tp->napi[i].irq_vec, dev); |
1572 | + tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]); |
1573 | } |
1574 | #endif |
1575 | |
1576 | diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h |
1577 | index bbd2f31..8b43089 100644 |
1578 | --- a/drivers/net/wireless/ath/ath5k/ath5k.h |
1579 | +++ b/drivers/net/wireless/ath/ath5k/ath5k.h |
1580 | @@ -535,7 +535,7 @@ struct ath5k_txq_info { |
1581 | u32 tqi_cbr_period; /* Constant bit rate period */ |
1582 | u32 tqi_cbr_overflow_limit; |
1583 | u32 tqi_burst_time; |
1584 | - u32 tqi_ready_time; /* Not used */ |
1585 | + u32 tqi_ready_time; /* Time queue waits after an event */ |
1586 | }; |
1587 | |
1588 | /* |
1589 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c |
1590 | index d6ee8ac..ced648b 100644 |
1591 | --- a/drivers/net/wireless/ath/ath5k/base.c |
1592 | +++ b/drivers/net/wireless/ath/ath5k/base.c |
1593 | @@ -1537,7 +1537,8 @@ ath5k_beaconq_config(struct ath5k_softc *sc) |
1594 | |
1595 | ret = ath5k_hw_get_tx_queueprops(ah, sc->bhalq, &qi); |
1596 | if (ret) |
1597 | - return ret; |
1598 | + goto err; |
1599 | + |
1600 | if (sc->opmode == NL80211_IFTYPE_AP || |
1601 | sc->opmode == NL80211_IFTYPE_MESH_POINT) { |
1602 | /* |
1603 | @@ -1564,10 +1565,25 @@ ath5k_beaconq_config(struct ath5k_softc *sc) |
1604 | if (ret) { |
1605 | ATH5K_ERR(sc, "%s: unable to update parameters for beacon " |
1606 | "hardware queue!\n", __func__); |
1607 | - return ret; |
1608 | + goto err; |
1609 | } |
1610 | + ret = ath5k_hw_reset_tx_queue(ah, sc->bhalq); /* push to h/w */ |
1611 | + if (ret) |
1612 | + goto err; |
1613 | |
1614 | - return ath5k_hw_reset_tx_queue(ah, sc->bhalq); /* push to h/w */; |
1615 | + /* reconfigure cabq with ready time to 80% of beacon_interval */ |
1616 | + ret = ath5k_hw_get_tx_queueprops(ah, AR5K_TX_QUEUE_ID_CAB, &qi); |
1617 | + if (ret) |
1618 | + goto err; |
1619 | + |
1620 | + qi.tqi_ready_time = (sc->bintval * 80) / 100; |
1621 | + ret = ath5k_hw_set_tx_queueprops(ah, AR5K_TX_QUEUE_ID_CAB, &qi); |
1622 | + if (ret) |
1623 | + goto err; |
1624 | + |
1625 | + ret = ath5k_hw_reset_tx_queue(ah, AR5K_TX_QUEUE_ID_CAB); |
1626 | +err: |
1627 | + return ret; |
1628 | } |
1629 | |
1630 | static void |
1631 | diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c |
1632 | index 72474c0..97df0d9 100644 |
1633 | --- a/drivers/net/wireless/ath/ath5k/phy.c |
1634 | +++ b/drivers/net/wireless/ath/ath5k/phy.c |
1635 | @@ -1386,38 +1386,39 @@ static int ath5k_hw_rf511x_calibrate(struct ath5k_hw *ah, |
1636 | goto done; |
1637 | |
1638 | /* Calibration has finished, get the results and re-run */ |
1639 | + |
1640 | + /* work around empty results which can apparently happen on 5212 */ |
1641 | for (i = 0; i <= 10; i++) { |
1642 | iq_corr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_CORR); |
1643 | i_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_I); |
1644 | q_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_Q); |
1645 | + ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_CALIBRATE, |
1646 | + "iq_corr:%x i_pwr:%x q_pwr:%x", iq_corr, i_pwr, q_pwr); |
1647 | + if (i_pwr && q_pwr) |
1648 | + break; |
1649 | } |
1650 | |
1651 | i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7; |
1652 | q_coffd = q_pwr >> 7; |
1653 | |
1654 | - /* No correction */ |
1655 | - if (i_coffd == 0 || q_coffd == 0) |
1656 | + /* protect against divide by 0 and loss of sign bits */ |
1657 | + if (i_coffd == 0 || q_coffd < 2) |
1658 | goto done; |
1659 | |
1660 | - i_coff = ((-iq_corr) / i_coffd); |
1661 | + i_coff = (-iq_corr) / i_coffd; |
1662 | + i_coff = clamp(i_coff, -32, 31); /* signed 6 bit */ |
1663 | |
1664 | - /* Boundary check */ |
1665 | - if (i_coff > 31) |
1666 | - i_coff = 31; |
1667 | - if (i_coff < -32) |
1668 | - i_coff = -32; |
1669 | + q_coff = (i_pwr / q_coffd) - 128; |
1670 | + q_coff = clamp(q_coff, -16, 15); /* signed 5 bit */ |
1671 | |
1672 | - q_coff = (((s32)i_pwr / q_coffd) - 128); |
1673 | + ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_CALIBRATE, |
1674 | + "new I:%d Q:%d (i_coffd:%x q_coffd:%x)", |
1675 | + i_coff, q_coff, i_coffd, q_coffd); |
1676 | |
1677 | - /* Boundary check */ |
1678 | - if (q_coff > 15) |
1679 | - q_coff = 15; |
1680 | - if (q_coff < -16) |
1681 | - q_coff = -16; |
1682 | - |
1683 | - /* Commit new I/Q value */ |
1684 | - AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE | |
1685 | - ((u32)q_coff) | ((u32)i_coff << AR5K_PHY_IQ_CORR_Q_I_COFF_S)); |
1686 | + /* Commit new I/Q values (set enable bit last to match HAL sources) */ |
1687 | + AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF, i_coff); |
1688 | + AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF, q_coff); |
1689 | + AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE); |
1690 | |
1691 | /* Re-enable calibration -if we don't we'll commit |
1692 | * the same values again and again */ |
1693 | diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c |
1694 | index eeebb9a..b7c5725 100644 |
1695 | --- a/drivers/net/wireless/ath/ath5k/qcu.c |
1696 | +++ b/drivers/net/wireless/ath/ath5k/qcu.c |
1697 | @@ -408,12 +408,13 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) |
1698 | break; |
1699 | |
1700 | case AR5K_TX_QUEUE_CAB: |
1701 | + /* XXX: use BCN_SENT_GT, if we can figure out how */ |
1702 | AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue), |
1703 | - AR5K_QCU_MISC_FRSHED_BCN_SENT_GT | |
1704 | + AR5K_QCU_MISC_FRSHED_DBA_GT | |
1705 | AR5K_QCU_MISC_CBREXP_DIS | |
1706 | AR5K_QCU_MISC_CBREXP_BCN_DIS); |
1707 | |
1708 | - ath5k_hw_reg_write(ah, ((AR5K_TUNE_BEACON_INTERVAL - |
1709 | + ath5k_hw_reg_write(ah, ((tq->tqi_ready_time - |
1710 | (AR5K_TUNE_SW_BEACON_RESP - |
1711 | AR5K_TUNE_DMA_BEACON_RESP) - |
1712 | AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) | |
1713 | diff --git a/drivers/net/wireless/ath/ath5k/reg.h b/drivers/net/wireless/ath/ath5k/reg.h |
1714 | index 4cb9c5d..1464f89 100644 |
1715 | --- a/drivers/net/wireless/ath/ath5k/reg.h |
1716 | +++ b/drivers/net/wireless/ath/ath5k/reg.h |
1717 | @@ -2187,6 +2187,7 @@ |
1718 | */ |
1719 | #define AR5K_PHY_IQ 0x9920 /* Register Address */ |
1720 | #define AR5K_PHY_IQ_CORR_Q_Q_COFF 0x0000001f /* Mask for q correction info */ |
1721 | +#define AR5K_PHY_IQ_CORR_Q_Q_COFF_S 0 |
1722 | #define AR5K_PHY_IQ_CORR_Q_I_COFF 0x000007e0 /* Mask for i correction info */ |
1723 | #define AR5K_PHY_IQ_CORR_Q_I_COFF_S 5 |
1724 | #define AR5K_PHY_IQ_CORR_ENABLE 0x00000800 /* Enable i/q correction */ |
1725 | diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c |
1726 | index 62954fc..dbc52ee 100644 |
1727 | --- a/drivers/net/wireless/ath/ath5k/reset.c |
1728 | +++ b/drivers/net/wireless/ath/ath5k/reset.c |
1729 | @@ -1371,8 +1371,9 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, |
1730 | * Set clocks to 32KHz operation and use an |
1731 | * external 32KHz crystal when sleeping if one |
1732 | * exists */ |
1733 | - if (ah->ah_version == AR5K_AR5212) |
1734 | - ath5k_hw_set_sleep_clock(ah, true); |
1735 | + if (ah->ah_version == AR5K_AR5212 && |
1736 | + ah->ah_op_mode != NL80211_IFTYPE_AP) |
1737 | + ath5k_hw_set_sleep_clock(ah, true); |
1738 | |
1739 | /* |
1740 | * Disable beacons and reset the register |
1741 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h |
1742 | index 1597a42..2bad712 100644 |
1743 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h |
1744 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h |
1745 | @@ -267,6 +267,7 @@ void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, |
1746 | u16 tid, u16 *ssn); |
1747 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
1748 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
1749 | +void ath9k_enable_ps(struct ath_softc *sc); |
1750 | |
1751 | /********/ |
1752 | /* VIFs */ |
1753 | diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c |
1754 | index 06eaaa9..20b1fd3 100644 |
1755 | --- a/drivers/net/wireless/ath/ath9k/beacon.c |
1756 | +++ b/drivers/net/wireless/ath/ath9k/beacon.c |
1757 | @@ -573,6 +573,13 @@ static void ath_beacon_config_sta(struct ath_softc *sc, |
1758 | u64 tsf; |
1759 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; |
1760 | |
1761 | + /* No need to configure beacon if we are not associated */ |
1762 | + if (!common->curaid) { |
1763 | + ath_print(common, ATH_DBG_BEACON, |
1764 | + "STA is not yet associated..skipping beacon config\n"); |
1765 | + return; |
1766 | + } |
1767 | + |
1768 | memset(&bs, 0, sizeof(bs)); |
1769 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; |
1770 | |
1771 | diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c |
1772 | index 7c64aa5..6661178 100644 |
1773 | --- a/drivers/net/wireless/ath/ath9k/hw.c |
1774 | +++ b/drivers/net/wireless/ath/ath9k/hw.c |
1775 | @@ -380,7 +380,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) |
1776 | ah->config.pcie_clock_req = 0; |
1777 | ah->config.pcie_waen = 0; |
1778 | ah->config.analog_shiftreg = 1; |
1779 | - ah->config.ht_enable = 1; |
1780 | ah->config.ofdm_trig_low = 200; |
1781 | ah->config.ofdm_trig_high = 500; |
1782 | ah->config.cck_trig_high = 200; |
1783 | @@ -392,6 +391,11 @@ static void ath9k_hw_init_config(struct ath_hw *ah) |
1784 | ah->config.spurchans[i][1] = AR_NO_SPUR; |
1785 | } |
1786 | |
1787 | + if (ah->hw_version.devid != AR2427_DEVID_PCIE) |
1788 | + ah->config.ht_enable = 1; |
1789 | + else |
1790 | + ah->config.ht_enable = 0; |
1791 | + |
1792 | ah->config.intr_mitigation = true; |
1793 | |
1794 | /* |
1795 | @@ -590,6 +594,7 @@ static bool ath9k_hw_devid_supported(u16 devid) |
1796 | case AR5416_DEVID_AR9287_PCI: |
1797 | case AR5416_DEVID_AR9287_PCIE: |
1798 | case AR9271_USB: |
1799 | + case AR2427_DEVID_PCIE: |
1800 | return true; |
1801 | default: |
1802 | break; |
1803 | diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h |
1804 | index e2b0c73..33a28ec 100644 |
1805 | --- a/drivers/net/wireless/ath/ath9k/hw.h |
1806 | +++ b/drivers/net/wireless/ath/ath9k/hw.h |
1807 | @@ -40,6 +40,7 @@ |
1808 | #define AR9280_DEVID_PCI 0x0029 |
1809 | #define AR9280_DEVID_PCIE 0x002a |
1810 | #define AR9285_DEVID_PCIE 0x002b |
1811 | +#define AR2427_DEVID_PCIE 0x002c |
1812 | |
1813 | #define AR5416_AR9100_DEVID 0x000b |
1814 | |
1815 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c |
1816 | index 4faafbd..33a1071 100644 |
1817 | --- a/drivers/net/wireless/ath/ath9k/main.c |
1818 | +++ b/drivers/net/wireless/ath/ath9k/main.c |
1819 | @@ -1854,11 +1854,14 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) |
1820 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | |
1821 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
1822 | IEEE80211_HW_SIGNAL_DBM | |
1823 | - IEEE80211_HW_AMPDU_AGGREGATION | |
1824 | IEEE80211_HW_SUPPORTS_PS | |
1825 | IEEE80211_HW_PS_NULLFUNC_STACK | |
1826 | + IEEE80211_HW_REPORTS_TX_ACK_STATUS | |
1827 | IEEE80211_HW_SPECTRUM_MGMT; |
1828 | |
1829 | + if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) |
1830 | + hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; |
1831 | + |
1832 | if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt) |
1833 | hw->flags |= IEEE80211_HW_MFP_CAPABLE; |
1834 | |
1835 | @@ -2679,6 +2682,19 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, |
1836 | mutex_unlock(&sc->mutex); |
1837 | } |
1838 | |
1839 | +void ath9k_enable_ps(struct ath_softc *sc) |
1840 | +{ |
1841 | + sc->ps_enabled = true; |
1842 | + if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { |
1843 | + if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) { |
1844 | + sc->imask |= ATH9K_INT_TIM_TIMER; |
1845 | + ath9k_hw_set_interrupts(sc->sc_ah, |
1846 | + sc->imask); |
1847 | + } |
1848 | + } |
1849 | + ath9k_hw_setrxabort(sc->sc_ah, 1); |
1850 | +} |
1851 | + |
1852 | static int ath9k_config(struct ieee80211_hw *hw, u32 changed) |
1853 | { |
1854 | struct ath_wiphy *aphy = hw->priv; |
1855 | @@ -2732,22 +2748,13 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) |
1856 | if (changed & IEEE80211_CONF_CHANGE_PS) { |
1857 | if (conf->flags & IEEE80211_CONF_PS) { |
1858 | sc->sc_flags |= SC_OP_PS_ENABLED; |
1859 | - if (!(ah->caps.hw_caps & |
1860 | - ATH9K_HW_CAP_AUTOSLEEP)) { |
1861 | - if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) { |
1862 | - sc->imask |= ATH9K_INT_TIM_TIMER; |
1863 | - ath9k_hw_set_interrupts(sc->sc_ah, |
1864 | - sc->imask); |
1865 | - } |
1866 | - } |
1867 | /* |
1868 | * At this point we know hardware has received an ACK |
1869 | * of a previously sent null data frame. |
1870 | */ |
1871 | if ((sc->sc_flags & SC_OP_NULLFUNC_COMPLETED)) { |
1872 | sc->sc_flags &= ~SC_OP_NULLFUNC_COMPLETED; |
1873 | - sc->ps_enabled = true; |
1874 | - ath9k_hw_setrxabort(sc->sc_ah, 1); |
1875 | + ath9k_enable_ps(sc); |
1876 | } |
1877 | } else { |
1878 | sc->ps_enabled = false; |
1879 | diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c |
1880 | index f7af5ea..199c54a 100644 |
1881 | --- a/drivers/net/wireless/ath/ath9k/pci.c |
1882 | +++ b/drivers/net/wireless/ath/ath9k/pci.c |
1883 | @@ -25,6 +25,7 @@ static struct pci_device_id ath_pci_id_table[] __devinitdata = { |
1884 | { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ |
1885 | { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ |
1886 | { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ |
1887 | + { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ |
1888 | { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ |
1889 | { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ |
1890 | { 0 } |
1891 | diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c |
1892 | index 1d6cf7d..171ce2b 100644 |
1893 | --- a/drivers/net/wireless/ath/ath9k/rc.c |
1894 | +++ b/drivers/net/wireless/ath/ath9k/rc.c |
1895 | @@ -1323,7 +1323,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband, |
1896 | |
1897 | static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, |
1898 | struct ieee80211_sta *sta, void *priv_sta, |
1899 | - u32 changed) |
1900 | + u32 changed, enum nl80211_channel_type oper_chan_type) |
1901 | { |
1902 | struct ath_softc *sc = priv; |
1903 | struct ath_rate_priv *ath_rc_priv = priv_sta; |
1904 | @@ -1340,8 +1340,8 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, |
1905 | if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION) |
1906 | return; |
1907 | |
1908 | - if (sc->hw->conf.channel_type == NL80211_CHAN_HT40MINUS || |
1909 | - sc->hw->conf.channel_type == NL80211_CHAN_HT40PLUS) |
1910 | + if (oper_chan_type == NL80211_CHAN_HT40MINUS || |
1911 | + oper_chan_type == NL80211_CHAN_HT40PLUS) |
1912 | oper_cw40 = true; |
1913 | |
1914 | oper_sgi40 = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? |
1915 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c |
1916 | index 29bf336..c3ce920 100644 |
1917 | --- a/drivers/net/wireless/ath/ath9k/xmit.c |
1918 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c |
1919 | @@ -1353,25 +1353,6 @@ static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb) |
1920 | return htype; |
1921 | } |
1922 | |
1923 | -static bool is_pae(struct sk_buff *skb) |
1924 | -{ |
1925 | - struct ieee80211_hdr *hdr; |
1926 | - __le16 fc; |
1927 | - |
1928 | - hdr = (struct ieee80211_hdr *)skb->data; |
1929 | - fc = hdr->frame_control; |
1930 | - |
1931 | - if (ieee80211_is_data(fc)) { |
1932 | - if (ieee80211_is_nullfunc(fc) || |
1933 | - /* Port Access Entity (IEEE 802.1X) */ |
1934 | - (skb->protocol == cpu_to_be16(ETH_P_PAE))) { |
1935 | - return true; |
1936 | - } |
1937 | - } |
1938 | - |
1939 | - return false; |
1940 | -} |
1941 | - |
1942 | static int get_hw_crypto_keytype(struct sk_buff *skb) |
1943 | { |
1944 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
1945 | @@ -1701,7 +1682,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, |
1946 | goto tx_done; |
1947 | } |
1948 | |
1949 | - if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && !is_pae(skb)) { |
1950 | + if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { |
1951 | /* |
1952 | * Try aggregation if it's a unicast data frame |
1953 | * and the destination is HT capable. |
1954 | @@ -2053,10 +2034,9 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) |
1955 | */ |
1956 | if (bf->bf_isnullfunc && |
1957 | (ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) { |
1958 | - if ((sc->sc_flags & SC_OP_PS_ENABLED)) { |
1959 | - sc->ps_enabled = true; |
1960 | - ath9k_hw_setrxabort(sc->sc_ah, 1); |
1961 | - } else |
1962 | + if ((sc->sc_flags & SC_OP_PS_ENABLED)) |
1963 | + ath9k_enable_ps(sc); |
1964 | + else |
1965 | sc->sc_flags |= SC_OP_NULLFUNC_COMPLETED; |
1966 | } |
1967 | |
1968 | @@ -2264,7 +2244,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) |
1969 | if (ATH_TXQ_SETUP(sc, i)) { |
1970 | txq = &sc->tx.txq[i]; |
1971 | |
1972 | - spin_lock(&txq->axq_lock); |
1973 | + spin_lock_bh(&txq->axq_lock); |
1974 | |
1975 | list_for_each_entry_safe(ac, |
1976 | ac_tmp, &txq->axq_acq, list) { |
1977 | @@ -2285,7 +2265,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) |
1978 | } |
1979 | } |
1980 | |
1981 | - spin_unlock(&txq->axq_lock); |
1982 | + spin_unlock_bh(&txq->axq_lock); |
1983 | } |
1984 | } |
1985 | } |
1986 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
1987 | index b59166c..629c166 100644 |
1988 | --- a/drivers/net/wireless/b43/main.c |
1989 | +++ b/drivers/net/wireless/b43/main.c |
1990 | @@ -852,19 +852,16 @@ static void b43_op_update_tkip_key(struct ieee80211_hw *hw, |
1991 | if (B43_WARN_ON(!modparam_hwtkip)) |
1992 | return; |
1993 | |
1994 | - mutex_lock(&wl->mutex); |
1995 | - |
1996 | + /* This is only called from the RX path through mac80211, where |
1997 | + * our mutex is already locked. */ |
1998 | + B43_WARN_ON(!mutex_is_locked(&wl->mutex)); |
1999 | dev = wl->current_dev; |
2000 | - if (!dev || b43_status(dev) < B43_STAT_INITIALIZED) |
2001 | - goto out_unlock; |
2002 | + B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED); |
2003 | |
2004 | keymac_write(dev, index, NULL); /* First zero out mac to avoid race */ |
2005 | |
2006 | rx_tkip_phase1_write(dev, index, iv32, phase1key); |
2007 | keymac_write(dev, index, addr); |
2008 | - |
2009 | -out_unlock: |
2010 | - mutex_unlock(&wl->mutex); |
2011 | } |
2012 | |
2013 | static void do_key_write(struct b43_wldev *dev, |
2014 | diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c |
2015 | index 234891d..e955515 100644 |
2016 | --- a/drivers/net/wireless/iwlwifi/iwl-3945.c |
2017 | +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c |
2018 | @@ -2474,11 +2474,9 @@ int iwl3945_hw_set_hw_params(struct iwl_priv *priv) |
2019 | memset((void *)&priv->hw_params, 0, |
2020 | sizeof(struct iwl_hw_params)); |
2021 | |
2022 | - priv->shared_virt = |
2023 | - pci_alloc_consistent(priv->pci_dev, |
2024 | - sizeof(struct iwl3945_shared), |
2025 | - &priv->shared_phys); |
2026 | - |
2027 | + priv->shared_virt = dma_alloc_coherent(&priv->pci_dev->dev, |
2028 | + sizeof(struct iwl3945_shared), |
2029 | + &priv->shared_phys, GFP_KERNEL); |
2030 | if (!priv->shared_virt) { |
2031 | IWL_ERR(priv, "failed to allocate pci memory\n"); |
2032 | mutex_unlock(&priv->mutex); |
2033 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c |
2034 | index f36f804..6e9e156 100644 |
2035 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c |
2036 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c |
2037 | @@ -1658,9 +1658,9 @@ EXPORT_SYMBOL(iwl_set_tx_power); |
2038 | void iwl_free_isr_ict(struct iwl_priv *priv) |
2039 | { |
2040 | if (priv->ict_tbl_vir) { |
2041 | - pci_free_consistent(priv->pci_dev, (sizeof(u32) * ICT_COUNT) + |
2042 | - PAGE_SIZE, priv->ict_tbl_vir, |
2043 | - priv->ict_tbl_dma); |
2044 | + dma_free_coherent(&priv->pci_dev->dev, |
2045 | + (sizeof(u32) * ICT_COUNT) + PAGE_SIZE, |
2046 | + priv->ict_tbl_vir, priv->ict_tbl_dma); |
2047 | priv->ict_tbl_vir = NULL; |
2048 | } |
2049 | } |
2050 | @@ -1676,9 +1676,9 @@ int iwl_alloc_isr_ict(struct iwl_priv *priv) |
2051 | if (priv->cfg->use_isr_legacy) |
2052 | return 0; |
2053 | /* allocate shrared data table */ |
2054 | - priv->ict_tbl_vir = pci_alloc_consistent(priv->pci_dev, (sizeof(u32) * |
2055 | - ICT_COUNT) + PAGE_SIZE, |
2056 | - &priv->ict_tbl_dma); |
2057 | + priv->ict_tbl_vir = dma_alloc_coherent(&priv->pci_dev->dev, |
2058 | + (sizeof(u32) * ICT_COUNT) + PAGE_SIZE, |
2059 | + &priv->ict_tbl_dma, GFP_KERNEL); |
2060 | if (!priv->ict_tbl_vir) |
2061 | return -ENOMEM; |
2062 | |
2063 | diff --git a/drivers/net/wireless/iwlwifi/iwl-helpers.h b/drivers/net/wireless/iwlwifi/iwl-helpers.h |
2064 | index bd0b12e..f8481e8 100644 |
2065 | --- a/drivers/net/wireless/iwlwifi/iwl-helpers.h |
2066 | +++ b/drivers/net/wireless/iwlwifi/iwl-helpers.h |
2067 | @@ -80,8 +80,8 @@ static inline void iwl_free_fw_desc(struct pci_dev *pci_dev, |
2068 | struct fw_desc *desc) |
2069 | { |
2070 | if (desc->v_addr) |
2071 | - pci_free_consistent(pci_dev, desc->len, |
2072 | - desc->v_addr, desc->p_addr); |
2073 | + dma_free_coherent(&pci_dev->dev, desc->len, |
2074 | + desc->v_addr, desc->p_addr); |
2075 | desc->v_addr = NULL; |
2076 | desc->len = 0; |
2077 | } |
2078 | @@ -89,7 +89,8 @@ static inline void iwl_free_fw_desc(struct pci_dev *pci_dev, |
2079 | static inline int iwl_alloc_fw_desc(struct pci_dev *pci_dev, |
2080 | struct fw_desc *desc) |
2081 | { |
2082 | - desc->v_addr = pci_alloc_consistent(pci_dev, desc->len, &desc->p_addr); |
2083 | + desc->v_addr = dma_alloc_coherent(&pci_dev->dev, desc->len, |
2084 | + &desc->p_addr, GFP_KERNEL); |
2085 | return (desc->v_addr != NULL) ? 0 : -ENOMEM; |
2086 | } |
2087 | |
2088 | diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c |
2089 | index 2dbce85..4ac16d9 100644 |
2090 | --- a/drivers/net/wireless/iwlwifi/iwl-rx.c |
2091 | +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c |
2092 | @@ -350,10 +350,10 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) |
2093 | } |
2094 | } |
2095 | |
2096 | - pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2097 | - rxq->dma_addr); |
2098 | - pci_free_consistent(priv->pci_dev, sizeof(struct iwl_rb_status), |
2099 | - rxq->rb_stts, rxq->rb_stts_dma); |
2100 | + dma_free_coherent(&priv->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2101 | + rxq->dma_addr); |
2102 | + dma_free_coherent(&priv->pci_dev->dev, sizeof(struct iwl_rb_status), |
2103 | + rxq->rb_stts, rxq->rb_stts_dma); |
2104 | rxq->bd = NULL; |
2105 | rxq->rb_stts = NULL; |
2106 | } |
2107 | @@ -362,7 +362,7 @@ EXPORT_SYMBOL(iwl_rx_queue_free); |
2108 | int iwl_rx_queue_alloc(struct iwl_priv *priv) |
2109 | { |
2110 | struct iwl_rx_queue *rxq = &priv->rxq; |
2111 | - struct pci_dev *dev = priv->pci_dev; |
2112 | + struct device *dev = &priv->pci_dev->dev; |
2113 | int i; |
2114 | |
2115 | spin_lock_init(&rxq->lock); |
2116 | @@ -370,12 +370,13 @@ int iwl_rx_queue_alloc(struct iwl_priv *priv) |
2117 | INIT_LIST_HEAD(&rxq->rx_used); |
2118 | |
2119 | /* Alloc the circular buffer of Read Buffer Descriptors (RBDs) */ |
2120 | - rxq->bd = pci_alloc_consistent(dev, 4 * RX_QUEUE_SIZE, &rxq->dma_addr); |
2121 | + rxq->bd = dma_alloc_coherent(dev, 4 * RX_QUEUE_SIZE, &rxq->dma_addr, |
2122 | + GFP_KERNEL); |
2123 | if (!rxq->bd) |
2124 | goto err_bd; |
2125 | |
2126 | - rxq->rb_stts = pci_alloc_consistent(dev, sizeof(struct iwl_rb_status), |
2127 | - &rxq->rb_stts_dma); |
2128 | + rxq->rb_stts = dma_alloc_coherent(dev, sizeof(struct iwl_rb_status), |
2129 | + &rxq->rb_stts_dma, GFP_KERNEL); |
2130 | if (!rxq->rb_stts) |
2131 | goto err_rb; |
2132 | |
2133 | @@ -392,8 +393,8 @@ int iwl_rx_queue_alloc(struct iwl_priv *priv) |
2134 | return 0; |
2135 | |
2136 | err_rb: |
2137 | - pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2138 | - rxq->dma_addr); |
2139 | + dma_free_coherent(&priv->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2140 | + rxq->dma_addr); |
2141 | err_bd: |
2142 | return -ENOMEM; |
2143 | } |
2144 | diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c |
2145 | index 8f40715..88470fb 100644 |
2146 | --- a/drivers/net/wireless/iwlwifi/iwl-tx.c |
2147 | +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c |
2148 | @@ -60,7 +60,8 @@ static const u16 default_tid_to_tx_fifo[] = { |
2149 | static inline int iwl_alloc_dma_ptr(struct iwl_priv *priv, |
2150 | struct iwl_dma_ptr *ptr, size_t size) |
2151 | { |
2152 | - ptr->addr = pci_alloc_consistent(priv->pci_dev, size, &ptr->dma); |
2153 | + ptr->addr = dma_alloc_coherent(&priv->pci_dev->dev, size, &ptr->dma, |
2154 | + GFP_KERNEL); |
2155 | if (!ptr->addr) |
2156 | return -ENOMEM; |
2157 | ptr->size = size; |
2158 | @@ -73,7 +74,7 @@ static inline void iwl_free_dma_ptr(struct iwl_priv *priv, |
2159 | if (unlikely(!ptr->addr)) |
2160 | return; |
2161 | |
2162 | - pci_free_consistent(priv->pci_dev, ptr->size, ptr->addr, ptr->dma); |
2163 | + dma_free_coherent(&priv->pci_dev->dev, ptr->size, ptr->addr, ptr->dma); |
2164 | memset(ptr, 0, sizeof(*ptr)); |
2165 | } |
2166 | |
2167 | @@ -126,7 +127,7 @@ void iwl_free_tfds_in_queue(struct iwl_priv *priv, |
2168 | if (priv->stations[sta_id].tid[tid].tfds_in_queue >= freed) |
2169 | priv->stations[sta_id].tid[tid].tfds_in_queue -= freed; |
2170 | else { |
2171 | - IWL_ERR(priv, "free more than tfds_in_queue (%u:%d)\n", |
2172 | + IWL_DEBUG_TX(priv, "free more than tfds_in_queue (%u:%d)\n", |
2173 | priv->stations[sta_id].tid[tid].tfds_in_queue, |
2174 | freed); |
2175 | priv->stations[sta_id].tid[tid].tfds_in_queue = 0; |
2176 | @@ -146,7 +147,7 @@ void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id) |
2177 | { |
2178 | struct iwl_tx_queue *txq = &priv->txq[txq_id]; |
2179 | struct iwl_queue *q = &txq->q; |
2180 | - struct pci_dev *dev = priv->pci_dev; |
2181 | + struct device *dev = &priv->pci_dev->dev; |
2182 | int i; |
2183 | |
2184 | if (q->n_bd == 0) |
2185 | @@ -163,8 +164,8 @@ void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id) |
2186 | |
2187 | /* De-alloc circular buffer of TFDs */ |
2188 | if (txq->q.n_bd) |
2189 | - pci_free_consistent(dev, priv->hw_params.tfd_size * |
2190 | - txq->q.n_bd, txq->tfds, txq->q.dma_addr); |
2191 | + dma_free_coherent(dev, priv->hw_params.tfd_size * |
2192 | + txq->q.n_bd, txq->tfds, txq->q.dma_addr); |
2193 | |
2194 | /* De-alloc array of per-TFD driver data */ |
2195 | kfree(txq->txb); |
2196 | @@ -193,7 +194,7 @@ void iwl_cmd_queue_free(struct iwl_priv *priv) |
2197 | { |
2198 | struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; |
2199 | struct iwl_queue *q = &txq->q; |
2200 | - struct pci_dev *dev = priv->pci_dev; |
2201 | + struct device *dev = &priv->pci_dev->dev; |
2202 | int i; |
2203 | |
2204 | if (q->n_bd == 0) |
2205 | @@ -205,8 +206,8 @@ void iwl_cmd_queue_free(struct iwl_priv *priv) |
2206 | |
2207 | /* De-alloc circular buffer of TFDs */ |
2208 | if (txq->q.n_bd) |
2209 | - pci_free_consistent(dev, priv->hw_params.tfd_size * |
2210 | - txq->q.n_bd, txq->tfds, txq->q.dma_addr); |
2211 | + dma_free_coherent(dev, priv->hw_params.tfd_size * txq->q.n_bd, |
2212 | + txq->tfds, txq->q.dma_addr); |
2213 | |
2214 | /* deallocate arrays */ |
2215 | kfree(txq->cmd); |
2216 | @@ -297,7 +298,7 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q, |
2217 | static int iwl_tx_queue_alloc(struct iwl_priv *priv, |
2218 | struct iwl_tx_queue *txq, u32 id) |
2219 | { |
2220 | - struct pci_dev *dev = priv->pci_dev; |
2221 | + struct device *dev = &priv->pci_dev->dev; |
2222 | size_t tfd_sz = priv->hw_params.tfd_size * TFD_QUEUE_SIZE_MAX; |
2223 | |
2224 | /* Driver private data, only for Tx (not command) queues, |
2225 | @@ -316,8 +317,8 @@ static int iwl_tx_queue_alloc(struct iwl_priv *priv, |
2226 | |
2227 | /* Circular buffer of transmit frame descriptors (TFDs), |
2228 | * shared with device */ |
2229 | - txq->tfds = pci_alloc_consistent(dev, tfd_sz, &txq->q.dma_addr); |
2230 | - |
2231 | + txq->tfds = dma_alloc_coherent(dev, tfd_sz, &txq->q.dma_addr, |
2232 | + GFP_KERNEL); |
2233 | if (!txq->tfds) { |
2234 | IWL_ERR(priv, "pci_alloc_consistent(%zd) failed\n", tfd_sz); |
2235 | goto error; |
2236 | diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c |
2237 | index f8e4e4b..f297865 100644 |
2238 | --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c |
2239 | +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c |
2240 | @@ -352,10 +352,10 @@ static int iwl3945_send_beacon_cmd(struct iwl_priv *priv) |
2241 | static void iwl3945_unset_hw_params(struct iwl_priv *priv) |
2242 | { |
2243 | if (priv->shared_virt) |
2244 | - pci_free_consistent(priv->pci_dev, |
2245 | - sizeof(struct iwl3945_shared), |
2246 | - priv->shared_virt, |
2247 | - priv->shared_phys); |
2248 | + dma_free_coherent(&priv->pci_dev->dev, |
2249 | + sizeof(struct iwl3945_shared), |
2250 | + priv->shared_virt, |
2251 | + priv->shared_phys); |
2252 | } |
2253 | |
2254 | static void iwl3945_build_tx_cmd_hwcrypto(struct iwl_priv *priv, |
2255 | @@ -1253,10 +1253,10 @@ static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rx |
2256 | } |
2257 | } |
2258 | |
2259 | - pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2260 | - rxq->dma_addr); |
2261 | - pci_free_consistent(priv->pci_dev, sizeof(struct iwl_rb_status), |
2262 | - rxq->rb_stts, rxq->rb_stts_dma); |
2263 | + dma_free_coherent(&priv->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, |
2264 | + rxq->dma_addr); |
2265 | + dma_free_coherent(&priv->pci_dev->dev, sizeof(struct iwl_rb_status), |
2266 | + rxq->rb_stts, rxq->rb_stts_dma); |
2267 | rxq->bd = NULL; |
2268 | rxq->rb_stts = NULL; |
2269 | } |
2270 | diff --git a/drivers/net/wireless/wl12xx/wl1251_debugfs.c b/drivers/net/wireless/wl12xx/wl1251_debugfs.c |
2271 | index a007230..1685c09 100644 |
2272 | --- a/drivers/net/wireless/wl12xx/wl1251_debugfs.c |
2273 | +++ b/drivers/net/wireless/wl12xx/wl1251_debugfs.c |
2274 | @@ -443,7 +443,8 @@ out: |
2275 | |
2276 | void wl1251_debugfs_reset(struct wl1251 *wl) |
2277 | { |
2278 | - memset(wl->stats.fw_stats, 0, sizeof(*wl->stats.fw_stats)); |
2279 | + if (wl->stats.fw_stats != NULL) |
2280 | + memset(wl->stats.fw_stats, 0, sizeof(*wl->stats.fw_stats)); |
2281 | wl->stats.retry_count = 0; |
2282 | wl->stats.excessive_retries = 0; |
2283 | } |
2284 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
2285 | index 315fea4..3245d33 100644 |
2286 | --- a/drivers/pci/pci.c |
2287 | +++ b/drivers/pci/pci.c |
2288 | @@ -2421,18 +2421,17 @@ EXPORT_SYMBOL_GPL(pci_reset_function); |
2289 | */ |
2290 | int pcix_get_max_mmrbc(struct pci_dev *dev) |
2291 | { |
2292 | - int err, cap; |
2293 | + int cap; |
2294 | u32 stat; |
2295 | |
2296 | cap = pci_find_capability(dev, PCI_CAP_ID_PCIX); |
2297 | if (!cap) |
2298 | return -EINVAL; |
2299 | |
2300 | - err = pci_read_config_dword(dev, cap + PCI_X_STATUS, &stat); |
2301 | - if (err) |
2302 | + if (pci_read_config_dword(dev, cap + PCI_X_STATUS, &stat)) |
2303 | return -EINVAL; |
2304 | |
2305 | - return (stat & PCI_X_STATUS_MAX_READ) >> 12; |
2306 | + return 512 << ((stat & PCI_X_STATUS_MAX_READ) >> 21); |
2307 | } |
2308 | EXPORT_SYMBOL(pcix_get_max_mmrbc); |
2309 | |
2310 | @@ -2445,18 +2444,17 @@ EXPORT_SYMBOL(pcix_get_max_mmrbc); |
2311 | */ |
2312 | int pcix_get_mmrbc(struct pci_dev *dev) |
2313 | { |
2314 | - int ret, cap; |
2315 | - u32 cmd; |
2316 | + int cap; |
2317 | + u16 cmd; |
2318 | |
2319 | cap = pci_find_capability(dev, PCI_CAP_ID_PCIX); |
2320 | if (!cap) |
2321 | return -EINVAL; |
2322 | |
2323 | - ret = pci_read_config_dword(dev, cap + PCI_X_CMD, &cmd); |
2324 | - if (!ret) |
2325 | - ret = 512 << ((cmd & PCI_X_CMD_MAX_READ) >> 2); |
2326 | + if (pci_read_config_word(dev, cap + PCI_X_CMD, &cmd)) |
2327 | + return -EINVAL; |
2328 | |
2329 | - return ret; |
2330 | + return 512 << ((cmd & PCI_X_CMD_MAX_READ) >> 2); |
2331 | } |
2332 | EXPORT_SYMBOL(pcix_get_mmrbc); |
2333 | |
2334 | @@ -2471,28 +2469,27 @@ EXPORT_SYMBOL(pcix_get_mmrbc); |
2335 | */ |
2336 | int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc) |
2337 | { |
2338 | - int cap, err = -EINVAL; |
2339 | - u32 stat, cmd, v, o; |
2340 | + int cap; |
2341 | + u32 stat, v, o; |
2342 | + u16 cmd; |
2343 | |
2344 | if (mmrbc < 512 || mmrbc > 4096 || !is_power_of_2(mmrbc)) |
2345 | - goto out; |
2346 | + return -EINVAL; |
2347 | |
2348 | v = ffs(mmrbc) - 10; |
2349 | |
2350 | cap = pci_find_capability(dev, PCI_CAP_ID_PCIX); |
2351 | if (!cap) |
2352 | - goto out; |
2353 | + return -EINVAL; |
2354 | |
2355 | - err = pci_read_config_dword(dev, cap + PCI_X_STATUS, &stat); |
2356 | - if (err) |
2357 | - goto out; |
2358 | + if (pci_read_config_dword(dev, cap + PCI_X_STATUS, &stat)) |
2359 | + return -EINVAL; |
2360 | |
2361 | if (v > (stat & PCI_X_STATUS_MAX_READ) >> 21) |
2362 | return -E2BIG; |
2363 | |
2364 | - err = pci_read_config_dword(dev, cap + PCI_X_CMD, &cmd); |
2365 | - if (err) |
2366 | - goto out; |
2367 | + if (pci_read_config_word(dev, cap + PCI_X_CMD, &cmd)) |
2368 | + return -EINVAL; |
2369 | |
2370 | o = (cmd & PCI_X_CMD_MAX_READ) >> 2; |
2371 | if (o != v) { |
2372 | @@ -2502,10 +2499,10 @@ int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc) |
2373 | |
2374 | cmd &= ~PCI_X_CMD_MAX_READ; |
2375 | cmd |= v << 2; |
2376 | - err = pci_write_config_dword(dev, cap + PCI_X_CMD, cmd); |
2377 | + if (pci_write_config_word(dev, cap + PCI_X_CMD, cmd)) |
2378 | + return -EIO; |
2379 | } |
2380 | -out: |
2381 | - return err; |
2382 | + return 0; |
2383 | } |
2384 | EXPORT_SYMBOL(pcix_set_mmrbc); |
2385 | |
2386 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
2387 | index d58b940..456c265 100644 |
2388 | --- a/drivers/pci/quirks.c |
2389 | +++ b/drivers/pci/quirks.c |
2390 | @@ -2534,6 +2534,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e7, quirk_i82576_sriov); |
2391 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x10e8, quirk_i82576_sriov); |
2392 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150a, quirk_i82576_sriov); |
2393 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x150d, quirk_i82576_sriov); |
2394 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1518, quirk_i82576_sriov); |
2395 | |
2396 | #endif /* CONFIG_PCI_IOV */ |
2397 | |
2398 | diff --git a/drivers/platform/x86/classmate-laptop.c b/drivers/platform/x86/classmate-laptop.c |
2399 | index ed90082..8cb20e4 100644 |
2400 | --- a/drivers/platform/x86/classmate-laptop.c |
2401 | +++ b/drivers/platform/x86/classmate-laptop.c |
2402 | @@ -34,6 +34,11 @@ struct cmpc_accel { |
2403 | #define CMPC_ACCEL_SENSITIVITY_DEFAULT 5 |
2404 | |
2405 | |
2406 | +#define CMPC_ACCEL_HID "ACCE0000" |
2407 | +#define CMPC_TABLET_HID "TBLT0000" |
2408 | +#define CMPC_BL_HID "IPML200" |
2409 | +#define CMPC_KEYS_HID "FnBT0000" |
2410 | + |
2411 | /* |
2412 | * Generic input device code. |
2413 | */ |
2414 | @@ -282,10 +287,9 @@ static int cmpc_accel_remove(struct acpi_device *acpi, int type) |
2415 | } |
2416 | |
2417 | static const struct acpi_device_id cmpc_accel_device_ids[] = { |
2418 | - {"ACCE0000", 0}, |
2419 | + {CMPC_ACCEL_HID, 0}, |
2420 | {"", 0} |
2421 | }; |
2422 | -MODULE_DEVICE_TABLE(acpi, cmpc_accel_device_ids); |
2423 | |
2424 | static struct acpi_driver cmpc_accel_acpi_driver = { |
2425 | .owner = THIS_MODULE, |
2426 | @@ -366,10 +370,9 @@ static int cmpc_tablet_resume(struct acpi_device *acpi) |
2427 | } |
2428 | |
2429 | static const struct acpi_device_id cmpc_tablet_device_ids[] = { |
2430 | - {"TBLT0000", 0}, |
2431 | + {CMPC_TABLET_HID, 0}, |
2432 | {"", 0} |
2433 | }; |
2434 | -MODULE_DEVICE_TABLE(acpi, cmpc_tablet_device_ids); |
2435 | |
2436 | static struct acpi_driver cmpc_tablet_acpi_driver = { |
2437 | .owner = THIS_MODULE, |
2438 | @@ -477,17 +480,16 @@ static int cmpc_bl_remove(struct acpi_device *acpi, int type) |
2439 | return 0; |
2440 | } |
2441 | |
2442 | -static const struct acpi_device_id cmpc_device_ids[] = { |
2443 | - {"IPML200", 0}, |
2444 | +static const struct acpi_device_id cmpc_bl_device_ids[] = { |
2445 | + {CMPC_BL_HID, 0}, |
2446 | {"", 0} |
2447 | }; |
2448 | -MODULE_DEVICE_TABLE(acpi, cmpc_device_ids); |
2449 | |
2450 | static struct acpi_driver cmpc_bl_acpi_driver = { |
2451 | .owner = THIS_MODULE, |
2452 | .name = "cmpc", |
2453 | .class = "cmpc", |
2454 | - .ids = cmpc_device_ids, |
2455 | + .ids = cmpc_bl_device_ids, |
2456 | .ops = { |
2457 | .add = cmpc_bl_add, |
2458 | .remove = cmpc_bl_remove |
2459 | @@ -540,10 +542,9 @@ static int cmpc_keys_remove(struct acpi_device *acpi, int type) |
2460 | } |
2461 | |
2462 | static const struct acpi_device_id cmpc_keys_device_ids[] = { |
2463 | - {"FnBT0000", 0}, |
2464 | + {CMPC_KEYS_HID, 0}, |
2465 | {"", 0} |
2466 | }; |
2467 | -MODULE_DEVICE_TABLE(acpi, cmpc_keys_device_ids); |
2468 | |
2469 | static struct acpi_driver cmpc_keys_acpi_driver = { |
2470 | .owner = THIS_MODULE, |
2471 | @@ -607,3 +608,13 @@ static void cmpc_exit(void) |
2472 | |
2473 | module_init(cmpc_init); |
2474 | module_exit(cmpc_exit); |
2475 | + |
2476 | +static const struct acpi_device_id cmpc_device_ids[] = { |
2477 | + {CMPC_ACCEL_HID, 0}, |
2478 | + {CMPC_TABLET_HID, 0}, |
2479 | + {CMPC_BL_HID, 0}, |
2480 | + {CMPC_KEYS_HID, 0}, |
2481 | + {"", 0} |
2482 | +}; |
2483 | + |
2484 | +MODULE_DEVICE_TABLE(acpi, cmpc_device_ids); |
2485 | diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c |
2486 | index fa34b92..1b82170 100644 |
2487 | --- a/drivers/scsi/qlogicpti.c |
2488 | +++ b/drivers/scsi/qlogicpti.c |
2489 | @@ -738,7 +738,7 @@ static int __devinit qpti_register_irq(struct qlogicpti *qpti) |
2490 | * sanely maintain. |
2491 | */ |
2492 | if (request_irq(qpti->irq, qpti_intr, |
2493 | - IRQF_SHARED, "Qlogic/PTI", qpti)) |
2494 | + IRQF_SHARED, "QlogicPTI", qpti)) |
2495 | goto fail; |
2496 | |
2497 | printk("qlogicpti%d: IRQ %d ", qpti->qpti_id, qpti->irq); |
2498 | diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c |
2499 | index 653f22a..bb8fd5b 100644 |
2500 | --- a/drivers/scsi/scsi_transport_fc.c |
2501 | +++ b/drivers/scsi/scsi_transport_fc.c |
2502 | @@ -1216,6 +1216,15 @@ store_fc_vport_delete(struct device *dev, struct device_attribute *attr, |
2503 | { |
2504 | struct fc_vport *vport = transport_class_to_vport(dev); |
2505 | struct Scsi_Host *shost = vport_to_shost(vport); |
2506 | + unsigned long flags; |
2507 | + |
2508 | + spin_lock_irqsave(shost->host_lock, flags); |
2509 | + if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) { |
2510 | + spin_unlock_irqrestore(shost->host_lock, flags); |
2511 | + return -EBUSY; |
2512 | + } |
2513 | + vport->flags |= FC_VPORT_DELETING; |
2514 | + spin_unlock_irqrestore(shost->host_lock, flags); |
2515 | |
2516 | fc_queue_work(shost, &vport->vport_delete_work); |
2517 | return count; |
2518 | @@ -1805,6 +1814,9 @@ store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr, |
2519 | list_for_each_entry(vport, &fc_host->vports, peers) { |
2520 | if ((vport->channel == 0) && |
2521 | (vport->port_name == wwpn) && (vport->node_name == wwnn)) { |
2522 | + if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) |
2523 | + break; |
2524 | + vport->flags |= FC_VPORT_DELETING; |
2525 | match = 1; |
2526 | break; |
2527 | } |
2528 | @@ -3354,18 +3366,6 @@ fc_vport_terminate(struct fc_vport *vport) |
2529 | unsigned long flags; |
2530 | int stat; |
2531 | |
2532 | - spin_lock_irqsave(shost->host_lock, flags); |
2533 | - if (vport->flags & FC_VPORT_CREATING) { |
2534 | - spin_unlock_irqrestore(shost->host_lock, flags); |
2535 | - return -EBUSY; |
2536 | - } |
2537 | - if (vport->flags & (FC_VPORT_DEL)) { |
2538 | - spin_unlock_irqrestore(shost->host_lock, flags); |
2539 | - return -EALREADY; |
2540 | - } |
2541 | - vport->flags |= FC_VPORT_DELETING; |
2542 | - spin_unlock_irqrestore(shost->host_lock, flags); |
2543 | - |
2544 | if (i->f->vport_delete) |
2545 | stat = i->f->vport_delete(vport); |
2546 | else |
2547 | diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c |
2548 | index 55b034b..3c8a024 100644 |
2549 | --- a/drivers/scsi/ses.c |
2550 | +++ b/drivers/scsi/ses.c |
2551 | @@ -591,8 +591,6 @@ static int ses_intf_add(struct device *cdev, |
2552 | ses_dev->page10_len = len; |
2553 | buf = NULL; |
2554 | } |
2555 | - kfree(hdr_buf); |
2556 | - |
2557 | scomp = kzalloc(sizeof(struct ses_component) * components, GFP_KERNEL); |
2558 | if (!scomp) |
2559 | goto err_free; |
2560 | @@ -604,6 +602,8 @@ static int ses_intf_add(struct device *cdev, |
2561 | goto err_free; |
2562 | } |
2563 | |
2564 | + kfree(hdr_buf); |
2565 | + |
2566 | edev->scratch = ses_dev; |
2567 | for (i = 0; i < components; i++) |
2568 | edev->component[i].scratch = scomp + i; |
2569 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
2570 | index a678186..4fd67d6 100644 |
2571 | --- a/drivers/usb/core/devio.c |
2572 | +++ b/drivers/usb/core/devio.c |
2573 | @@ -1176,6 +1176,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, |
2574 | free_async(as); |
2575 | return -ENOMEM; |
2576 | } |
2577 | + /* Isochronous input data may end up being discontiguous |
2578 | + * if some of the packets are short. Clear the buffer so |
2579 | + * that the gaps don't leak kernel data to userspace. |
2580 | + */ |
2581 | + if (is_in && uurb->type == USBDEVFS_URB_TYPE_ISO) |
2582 | + memset(as->urb->transfer_buffer, 0, |
2583 | + uurb->buffer_length); |
2584 | } |
2585 | as->urb->dev = ps->dev; |
2586 | as->urb->pipe = (uurb->type << 30) | |
2587 | @@ -1312,10 +1319,14 @@ static int processcompl(struct async *as, void __user * __user *arg) |
2588 | void __user *addr = as->userurb; |
2589 | unsigned int i; |
2590 | |
2591 | - if (as->userbuffer && urb->actual_length) |
2592 | - if (copy_to_user(as->userbuffer, urb->transfer_buffer, |
2593 | - urb->actual_length)) |
2594 | + if (as->userbuffer && urb->actual_length) { |
2595 | + if (urb->number_of_packets > 0) /* Isochronous */ |
2596 | + i = urb->transfer_buffer_length; |
2597 | + else /* Non-Isoc */ |
2598 | + i = urb->actual_length; |
2599 | + if (copy_to_user(as->userbuffer, urb->transfer_buffer, i)) |
2600 | goto err_out; |
2601 | + } |
2602 | if (put_user(as->status, &userurb->status)) |
2603 | goto err_out; |
2604 | if (put_user(urb->actual_length, &userurb->actual_length)) |
2605 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
2606 | index 1ec3857..9c90b67 100644 |
2607 | --- a/drivers/usb/host/ehci-hcd.c |
2608 | +++ b/drivers/usb/host/ehci-hcd.c |
2609 | @@ -995,7 +995,7 @@ rescan: |
2610 | /* endpoints can be iso streams. for now, we don't |
2611 | * accelerate iso completions ... so spin a while. |
2612 | */ |
2613 | - if (qh->hw->hw_info1 == 0) { |
2614 | + if (qh->hw == NULL) { |
2615 | ehci_vdbg (ehci, "iso delay\n"); |
2616 | goto idle_timeout; |
2617 | } |
2618 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
2619 | index 1e391e6..df533ce 100644 |
2620 | --- a/drivers/usb/host/ehci-sched.c |
2621 | +++ b/drivers/usb/host/ehci-sched.c |
2622 | @@ -1121,8 +1121,8 @@ iso_stream_find (struct ehci_hcd *ehci, struct urb *urb) |
2623 | urb->interval); |
2624 | } |
2625 | |
2626 | - /* if dev->ep [epnum] is a QH, info1.maxpacket is nonzero */ |
2627 | - } else if (unlikely (stream->hw_info1 != 0)) { |
2628 | + /* if dev->ep [epnum] is a QH, hw is set */ |
2629 | + } else if (unlikely (stream->hw != NULL)) { |
2630 | ehci_dbg (ehci, "dev %s ep%d%s, not iso??\n", |
2631 | urb->dev->devpath, epnum, |
2632 | usb_pipein(urb->pipe) ? "in" : "out"); |
2633 | @@ -1563,13 +1563,27 @@ itd_patch( |
2634 | static inline void |
2635 | itd_link (struct ehci_hcd *ehci, unsigned frame, struct ehci_itd *itd) |
2636 | { |
2637 | - /* always prepend ITD/SITD ... only QH tree is order-sensitive */ |
2638 | - itd->itd_next = ehci->pshadow [frame]; |
2639 | - itd->hw_next = ehci->periodic [frame]; |
2640 | - ehci->pshadow [frame].itd = itd; |
2641 | + union ehci_shadow *prev = &ehci->pshadow[frame]; |
2642 | + __hc32 *hw_p = &ehci->periodic[frame]; |
2643 | + union ehci_shadow here = *prev; |
2644 | + __hc32 type = 0; |
2645 | + |
2646 | + /* skip any iso nodes which might belong to previous microframes */ |
2647 | + while (here.ptr) { |
2648 | + type = Q_NEXT_TYPE(ehci, *hw_p); |
2649 | + if (type == cpu_to_hc32(ehci, Q_TYPE_QH)) |
2650 | + break; |
2651 | + prev = periodic_next_shadow(ehci, prev, type); |
2652 | + hw_p = shadow_next_periodic(ehci, &here, type); |
2653 | + here = *prev; |
2654 | + } |
2655 | + |
2656 | + itd->itd_next = here; |
2657 | + itd->hw_next = *hw_p; |
2658 | + prev->itd = itd; |
2659 | itd->frame = frame; |
2660 | wmb (); |
2661 | - ehci->periodic[frame] = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD); |
2662 | + *hw_p = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD); |
2663 | } |
2664 | |
2665 | /* fit urb's itds into the selected schedule slot; activate as needed */ |
2666 | diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h |
2667 | index 2d85e21..b1dce96 100644 |
2668 | --- a/drivers/usb/host/ehci.h |
2669 | +++ b/drivers/usb/host/ehci.h |
2670 | @@ -394,9 +394,8 @@ struct ehci_iso_sched { |
2671 | * acts like a qh would, if EHCI had them for ISO. |
2672 | */ |
2673 | struct ehci_iso_stream { |
2674 | - /* first two fields match QH, but info1 == 0 */ |
2675 | - __hc32 hw_next; |
2676 | - __hc32 hw_info1; |
2677 | + /* first field matches ehci_hq, but is NULL */ |
2678 | + struct ehci_qh_hw *hw; |
2679 | |
2680 | u32 refcount; |
2681 | u8 bEndpointAddress; |
2682 | diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c |
2683 | index bee558a..f71a73a 100644 |
2684 | --- a/drivers/usb/host/r8a66597-hcd.c |
2685 | +++ b/drivers/usb/host/r8a66597-hcd.c |
2686 | @@ -418,7 +418,7 @@ static u8 alloc_usb_address(struct r8a66597 *r8a66597, struct urb *urb) |
2687 | |
2688 | /* this function must be called with interrupt disabled */ |
2689 | static void free_usb_address(struct r8a66597 *r8a66597, |
2690 | - struct r8a66597_device *dev) |
2691 | + struct r8a66597_device *dev, int reset) |
2692 | { |
2693 | int port; |
2694 | |
2695 | @@ -430,7 +430,13 @@ static void free_usb_address(struct r8a66597 *r8a66597, |
2696 | dev->state = USB_STATE_DEFAULT; |
2697 | r8a66597->address_map &= ~(1 << dev->address); |
2698 | dev->address = 0; |
2699 | - dev_set_drvdata(&dev->udev->dev, NULL); |
2700 | + /* |
2701 | + * Only when resetting USB, it is necessary to erase drvdata. When |
2702 | + * a usb device with usb hub is disconnect, "dev->udev" is already |
2703 | + * freed on usb_desconnect(). So we cannot access the data. |
2704 | + */ |
2705 | + if (reset) |
2706 | + dev_set_drvdata(&dev->udev->dev, NULL); |
2707 | list_del(&dev->device_list); |
2708 | kfree(dev); |
2709 | |
2710 | @@ -1069,7 +1075,7 @@ static void r8a66597_usb_disconnect(struct r8a66597 *r8a66597, int port) |
2711 | struct r8a66597_device *dev = r8a66597->root_hub[port].dev; |
2712 | |
2713 | disable_r8a66597_pipe_all(r8a66597, dev); |
2714 | - free_usb_address(r8a66597, dev); |
2715 | + free_usb_address(r8a66597, dev, 0); |
2716 | |
2717 | start_root_hub_sampling(r8a66597, port, 0); |
2718 | } |
2719 | @@ -2085,7 +2091,7 @@ static void update_usb_address_map(struct r8a66597 *r8a66597, |
2720 | spin_lock_irqsave(&r8a66597->lock, flags); |
2721 | dev = get_r8a66597_device(r8a66597, addr); |
2722 | disable_r8a66597_pipe_all(r8a66597, dev); |
2723 | - free_usb_address(r8a66597, dev); |
2724 | + free_usb_address(r8a66597, dev, 0); |
2725 | put_child_connect_map(r8a66597, addr); |
2726 | spin_unlock_irqrestore(&r8a66597->lock, flags); |
2727 | } |
2728 | @@ -2228,7 +2234,7 @@ static int r8a66597_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
2729 | rh->port |= (1 << USB_PORT_FEAT_RESET); |
2730 | |
2731 | disable_r8a66597_pipe_all(r8a66597, dev); |
2732 | - free_usb_address(r8a66597, dev); |
2733 | + free_usb_address(r8a66597, dev, 1); |
2734 | |
2735 | r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, |
2736 | get_dvstctr_reg(port)); |
2737 | diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c |
2738 | index 5e92c72..fa920c7 100644 |
2739 | --- a/drivers/usb/host/xhci-hcd.c |
2740 | +++ b/drivers/usb/host/xhci-hcd.c |
2741 | @@ -1173,6 +1173,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
2742 | cmd_completion = &virt_dev->cmd_completion; |
2743 | cmd_status = &virt_dev->cmd_status; |
2744 | } |
2745 | + init_completion(cmd_completion); |
2746 | |
2747 | if (!ctx_change) |
2748 | ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma, |
2749 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
2750 | index 34acf6c..ca9e3ba 100644 |
2751 | --- a/drivers/usb/serial/ftdi_sio.c |
2752 | +++ b/drivers/usb/serial/ftdi_sio.c |
2753 | @@ -658,6 +658,7 @@ static struct usb_device_id id_table_combined [] = { |
2754 | { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, |
2755 | { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, |
2756 | { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, |
2757 | + { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, |
2758 | { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, |
2759 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, |
2760 | { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, |
2761 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
2762 | index d10b5a8..8f9e805 100644 |
2763 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
2764 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
2765 | @@ -501,6 +501,13 @@ |
2766 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ |
2767 | |
2768 | /* |
2769 | + * Contec products (http://www.contec.com) |
2770 | + * Submitted by Daniel Sangorrin |
2771 | + */ |
2772 | +#define CONTEC_VID 0x06CE /* Vendor ID */ |
2773 | +#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ |
2774 | + |
2775 | +/* |
2776 | * Definitions for B&B Electronics products. |
2777 | */ |
2778 | #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ |
2779 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
2780 | index 6e94a67..d93283d 100644 |
2781 | --- a/drivers/usb/serial/option.c |
2782 | +++ b/drivers/usb/serial/option.c |
2783 | @@ -288,7 +288,9 @@ static int option_resume(struct usb_serial *serial); |
2784 | |
2785 | #define QUALCOMM_VENDOR_ID 0x05C6 |
2786 | |
2787 | -#define MAXON_VENDOR_ID 0x16d8 |
2788 | +#define CMOTECH_VENDOR_ID 0x16d8 |
2789 | +#define CMOTECH_PRODUCT_6008 0x6008 |
2790 | +#define CMOTECH_PRODUCT_6280 0x6280 |
2791 | |
2792 | #define TELIT_VENDOR_ID 0x1bc7 |
2793 | #define TELIT_PRODUCT_UC864E 0x1003 |
2794 | @@ -520,7 +522,8 @@ static struct usb_device_id option_ids[] = { |
2795 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
2796 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ |
2797 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
2798 | - { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
2799 | + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
2800 | + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, |
2801 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
2802 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, |
2803 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
2804 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
2805 | index 7528b8d..8ab4ab2 100644 |
2806 | --- a/drivers/usb/serial/qcserial.c |
2807 | +++ b/drivers/usb/serial/qcserial.c |
2808 | @@ -47,6 +47,35 @@ static struct usb_device_id id_table[] = { |
2809 | {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ |
2810 | {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ |
2811 | {USB_DEVICE(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ |
2812 | + {USB_DEVICE(0x413c, 0x8185)}, /* Dell Gobi 2000 QDL device (N0218, VU936) */ |
2813 | + {USB_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ |
2814 | + {USB_DEVICE(0x05c6, 0x9224)}, /* Sony Gobi 2000 QDL device (N0279, VU730) */ |
2815 | + {USB_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ |
2816 | + {USB_DEVICE(0x05c6, 0x9244)}, /* Samsung Gobi 2000 QDL device (VL176) */ |
2817 | + {USB_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ |
2818 | + {USB_DEVICE(0x03f0, 0x241d)}, /* HP Gobi 2000 QDL device (VP412) */ |
2819 | + {USB_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ |
2820 | + {USB_DEVICE(0x05c6, 0x9214)}, /* Acer Gobi 2000 QDL device (VP413) */ |
2821 | + {USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */ |
2822 | + {USB_DEVICE(0x05c6, 0x9264)}, /* Asus Gobi 2000 QDL device (VR305) */ |
2823 | + {USB_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */ |
2824 | + {USB_DEVICE(0x05c6, 0x9234)}, /* Top Global Gobi 2000 QDL device (VR306) */ |
2825 | + {USB_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */ |
2826 | + {USB_DEVICE(0x05c6, 0x9274)}, /* iRex Technologies Gobi 2000 QDL device (VR307) */ |
2827 | + {USB_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */ |
2828 | + {USB_DEVICE(0x1199, 0x9000)}, /* Sierra Wireless Gobi 2000 QDL device (VT773) */ |
2829 | + {USB_DEVICE(0x1199, 0x9001)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2830 | + {USB_DEVICE(0x1199, 0x9002)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2831 | + {USB_DEVICE(0x1199, 0x9003)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2832 | + {USB_DEVICE(0x1199, 0x9004)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2833 | + {USB_DEVICE(0x1199, 0x9005)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2834 | + {USB_DEVICE(0x1199, 0x9006)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2835 | + {USB_DEVICE(0x1199, 0x9007)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2836 | + {USB_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2837 | + {USB_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2838 | + {USB_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
2839 | + {USB_DEVICE(0x16d8, 0x8001)}, /* CMDTech Gobi 2000 QDL device (VU922) */ |
2840 | + {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ |
2841 | { } /* Terminating entry */ |
2842 | }; |
2843 | MODULE_DEVICE_TABLE(usb, id_table); |
2844 | diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig |
2845 | index 5a5c303..f15fb02 100644 |
2846 | --- a/drivers/video/Kconfig |
2847 | +++ b/drivers/video/Kconfig |
2848 | @@ -909,6 +909,18 @@ config FB_XVR2500 |
2849 | mostly initialized the card already. It is treated as a |
2850 | completely dumb framebuffer device. |
2851 | |
2852 | +config FB_XVR1000 |
2853 | + bool "Sun XVR-1000 support" |
2854 | + depends on (FB = y) && SPARC64 |
2855 | + select FB_CFB_FILLRECT |
2856 | + select FB_CFB_COPYAREA |
2857 | + select FB_CFB_IMAGEBLIT |
2858 | + help |
2859 | + This is the framebuffer device for the Sun XVR-1000 and similar |
2860 | + graphics cards. The driver only works on sparc64 systems where |
2861 | + the system firmware has mostly initialized the card already. It |
2862 | + is treated as a completely dumb framebuffer device. |
2863 | + |
2864 | config FB_PVR2 |
2865 | tristate "NEC PowerVR 2 display support" |
2866 | depends on FB && SH_DREAMCAST |
2867 | diff --git a/drivers/video/Makefile b/drivers/video/Makefile |
2868 | index 4ecb30c..8c9a357 100644 |
2869 | --- a/drivers/video/Makefile |
2870 | +++ b/drivers/video/Makefile |
2871 | @@ -79,6 +79,7 @@ obj-$(CONFIG_FB_N411) += n411.o |
2872 | obj-$(CONFIG_FB_HGA) += hgafb.o |
2873 | obj-$(CONFIG_FB_XVR500) += sunxvr500.o |
2874 | obj-$(CONFIG_FB_XVR2500) += sunxvr2500.o |
2875 | +obj-$(CONFIG_FB_XVR1000) += sunxvr1000.o |
2876 | obj-$(CONFIG_FB_IGA) += igafb.o |
2877 | obj-$(CONFIG_FB_APOLLO) += dnfb.o |
2878 | obj-$(CONFIG_FB_Q40) += q40fb.o |
2879 | diff --git a/drivers/video/sunxvr1000.c b/drivers/video/sunxvr1000.c |
2880 | new file mode 100644 |
2881 | index 0000000..a8248c0 |
2882 | --- /dev/null |
2883 | +++ b/drivers/video/sunxvr1000.c |
2884 | @@ -0,0 +1,228 @@ |
2885 | +/* sunxvr1000.c: Sun XVR-1000 driver for sparc64 systems |
2886 | + * |
2887 | + * Copyright (C) 2010 David S. Miller (davem@davemloft.net) |
2888 | + */ |
2889 | + |
2890 | +#include <linux/module.h> |
2891 | +#include <linux/kernel.h> |
2892 | +#include <linux/slab.h> |
2893 | +#include <linux/fb.h> |
2894 | +#include <linux/init.h> |
2895 | +#include <linux/of_device.h> |
2896 | + |
2897 | +struct gfb_info { |
2898 | + struct fb_info *info; |
2899 | + |
2900 | + char __iomem *fb_base; |
2901 | + unsigned long fb_base_phys; |
2902 | + |
2903 | + struct device_node *of_node; |
2904 | + |
2905 | + unsigned int width; |
2906 | + unsigned int height; |
2907 | + unsigned int depth; |
2908 | + unsigned int fb_size; |
2909 | + |
2910 | + u32 pseudo_palette[16]; |
2911 | +}; |
2912 | + |
2913 | +static int __devinit gfb_get_props(struct gfb_info *gp) |
2914 | +{ |
2915 | + gp->width = of_getintprop_default(gp->of_node, "width", 0); |
2916 | + gp->height = of_getintprop_default(gp->of_node, "height", 0); |
2917 | + gp->depth = of_getintprop_default(gp->of_node, "depth", 32); |
2918 | + |
2919 | + if (!gp->width || !gp->height) { |
2920 | + printk(KERN_ERR "gfb: Critical properties missing for %s\n", |
2921 | + gp->of_node->full_name); |
2922 | + return -EINVAL; |
2923 | + } |
2924 | + |
2925 | + return 0; |
2926 | +} |
2927 | + |
2928 | +static int gfb_setcolreg(unsigned regno, |
2929 | + unsigned red, unsigned green, unsigned blue, |
2930 | + unsigned transp, struct fb_info *info) |
2931 | +{ |
2932 | + u32 value; |
2933 | + |
2934 | + if (regno < 16) { |
2935 | + red >>= 8; |
2936 | + green >>= 8; |
2937 | + blue >>= 8; |
2938 | + |
2939 | + value = (blue << 16) | (green << 8) | red; |
2940 | + ((u32 *)info->pseudo_palette)[regno] = value; |
2941 | + } |
2942 | + |
2943 | + return 0; |
2944 | +} |
2945 | + |
2946 | +static struct fb_ops gfb_ops = { |
2947 | + .owner = THIS_MODULE, |
2948 | + .fb_setcolreg = gfb_setcolreg, |
2949 | + .fb_fillrect = cfb_fillrect, |
2950 | + .fb_copyarea = cfb_copyarea, |
2951 | + .fb_imageblit = cfb_imageblit, |
2952 | +}; |
2953 | + |
2954 | +static int __devinit gfb_set_fbinfo(struct gfb_info *gp) |
2955 | +{ |
2956 | + struct fb_info *info = gp->info; |
2957 | + struct fb_var_screeninfo *var = &info->var; |
2958 | + |
2959 | + info->flags = FBINFO_DEFAULT; |
2960 | + info->fbops = &gfb_ops; |
2961 | + info->screen_base = gp->fb_base; |
2962 | + info->screen_size = gp->fb_size; |
2963 | + |
2964 | + info->pseudo_palette = gp->pseudo_palette; |
2965 | + |
2966 | + /* Fill fix common fields */ |
2967 | + strlcpy(info->fix.id, "gfb", sizeof(info->fix.id)); |
2968 | + info->fix.smem_start = gp->fb_base_phys; |
2969 | + info->fix.smem_len = gp->fb_size; |
2970 | + info->fix.type = FB_TYPE_PACKED_PIXELS; |
2971 | + if (gp->depth == 32 || gp->depth == 24) |
2972 | + info->fix.visual = FB_VISUAL_TRUECOLOR; |
2973 | + else |
2974 | + info->fix.visual = FB_VISUAL_PSEUDOCOLOR; |
2975 | + |
2976 | + var->xres = gp->width; |
2977 | + var->yres = gp->height; |
2978 | + var->xres_virtual = var->xres; |
2979 | + var->yres_virtual = var->yres; |
2980 | + var->bits_per_pixel = gp->depth; |
2981 | + |
2982 | + var->red.offset = 0; |
2983 | + var->red.length = 8; |
2984 | + var->green.offset = 8; |
2985 | + var->green.length = 8; |
2986 | + var->blue.offset = 16; |
2987 | + var->blue.length = 8; |
2988 | + var->transp.offset = 0; |
2989 | + var->transp.length = 0; |
2990 | + |
2991 | + if (fb_alloc_cmap(&info->cmap, 256, 0)) { |
2992 | + printk(KERN_ERR "gfb: Cannot allocate color map.\n"); |
2993 | + return -ENOMEM; |
2994 | + } |
2995 | + |
2996 | + return 0; |
2997 | +} |
2998 | + |
2999 | +static int __devinit gfb_probe(struct of_device *op, |
3000 | + const struct of_device_id *match) |
3001 | +{ |
3002 | + struct device_node *dp = op->node; |
3003 | + struct fb_info *info; |
3004 | + struct gfb_info *gp; |
3005 | + int err; |
3006 | + |
3007 | + info = framebuffer_alloc(sizeof(struct gfb_info), &op->dev); |
3008 | + if (!info) { |
3009 | + printk(KERN_ERR "gfb: Cannot allocate fb_info\n"); |
3010 | + err = -ENOMEM; |
3011 | + goto err_out; |
3012 | + } |
3013 | + |
3014 | + gp = info->par; |
3015 | + gp->info = info; |
3016 | + gp->of_node = dp; |
3017 | + |
3018 | + gp->fb_base_phys = op->resource[6].start; |
3019 | + |
3020 | + err = gfb_get_props(gp); |
3021 | + if (err) |
3022 | + goto err_release_fb; |
3023 | + |
3024 | + /* Framebuffer length is the same regardless of resolution. */ |
3025 | + info->fix.line_length = 16384; |
3026 | + gp->fb_size = info->fix.line_length * gp->height; |
3027 | + |
3028 | + gp->fb_base = of_ioremap(&op->resource[6], 0, |
3029 | + gp->fb_size, "gfb fb"); |
3030 | + if (!gp->fb_base) |
3031 | + goto err_release_fb; |
3032 | + |
3033 | + err = gfb_set_fbinfo(gp); |
3034 | + if (err) |
3035 | + goto err_unmap_fb; |
3036 | + |
3037 | + printk("gfb: Found device at %s\n", dp->full_name); |
3038 | + |
3039 | + err = register_framebuffer(info); |
3040 | + if (err < 0) { |
3041 | + printk(KERN_ERR "gfb: Could not register framebuffer %s\n", |
3042 | + dp->full_name); |
3043 | + goto err_unmap_fb; |
3044 | + } |
3045 | + |
3046 | + dev_set_drvdata(&op->dev, info); |
3047 | + |
3048 | + return 0; |
3049 | + |
3050 | +err_unmap_fb: |
3051 | + of_iounmap(&op->resource[6], gp->fb_base, gp->fb_size); |
3052 | + |
3053 | +err_release_fb: |
3054 | + framebuffer_release(info); |
3055 | + |
3056 | +err_out: |
3057 | + return err; |
3058 | +} |
3059 | + |
3060 | +static int __devexit gfb_remove(struct of_device *op) |
3061 | +{ |
3062 | + struct fb_info *info = dev_get_drvdata(&op->dev); |
3063 | + struct gfb_info *gp = info->par; |
3064 | + |
3065 | + unregister_framebuffer(info); |
3066 | + |
3067 | + iounmap(gp->fb_base); |
3068 | + |
3069 | + of_iounmap(&op->resource[6], gp->fb_base, gp->fb_size); |
3070 | + |
3071 | + framebuffer_release(info); |
3072 | + |
3073 | + dev_set_drvdata(&op->dev, NULL); |
3074 | + |
3075 | + return 0; |
3076 | +} |
3077 | + |
3078 | +static const struct of_device_id gfb_match[] = { |
3079 | + { |
3080 | + .name = "SUNW,gfb", |
3081 | + }, |
3082 | + {}, |
3083 | +}; |
3084 | +MODULE_DEVICE_TABLE(of, ffb_match); |
3085 | + |
3086 | +static struct of_platform_driver gfb_driver = { |
3087 | + .name = "gfb", |
3088 | + .match_table = gfb_match, |
3089 | + .probe = gfb_probe, |
3090 | + .remove = __devexit_p(gfb_remove), |
3091 | +}; |
3092 | + |
3093 | +static int __init gfb_init(void) |
3094 | +{ |
3095 | + if (fb_get_options("gfb", NULL)) |
3096 | + return -ENODEV; |
3097 | + |
3098 | + return of_register_driver(&gfb_driver, &of_bus_type); |
3099 | +} |
3100 | + |
3101 | +static void __exit gfb_exit(void) |
3102 | +{ |
3103 | + of_unregister_driver(&gfb_driver); |
3104 | +} |
3105 | + |
3106 | +module_init(gfb_init); |
3107 | +module_exit(gfb_exit); |
3108 | + |
3109 | +MODULE_DESCRIPTION("framebuffer driver for Sun XVR-1000 graphics"); |
3110 | +MODULE_AUTHOR("David S. Miller <davem@davemloft.net>"); |
3111 | +MODULE_VERSION("1.0"); |
3112 | +MODULE_LICENSE("GPL"); |
3113 | diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c |
3114 | index 28d9cf7..7127bfe 100644 |
3115 | --- a/drivers/virtio/virtio_pci.c |
3116 | +++ b/drivers/virtio/virtio_pci.c |
3117 | @@ -473,7 +473,8 @@ static void vp_del_vqs(struct virtio_device *vdev) |
3118 | |
3119 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) { |
3120 | info = vq->priv; |
3121 | - if (vp_dev->per_vq_vectors) |
3122 | + if (vp_dev->per_vq_vectors && |
3123 | + info->msix_vector != VIRTIO_MSI_NO_VECTOR) |
3124 | free_irq(vp_dev->msix_entries[info->msix_vector].vector, |
3125 | vq); |
3126 | vp_del_vq(vq); |
3127 | diff --git a/fs/exec.c b/fs/exec.c |
3128 | index cce6bbd..9071360 100644 |
3129 | --- a/fs/exec.c |
3130 | +++ b/fs/exec.c |
3131 | @@ -1923,8 +1923,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) |
3132 | /* |
3133 | * Dont allow local users get cute and trick others to coredump |
3134 | * into their pre-created files: |
3135 | + * Note, this is not relevant for pipes |
3136 | */ |
3137 | - if (inode->i_uid != current_fsuid()) |
3138 | + if (!ispipe && (inode->i_uid != current_fsuid())) |
3139 | goto close_fail; |
3140 | if (!cprm.file->f_op) |
3141 | goto close_fail; |
3142 | diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c |
3143 | index a6abbae..e6dd2ae 100644 |
3144 | --- a/fs/gfs2/file.c |
3145 | +++ b/fs/gfs2/file.c |
3146 | @@ -640,7 +640,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) |
3147 | |
3148 | if (!(fl->fl_flags & FL_POSIX)) |
3149 | return -ENOLCK; |
3150 | - if (__mandatory_lock(&ip->i_inode)) |
3151 | + if (__mandatory_lock(&ip->i_inode) && fl->fl_type != F_UNLCK) |
3152 | return -ENOLCK; |
3153 | |
3154 | if (cmd == F_CANCELLK) { |
3155 | diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h |
3156 | index 944b627..69e7b81 100644 |
3157 | --- a/fs/nfs/delegation.h |
3158 | +++ b/fs/nfs/delegation.h |
3159 | @@ -71,4 +71,10 @@ static inline int nfs_inode_return_delegation(struct inode *inode) |
3160 | } |
3161 | #endif |
3162 | |
3163 | +static inline int nfs_have_delegated_attributes(struct inode *inode) |
3164 | +{ |
3165 | + return nfs_have_delegation(inode, FMODE_READ) && |
3166 | + !(NFS_I(inode)->cache_validity & NFS_INO_REVAL_FORCED); |
3167 | +} |
3168 | + |
3169 | #endif |
3170 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
3171 | index 3c7f03b..8b5382e 100644 |
3172 | --- a/fs/nfs/dir.c |
3173 | +++ b/fs/nfs/dir.c |
3174 | @@ -1789,7 +1789,7 @@ static int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, str |
3175 | cache = nfs_access_search_rbtree(inode, cred); |
3176 | if (cache == NULL) |
3177 | goto out; |
3178 | - if (!nfs_have_delegation(inode, FMODE_READ) && |
3179 | + if (!nfs_have_delegated_attributes(inode) && |
3180 | !time_in_range_open(jiffies, cache->jiffies, cache->jiffies + nfsi->attrtimeo)) |
3181 | goto out_stale; |
3182 | res->jiffies = cache->jiffies; |
3183 | diff --git a/fs/nfs/file.c b/fs/nfs/file.c |
3184 | index 63f2071..bdd2142 100644 |
3185 | --- a/fs/nfs/file.c |
3186 | +++ b/fs/nfs/file.c |
3187 | @@ -486,7 +486,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp) |
3188 | { |
3189 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); |
3190 | |
3191 | - if (gfp & __GFP_WAIT) |
3192 | + /* Only do I/O if gfp is a superset of GFP_KERNEL */ |
3193 | + if ((gfp & GFP_KERNEL) == GFP_KERNEL) |
3194 | nfs_wb_page(page->mapping->host, page); |
3195 | /* If PagePrivate() is set, then the page is not freeable */ |
3196 | if (PagePrivate(page)) |
3197 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
3198 | index f141bde..5f59a2d 100644 |
3199 | --- a/fs/nfs/inode.c |
3200 | +++ b/fs/nfs/inode.c |
3201 | @@ -759,7 +759,7 @@ int nfs_attribute_timeout(struct inode *inode) |
3202 | { |
3203 | struct nfs_inode *nfsi = NFS_I(inode); |
3204 | |
3205 | - if (nfs_have_delegation(inode, FMODE_READ)) |
3206 | + if (nfs_have_delegated_attributes(inode)) |
3207 | return 0; |
3208 | return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo); |
3209 | } |
3210 | diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c |
3211 | index a12c45b..29d9d36 100644 |
3212 | --- a/fs/nfs/pagelist.c |
3213 | +++ b/fs/nfs/pagelist.c |
3214 | @@ -112,12 +112,10 @@ void nfs_unlock_request(struct nfs_page *req) |
3215 | */ |
3216 | int nfs_set_page_tag_locked(struct nfs_page *req) |
3217 | { |
3218 | - struct nfs_inode *nfsi = NFS_I(req->wb_context->path.dentry->d_inode); |
3219 | - |
3220 | if (!nfs_lock_request_dontget(req)) |
3221 | return 0; |
3222 | if (req->wb_page != NULL) |
3223 | - radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); |
3224 | + radix_tree_tag_set(&NFS_I(req->wb_context->path.dentry->d_inode)->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); |
3225 | return 1; |
3226 | } |
3227 | |
3228 | @@ -126,10 +124,10 @@ int nfs_set_page_tag_locked(struct nfs_page *req) |
3229 | */ |
3230 | void nfs_clear_page_tag_locked(struct nfs_page *req) |
3231 | { |
3232 | - struct inode *inode = req->wb_context->path.dentry->d_inode; |
3233 | - struct nfs_inode *nfsi = NFS_I(inode); |
3234 | - |
3235 | if (req->wb_page != NULL) { |
3236 | + struct inode *inode = req->wb_context->path.dentry->d_inode; |
3237 | + struct nfs_inode *nfsi = NFS_I(inode); |
3238 | + |
3239 | spin_lock(&inode->i_lock); |
3240 | radix_tree_tag_clear(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); |
3241 | nfs_unlock_request(req); |
3242 | @@ -142,16 +140,22 @@ void nfs_clear_page_tag_locked(struct nfs_page *req) |
3243 | * nfs_clear_request - Free up all resources allocated to the request |
3244 | * @req: |
3245 | * |
3246 | - * Release page resources associated with a write request after it |
3247 | - * has completed. |
3248 | + * Release page and open context resources associated with a read/write |
3249 | + * request after it has completed. |
3250 | */ |
3251 | void nfs_clear_request(struct nfs_page *req) |
3252 | { |
3253 | struct page *page = req->wb_page; |
3254 | + struct nfs_open_context *ctx = req->wb_context; |
3255 | + |
3256 | if (page != NULL) { |
3257 | page_cache_release(page); |
3258 | req->wb_page = NULL; |
3259 | } |
3260 | + if (ctx != NULL) { |
3261 | + put_nfs_open_context(ctx); |
3262 | + req->wb_context = NULL; |
3263 | + } |
3264 | } |
3265 | |
3266 | |
3267 | @@ -165,9 +169,8 @@ static void nfs_free_request(struct kref *kref) |
3268 | { |
3269 | struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref); |
3270 | |
3271 | - /* Release struct file or cached credential */ |
3272 | + /* Release struct file and open context */ |
3273 | nfs_clear_request(req); |
3274 | - put_nfs_open_context(req->wb_context); |
3275 | nfs_page_free(req); |
3276 | } |
3277 | |
3278 | diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c |
3279 | index 105b508..ddce17b 100644 |
3280 | --- a/fs/nilfs2/segment.c |
3281 | +++ b/fs/nilfs2/segment.c |
3282 | @@ -1902,8 +1902,7 @@ static void nilfs_segctor_abort_construction(struct nilfs_sc_info *sci, |
3283 | |
3284 | list_splice_tail_init(&sci->sc_write_logs, &logs); |
3285 | ret = nilfs_wait_on_logs(&logs); |
3286 | - if (ret) |
3287 | - nilfs_abort_logs(&logs, NULL, sci->sc_super_root, ret); |
3288 | + nilfs_abort_logs(&logs, NULL, sci->sc_super_root, ret ? : err); |
3289 | |
3290 | list_splice_tail_init(&sci->sc_segbufs, &logs); |
3291 | nilfs_cancel_segusage(&logs, nilfs->ns_sufile); |
3292 | diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c |
3293 | index 0028d2e..90be97f 100644 |
3294 | --- a/fs/partitions/msdos.c |
3295 | +++ b/fs/partitions/msdos.c |
3296 | @@ -31,14 +31,17 @@ |
3297 | */ |
3298 | #include <asm/unaligned.h> |
3299 | |
3300 | -#define SYS_IND(p) (get_unaligned(&p->sys_ind)) |
3301 | -#define NR_SECTS(p) ({ __le32 __a = get_unaligned(&p->nr_sects); \ |
3302 | - le32_to_cpu(__a); \ |
3303 | - }) |
3304 | +#define SYS_IND(p) get_unaligned(&p->sys_ind) |
3305 | |
3306 | -#define START_SECT(p) ({ __le32 __a = get_unaligned(&p->start_sect); \ |
3307 | - le32_to_cpu(__a); \ |
3308 | - }) |
3309 | +static inline sector_t nr_sects(struct partition *p) |
3310 | +{ |
3311 | + return (sector_t)get_unaligned_le32(&p->nr_sects); |
3312 | +} |
3313 | + |
3314 | +static inline sector_t start_sect(struct partition *p) |
3315 | +{ |
3316 | + return (sector_t)get_unaligned_le32(&p->start_sect); |
3317 | +} |
3318 | |
3319 | static inline int is_extended_partition(struct partition *p) |
3320 | { |
3321 | @@ -104,13 +107,13 @@ static int aix_magic_present(unsigned char *p, struct block_device *bdev) |
3322 | |
3323 | static void |
3324 | parse_extended(struct parsed_partitions *state, struct block_device *bdev, |
3325 | - u32 first_sector, u32 first_size) |
3326 | + sector_t first_sector, sector_t first_size) |
3327 | { |
3328 | struct partition *p; |
3329 | Sector sect; |
3330 | unsigned char *data; |
3331 | - u32 this_sector, this_size; |
3332 | - int sector_size = bdev_logical_block_size(bdev) / 512; |
3333 | + sector_t this_sector, this_size; |
3334 | + sector_t sector_size = bdev_logical_block_size(bdev) / 512; |
3335 | int loopct = 0; /* number of links followed |
3336 | without finding a data partition */ |
3337 | int i; |
3338 | @@ -145,14 +148,14 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev, |
3339 | * First process the data partition(s) |
3340 | */ |
3341 | for (i=0; i<4; i++, p++) { |
3342 | - u32 offs, size, next; |
3343 | - if (!NR_SECTS(p) || is_extended_partition(p)) |
3344 | + sector_t offs, size, next; |
3345 | + if (!nr_sects(p) || is_extended_partition(p)) |
3346 | continue; |
3347 | |
3348 | /* Check the 3rd and 4th entries - |
3349 | these sometimes contain random garbage */ |
3350 | - offs = START_SECT(p)*sector_size; |
3351 | - size = NR_SECTS(p)*sector_size; |
3352 | + offs = start_sect(p)*sector_size; |
3353 | + size = nr_sects(p)*sector_size; |
3354 | next = this_sector + offs; |
3355 | if (i >= 2) { |
3356 | if (offs + size > this_size) |
3357 | @@ -179,13 +182,13 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev, |
3358 | */ |
3359 | p -= 4; |
3360 | for (i=0; i<4; i++, p++) |
3361 | - if (NR_SECTS(p) && is_extended_partition(p)) |
3362 | + if (nr_sects(p) && is_extended_partition(p)) |
3363 | break; |
3364 | if (i == 4) |
3365 | goto done; /* nothing left to do */ |
3366 | |
3367 | - this_sector = first_sector + START_SECT(p) * sector_size; |
3368 | - this_size = NR_SECTS(p) * sector_size; |
3369 | + this_sector = first_sector + start_sect(p) * sector_size; |
3370 | + this_size = nr_sects(p) * sector_size; |
3371 | put_dev_sector(sect); |
3372 | } |
3373 | done: |
3374 | @@ -197,7 +200,7 @@ done: |
3375 | |
3376 | static void |
3377 | parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev, |
3378 | - u32 offset, u32 size, int origin) |
3379 | + sector_t offset, sector_t size, int origin) |
3380 | { |
3381 | #ifdef CONFIG_SOLARIS_X86_PARTITION |
3382 | Sector sect; |
3383 | @@ -244,7 +247,7 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev, |
3384 | */ |
3385 | static void |
3386 | parse_bsd(struct parsed_partitions *state, struct block_device *bdev, |
3387 | - u32 offset, u32 size, int origin, char *flavour, |
3388 | + sector_t offset, sector_t size, int origin, char *flavour, |
3389 | int max_partitions) |
3390 | { |
3391 | Sector sect; |
3392 | @@ -263,7 +266,7 @@ parse_bsd(struct parsed_partitions *state, struct block_device *bdev, |
3393 | if (le16_to_cpu(l->d_npartitions) < max_partitions) |
3394 | max_partitions = le16_to_cpu(l->d_npartitions); |
3395 | for (p = l->d_partitions; p - l->d_partitions < max_partitions; p++) { |
3396 | - u32 bsd_start, bsd_size; |
3397 | + sector_t bsd_start, bsd_size; |
3398 | |
3399 | if (state->next == state->limit) |
3400 | break; |
3401 | @@ -290,7 +293,7 @@ parse_bsd(struct parsed_partitions *state, struct block_device *bdev, |
3402 | |
3403 | static void |
3404 | parse_freebsd(struct parsed_partitions *state, struct block_device *bdev, |
3405 | - u32 offset, u32 size, int origin) |
3406 | + sector_t offset, sector_t size, int origin) |
3407 | { |
3408 | #ifdef CONFIG_BSD_DISKLABEL |
3409 | parse_bsd(state, bdev, offset, size, origin, |
3410 | @@ -300,7 +303,7 @@ parse_freebsd(struct parsed_partitions *state, struct block_device *bdev, |
3411 | |
3412 | static void |
3413 | parse_netbsd(struct parsed_partitions *state, struct block_device *bdev, |
3414 | - u32 offset, u32 size, int origin) |
3415 | + sector_t offset, sector_t size, int origin) |
3416 | { |
3417 | #ifdef CONFIG_BSD_DISKLABEL |
3418 | parse_bsd(state, bdev, offset, size, origin, |
3419 | @@ -310,7 +313,7 @@ parse_netbsd(struct parsed_partitions *state, struct block_device *bdev, |
3420 | |
3421 | static void |
3422 | parse_openbsd(struct parsed_partitions *state, struct block_device *bdev, |
3423 | - u32 offset, u32 size, int origin) |
3424 | + sector_t offset, sector_t size, int origin) |
3425 | { |
3426 | #ifdef CONFIG_BSD_DISKLABEL |
3427 | parse_bsd(state, bdev, offset, size, origin, |
3428 | @@ -324,7 +327,7 @@ parse_openbsd(struct parsed_partitions *state, struct block_device *bdev, |
3429 | */ |
3430 | static void |
3431 | parse_unixware(struct parsed_partitions *state, struct block_device *bdev, |
3432 | - u32 offset, u32 size, int origin) |
3433 | + sector_t offset, sector_t size, int origin) |
3434 | { |
3435 | #ifdef CONFIG_UNIXWARE_DISKLABEL |
3436 | Sector sect; |
3437 | @@ -348,7 +351,8 @@ parse_unixware(struct parsed_partitions *state, struct block_device *bdev, |
3438 | |
3439 | if (p->s_label != UNIXWARE_FS_UNUSED) |
3440 | put_partition(state, state->next++, |
3441 | - START_SECT(p), NR_SECTS(p)); |
3442 | + le32_to_cpu(p->start_sect), |
3443 | + le32_to_cpu(p->nr_sects)); |
3444 | p++; |
3445 | } |
3446 | put_dev_sector(sect); |
3447 | @@ -363,7 +367,7 @@ parse_unixware(struct parsed_partitions *state, struct block_device *bdev, |
3448 | */ |
3449 | static void |
3450 | parse_minix(struct parsed_partitions *state, struct block_device *bdev, |
3451 | - u32 offset, u32 size, int origin) |
3452 | + sector_t offset, sector_t size, int origin) |
3453 | { |
3454 | #ifdef CONFIG_MINIX_SUBPARTITION |
3455 | Sector sect; |
3456 | @@ -390,7 +394,7 @@ parse_minix(struct parsed_partitions *state, struct block_device *bdev, |
3457 | /* add each partition in use */ |
3458 | if (SYS_IND(p) == MINIX_PARTITION) |
3459 | put_partition(state, state->next++, |
3460 | - START_SECT(p), NR_SECTS(p)); |
3461 | + start_sect(p), nr_sects(p)); |
3462 | } |
3463 | printk(" >\n"); |
3464 | } |
3465 | @@ -401,7 +405,7 @@ parse_minix(struct parsed_partitions *state, struct block_device *bdev, |
3466 | static struct { |
3467 | unsigned char id; |
3468 | void (*parse)(struct parsed_partitions *, struct block_device *, |
3469 | - u32, u32, int); |
3470 | + sector_t, sector_t, int); |
3471 | } subtypes[] = { |
3472 | {FREEBSD_PARTITION, parse_freebsd}, |
3473 | {NETBSD_PARTITION, parse_netbsd}, |
3474 | @@ -415,7 +419,7 @@ static struct { |
3475 | |
3476 | int msdos_partition(struct parsed_partitions *state, struct block_device *bdev) |
3477 | { |
3478 | - int sector_size = bdev_logical_block_size(bdev) / 512; |
3479 | + sector_t sector_size = bdev_logical_block_size(bdev) / 512; |
3480 | Sector sect; |
3481 | unsigned char *data; |
3482 | struct partition *p; |
3483 | @@ -483,14 +487,21 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev) |
3484 | |
3485 | state->next = 5; |
3486 | for (slot = 1 ; slot <= 4 ; slot++, p++) { |
3487 | - u32 start = START_SECT(p)*sector_size; |
3488 | - u32 size = NR_SECTS(p)*sector_size; |
3489 | + sector_t start = start_sect(p)*sector_size; |
3490 | + sector_t size = nr_sects(p)*sector_size; |
3491 | if (!size) |
3492 | continue; |
3493 | if (is_extended_partition(p)) { |
3494 | - /* prevent someone doing mkfs or mkswap on an |
3495 | - extended partition, but leave room for LILO */ |
3496 | - put_partition(state, slot, start, size == 1 ? 1 : 2); |
3497 | + /* |
3498 | + * prevent someone doing mkfs or mkswap on an |
3499 | + * extended partition, but leave room for LILO |
3500 | + * FIXME: this uses one logical sector for > 512b |
3501 | + * sector, although it may not be enough/proper. |
3502 | + */ |
3503 | + sector_t n = 2; |
3504 | + n = min(size, max(sector_size, n)); |
3505 | + put_partition(state, slot, start, n); |
3506 | + |
3507 | printk(" <"); |
3508 | parse_extended(state, bdev, start, size); |
3509 | printk(" >"); |
3510 | @@ -513,7 +524,7 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev) |
3511 | unsigned char id = SYS_IND(p); |
3512 | int n; |
3513 | |
3514 | - if (!NR_SECTS(p)) |
3515 | + if (!nr_sects(p)) |
3516 | continue; |
3517 | |
3518 | for (n = 0; subtypes[n].parse && id != subtypes[n].id; n++) |
3519 | @@ -521,8 +532,8 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev) |
3520 | |
3521 | if (!subtypes[n].parse) |
3522 | continue; |
3523 | - subtypes[n].parse(state, bdev, START_SECT(p)*sector_size, |
3524 | - NR_SECTS(p)*sector_size, slot); |
3525 | + subtypes[n].parse(state, bdev, start_sect(p)*sector_size, |
3526 | + nr_sects(p)*sector_size, slot); |
3527 | } |
3528 | put_dev_sector(sect); |
3529 | return 1; |
3530 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
3531 | index 3fc62b0..6e722c1 100644 |
3532 | --- a/fs/quota/dquot.c |
3533 | +++ b/fs/quota/dquot.c |
3534 | @@ -225,6 +225,8 @@ static struct hlist_head *dquot_hash; |
3535 | struct dqstats dqstats; |
3536 | EXPORT_SYMBOL(dqstats); |
3537 | |
3538 | +static qsize_t inode_get_rsv_space(struct inode *inode); |
3539 | + |
3540 | static inline unsigned int |
3541 | hashfn(const struct super_block *sb, unsigned int id, int type) |
3542 | { |
3543 | @@ -840,11 +842,14 @@ static int dqinit_needed(struct inode *inode, int type) |
3544 | static void add_dquot_ref(struct super_block *sb, int type) |
3545 | { |
3546 | struct inode *inode, *old_inode = NULL; |
3547 | + int reserved = 0; |
3548 | |
3549 | spin_lock(&inode_lock); |
3550 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
3551 | if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) |
3552 | continue; |
3553 | + if (unlikely(inode_get_rsv_space(inode) > 0)) |
3554 | + reserved = 1; |
3555 | if (!atomic_read(&inode->i_writecount)) |
3556 | continue; |
3557 | if (!dqinit_needed(inode, type)) |
3558 | @@ -865,6 +870,12 @@ static void add_dquot_ref(struct super_block *sb, int type) |
3559 | } |
3560 | spin_unlock(&inode_lock); |
3561 | iput(old_inode); |
3562 | + |
3563 | + if (reserved) { |
3564 | + printk(KERN_WARNING "VFS (%s): Writes happened before quota" |
3565 | + " was turned on thus quota information is probably " |
3566 | + "inconsistent. Please run quotacheck(8).\n", sb->s_id); |
3567 | + } |
3568 | } |
3569 | |
3570 | /* |
3571 | @@ -978,10 +989,12 @@ static inline void dquot_resv_space(struct dquot *dquot, qsize_t number) |
3572 | /* |
3573 | * Claim reserved quota space |
3574 | */ |
3575 | -static void dquot_claim_reserved_space(struct dquot *dquot, |
3576 | - qsize_t number) |
3577 | +static void dquot_claim_reserved_space(struct dquot *dquot, qsize_t number) |
3578 | { |
3579 | - WARN_ON(dquot->dq_dqb.dqb_rsvspace < number); |
3580 | + if (dquot->dq_dqb.dqb_rsvspace < number) { |
3581 | + WARN_ON_ONCE(1); |
3582 | + number = dquot->dq_dqb.dqb_rsvspace; |
3583 | + } |
3584 | dquot->dq_dqb.dqb_curspace += number; |
3585 | dquot->dq_dqb.dqb_rsvspace -= number; |
3586 | } |
3587 | @@ -989,7 +1002,12 @@ static void dquot_claim_reserved_space(struct dquot *dquot, |
3588 | static inline |
3589 | void dquot_free_reserved_space(struct dquot *dquot, qsize_t number) |
3590 | { |
3591 | - dquot->dq_dqb.dqb_rsvspace -= number; |
3592 | + if (dquot->dq_dqb.dqb_rsvspace >= number) |
3593 | + dquot->dq_dqb.dqb_rsvspace -= number; |
3594 | + else { |
3595 | + WARN_ON_ONCE(1); |
3596 | + dquot->dq_dqb.dqb_rsvspace = 0; |
3597 | + } |
3598 | } |
3599 | |
3600 | static void dquot_decr_inodes(struct dquot *dquot, qsize_t number) |
3601 | @@ -1242,6 +1260,7 @@ static int info_bdq_free(struct dquot *dquot, qsize_t space) |
3602 | return QUOTA_NL_BHARDBELOW; |
3603 | return QUOTA_NL_NOWARN; |
3604 | } |
3605 | + |
3606 | /* |
3607 | * Initialize quota pointers in inode |
3608 | * We do things in a bit complicated way but by that we avoid calling |
3609 | @@ -1253,6 +1272,7 @@ int dquot_initialize(struct inode *inode, int type) |
3610 | int cnt, ret = 0; |
3611 | struct dquot *got[MAXQUOTAS] = { NULL, NULL }; |
3612 | struct super_block *sb = inode->i_sb; |
3613 | + qsize_t rsv; |
3614 | |
3615 | /* First test before acquiring mutex - solves deadlocks when we |
3616 | * re-enter the quota code and are already holding the mutex */ |
3617 | @@ -1287,6 +1307,13 @@ int dquot_initialize(struct inode *inode, int type) |
3618 | if (!inode->i_dquot[cnt]) { |
3619 | inode->i_dquot[cnt] = got[cnt]; |
3620 | got[cnt] = NULL; |
3621 | + /* |
3622 | + * Make quota reservation system happy if someone |
3623 | + * did a write before quota was turned on |
3624 | + */ |
3625 | + rsv = inode_get_rsv_space(inode); |
3626 | + if (unlikely(rsv)) |
3627 | + dquot_resv_space(inode->i_dquot[cnt], rsv); |
3628 | } |
3629 | } |
3630 | out_err: |
3631 | @@ -1351,28 +1378,30 @@ static qsize_t *inode_reserved_space(struct inode * inode) |
3632 | return inode->i_sb->dq_op->get_reserved_space(inode); |
3633 | } |
3634 | |
3635 | -static void inode_add_rsv_space(struct inode *inode, qsize_t number) |
3636 | +void inode_add_rsv_space(struct inode *inode, qsize_t number) |
3637 | { |
3638 | spin_lock(&inode->i_lock); |
3639 | *inode_reserved_space(inode) += number; |
3640 | spin_unlock(&inode->i_lock); |
3641 | } |
3642 | +EXPORT_SYMBOL(inode_add_rsv_space); |
3643 | |
3644 | - |
3645 | -static void inode_claim_rsv_space(struct inode *inode, qsize_t number) |
3646 | +void inode_claim_rsv_space(struct inode *inode, qsize_t number) |
3647 | { |
3648 | spin_lock(&inode->i_lock); |
3649 | *inode_reserved_space(inode) -= number; |
3650 | __inode_add_bytes(inode, number); |
3651 | spin_unlock(&inode->i_lock); |
3652 | } |
3653 | +EXPORT_SYMBOL(inode_claim_rsv_space); |
3654 | |
3655 | -static void inode_sub_rsv_space(struct inode *inode, qsize_t number) |
3656 | +void inode_sub_rsv_space(struct inode *inode, qsize_t number) |
3657 | { |
3658 | spin_lock(&inode->i_lock); |
3659 | *inode_reserved_space(inode) -= number; |
3660 | spin_unlock(&inode->i_lock); |
3661 | } |
3662 | +EXPORT_SYMBOL(inode_sub_rsv_space); |
3663 | |
3664 | static qsize_t inode_get_rsv_space(struct inode *inode) |
3665 | { |
3666 | diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h |
3667 | index 5032b9a..ad5ec1d 100644 |
3668 | --- a/include/linux/decompress/mm.h |
3669 | +++ b/include/linux/decompress/mm.h |
3670 | @@ -14,11 +14,21 @@ |
3671 | |
3672 | /* Code active when included from pre-boot environment: */ |
3673 | |
3674 | +/* |
3675 | + * Some architectures want to ensure there is no local data in their |
3676 | + * pre-boot environment, so that data can arbitarily relocated (via |
3677 | + * GOT references). This is achieved by defining STATIC_RW_DATA to |
3678 | + * be null. |
3679 | + */ |
3680 | +#ifndef STATIC_RW_DATA |
3681 | +#define STATIC_RW_DATA static |
3682 | +#endif |
3683 | + |
3684 | /* A trivial malloc implementation, adapted from |
3685 | * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 |
3686 | */ |
3687 | -static unsigned long malloc_ptr; |
3688 | -static int malloc_count; |
3689 | +STATIC_RW_DATA unsigned long malloc_ptr; |
3690 | +STATIC_RW_DATA int malloc_count; |
3691 | |
3692 | static void *malloc(int size) |
3693 | { |
3694 | diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h |
3695 | index 1822d63..16b92d0 100644 |
3696 | --- a/include/linux/if_tunnel.h |
3697 | +++ b/include/linux/if_tunnel.h |
3698 | @@ -2,6 +2,7 @@ |
3699 | #define _IF_TUNNEL_H_ |
3700 | |
3701 | #include <linux/types.h> |
3702 | +#include <asm/byteorder.h> |
3703 | |
3704 | #ifdef __KERNEL__ |
3705 | #include <linux/ip.h> |
3706 | diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h |
3707 | index bc0fc79..ece0b1c 100644 |
3708 | --- a/include/linux/kfifo.h |
3709 | +++ b/include/linux/kfifo.h |
3710 | @@ -102,8 +102,6 @@ union { \ |
3711 | unsigned char name##kfifo_buffer[size]; \ |
3712 | struct kfifo name = __kfifo_initializer(size, name##kfifo_buffer) |
3713 | |
3714 | -#undef __kfifo_initializer |
3715 | - |
3716 | extern void kfifo_init(struct kfifo *fifo, void *buffer, |
3717 | unsigned int size); |
3718 | extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, |
3719 | diff --git a/include/linux/kvm.h b/include/linux/kvm.h |
3720 | index a24de0b..553a388 100644 |
3721 | --- a/include/linux/kvm.h |
3722 | +++ b/include/linux/kvm.h |
3723 | @@ -497,6 +497,7 @@ struct kvm_ioeventfd { |
3724 | #endif |
3725 | #define KVM_CAP_S390_PSW 42 |
3726 | #define KVM_CAP_PPC_SEGSTATE 43 |
3727 | +#define KVM_CAP_X86_ROBUST_SINGLESTEP 51 |
3728 | |
3729 | #ifdef KVM_CAP_IRQ_ROUTING |
3730 | |
3731 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
3732 | index 99914e6..03e8d81 100644 |
3733 | --- a/include/linux/netdevice.h |
3734 | +++ b/include/linux/netdevice.h |
3735 | @@ -2023,12 +2023,12 @@ static inline void skb_bond_set_mac_by_master(struct sk_buff *skb, |
3736 | * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and |
3737 | * ARP on active-backup slaves with arp_validate enabled. |
3738 | */ |
3739 | -static inline int skb_bond_should_drop(struct sk_buff *skb) |
3740 | +static inline int skb_bond_should_drop(struct sk_buff *skb, |
3741 | + struct net_device *master) |
3742 | { |
3743 | - struct net_device *dev = skb->dev; |
3744 | - struct net_device *master = dev->master; |
3745 | - |
3746 | if (master) { |
3747 | + struct net_device *dev = skb->dev; |
3748 | + |
3749 | if (master->priv_flags & IFF_MASTER_ARPMON) |
3750 | dev->last_rx = jiffies; |
3751 | |
3752 | diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h |
3753 | index 49d321f..264d83d 100644 |
3754 | --- a/include/linux/netfilter/nfnetlink.h |
3755 | +++ b/include/linux/netfilter/nfnetlink.h |
3756 | @@ -76,7 +76,7 @@ extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); |
3757 | extern int nfnetlink_has_listeners(unsigned int group); |
3758 | extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, |
3759 | int echo, gfp_t flags); |
3760 | -extern void nfnetlink_set_err(u32 pid, u32 group, int error); |
3761 | +extern int nfnetlink_set_err(u32 pid, u32 group, int error); |
3762 | extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); |
3763 | |
3764 | extern void nfnl_lock(void); |
3765 | diff --git a/include/linux/netlink.h b/include/linux/netlink.h |
3766 | index fde27c0..6eaca5e 100644 |
3767 | --- a/include/linux/netlink.h |
3768 | +++ b/include/linux/netlink.h |
3769 | @@ -188,7 +188,7 @@ extern int netlink_has_listeners(struct sock *sk, unsigned int group); |
3770 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); |
3771 | extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid, |
3772 | __u32 group, gfp_t allocation); |
3773 | -extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); |
3774 | +extern int netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); |
3775 | extern int netlink_register_notifier(struct notifier_block *nb); |
3776 | extern int netlink_unregister_notifier(struct notifier_block *nb); |
3777 | |
3778 | diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h |
3779 | index c8ea0c7..41f977b 100644 |
3780 | --- a/include/linux/perf_event.h |
3781 | +++ b/include/linux/perf_event.h |
3782 | @@ -793,6 +793,13 @@ struct perf_sample_data { |
3783 | struct perf_raw_record *raw; |
3784 | }; |
3785 | |
3786 | +static inline |
3787 | +void perf_sample_data_init(struct perf_sample_data *data, u64 addr) |
3788 | +{ |
3789 | + data->addr = addr; |
3790 | + data->raw = NULL; |
3791 | +} |
3792 | + |
3793 | extern void perf_output_sample(struct perf_output_handle *handle, |
3794 | struct perf_event_header *header, |
3795 | struct perf_sample_data *data, |
3796 | diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h |
3797 | index 3ebb231..a529d86 100644 |
3798 | --- a/include/linux/quotaops.h |
3799 | +++ b/include/linux/quotaops.h |
3800 | @@ -26,6 +26,10 @@ static inline void writeout_quota_sb(struct super_block *sb, int type) |
3801 | sb->s_qcop->quota_sync(sb, type); |
3802 | } |
3803 | |
3804 | +void inode_add_rsv_space(struct inode *inode, qsize_t number); |
3805 | +void inode_claim_rsv_space(struct inode *inode, qsize_t number); |
3806 | +void inode_sub_rsv_space(struct inode *inode, qsize_t number); |
3807 | + |
3808 | int dquot_initialize(struct inode *inode, int type); |
3809 | int dquot_drop(struct inode *inode); |
3810 | struct dquot *dqget(struct super_block *sb, unsigned int id, int type); |
3811 | @@ -42,7 +46,6 @@ int dquot_alloc_inode(const struct inode *inode, qsize_t number); |
3812 | int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc); |
3813 | int dquot_claim_space(struct inode *inode, qsize_t number); |
3814 | void dquot_release_reserved_space(struct inode *inode, qsize_t number); |
3815 | -qsize_t dquot_get_reserved_space(struct inode *inode); |
3816 | |
3817 | int dquot_free_space(struct inode *inode, qsize_t number); |
3818 | int dquot_free_inode(const struct inode *inode, qsize_t number); |
3819 | @@ -199,6 +202,8 @@ static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr) |
3820 | if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA) |
3821 | return 1; |
3822 | } |
3823 | + else |
3824 | + inode_add_rsv_space(inode, nr); |
3825 | return 0; |
3826 | } |
3827 | |
3828 | @@ -221,7 +226,7 @@ static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr) |
3829 | if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA) |
3830 | return 1; |
3831 | } else |
3832 | - inode_add_bytes(inode, nr); |
3833 | + inode_claim_rsv_space(inode, nr); |
3834 | |
3835 | mark_inode_dirty(inode); |
3836 | return 0; |
3837 | @@ -235,6 +240,8 @@ void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr) |
3838 | { |
3839 | if (sb_any_quota_active(inode->i_sb)) |
3840 | inode->i_sb->dq_op->release_rsv(inode, nr); |
3841 | + else |
3842 | + inode_sub_rsv_space(inode, nr); |
3843 | } |
3844 | |
3845 | static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) |
3846 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
3847 | index ec226a2..28a9617 100644 |
3848 | --- a/include/linux/skbuff.h |
3849 | +++ b/include/linux/skbuff.h |
3850 | @@ -190,9 +190,6 @@ struct skb_shared_info { |
3851 | atomic_t dataref; |
3852 | unsigned short nr_frags; |
3853 | unsigned short gso_size; |
3854 | -#ifdef CONFIG_HAS_DMA |
3855 | - dma_addr_t dma_head; |
3856 | -#endif |
3857 | /* Warning: this field is not always filled in (UFO)! */ |
3858 | unsigned short gso_segs; |
3859 | unsigned short gso_type; |
3860 | @@ -201,9 +198,6 @@ struct skb_shared_info { |
3861 | struct sk_buff *frag_list; |
3862 | struct skb_shared_hwtstamps hwtstamps; |
3863 | skb_frag_t frags[MAX_SKB_FRAGS]; |
3864 | -#ifdef CONFIG_HAS_DMA |
3865 | - dma_addr_t dma_maps[MAX_SKB_FRAGS]; |
3866 | -#endif |
3867 | /* Intermediate layers must ensure that destructor_arg |
3868 | * remains valid until skb destructor */ |
3869 | void * destructor_arg; |
3870 | diff --git a/include/linux/tty.h b/include/linux/tty.h |
3871 | index 6abfcf5..42f2076 100644 |
3872 | --- a/include/linux/tty.h |
3873 | +++ b/include/linux/tty.h |
3874 | @@ -68,6 +68,17 @@ struct tty_buffer { |
3875 | unsigned long data[0]; |
3876 | }; |
3877 | |
3878 | +/* |
3879 | + * We default to dicing tty buffer allocations to this many characters |
3880 | + * in order to avoid multiple page allocations. We know the size of |
3881 | + * tty_buffer itself but it must also be taken into account that the |
3882 | + * the buffer is 256 byte aligned. See tty_buffer_find for the allocation |
3883 | + * logic this must match |
3884 | + */ |
3885 | + |
3886 | +#define TTY_BUFFER_PAGE (((PAGE_SIZE - sizeof(struct tty_buffer)) / 2) & ~0xFF) |
3887 | + |
3888 | + |
3889 | struct tty_bufhead { |
3890 | struct delayed_work work; |
3891 | spinlock_t lock; |
3892 | diff --git a/include/net/mac80211.h b/include/net/mac80211.h |
3893 | index 0bf3697..f39b303 100644 |
3894 | --- a/include/net/mac80211.h |
3895 | +++ b/include/net/mac80211.h |
3896 | @@ -926,6 +926,9 @@ enum ieee80211_tkip_key_type { |
3897 | * @IEEE80211_HW_BEACON_FILTER: |
3898 | * Hardware supports dropping of irrelevant beacon frames to |
3899 | * avoid waking up cpu. |
3900 | + * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: |
3901 | + * Hardware can provide ack status reports of Tx frames to |
3902 | + * the stack. |
3903 | */ |
3904 | enum ieee80211_hw_flags { |
3905 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, |
3906 | @@ -943,6 +946,7 @@ enum ieee80211_hw_flags { |
3907 | IEEE80211_HW_SUPPORTS_DYNAMIC_PS = 1<<12, |
3908 | IEEE80211_HW_MFP_CAPABLE = 1<<13, |
3909 | IEEE80211_HW_BEACON_FILTER = 1<<14, |
3910 | + IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<15, |
3911 | }; |
3912 | |
3913 | /** |
3914 | @@ -2258,7 +2262,8 @@ struct rate_control_ops { |
3915 | struct ieee80211_sta *sta, void *priv_sta); |
3916 | void (*rate_update)(void *priv, struct ieee80211_supported_band *sband, |
3917 | struct ieee80211_sta *sta, |
3918 | - void *priv_sta, u32 changed); |
3919 | + void *priv_sta, u32 changed, |
3920 | + enum nl80211_channel_type oper_chan_type); |
3921 | void (*free_sta)(void *priv, struct ieee80211_sta *sta, |
3922 | void *priv_sta); |
3923 | |
3924 | diff --git a/include/net/netlink.h b/include/net/netlink.h |
3925 | index a63b219..668ad04 100644 |
3926 | --- a/include/net/netlink.h |
3927 | +++ b/include/net/netlink.h |
3928 | @@ -945,7 +945,11 @@ static inline u64 nla_get_u64(const struct nlattr *nla) |
3929 | */ |
3930 | static inline __be64 nla_get_be64(const struct nlattr *nla) |
3931 | { |
3932 | - return *(__be64 *) nla_data(nla); |
3933 | + __be64 tmp; |
3934 | + |
3935 | + nla_memcpy(&tmp, nla, sizeof(tmp)); |
3936 | + |
3937 | + return tmp; |
3938 | } |
3939 | |
3940 | /** |
3941 | diff --git a/include/net/sock.h b/include/net/sock.h |
3942 | index 3f1a480..86f2da1 100644 |
3943 | --- a/include/net/sock.h |
3944 | +++ b/include/net/sock.h |
3945 | @@ -253,6 +253,8 @@ struct sock { |
3946 | struct { |
3947 | struct sk_buff *head; |
3948 | struct sk_buff *tail; |
3949 | + int len; |
3950 | + int limit; |
3951 | } sk_backlog; |
3952 | wait_queue_head_t *sk_sleep; |
3953 | struct dst_entry *sk_dst_cache; |
3954 | @@ -574,8 +576,8 @@ static inline int sk_stream_memory_free(struct sock *sk) |
3955 | return sk->sk_wmem_queued < sk->sk_sndbuf; |
3956 | } |
3957 | |
3958 | -/* The per-socket spinlock must be held here. */ |
3959 | -static inline void sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
3960 | +/* OOB backlog add */ |
3961 | +static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
3962 | { |
3963 | if (!sk->sk_backlog.tail) { |
3964 | sk->sk_backlog.head = sk->sk_backlog.tail = skb; |
3965 | @@ -586,6 +588,17 @@ static inline void sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
3966 | skb->next = NULL; |
3967 | } |
3968 | |
3969 | +/* The per-socket spinlock must be held here. */ |
3970 | +static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
3971 | +{ |
3972 | + if (sk->sk_backlog.len >= max(sk->sk_backlog.limit, sk->sk_rcvbuf << 1)) |
3973 | + return -ENOBUFS; |
3974 | + |
3975 | + __sk_add_backlog(sk, skb); |
3976 | + sk->sk_backlog.len += skb->truesize; |
3977 | + return 0; |
3978 | +} |
3979 | + |
3980 | static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) |
3981 | { |
3982 | return sk->sk_backlog_rcv(sk, skb); |
3983 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h |
3984 | index 60c2770..1e355d8 100644 |
3985 | --- a/include/net/xfrm.h |
3986 | +++ b/include/net/xfrm.h |
3987 | @@ -274,7 +274,8 @@ struct xfrm_policy_afinfo { |
3988 | struct dst_entry *dst, |
3989 | int nfheader_len); |
3990 | int (*fill_dst)(struct xfrm_dst *xdst, |
3991 | - struct net_device *dev); |
3992 | + struct net_device *dev, |
3993 | + struct flowi *fl); |
3994 | }; |
3995 | |
3996 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); |
3997 | diff --git a/init/main.c b/init/main.c |
3998 | index 4cb47a1..512ba15 100644 |
3999 | --- a/init/main.c |
4000 | +++ b/init/main.c |
4001 | @@ -846,7 +846,7 @@ static int __init kernel_init(void * unused) |
4002 | /* |
4003 | * init can allocate pages on any node |
4004 | */ |
4005 | - set_mems_allowed(node_possible_map); |
4006 | + set_mems_allowed(node_states[N_HIGH_MEMORY]); |
4007 | /* |
4008 | * init can run on any cpu. |
4009 | */ |
4010 | diff --git a/ipc/mqueue.c b/ipc/mqueue.c |
4011 | index c79bd57..04985a7 100644 |
4012 | --- a/ipc/mqueue.c |
4013 | +++ b/ipc/mqueue.c |
4014 | @@ -705,7 +705,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode, |
4015 | dentry = lookup_one_len(name, ipc_ns->mq_mnt->mnt_root, strlen(name)); |
4016 | if (IS_ERR(dentry)) { |
4017 | error = PTR_ERR(dentry); |
4018 | - goto out_err; |
4019 | + goto out_putfd; |
4020 | } |
4021 | mntget(ipc_ns->mq_mnt); |
4022 | |
4023 | @@ -742,7 +742,6 @@ out: |
4024 | mntput(ipc_ns->mq_mnt); |
4025 | out_putfd: |
4026 | put_unused_fd(fd); |
4027 | -out_err: |
4028 | fd = error; |
4029 | out_upsem: |
4030 | mutex_unlock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex); |
4031 | diff --git a/kernel/cpuset.c b/kernel/cpuset.c |
4032 | index ba401fa..5d38bd7 100644 |
4033 | --- a/kernel/cpuset.c |
4034 | +++ b/kernel/cpuset.c |
4035 | @@ -920,9 +920,6 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, |
4036 | * call to guarantee_online_mems(), as we know no one is changing |
4037 | * our task's cpuset. |
4038 | * |
4039 | - * Hold callback_mutex around the two modifications of our tasks |
4040 | - * mems_allowed to synchronize with cpuset_mems_allowed(). |
4041 | - * |
4042 | * While the mm_struct we are migrating is typically from some |
4043 | * other task, the task_struct mems_allowed that we are hacking |
4044 | * is for our current task, which must allocate new pages for that |
4045 | @@ -1391,11 +1388,10 @@ static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cont, |
4046 | |
4047 | if (cs == &top_cpuset) { |
4048 | cpumask_copy(cpus_attach, cpu_possible_mask); |
4049 | - to = node_possible_map; |
4050 | } else { |
4051 | guarantee_online_cpus(cs, cpus_attach); |
4052 | - guarantee_online_mems(cs, &to); |
4053 | } |
4054 | + guarantee_online_mems(cs, &to); |
4055 | |
4056 | /* do per-task migration stuff possibly for each in the threadgroup */ |
4057 | cpuset_attach_task(tsk, &to, cs); |
4058 | @@ -2090,15 +2086,23 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, |
4059 | static int cpuset_track_online_nodes(struct notifier_block *self, |
4060 | unsigned long action, void *arg) |
4061 | { |
4062 | + nodemask_t oldmems; |
4063 | + |
4064 | cgroup_lock(); |
4065 | switch (action) { |
4066 | case MEM_ONLINE: |
4067 | - case MEM_OFFLINE: |
4068 | + oldmems = top_cpuset.mems_allowed; |
4069 | mutex_lock(&callback_mutex); |
4070 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
4071 | mutex_unlock(&callback_mutex); |
4072 | - if (action == MEM_OFFLINE) |
4073 | - scan_for_empty_cpusets(&top_cpuset); |
4074 | + update_tasks_nodemask(&top_cpuset, &oldmems, NULL); |
4075 | + break; |
4076 | + case MEM_OFFLINE: |
4077 | + /* |
4078 | + * needn't update top_cpuset.mems_allowed explicitly because |
4079 | + * scan_for_empty_cpusets() will update it. |
4080 | + */ |
4081 | + scan_for_empty_cpusets(&top_cpuset); |
4082 | break; |
4083 | default: |
4084 | break; |
4085 | diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c |
4086 | index 967e661..4d99512 100644 |
4087 | --- a/kernel/hw_breakpoint.c |
4088 | +++ b/kernel/hw_breakpoint.c |
4089 | @@ -489,5 +489,4 @@ struct pmu perf_ops_bp = { |
4090 | .enable = arch_install_hw_breakpoint, |
4091 | .disable = arch_uninstall_hw_breakpoint, |
4092 | .read = hw_breakpoint_pmu_read, |
4093 | - .unthrottle = hw_breakpoint_pmu_unthrottle |
4094 | }; |
4095 | diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c |
4096 | index d70394f..71eba24 100644 |
4097 | --- a/kernel/irq/chip.c |
4098 | +++ b/kernel/irq/chip.c |
4099 | @@ -359,6 +359,23 @@ static inline void mask_ack_irq(struct irq_desc *desc, int irq) |
4100 | if (desc->chip->ack) |
4101 | desc->chip->ack(irq); |
4102 | } |
4103 | + desc->status |= IRQ_MASKED; |
4104 | +} |
4105 | + |
4106 | +static inline void mask_irq(struct irq_desc *desc, int irq) |
4107 | +{ |
4108 | + if (desc->chip->mask) { |
4109 | + desc->chip->mask(irq); |
4110 | + desc->status |= IRQ_MASKED; |
4111 | + } |
4112 | +} |
4113 | + |
4114 | +static inline void unmask_irq(struct irq_desc *desc, int irq) |
4115 | +{ |
4116 | + if (desc->chip->unmask) { |
4117 | + desc->chip->unmask(irq); |
4118 | + desc->status &= ~IRQ_MASKED; |
4119 | + } |
4120 | } |
4121 | |
4122 | /* |
4123 | @@ -484,10 +501,8 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) |
4124 | raw_spin_lock(&desc->lock); |
4125 | desc->status &= ~IRQ_INPROGRESS; |
4126 | |
4127 | - if (unlikely(desc->status & IRQ_ONESHOT)) |
4128 | - desc->status |= IRQ_MASKED; |
4129 | - else if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) |
4130 | - desc->chip->unmask(irq); |
4131 | + if (!(desc->status & (IRQ_DISABLED | IRQ_ONESHOT))) |
4132 | + unmask_irq(desc, irq); |
4133 | out_unlock: |
4134 | raw_spin_unlock(&desc->lock); |
4135 | } |
4136 | @@ -524,8 +539,7 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc) |
4137 | action = desc->action; |
4138 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { |
4139 | desc->status |= IRQ_PENDING; |
4140 | - if (desc->chip->mask) |
4141 | - desc->chip->mask(irq); |
4142 | + mask_irq(desc, irq); |
4143 | goto out; |
4144 | } |
4145 | |
4146 | @@ -593,7 +607,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) |
4147 | irqreturn_t action_ret; |
4148 | |
4149 | if (unlikely(!action)) { |
4150 | - desc->chip->mask(irq); |
4151 | + mask_irq(desc, irq); |
4152 | goto out_unlock; |
4153 | } |
4154 | |
4155 | @@ -605,8 +619,7 @@ handle_edge_irq(unsigned int irq, struct irq_desc *desc) |
4156 | if (unlikely((desc->status & |
4157 | (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) == |
4158 | (IRQ_PENDING | IRQ_MASKED))) { |
4159 | - desc->chip->unmask(irq); |
4160 | - desc->status &= ~IRQ_MASKED; |
4161 | + unmask_irq(desc, irq); |
4162 | } |
4163 | |
4164 | desc->status &= ~IRQ_PENDING; |
4165 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
4166 | index eb6078c..69a3d7b 100644 |
4167 | --- a/kernel/irq/manage.c |
4168 | +++ b/kernel/irq/manage.c |
4169 | @@ -483,8 +483,26 @@ static int irq_wait_for_interrupt(struct irqaction *action) |
4170 | */ |
4171 | static void irq_finalize_oneshot(unsigned int irq, struct irq_desc *desc) |
4172 | { |
4173 | +again: |
4174 | chip_bus_lock(irq, desc); |
4175 | raw_spin_lock_irq(&desc->lock); |
4176 | + |
4177 | + /* |
4178 | + * Implausible though it may be we need to protect us against |
4179 | + * the following scenario: |
4180 | + * |
4181 | + * The thread is faster done than the hard interrupt handler |
4182 | + * on the other CPU. If we unmask the irq line then the |
4183 | + * interrupt can come in again and masks the line, leaves due |
4184 | + * to IRQ_INPROGRESS and the irq line is masked forever. |
4185 | + */ |
4186 | + if (unlikely(desc->status & IRQ_INPROGRESS)) { |
4187 | + raw_spin_unlock_irq(&desc->lock); |
4188 | + chip_bus_sync_unlock(irq, desc); |
4189 | + cpu_relax(); |
4190 | + goto again; |
4191 | + } |
4192 | + |
4193 | if (!(desc->status & IRQ_DISABLED) && (desc->status & IRQ_MASKED)) { |
4194 | desc->status &= ~IRQ_MASKED; |
4195 | desc->chip->unmask(irq); |
4196 | diff --git a/kernel/kthread.c b/kernel/kthread.c |
4197 | index fbb6222..84c7f99 100644 |
4198 | --- a/kernel/kthread.c |
4199 | +++ b/kernel/kthread.c |
4200 | @@ -219,7 +219,7 @@ int kthreadd(void *unused) |
4201 | set_task_comm(tsk, "kthreadd"); |
4202 | ignore_signals(tsk); |
4203 | set_cpus_allowed_ptr(tsk, cpu_all_mask); |
4204 | - set_mems_allowed(node_possible_map); |
4205 | + set_mems_allowed(node_states[N_HIGH_MEMORY]); |
4206 | |
4207 | current->flags |= PF_NOFREEZE | PF_FREEZER_NOSIG; |
4208 | |
4209 | diff --git a/kernel/perf_event.c b/kernel/perf_event.c |
4210 | index b707465..32d0ae2 100644 |
4211 | --- a/kernel/perf_event.c |
4212 | +++ b/kernel/perf_event.c |
4213 | @@ -4027,8 +4027,7 @@ void __perf_sw_event(u32 event_id, u64 nr, int nmi, |
4214 | if (rctx < 0) |
4215 | return; |
4216 | |
4217 | - data.addr = addr; |
4218 | - data.raw = NULL; |
4219 | + perf_sample_data_init(&data, addr); |
4220 | |
4221 | do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, nmi, &data, regs); |
4222 | |
4223 | @@ -4073,11 +4072,10 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) |
4224 | struct perf_event *event; |
4225 | u64 period; |
4226 | |
4227 | - event = container_of(hrtimer, struct perf_event, hw.hrtimer); |
4228 | + event = container_of(hrtimer, struct perf_event, hw.hrtimer); |
4229 | event->pmu->read(event); |
4230 | |
4231 | - data.addr = 0; |
4232 | - data.raw = NULL; |
4233 | + perf_sample_data_init(&data, 0); |
4234 | data.period = event->hw.last_period; |
4235 | regs = get_irq_regs(); |
4236 | /* |
4237 | @@ -4241,17 +4239,15 @@ static const struct pmu perf_ops_task_clock = { |
4238 | void perf_tp_event(int event_id, u64 addr, u64 count, void *record, |
4239 | int entry_size) |
4240 | { |
4241 | + struct pt_regs *regs = get_irq_regs(); |
4242 | + struct perf_sample_data data; |
4243 | struct perf_raw_record raw = { |
4244 | .size = entry_size, |
4245 | .data = record, |
4246 | }; |
4247 | |
4248 | - struct perf_sample_data data = { |
4249 | - .addr = addr, |
4250 | - .raw = &raw, |
4251 | - }; |
4252 | - |
4253 | - struct pt_regs *regs = get_irq_regs(); |
4254 | + perf_sample_data_init(&data, addr); |
4255 | + data.raw = &raw; |
4256 | |
4257 | if (!regs) |
4258 | regs = task_pt_regs(current); |
4259 | @@ -4367,8 +4363,7 @@ void perf_bp_event(struct perf_event *bp, void *data) |
4260 | struct perf_sample_data sample; |
4261 | struct pt_regs *regs = data; |
4262 | |
4263 | - sample.raw = NULL; |
4264 | - sample.addr = bp->attr.bp_addr; |
4265 | + perf_sample_data_init(&sample, bp->attr.bp_addr); |
4266 | |
4267 | if (!perf_exclude_event(bp, regs)) |
4268 | perf_swevent_add(bp, 1, 1, &sample, regs); |
4269 | @@ -5251,12 +5246,22 @@ int perf_event_init_task(struct task_struct *child) |
4270 | return ret; |
4271 | } |
4272 | |
4273 | +static void __init perf_event_init_all_cpus(void) |
4274 | +{ |
4275 | + int cpu; |
4276 | + struct perf_cpu_context *cpuctx; |
4277 | + |
4278 | + for_each_possible_cpu(cpu) { |
4279 | + cpuctx = &per_cpu(perf_cpu_context, cpu); |
4280 | + __perf_event_init_context(&cpuctx->ctx, NULL); |
4281 | + } |
4282 | +} |
4283 | + |
4284 | static void __cpuinit perf_event_init_cpu(int cpu) |
4285 | { |
4286 | struct perf_cpu_context *cpuctx; |
4287 | |
4288 | cpuctx = &per_cpu(perf_cpu_context, cpu); |
4289 | - __perf_event_init_context(&cpuctx->ctx, NULL); |
4290 | |
4291 | spin_lock(&perf_resource_lock); |
4292 | cpuctx->max_pertask = perf_max_events - perf_reserved_percpu; |
4293 | @@ -5327,6 +5332,7 @@ static struct notifier_block __cpuinitdata perf_cpu_nb = { |
4294 | |
4295 | void __init perf_event_init(void) |
4296 | { |
4297 | + perf_event_init_all_cpus(); |
4298 | perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_UP_PREPARE, |
4299 | (void *)(long)smp_processor_id()); |
4300 | perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_ONLINE, |
4301 | diff --git a/kernel/sched.c b/kernel/sched.c |
4302 | index 00a59b0..7ca9345 100644 |
4303 | --- a/kernel/sched.c |
4304 | +++ b/kernel/sched.c |
4305 | @@ -3423,6 +3423,7 @@ struct sd_lb_stats { |
4306 | unsigned long max_load; |
4307 | unsigned long busiest_load_per_task; |
4308 | unsigned long busiest_nr_running; |
4309 | + unsigned long busiest_group_capacity; |
4310 | |
4311 | int group_imb; /* Is there imbalance in this sd */ |
4312 | #if defined(CONFIG_SCHED_MC) || defined(CONFIG_SCHED_SMT) |
4313 | @@ -3742,8 +3743,7 @@ static inline void update_sg_lb_stats(struct sched_domain *sd, |
4314 | unsigned long load, max_cpu_load, min_cpu_load; |
4315 | int i; |
4316 | unsigned int balance_cpu = -1, first_idle_cpu = 0; |
4317 | - unsigned long sum_avg_load_per_task; |
4318 | - unsigned long avg_load_per_task; |
4319 | + unsigned long avg_load_per_task = 0; |
4320 | |
4321 | if (local_group) { |
4322 | balance_cpu = group_first_cpu(group); |
4323 | @@ -3752,7 +3752,6 @@ static inline void update_sg_lb_stats(struct sched_domain *sd, |
4324 | } |
4325 | |
4326 | /* Tally up the load of all CPUs in the group */ |
4327 | - sum_avg_load_per_task = avg_load_per_task = 0; |
4328 | max_cpu_load = 0; |
4329 | min_cpu_load = ~0UL; |
4330 | |
4331 | @@ -3782,7 +3781,6 @@ static inline void update_sg_lb_stats(struct sched_domain *sd, |
4332 | sgs->sum_nr_running += rq->nr_running; |
4333 | sgs->sum_weighted_load += weighted_cpuload(i); |
4334 | |
4335 | - sum_avg_load_per_task += cpu_avg_load_per_task(i); |
4336 | } |
4337 | |
4338 | /* |
4339 | @@ -3800,7 +3798,6 @@ static inline void update_sg_lb_stats(struct sched_domain *sd, |
4340 | /* Adjust by relative CPU power of the group */ |
4341 | sgs->avg_load = (sgs->group_load * SCHED_LOAD_SCALE) / group->cpu_power; |
4342 | |
4343 | - |
4344 | /* |
4345 | * Consider the group unbalanced when the imbalance is larger |
4346 | * than the average weight of two tasks. |
4347 | @@ -3810,8 +3807,8 @@ static inline void update_sg_lb_stats(struct sched_domain *sd, |
4348 | * normalized nr_running number somewhere that negates |
4349 | * the hierarchy? |
4350 | */ |
4351 | - avg_load_per_task = (sum_avg_load_per_task * SCHED_LOAD_SCALE) / |
4352 | - group->cpu_power; |
4353 | + if (sgs->sum_nr_running) |
4354 | + avg_load_per_task = sgs->sum_weighted_load / sgs->sum_nr_running; |
4355 | |
4356 | if ((max_cpu_load - min_cpu_load) > 2*avg_load_per_task) |
4357 | sgs->group_imb = 1; |
4358 | @@ -3880,6 +3877,7 @@ static inline void update_sd_lb_stats(struct sched_domain *sd, int this_cpu, |
4359 | sds->max_load = sgs.avg_load; |
4360 | sds->busiest = group; |
4361 | sds->busiest_nr_running = sgs.sum_nr_running; |
4362 | + sds->busiest_group_capacity = sgs.group_capacity; |
4363 | sds->busiest_load_per_task = sgs.sum_weighted_load; |
4364 | sds->group_imb = sgs.group_imb; |
4365 | } |
4366 | @@ -3902,6 +3900,7 @@ static inline void fix_small_imbalance(struct sd_lb_stats *sds, |
4367 | { |
4368 | unsigned long tmp, pwr_now = 0, pwr_move = 0; |
4369 | unsigned int imbn = 2; |
4370 | + unsigned long scaled_busy_load_per_task; |
4371 | |
4372 | if (sds->this_nr_running) { |
4373 | sds->this_load_per_task /= sds->this_nr_running; |
4374 | @@ -3912,8 +3911,12 @@ static inline void fix_small_imbalance(struct sd_lb_stats *sds, |
4375 | sds->this_load_per_task = |
4376 | cpu_avg_load_per_task(this_cpu); |
4377 | |
4378 | - if (sds->max_load - sds->this_load + sds->busiest_load_per_task >= |
4379 | - sds->busiest_load_per_task * imbn) { |
4380 | + scaled_busy_load_per_task = sds->busiest_load_per_task |
4381 | + * SCHED_LOAD_SCALE; |
4382 | + scaled_busy_load_per_task /= sds->busiest->cpu_power; |
4383 | + |
4384 | + if (sds->max_load - sds->this_load + scaled_busy_load_per_task >= |
4385 | + (scaled_busy_load_per_task * imbn)) { |
4386 | *imbalance = sds->busiest_load_per_task; |
4387 | return; |
4388 | } |
4389 | @@ -3964,7 +3967,14 @@ static inline void fix_small_imbalance(struct sd_lb_stats *sds, |
4390 | static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu, |
4391 | unsigned long *imbalance) |
4392 | { |
4393 | - unsigned long max_pull; |
4394 | + unsigned long max_pull, load_above_capacity = ~0UL; |
4395 | + |
4396 | + sds->busiest_load_per_task /= sds->busiest_nr_running; |
4397 | + if (sds->group_imb) { |
4398 | + sds->busiest_load_per_task = |
4399 | + min(sds->busiest_load_per_task, sds->avg_load); |
4400 | + } |
4401 | + |
4402 | /* |
4403 | * In the presence of smp nice balancing, certain scenarios can have |
4404 | * max load less than avg load(as we skip the groups at or below |
4405 | @@ -3975,9 +3985,29 @@ static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu, |
4406 | return fix_small_imbalance(sds, this_cpu, imbalance); |
4407 | } |
4408 | |
4409 | - /* Don't want to pull so many tasks that a group would go idle */ |
4410 | - max_pull = min(sds->max_load - sds->avg_load, |
4411 | - sds->max_load - sds->busiest_load_per_task); |
4412 | + if (!sds->group_imb) { |
4413 | + /* |
4414 | + * Don't want to pull so many tasks that a group would go idle. |
4415 | + */ |
4416 | + load_above_capacity = (sds->busiest_nr_running - |
4417 | + sds->busiest_group_capacity); |
4418 | + |
4419 | + load_above_capacity *= (SCHED_LOAD_SCALE * SCHED_LOAD_SCALE); |
4420 | + |
4421 | + load_above_capacity /= sds->busiest->cpu_power; |
4422 | + } |
4423 | + |
4424 | + /* |
4425 | + * We're trying to get all the cpus to the average_load, so we don't |
4426 | + * want to push ourselves above the average load, nor do we wish to |
4427 | + * reduce the max loaded cpu below the average load. At the same time, |
4428 | + * we also don't want to reduce the group load below the group capacity |
4429 | + * (so that we can implement power-savings policies etc). Thus we look |
4430 | + * for the minimum possible imbalance. |
4431 | + * Be careful of negative numbers as they'll appear as very large values |
4432 | + * with unsigned longs. |
4433 | + */ |
4434 | + max_pull = min(sds->max_load - sds->avg_load, load_above_capacity); |
4435 | |
4436 | /* How much load to actually move to equalise the imbalance */ |
4437 | *imbalance = min(max_pull * sds->busiest->cpu_power, |
4438 | @@ -4045,7 +4075,6 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, |
4439 | * 4) This group is more busy than the avg busieness at this |
4440 | * sched_domain. |
4441 | * 5) The imbalance is within the specified limit. |
4442 | - * 6) Any rebalance would lead to ping-pong |
4443 | */ |
4444 | if (balance && !(*balance)) |
4445 | goto ret; |
4446 | @@ -4064,25 +4093,6 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, |
4447 | if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load) |
4448 | goto out_balanced; |
4449 | |
4450 | - sds.busiest_load_per_task /= sds.busiest_nr_running; |
4451 | - if (sds.group_imb) |
4452 | - sds.busiest_load_per_task = |
4453 | - min(sds.busiest_load_per_task, sds.avg_load); |
4454 | - |
4455 | - /* |
4456 | - * We're trying to get all the cpus to the average_load, so we don't |
4457 | - * want to push ourselves above the average load, nor do we wish to |
4458 | - * reduce the max loaded cpu below the average load, as either of these |
4459 | - * actions would just result in more rebalancing later, and ping-pong |
4460 | - * tasks around. Thus we look for the minimum possible imbalance. |
4461 | - * Negative imbalances (*we* are more loaded than anyone else) will |
4462 | - * be counted as no imbalance for these purposes -- we can't fix that |
4463 | - * by pulling tasks to us. Be careful of negative numbers as they'll |
4464 | - * appear as very large values with unsigned longs. |
4465 | - */ |
4466 | - if (sds.max_load <= sds.busiest_load_per_task) |
4467 | - goto out_balanced; |
4468 | - |
4469 | /* Looks like there is an imbalance. Compute it */ |
4470 | calculate_imbalance(&sds, this_cpu, imbalance); |
4471 | return sds.busiest; |
4472 | diff --git a/kernel/softlockup.c b/kernel/softlockup.c |
4473 | index 0d4c789..4b493f6 100644 |
4474 | --- a/kernel/softlockup.c |
4475 | +++ b/kernel/softlockup.c |
4476 | @@ -155,11 +155,11 @@ void softlockup_tick(void) |
4477 | * Wake up the high-prio watchdog task twice per |
4478 | * threshold timespan. |
4479 | */ |
4480 | - if (now > touch_ts + softlockup_thresh/2) |
4481 | + if (time_after(now - softlockup_thresh/2, touch_ts)) |
4482 | wake_up_process(per_cpu(softlockup_watchdog, this_cpu)); |
4483 | |
4484 | /* Warn about unreasonable delays: */ |
4485 | - if (now <= (touch_ts + softlockup_thresh)) |
4486 | + if (time_before_eq(now - softlockup_thresh, touch_ts)) |
4487 | return; |
4488 | |
4489 | per_cpu(softlockup_print_ts, this_cpu) = touch_ts; |
4490 | diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c |
4491 | index 1370083..0e98497 100644 |
4492 | --- a/kernel/time/clocksource.c |
4493 | +++ b/kernel/time/clocksource.c |
4494 | @@ -580,6 +580,10 @@ static inline void clocksource_select(void) { } |
4495 | */ |
4496 | static int __init clocksource_done_booting(void) |
4497 | { |
4498 | + mutex_lock(&clocksource_mutex); |
4499 | + curr_clocksource = clocksource_default_clock(); |
4500 | + mutex_unlock(&clocksource_mutex); |
4501 | + |
4502 | finished_booting = 1; |
4503 | |
4504 | /* |
4505 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
4506 | index 1e6640f..404c9ba 100644 |
4507 | --- a/kernel/trace/ftrace.c |
4508 | +++ b/kernel/trace/ftrace.c |
4509 | @@ -3364,6 +3364,7 @@ void ftrace_graph_init_task(struct task_struct *t) |
4510 | { |
4511 | /* Make sure we do not use the parent ret_stack */ |
4512 | t->ret_stack = NULL; |
4513 | + t->curr_ret_stack = -1; |
4514 | |
4515 | if (ftrace_graph_active) { |
4516 | struct ftrace_ret_stack *ret_stack; |
4517 | @@ -3373,7 +3374,6 @@ void ftrace_graph_init_task(struct task_struct *t) |
4518 | GFP_KERNEL); |
4519 | if (!ret_stack) |
4520 | return; |
4521 | - t->curr_ret_stack = -1; |
4522 | atomic_set(&t->tracing_graph_pause, 0); |
4523 | atomic_set(&t->trace_overrun, 0); |
4524 | t->ftrace_timestamp = 0; |
4525 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
4526 | index 8c1b2d2..54191d6 100644 |
4527 | --- a/kernel/trace/ring_buffer.c |
4528 | +++ b/kernel/trace/ring_buffer.c |
4529 | @@ -2232,12 +2232,12 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, unsigned long length) |
4530 | if (ring_buffer_flags != RB_BUFFERS_ON) |
4531 | return NULL; |
4532 | |
4533 | - if (atomic_read(&buffer->record_disabled)) |
4534 | - return NULL; |
4535 | - |
4536 | /* If we are tracing schedule, we don't want to recurse */ |
4537 | resched = ftrace_preempt_disable(); |
4538 | |
4539 | + if (atomic_read(&buffer->record_disabled)) |
4540 | + goto out_nocheck; |
4541 | + |
4542 | if (trace_recursive_lock()) |
4543 | goto out_nocheck; |
4544 | |
4545 | @@ -2469,11 +2469,11 @@ int ring_buffer_write(struct ring_buffer *buffer, |
4546 | if (ring_buffer_flags != RB_BUFFERS_ON) |
4547 | return -EBUSY; |
4548 | |
4549 | - if (atomic_read(&buffer->record_disabled)) |
4550 | - return -EBUSY; |
4551 | - |
4552 | resched = ftrace_preempt_disable(); |
4553 | |
4554 | + if (atomic_read(&buffer->record_disabled)) |
4555 | + goto out; |
4556 | + |
4557 | cpu = raw_smp_processor_id(); |
4558 | |
4559 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) |
4560 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
4561 | index eac6875..45cfb6d 100644 |
4562 | --- a/kernel/trace/trace.c |
4563 | +++ b/kernel/trace/trace.c |
4564 | @@ -747,10 +747,10 @@ out: |
4565 | mutex_unlock(&trace_types_lock); |
4566 | } |
4567 | |
4568 | -static void __tracing_reset(struct trace_array *tr, int cpu) |
4569 | +static void __tracing_reset(struct ring_buffer *buffer, int cpu) |
4570 | { |
4571 | ftrace_disable_cpu(); |
4572 | - ring_buffer_reset_cpu(tr->buffer, cpu); |
4573 | + ring_buffer_reset_cpu(buffer, cpu); |
4574 | ftrace_enable_cpu(); |
4575 | } |
4576 | |
4577 | @@ -762,7 +762,7 @@ void tracing_reset(struct trace_array *tr, int cpu) |
4578 | |
4579 | /* Make sure all commits have finished */ |
4580 | synchronize_sched(); |
4581 | - __tracing_reset(tr, cpu); |
4582 | + __tracing_reset(buffer, cpu); |
4583 | |
4584 | ring_buffer_record_enable(buffer); |
4585 | } |
4586 | @@ -780,7 +780,7 @@ void tracing_reset_online_cpus(struct trace_array *tr) |
4587 | tr->time_start = ftrace_now(tr->cpu); |
4588 | |
4589 | for_each_online_cpu(cpu) |
4590 | - __tracing_reset(tr, cpu); |
4591 | + __tracing_reset(buffer, cpu); |
4592 | |
4593 | ring_buffer_record_enable(buffer); |
4594 | } |
4595 | @@ -857,6 +857,8 @@ void tracing_start(void) |
4596 | goto out; |
4597 | } |
4598 | |
4599 | + /* Prevent the buffers from switching */ |
4600 | + arch_spin_lock(&ftrace_max_lock); |
4601 | |
4602 | buffer = global_trace.buffer; |
4603 | if (buffer) |
4604 | @@ -866,6 +868,8 @@ void tracing_start(void) |
4605 | if (buffer) |
4606 | ring_buffer_record_enable(buffer); |
4607 | |
4608 | + arch_spin_unlock(&ftrace_max_lock); |
4609 | + |
4610 | ftrace_start(); |
4611 | out: |
4612 | spin_unlock_irqrestore(&tracing_start_lock, flags); |
4613 | @@ -887,6 +891,9 @@ void tracing_stop(void) |
4614 | if (trace_stop_count++) |
4615 | goto out; |
4616 | |
4617 | + /* Prevent the buffers from switching */ |
4618 | + arch_spin_lock(&ftrace_max_lock); |
4619 | + |
4620 | buffer = global_trace.buffer; |
4621 | if (buffer) |
4622 | ring_buffer_record_disable(buffer); |
4623 | @@ -895,6 +902,8 @@ void tracing_stop(void) |
4624 | if (buffer) |
4625 | ring_buffer_record_disable(buffer); |
4626 | |
4627 | + arch_spin_unlock(&ftrace_max_lock); |
4628 | + |
4629 | out: |
4630 | spin_unlock_irqrestore(&tracing_start_lock, flags); |
4631 | } |
4632 | @@ -1182,6 +1191,13 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) |
4633 | if (!(trace_flags & TRACE_ITER_USERSTACKTRACE)) |
4634 | return; |
4635 | |
4636 | + /* |
4637 | + * NMIs can not handle page faults, even with fix ups. |
4638 | + * The save user stack can (and often does) fault. |
4639 | + */ |
4640 | + if (unlikely(in_nmi())) |
4641 | + return; |
4642 | + |
4643 | event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK, |
4644 | sizeof(*entry), flags, pc); |
4645 | if (!event) |
4646 | @@ -1628,6 +1644,7 @@ static void *s_start(struct seq_file *m, loff_t *pos) |
4647 | |
4648 | ftrace_enable_cpu(); |
4649 | |
4650 | + iter->leftover = 0; |
4651 | for (p = iter; p && l < *pos; p = s_next(m, p, &l)) |
4652 | ; |
4653 | |
4654 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
4655 | index 290fb5b..0beac93 100644 |
4656 | --- a/mm/mempolicy.c |
4657 | +++ b/mm/mempolicy.c |
4658 | @@ -2167,8 +2167,8 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
4659 | char *rest = nodelist; |
4660 | while (isdigit(*rest)) |
4661 | rest++; |
4662 | - if (!*rest) |
4663 | - err = 0; |
4664 | + if (*rest) |
4665 | + goto out; |
4666 | } |
4667 | break; |
4668 | case MPOL_INTERLEAVE: |
4669 | @@ -2177,7 +2177,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
4670 | */ |
4671 | if (!nodelist) |
4672 | nodes = node_states[N_HIGH_MEMORY]; |
4673 | - err = 0; |
4674 | break; |
4675 | case MPOL_LOCAL: |
4676 | /* |
4677 | @@ -2187,11 +2186,19 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
4678 | goto out; |
4679 | mode = MPOL_PREFERRED; |
4680 | break; |
4681 | - |
4682 | - /* |
4683 | - * case MPOL_BIND: mpol_new() enforces non-empty nodemask. |
4684 | - * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags. |
4685 | - */ |
4686 | + case MPOL_DEFAULT: |
4687 | + /* |
4688 | + * Insist on a empty nodelist |
4689 | + */ |
4690 | + if (!nodelist) |
4691 | + err = 0; |
4692 | + goto out; |
4693 | + case MPOL_BIND: |
4694 | + /* |
4695 | + * Insist on a nodelist |
4696 | + */ |
4697 | + if (!nodelist) |
4698 | + goto out; |
4699 | } |
4700 | |
4701 | mode_flags = 0; |
4702 | @@ -2205,13 +2212,14 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
4703 | else if (!strcmp(flags, "relative")) |
4704 | mode_flags |= MPOL_F_RELATIVE_NODES; |
4705 | else |
4706 | - err = 1; |
4707 | + goto out; |
4708 | } |
4709 | |
4710 | new = mpol_new(mode, mode_flags, &nodes); |
4711 | if (IS_ERR(new)) |
4712 | - err = 1; |
4713 | - else { |
4714 | + goto out; |
4715 | + |
4716 | + { |
4717 | int ret; |
4718 | NODEMASK_SCRATCH(scratch); |
4719 | if (scratch) { |
4720 | @@ -2222,13 +2230,15 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
4721 | ret = -ENOMEM; |
4722 | NODEMASK_SCRATCH_FREE(scratch); |
4723 | if (ret) { |
4724 | - err = 1; |
4725 | mpol_put(new); |
4726 | - } else if (no_context) { |
4727 | - /* save for contextualization */ |
4728 | - new->w.user_nodemask = nodes; |
4729 | + goto out; |
4730 | } |
4731 | } |
4732 | + err = 0; |
4733 | + if (no_context) { |
4734 | + /* save for contextualization */ |
4735 | + new->w.user_nodemask = nodes; |
4736 | + } |
4737 | |
4738 | out: |
4739 | /* Restore string for error message */ |
4740 | diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c |
4741 | index e75a2f3..152760a 100644 |
4742 | --- a/net/8021q/vlan_core.c |
4743 | +++ b/net/8021q/vlan_core.c |
4744 | @@ -11,7 +11,7 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
4745 | if (netpoll_rx(skb)) |
4746 | return NET_RX_DROP; |
4747 | |
4748 | - if (skb_bond_should_drop(skb)) |
4749 | + if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
4750 | goto drop; |
4751 | |
4752 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
4753 | @@ -82,7 +82,7 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, |
4754 | { |
4755 | struct sk_buff *p; |
4756 | |
4757 | - if (skb_bond_should_drop(skb)) |
4758 | + if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
4759 | goto drop; |
4760 | |
4761 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
4762 | diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c |
4763 | index 400efa2..615fecc 100644 |
4764 | --- a/net/bluetooth/l2cap.c |
4765 | +++ b/net/bluetooth/l2cap.c |
4766 | @@ -2830,6 +2830,11 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr |
4767 | int len = cmd->len - sizeof(*rsp); |
4768 | char req[64]; |
4769 | |
4770 | + if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { |
4771 | + l2cap_send_disconn_req(conn, sk); |
4772 | + goto done; |
4773 | + } |
4774 | + |
4775 | /* throw out any old stored conf requests */ |
4776 | result = L2CAP_CONF_SUCCESS; |
4777 | len = l2cap_parse_conf_rsp(sk, rsp->data, |
4778 | @@ -3942,16 +3947,24 @@ static ssize_t l2cap_sysfs_show(struct class *dev, char *buf) |
4779 | struct sock *sk; |
4780 | struct hlist_node *node; |
4781 | char *str = buf; |
4782 | + int size = PAGE_SIZE; |
4783 | |
4784 | read_lock_bh(&l2cap_sk_list.lock); |
4785 | |
4786 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
4787 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
4788 | + int len; |
4789 | |
4790 | - str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", |
4791 | + len = snprintf(str, size, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", |
4792 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
4793 | sk->sk_state, __le16_to_cpu(pi->psm), pi->scid, |
4794 | pi->dcid, pi->imtu, pi->omtu, pi->sec_level); |
4795 | + |
4796 | + size -= len; |
4797 | + if (size <= 0) |
4798 | + break; |
4799 | + |
4800 | + str += len; |
4801 | } |
4802 | |
4803 | read_unlock_bh(&l2cap_sk_list.lock); |
4804 | diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c |
4805 | index 89f4a59..3fe9c7c 100644 |
4806 | --- a/net/bluetooth/rfcomm/core.c |
4807 | +++ b/net/bluetooth/rfcomm/core.c |
4808 | @@ -2103,6 +2103,7 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf) |
4809 | struct rfcomm_session *s; |
4810 | struct list_head *pp, *p; |
4811 | char *str = buf; |
4812 | + int size = PAGE_SIZE; |
4813 | |
4814 | rfcomm_lock(); |
4815 | |
4816 | @@ -2111,11 +2112,21 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf) |
4817 | list_for_each(pp, &s->dlcs) { |
4818 | struct sock *sk = s->sock->sk; |
4819 | struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list); |
4820 | + int len; |
4821 | |
4822 | - str += sprintf(str, "%s %s %ld %d %d %d %d\n", |
4823 | + len = snprintf(str, size, "%s %s %ld %d %d %d %d\n", |
4824 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
4825 | d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits); |
4826 | + |
4827 | + size -= len; |
4828 | + if (size <= 0) |
4829 | + break; |
4830 | + |
4831 | + str += len; |
4832 | } |
4833 | + |
4834 | + if (size <= 0) |
4835 | + break; |
4836 | } |
4837 | |
4838 | rfcomm_unlock(); |
4839 | diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c |
4840 | index 4b5968d..bc03b50 100644 |
4841 | --- a/net/bluetooth/rfcomm/sock.c |
4842 | +++ b/net/bluetooth/rfcomm/sock.c |
4843 | @@ -1066,13 +1066,22 @@ static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf) |
4844 | struct sock *sk; |
4845 | struct hlist_node *node; |
4846 | char *str = buf; |
4847 | + int size = PAGE_SIZE; |
4848 | |
4849 | read_lock_bh(&rfcomm_sk_list.lock); |
4850 | |
4851 | sk_for_each(sk, node, &rfcomm_sk_list.head) { |
4852 | - str += sprintf(str, "%s %s %d %d\n", |
4853 | + int len; |
4854 | + |
4855 | + len = snprintf(str, size, "%s %s %d %d\n", |
4856 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
4857 | sk->sk_state, rfcomm_pi(sk)->channel); |
4858 | + |
4859 | + size -= len; |
4860 | + if (size <= 0) |
4861 | + break; |
4862 | + |
4863 | + str += len; |
4864 | } |
4865 | |
4866 | read_unlock_bh(&rfcomm_sk_list.lock); |
4867 | diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c |
4868 | index dd8f6ec..66cab63 100644 |
4869 | --- a/net/bluetooth/sco.c |
4870 | +++ b/net/bluetooth/sco.c |
4871 | @@ -958,13 +958,22 @@ static ssize_t sco_sysfs_show(struct class *dev, char *buf) |
4872 | struct sock *sk; |
4873 | struct hlist_node *node; |
4874 | char *str = buf; |
4875 | + int size = PAGE_SIZE; |
4876 | |
4877 | read_lock_bh(&sco_sk_list.lock); |
4878 | |
4879 | sk_for_each(sk, node, &sco_sk_list.head) { |
4880 | - str += sprintf(str, "%s %s %d\n", |
4881 | + int len; |
4882 | + |
4883 | + len = snprintf(str, size, "%s %s %d\n", |
4884 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
4885 | sk->sk_state); |
4886 | + |
4887 | + size -= len; |
4888 | + if (size <= 0) |
4889 | + break; |
4890 | + |
4891 | + str += len; |
4892 | } |
4893 | |
4894 | read_unlock_bh(&sco_sk_list.lock); |
4895 | diff --git a/net/core/dev.c b/net/core/dev.c |
4896 | index ec87421..f51f940 100644 |
4897 | --- a/net/core/dev.c |
4898 | +++ b/net/core/dev.c |
4899 | @@ -2421,6 +2421,7 @@ int netif_receive_skb(struct sk_buff *skb) |
4900 | { |
4901 | struct packet_type *ptype, *pt_prev; |
4902 | struct net_device *orig_dev; |
4903 | + struct net_device *master; |
4904 | struct net_device *null_or_orig; |
4905 | int ret = NET_RX_DROP; |
4906 | __be16 type; |
4907 | @@ -2440,11 +2441,12 @@ int netif_receive_skb(struct sk_buff *skb) |
4908 | |
4909 | null_or_orig = NULL; |
4910 | orig_dev = skb->dev; |
4911 | - if (orig_dev->master) { |
4912 | - if (skb_bond_should_drop(skb)) |
4913 | + master = ACCESS_ONCE(orig_dev->master); |
4914 | + if (master) { |
4915 | + if (skb_bond_should_drop(skb, master)) |
4916 | null_or_orig = orig_dev; /* deliver only exact match */ |
4917 | else |
4918 | - skb->dev = orig_dev->master; |
4919 | + skb->dev = master; |
4920 | } |
4921 | |
4922 | __get_cpu_var(netdev_rx_stat).total++; |
4923 | diff --git a/net/core/sock.c b/net/core/sock.c |
4924 | index e1f6f22..5779f31 100644 |
4925 | --- a/net/core/sock.c |
4926 | +++ b/net/core/sock.c |
4927 | @@ -340,8 +340,12 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested) |
4928 | rc = sk_backlog_rcv(sk, skb); |
4929 | |
4930 | mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); |
4931 | - } else |
4932 | - sk_add_backlog(sk, skb); |
4933 | + } else if (sk_add_backlog(sk, skb)) { |
4934 | + bh_unlock_sock(sk); |
4935 | + atomic_inc(&sk->sk_drops); |
4936 | + goto discard_and_relse; |
4937 | + } |
4938 | + |
4939 | bh_unlock_sock(sk); |
4940 | out: |
4941 | sock_put(sk); |
4942 | @@ -1138,6 +1142,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) |
4943 | sock_lock_init(newsk); |
4944 | bh_lock_sock(newsk); |
4945 | newsk->sk_backlog.head = newsk->sk_backlog.tail = NULL; |
4946 | + newsk->sk_backlog.len = 0; |
4947 | |
4948 | atomic_set(&newsk->sk_rmem_alloc, 0); |
4949 | /* |
4950 | @@ -1541,6 +1546,12 @@ static void __release_sock(struct sock *sk) |
4951 | |
4952 | bh_lock_sock(sk); |
4953 | } while ((skb = sk->sk_backlog.head) != NULL); |
4954 | + |
4955 | + /* |
4956 | + * Doing the zeroing here guarantee we can not loop forever |
4957 | + * while a wild producer attempts to flood us. |
4958 | + */ |
4959 | + sk->sk_backlog.len = 0; |
4960 | } |
4961 | |
4962 | /** |
4963 | @@ -1873,6 +1884,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) |
4964 | sk->sk_allocation = GFP_KERNEL; |
4965 | sk->sk_rcvbuf = sysctl_rmem_default; |
4966 | sk->sk_sndbuf = sysctl_wmem_default; |
4967 | + sk->sk_backlog.limit = sk->sk_rcvbuf << 1; |
4968 | sk->sk_state = TCP_CLOSE; |
4969 | sk_set_socket(sk, sock); |
4970 | |
4971 | diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c |
4972 | index af226a0..0d508c3 100644 |
4973 | --- a/net/dccp/minisocks.c |
4974 | +++ b/net/dccp/minisocks.c |
4975 | @@ -254,7 +254,7 @@ int dccp_child_process(struct sock *parent, struct sock *child, |
4976 | * in main socket hash table and lock on listening |
4977 | * socket does not protect us more. |
4978 | */ |
4979 | - sk_add_backlog(child, skb); |
4980 | + __sk_add_backlog(child, skb); |
4981 | } |
4982 | |
4983 | bh_unlock_sock(child); |
4984 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c |
4985 | index f36ce15..68c1454 100644 |
4986 | --- a/net/ipv4/ip_gre.c |
4987 | +++ b/net/ipv4/ip_gre.c |
4988 | @@ -810,11 +810,13 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev |
4989 | tunnel->err_count = 0; |
4990 | } |
4991 | |
4992 | - max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen; |
4993 | + max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->u.dst.header_len; |
4994 | |
4995 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| |
4996 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { |
4997 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
4998 | + if (max_headroom > dev->needed_headroom) |
4999 | + dev->needed_headroom = max_headroom; |
5000 | if (!new_skb) { |
5001 | ip_rt_put(rt); |
5002 | txq->tx_dropped++; |
5003 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
5004 | index d62b05d..af86e41 100644 |
5005 | --- a/net/ipv4/route.c |
5006 | +++ b/net/ipv4/route.c |
5007 | @@ -922,10 +922,8 @@ static void rt_secret_rebuild_oneshot(struct net *net) |
5008 | { |
5009 | del_timer_sync(&net->ipv4.rt_secret_timer); |
5010 | rt_cache_invalidate(net); |
5011 | - if (ip_rt_secret_interval) { |
5012 | - net->ipv4.rt_secret_timer.expires += ip_rt_secret_interval; |
5013 | - add_timer(&net->ipv4.rt_secret_timer); |
5014 | - } |
5015 | + if (ip_rt_secret_interval) |
5016 | + mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval); |
5017 | } |
5018 | |
5019 | static void rt_emergency_hash_rebuild(struct net *net) |
5020 | @@ -1417,7 +1415,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, |
5021 | dev_hold(rt->u.dst.dev); |
5022 | if (rt->idev) |
5023 | in_dev_hold(rt->idev); |
5024 | - rt->u.dst.obsolete = 0; |
5025 | + rt->u.dst.obsolete = -1; |
5026 | rt->u.dst.lastuse = jiffies; |
5027 | rt->u.dst.path = &rt->u.dst; |
5028 | rt->u.dst.neighbour = NULL; |
5029 | @@ -1482,11 +1480,12 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) |
5030 | struct dst_entry *ret = dst; |
5031 | |
5032 | if (rt) { |
5033 | - if (dst->obsolete) { |
5034 | + if (dst->obsolete > 0) { |
5035 | ip_rt_put(rt); |
5036 | ret = NULL; |
5037 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || |
5038 | - rt->u.dst.expires) { |
5039 | + (rt->u.dst.expires && |
5040 | + time_after_eq(jiffies, rt->u.dst.expires))) { |
5041 | unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, |
5042 | rt->fl.oif, |
5043 | rt_genid(dev_net(dst->dev))); |
5044 | @@ -1702,7 +1701,9 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) |
5045 | |
5046 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) |
5047 | { |
5048 | - return NULL; |
5049 | + if (rt_is_expired((struct rtable *)dst)) |
5050 | + return NULL; |
5051 | + return dst; |
5052 | } |
5053 | |
5054 | static void ipv4_dst_destroy(struct dst_entry *dst) |
5055 | @@ -1864,7 +1865,8 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, |
5056 | if (!rth) |
5057 | goto e_nobufs; |
5058 | |
5059 | - rth->u.dst.output= ip_rt_bug; |
5060 | + rth->u.dst.output = ip_rt_bug; |
5061 | + rth->u.dst.obsolete = -1; |
5062 | |
5063 | atomic_set(&rth->u.dst.__refcnt, 1); |
5064 | rth->u.dst.flags= DST_HOST; |
5065 | @@ -2025,6 +2027,7 @@ static int __mkroute_input(struct sk_buff *skb, |
5066 | rth->fl.oif = 0; |
5067 | rth->rt_spec_dst= spec_dst; |
5068 | |
5069 | + rth->u.dst.obsolete = -1; |
5070 | rth->u.dst.input = ip_forward; |
5071 | rth->u.dst.output = ip_output; |
5072 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); |
5073 | @@ -2189,6 +2192,7 @@ local_input: |
5074 | goto e_nobufs; |
5075 | |
5076 | rth->u.dst.output= ip_rt_bug; |
5077 | + rth->u.dst.obsolete = -1; |
5078 | rth->rt_genid = rt_genid(net); |
5079 | |
5080 | atomic_set(&rth->u.dst.__refcnt, 1); |
5081 | @@ -2415,6 +2419,7 @@ static int __mkroute_output(struct rtable **result, |
5082 | rth->rt_spec_dst= fl->fl4_src; |
5083 | |
5084 | rth->u.dst.output=ip_output; |
5085 | + rth->u.dst.obsolete = -1; |
5086 | rth->rt_genid = rt_genid(dev_net(dev_out)); |
5087 | |
5088 | RT_CACHE_STAT_INC(out_slow_tot); |
5089 | @@ -3072,22 +3077,20 @@ static void rt_secret_reschedule(int old) |
5090 | rtnl_lock(); |
5091 | for_each_net(net) { |
5092 | int deleted = del_timer_sync(&net->ipv4.rt_secret_timer); |
5093 | + long time; |
5094 | |
5095 | if (!new) |
5096 | continue; |
5097 | |
5098 | if (deleted) { |
5099 | - long time = net->ipv4.rt_secret_timer.expires - jiffies; |
5100 | + time = net->ipv4.rt_secret_timer.expires - jiffies; |
5101 | |
5102 | if (time <= 0 || (time += diff) <= 0) |
5103 | time = 0; |
5104 | - |
5105 | - net->ipv4.rt_secret_timer.expires = time; |
5106 | } else |
5107 | - net->ipv4.rt_secret_timer.expires = new; |
5108 | + time = new; |
5109 | |
5110 | - net->ipv4.rt_secret_timer.expires += jiffies; |
5111 | - add_timer(&net->ipv4.rt_secret_timer); |
5112 | + mod_timer(&net->ipv4.rt_secret_timer, jiffies + time); |
5113 | } |
5114 | rtnl_unlock(); |
5115 | } |
5116 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
5117 | index b0a26bb..564a0f8 100644 |
5118 | --- a/net/ipv4/tcp.c |
5119 | +++ b/net/ipv4/tcp.c |
5120 | @@ -429,7 +429,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) |
5121 | if (tp->urg_seq == tp->copied_seq && |
5122 | !sock_flag(sk, SOCK_URGINLINE) && |
5123 | tp->urg_data) |
5124 | - target--; |
5125 | + target++; |
5126 | |
5127 | /* Potential race condition. If read of tp below will |
5128 | * escape above sk->sk_state, we can be illegally awaken |
5129 | @@ -1254,6 +1254,39 @@ static void tcp_prequeue_process(struct sock *sk) |
5130 | tp->ucopy.memory = 0; |
5131 | } |
5132 | |
5133 | +#ifdef CONFIG_NET_DMA |
5134 | +static void tcp_service_net_dma(struct sock *sk, bool wait) |
5135 | +{ |
5136 | + dma_cookie_t done, used; |
5137 | + dma_cookie_t last_issued; |
5138 | + struct tcp_sock *tp = tcp_sk(sk); |
5139 | + |
5140 | + if (!tp->ucopy.dma_chan) |
5141 | + return; |
5142 | + |
5143 | + last_issued = tp->ucopy.dma_cookie; |
5144 | + dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); |
5145 | + |
5146 | + do { |
5147 | + if (dma_async_memcpy_complete(tp->ucopy.dma_chan, |
5148 | + last_issued, &done, |
5149 | + &used) == DMA_SUCCESS) { |
5150 | + /* Safe to free early-copied skbs now */ |
5151 | + __skb_queue_purge(&sk->sk_async_wait_queue); |
5152 | + break; |
5153 | + } else { |
5154 | + struct sk_buff *skb; |
5155 | + while ((skb = skb_peek(&sk->sk_async_wait_queue)) && |
5156 | + (dma_async_is_complete(skb->dma_cookie, done, |
5157 | + used) == DMA_SUCCESS)) { |
5158 | + __skb_dequeue(&sk->sk_async_wait_queue); |
5159 | + kfree_skb(skb); |
5160 | + } |
5161 | + } |
5162 | + } while (wait); |
5163 | +} |
5164 | +#endif |
5165 | + |
5166 | static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) |
5167 | { |
5168 | struct sk_buff *skb; |
5169 | @@ -1546,6 +1579,10 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
5170 | /* __ Set realtime policy in scheduler __ */ |
5171 | } |
5172 | |
5173 | +#ifdef CONFIG_NET_DMA |
5174 | + if (tp->ucopy.dma_chan) |
5175 | + dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); |
5176 | +#endif |
5177 | if (copied >= target) { |
5178 | /* Do not sleep, just process backlog. */ |
5179 | release_sock(sk); |
5180 | @@ -1554,6 +1591,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
5181 | sk_wait_data(sk, &timeo); |
5182 | |
5183 | #ifdef CONFIG_NET_DMA |
5184 | + tcp_service_net_dma(sk, false); /* Don't block */ |
5185 | tp->ucopy.wakeup = 0; |
5186 | #endif |
5187 | |
5188 | @@ -1633,6 +1671,9 @@ do_prequeue: |
5189 | copied = -EFAULT; |
5190 | break; |
5191 | } |
5192 | + |
5193 | + dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); |
5194 | + |
5195 | if ((offset + used) == skb->len) |
5196 | copied_early = 1; |
5197 | |
5198 | @@ -1702,27 +1743,9 @@ skip_copy: |
5199 | } |
5200 | |
5201 | #ifdef CONFIG_NET_DMA |
5202 | - if (tp->ucopy.dma_chan) { |
5203 | - dma_cookie_t done, used; |
5204 | - |
5205 | - dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); |
5206 | - |
5207 | - while (dma_async_memcpy_complete(tp->ucopy.dma_chan, |
5208 | - tp->ucopy.dma_cookie, &done, |
5209 | - &used) == DMA_IN_PROGRESS) { |
5210 | - /* do partial cleanup of sk_async_wait_queue */ |
5211 | - while ((skb = skb_peek(&sk->sk_async_wait_queue)) && |
5212 | - (dma_async_is_complete(skb->dma_cookie, done, |
5213 | - used) == DMA_SUCCESS)) { |
5214 | - __skb_dequeue(&sk->sk_async_wait_queue); |
5215 | - kfree_skb(skb); |
5216 | - } |
5217 | - } |
5218 | + tcp_service_net_dma(sk, true); /* Wait for queue to drain */ |
5219 | + tp->ucopy.dma_chan = NULL; |
5220 | |
5221 | - /* Safe to free early-copied skbs now */ |
5222 | - __skb_queue_purge(&sk->sk_async_wait_queue); |
5223 | - tp->ucopy.dma_chan = NULL; |
5224 | - } |
5225 | if (tp->ucopy.pinned_list) { |
5226 | dma_unpin_iovec_pages(tp->ucopy.pinned_list); |
5227 | tp->ucopy.pinned_list = NULL; |
5228 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
5229 | index 3fddc69..b347d3c 100644 |
5230 | --- a/net/ipv4/tcp_input.c |
5231 | +++ b/net/ipv4/tcp_input.c |
5232 | @@ -2499,6 +2499,9 @@ static void tcp_mark_head_lost(struct sock *sk, int packets) |
5233 | int err; |
5234 | unsigned int mss; |
5235 | |
5236 | + if (packets == 0) |
5237 | + return; |
5238 | + |
5239 | WARN_ON(packets > tp->packets_out); |
5240 | if (tp->lost_skb_hint) { |
5241 | skb = tp->lost_skb_hint; |
5242 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c |
5243 | index 65b8ebf..de935e3 100644 |
5244 | --- a/net/ipv4/tcp_ipv4.c |
5245 | +++ b/net/ipv4/tcp_ipv4.c |
5246 | @@ -1677,8 +1677,10 @@ process: |
5247 | if (!tcp_prequeue(sk, skb)) |
5248 | ret = tcp_v4_do_rcv(sk, skb); |
5249 | } |
5250 | - } else |
5251 | - sk_add_backlog(sk, skb); |
5252 | + } else if (sk_add_backlog(sk, skb)) { |
5253 | + bh_unlock_sock(sk); |
5254 | + goto discard_and_relse; |
5255 | + } |
5256 | bh_unlock_sock(sk); |
5257 | |
5258 | sock_put(sk); |
5259 | diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c |
5260 | index f206ee5..4199bc6 100644 |
5261 | --- a/net/ipv4/tcp_minisocks.c |
5262 | +++ b/net/ipv4/tcp_minisocks.c |
5263 | @@ -728,7 +728,7 @@ int tcp_child_process(struct sock *parent, struct sock *child, |
5264 | * in main socket hash table and lock on listening |
5265 | * socket does not protect us more. |
5266 | */ |
5267 | - sk_add_backlog(child, skb); |
5268 | + __sk_add_backlog(child, skb); |
5269 | } |
5270 | |
5271 | bh_unlock_sock(child); |
5272 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
5273 | index 383ce23..dc26654 100644 |
5274 | --- a/net/ipv4/tcp_output.c |
5275 | +++ b/net/ipv4/tcp_output.c |
5276 | @@ -2393,13 +2393,17 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, |
5277 | struct tcp_extend_values *xvp = tcp_xv(rvp); |
5278 | struct inet_request_sock *ireq = inet_rsk(req); |
5279 | struct tcp_sock *tp = tcp_sk(sk); |
5280 | + const struct tcp_cookie_values *cvp = tp->cookie_values; |
5281 | struct tcphdr *th; |
5282 | struct sk_buff *skb; |
5283 | struct tcp_md5sig_key *md5; |
5284 | int tcp_header_size; |
5285 | int mss; |
5286 | + int s_data_desired = 0; |
5287 | |
5288 | - skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC); |
5289 | + if (cvp != NULL && cvp->s_data_constant && cvp->s_data_desired) |
5290 | + s_data_desired = cvp->s_data_desired; |
5291 | + skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC); |
5292 | if (skb == NULL) |
5293 | return NULL; |
5294 | |
5295 | @@ -2454,16 +2458,12 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, |
5296 | TCPCB_FLAG_SYN | TCPCB_FLAG_ACK); |
5297 | |
5298 | if (OPTION_COOKIE_EXTENSION & opts.options) { |
5299 | - const struct tcp_cookie_values *cvp = tp->cookie_values; |
5300 | - |
5301 | - if (cvp != NULL && |
5302 | - cvp->s_data_constant && |
5303 | - cvp->s_data_desired > 0) { |
5304 | - u8 *buf = skb_put(skb, cvp->s_data_desired); |
5305 | + if (s_data_desired) { |
5306 | + u8 *buf = skb_put(skb, s_data_desired); |
5307 | |
5308 | /* copy data directly from the listening socket. */ |
5309 | - memcpy(buf, cvp->s_data_payload, cvp->s_data_desired); |
5310 | - TCP_SKB_CB(skb)->end_seq += cvp->s_data_desired; |
5311 | + memcpy(buf, cvp->s_data_payload, s_data_desired); |
5312 | + TCP_SKB_CB(skb)->end_seq += s_data_desired; |
5313 | } |
5314 | |
5315 | if (opts.hash_size > 0) { |
5316 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
5317 | index f0126fd..112c611 100644 |
5318 | --- a/net/ipv4/udp.c |
5319 | +++ b/net/ipv4/udp.c |
5320 | @@ -1372,8 +1372,10 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) |
5321 | bh_lock_sock(sk); |
5322 | if (!sock_owned_by_user(sk)) |
5323 | rc = __udp_queue_rcv_skb(sk, skb); |
5324 | - else |
5325 | - sk_add_backlog(sk, skb); |
5326 | + else if (sk_add_backlog(sk, skb)) { |
5327 | + bh_unlock_sock(sk); |
5328 | + goto drop; |
5329 | + } |
5330 | bh_unlock_sock(sk); |
5331 | |
5332 | return rc; |
5333 | diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
5334 | index 67107d6..e4a1483 100644 |
5335 | --- a/net/ipv4/xfrm4_policy.c |
5336 | +++ b/net/ipv4/xfrm4_policy.c |
5337 | @@ -91,11 +91,12 @@ static int xfrm4_init_path(struct xfrm_dst *path, struct dst_entry *dst, |
5338 | return 0; |
5339 | } |
5340 | |
5341 | -static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) |
5342 | +static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, |
5343 | + struct flowi *fl) |
5344 | { |
5345 | struct rtable *rt = (struct rtable *)xdst->route; |
5346 | |
5347 | - xdst->u.rt.fl = rt->fl; |
5348 | + xdst->u.rt.fl = *fl; |
5349 | |
5350 | xdst->u.dst.dev = dev; |
5351 | dev_hold(dev); |
5352 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
5353 | index c2bd74c..6232284 100644 |
5354 | --- a/net/ipv6/route.c |
5355 | +++ b/net/ipv6/route.c |
5356 | @@ -897,12 +897,17 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst) |
5357 | struct rt6_info *rt = (struct rt6_info *) dst; |
5358 | |
5359 | if (rt) { |
5360 | - if (rt->rt6i_flags & RTF_CACHE) |
5361 | - ip6_del_rt(rt); |
5362 | - else |
5363 | + if (rt->rt6i_flags & RTF_CACHE) { |
5364 | + if (rt6_check_expired(rt)) { |
5365 | + ip6_del_rt(rt); |
5366 | + dst = NULL; |
5367 | + } |
5368 | + } else { |
5369 | dst_release(dst); |
5370 | + dst = NULL; |
5371 | + } |
5372 | } |
5373 | - return NULL; |
5374 | + return dst; |
5375 | } |
5376 | |
5377 | static void ip6_link_failure(struct sk_buff *skb) |
5378 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
5379 | index febfd59..548a06e 100644 |
5380 | --- a/net/ipv6/tcp_ipv6.c |
5381 | +++ b/net/ipv6/tcp_ipv6.c |
5382 | @@ -1732,8 +1732,10 @@ process: |
5383 | if (!tcp_prequeue(sk, skb)) |
5384 | ret = tcp_v6_do_rcv(sk, skb); |
5385 | } |
5386 | - } else |
5387 | - sk_add_backlog(sk, skb); |
5388 | + } else if (sk_add_backlog(sk, skb)) { |
5389 | + bh_unlock_sock(sk); |
5390 | + goto discard_and_relse; |
5391 | + } |
5392 | bh_unlock_sock(sk); |
5393 | |
5394 | sock_put(sk); |
5395 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
5396 | index 69ebdbe..d9714d2 100644 |
5397 | --- a/net/ipv6/udp.c |
5398 | +++ b/net/ipv6/udp.c |
5399 | @@ -584,16 +584,20 @@ static void flush_stack(struct sock **stack, unsigned int count, |
5400 | bh_lock_sock(sk); |
5401 | if (!sock_owned_by_user(sk)) |
5402 | udpv6_queue_rcv_skb(sk, skb1); |
5403 | - else |
5404 | - sk_add_backlog(sk, skb1); |
5405 | + else if (sk_add_backlog(sk, skb1)) { |
5406 | + kfree_skb(skb1); |
5407 | + bh_unlock_sock(sk); |
5408 | + goto drop; |
5409 | + } |
5410 | bh_unlock_sock(sk); |
5411 | - } else { |
5412 | - atomic_inc(&sk->sk_drops); |
5413 | - UDP6_INC_STATS_BH(sock_net(sk), |
5414 | - UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); |
5415 | - UDP6_INC_STATS_BH(sock_net(sk), |
5416 | - UDP_MIB_INERRORS, IS_UDPLITE(sk)); |
5417 | + continue; |
5418 | } |
5419 | +drop: |
5420 | + atomic_inc(&sk->sk_drops); |
5421 | + UDP6_INC_STATS_BH(sock_net(sk), |
5422 | + UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); |
5423 | + UDP6_INC_STATS_BH(sock_net(sk), |
5424 | + UDP_MIB_INERRORS, IS_UDPLITE(sk)); |
5425 | } |
5426 | } |
5427 | /* |
5428 | @@ -756,8 +760,12 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, |
5429 | bh_lock_sock(sk); |
5430 | if (!sock_owned_by_user(sk)) |
5431 | udpv6_queue_rcv_skb(sk, skb); |
5432 | - else |
5433 | - sk_add_backlog(sk, skb); |
5434 | + else if (sk_add_backlog(sk, skb)) { |
5435 | + atomic_inc(&sk->sk_drops); |
5436 | + bh_unlock_sock(sk); |
5437 | + sock_put(sk); |
5438 | + goto discard; |
5439 | + } |
5440 | bh_unlock_sock(sk); |
5441 | sock_put(sk); |
5442 | return 0; |
5443 | diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c |
5444 | index dbdc696..ae18165 100644 |
5445 | --- a/net/ipv6/xfrm6_policy.c |
5446 | +++ b/net/ipv6/xfrm6_policy.c |
5447 | @@ -116,7 +116,8 @@ static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst, |
5448 | return 0; |
5449 | } |
5450 | |
5451 | -static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) |
5452 | +static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, |
5453 | + struct flowi *fl) |
5454 | { |
5455 | struct rt6_info *rt = (struct rt6_info*)xdst->route; |
5456 | |
5457 | diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c |
5458 | index 019c780..86d6985 100644 |
5459 | --- a/net/llc/llc_c_ac.c |
5460 | +++ b/net/llc/llc_c_ac.c |
5461 | @@ -1437,7 +1437,7 @@ static void llc_process_tmr_ev(struct sock *sk, struct sk_buff *skb) |
5462 | llc_conn_state_process(sk, skb); |
5463 | else { |
5464 | llc_set_backlog_type(skb, LLC_EVENT); |
5465 | - sk_add_backlog(sk, skb); |
5466 | + __sk_add_backlog(sk, skb); |
5467 | } |
5468 | } |
5469 | } |
5470 | diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c |
5471 | index c6bab39..c61ca88 100644 |
5472 | --- a/net/llc/llc_conn.c |
5473 | +++ b/net/llc/llc_conn.c |
5474 | @@ -756,7 +756,8 @@ void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb) |
5475 | else { |
5476 | dprintk("%s: adding to backlog...\n", __func__); |
5477 | llc_set_backlog_type(skb, LLC_PACKET); |
5478 | - sk_add_backlog(sk, skb); |
5479 | + if (sk_add_backlog(sk, skb)) |
5480 | + goto drop_unlock; |
5481 | } |
5482 | out: |
5483 | bh_unlock_sock(sk); |
5484 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
5485 | index 91dc863..3521c17 100644 |
5486 | --- a/net/mac80211/ieee80211_i.h |
5487 | +++ b/net/mac80211/ieee80211_i.h |
5488 | @@ -264,6 +264,7 @@ enum ieee80211_sta_flags { |
5489 | IEEE80211_STA_DISABLE_11N = BIT(4), |
5490 | IEEE80211_STA_CSA_RECEIVED = BIT(5), |
5491 | IEEE80211_STA_MFP_ENABLED = BIT(6), |
5492 | + IEEE80211_STA_NULLFUNC_ACKED = BIT(7), |
5493 | }; |
5494 | |
5495 | /* flags for MLME request */ |
5496 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
5497 | index 05a18f4..1a209ac 100644 |
5498 | --- a/net/mac80211/mlme.c |
5499 | +++ b/net/mac80211/mlme.c |
5500 | @@ -205,7 +205,8 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, |
5501 | sta = sta_info_get(local, bssid); |
5502 | if (sta) |
5503 | rate_control_rate_update(local, sband, sta, |
5504 | - IEEE80211_RC_HT_CHANGED); |
5505 | + IEEE80211_RC_HT_CHANGED, |
5506 | + local->oper_channel_type); |
5507 | rcu_read_unlock(); |
5508 | } |
5509 | |
5510 | @@ -661,8 +662,11 @@ static void ieee80211_enable_ps(struct ieee80211_local *local, |
5511 | } else { |
5512 | if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) |
5513 | ieee80211_send_nullfunc(local, sdata, 1); |
5514 | - conf->flags |= IEEE80211_CONF_PS; |
5515 | - ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
5516 | + |
5517 | + if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { |
5518 | + conf->flags |= IEEE80211_CONF_PS; |
5519 | + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
5520 | + } |
5521 | } |
5522 | } |
5523 | |
5524 | @@ -753,6 +757,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work) |
5525 | container_of(work, struct ieee80211_local, |
5526 | dynamic_ps_enable_work); |
5527 | struct ieee80211_sub_if_data *sdata = local->ps_sdata; |
5528 | + struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
5529 | |
5530 | /* can only happen when PS was just disabled anyway */ |
5531 | if (!sdata) |
5532 | @@ -761,11 +766,16 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work) |
5533 | if (local->hw.conf.flags & IEEE80211_CONF_PS) |
5534 | return; |
5535 | |
5536 | - if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) |
5537 | + if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && |
5538 | + (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) |
5539 | ieee80211_send_nullfunc(local, sdata, 1); |
5540 | |
5541 | - local->hw.conf.flags |= IEEE80211_CONF_PS; |
5542 | - ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
5543 | + if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) || |
5544 | + (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { |
5545 | + ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; |
5546 | + local->hw.conf.flags |= IEEE80211_CONF_PS; |
5547 | + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
5548 | + } |
5549 | } |
5550 | |
5551 | void ieee80211_dynamic_ps_timer(unsigned long data) |
5552 | @@ -2467,6 +2477,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, |
5553 | list_add(&wk->list, &ifmgd->work_list); |
5554 | |
5555 | ifmgd->flags &= ~IEEE80211_STA_DISABLE_11N; |
5556 | + ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; |
5557 | |
5558 | for (i = 0; i < req->crypto.n_ciphers_pairwise; i++) |
5559 | if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 || |
5560 | diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h |
5561 | index cb9bd1f..3e02ea4 100644 |
5562 | --- a/net/mac80211/rate.h |
5563 | +++ b/net/mac80211/rate.h |
5564 | @@ -69,7 +69,8 @@ static inline void rate_control_rate_init(struct sta_info *sta) |
5565 | |
5566 | static inline void rate_control_rate_update(struct ieee80211_local *local, |
5567 | struct ieee80211_supported_band *sband, |
5568 | - struct sta_info *sta, u32 changed) |
5569 | + struct sta_info *sta, u32 changed, |
5570 | + enum nl80211_channel_type oper_chan_type) |
5571 | { |
5572 | struct rate_control_ref *ref = local->rate_ctrl; |
5573 | struct ieee80211_sta *ista = &sta->sta; |
5574 | @@ -77,7 +78,7 @@ static inline void rate_control_rate_update(struct ieee80211_local *local, |
5575 | |
5576 | if (ref && ref->ops->rate_update) |
5577 | ref->ops->rate_update(ref->priv, sband, ista, |
5578 | - priv_sta, changed); |
5579 | + priv_sta, changed, oper_chan_type); |
5580 | } |
5581 | |
5582 | static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, |
5583 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c |
5584 | index d78f36c..f5abeec 100644 |
5585 | --- a/net/mac80211/status.c |
5586 | +++ b/net/mac80211/status.c |
5587 | @@ -165,6 +165,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
5588 | rcu_read_lock(); |
5589 | |
5590 | sband = local->hw.wiphy->bands[info->band]; |
5591 | + fc = hdr->frame_control; |
5592 | |
5593 | sta = sta_info_get(local, hdr->addr1); |
5594 | |
5595 | @@ -180,8 +181,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
5596 | return; |
5597 | } |
5598 | |
5599 | - fc = hdr->frame_control; |
5600 | - |
5601 | if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) && |
5602 | (ieee80211_is_data_qos(fc))) { |
5603 | u16 tid, ssn; |
5604 | @@ -246,6 +245,20 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
5605 | local->dot11FailedCount++; |
5606 | } |
5607 | |
5608 | + if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) && |
5609 | + (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && |
5610 | + !(info->flags & IEEE80211_TX_CTL_INJECTED) && |
5611 | + local->ps_sdata && !(local->scanning)) { |
5612 | + if (info->flags & IEEE80211_TX_STAT_ACK) { |
5613 | + local->ps_sdata->u.mgd.flags |= |
5614 | + IEEE80211_STA_NULLFUNC_ACKED; |
5615 | + ieee80211_queue_work(&local->hw, |
5616 | + &local->dynamic_ps_enable_work); |
5617 | + } else |
5618 | + mod_timer(&local->dynamic_ps_timer, jiffies + |
5619 | + msecs_to_jiffies(10)); |
5620 | + } |
5621 | + |
5622 | /* this was a transmitted frame, but now we want to reuse it */ |
5623 | skb_orphan(skb); |
5624 | |
5625 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
5626 | index 0ffe689..eeac97f 100644 |
5627 | --- a/net/netfilter/nf_conntrack_netlink.c |
5628 | +++ b/net/netfilter/nf_conntrack_netlink.c |
5629 | @@ -571,7 +571,8 @@ nla_put_failure: |
5630 | nlmsg_failure: |
5631 | kfree_skb(skb); |
5632 | errout: |
5633 | - nfnetlink_set_err(0, group, -ENOBUFS); |
5634 | + if (nfnetlink_set_err(0, group, -ENOBUFS) > 0) |
5635 | + return -ENOBUFS; |
5636 | return 0; |
5637 | } |
5638 | #endif /* CONFIG_NF_CONNTRACK_EVENTS */ |
5639 | diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c |
5640 | index eedc0c1..35fe185 100644 |
5641 | --- a/net/netfilter/nfnetlink.c |
5642 | +++ b/net/netfilter/nfnetlink.c |
5643 | @@ -114,9 +114,9 @@ int nfnetlink_send(struct sk_buff *skb, u32 pid, |
5644 | } |
5645 | EXPORT_SYMBOL_GPL(nfnetlink_send); |
5646 | |
5647 | -void nfnetlink_set_err(u32 pid, u32 group, int error) |
5648 | +int nfnetlink_set_err(u32 pid, u32 group, int error) |
5649 | { |
5650 | - netlink_set_err(nfnl, pid, group, error); |
5651 | + return netlink_set_err(nfnl, pid, group, error); |
5652 | } |
5653 | EXPORT_SYMBOL_GPL(nfnetlink_set_err); |
5654 | |
5655 | diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c |
5656 | index 43e83a4..e460bf9 100644 |
5657 | --- a/net/netfilter/xt_recent.c |
5658 | +++ b/net/netfilter/xt_recent.c |
5659 | @@ -260,7 +260,7 @@ recent_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
5660 | for (i = 0; i < e->nstamps; i++) { |
5661 | if (info->seconds && time_after(time, e->stamps[i])) |
5662 | continue; |
5663 | - if (info->hit_count && ++hits >= info->hit_count) { |
5664 | + if (!info->hit_count || ++hits >= info->hit_count) { |
5665 | ret = !ret; |
5666 | break; |
5667 | } |
5668 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
5669 | index 4c5972b..0052d3c 100644 |
5670 | --- a/net/netlink/af_netlink.c |
5671 | +++ b/net/netlink/af_netlink.c |
5672 | @@ -1093,6 +1093,7 @@ static inline int do_one_set_err(struct sock *sk, |
5673 | struct netlink_set_err_data *p) |
5674 | { |
5675 | struct netlink_sock *nlk = nlk_sk(sk); |
5676 | + int ret = 0; |
5677 | |
5678 | if (sk == p->exclude_sk) |
5679 | goto out; |
5680 | @@ -1104,10 +1105,15 @@ static inline int do_one_set_err(struct sock *sk, |
5681 | !test_bit(p->group - 1, nlk->groups)) |
5682 | goto out; |
5683 | |
5684 | + if (p->code == ENOBUFS && nlk->flags & NETLINK_RECV_NO_ENOBUFS) { |
5685 | + ret = 1; |
5686 | + goto out; |
5687 | + } |
5688 | + |
5689 | sk->sk_err = p->code; |
5690 | sk->sk_error_report(sk); |
5691 | out: |
5692 | - return 0; |
5693 | + return ret; |
5694 | } |
5695 | |
5696 | /** |
5697 | @@ -1116,12 +1122,16 @@ out: |
5698 | * @pid: the PID of a process that we want to skip (if any) |
5699 | * @groups: the broadcast group that will notice the error |
5700 | * @code: error code, must be negative (as usual in kernelspace) |
5701 | + * |
5702 | + * This function returns the number of broadcast listeners that have set the |
5703 | + * NETLINK_RECV_NO_ENOBUFS socket option. |
5704 | */ |
5705 | -void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) |
5706 | +int netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) |
5707 | { |
5708 | struct netlink_set_err_data info; |
5709 | struct hlist_node *node; |
5710 | struct sock *sk; |
5711 | + int ret = 0; |
5712 | |
5713 | info.exclude_sk = ssk; |
5714 | info.pid = pid; |
5715 | @@ -1132,9 +1142,10 @@ void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) |
5716 | read_lock(&nl_table_lock); |
5717 | |
5718 | sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list) |
5719 | - do_one_set_err(sk, &info); |
5720 | + ret += do_one_set_err(sk, &info); |
5721 | |
5722 | read_unlock(&nl_table_lock); |
5723 | + return ret; |
5724 | } |
5725 | EXPORT_SYMBOL(netlink_set_err); |
5726 | |
5727 | diff --git a/net/sctp/input.c b/net/sctp/input.c |
5728 | index c0c973e..3d74b26 100644 |
5729 | --- a/net/sctp/input.c |
5730 | +++ b/net/sctp/input.c |
5731 | @@ -75,7 +75,7 @@ static struct sctp_association *__sctp_lookup_association( |
5732 | const union sctp_addr *peer, |
5733 | struct sctp_transport **pt); |
5734 | |
5735 | -static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb); |
5736 | +static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb); |
5737 | |
5738 | |
5739 | /* Calculate the SCTP checksum of an SCTP packet. */ |
5740 | @@ -265,8 +265,13 @@ int sctp_rcv(struct sk_buff *skb) |
5741 | } |
5742 | |
5743 | if (sock_owned_by_user(sk)) { |
5744 | + if (sctp_add_backlog(sk, skb)) { |
5745 | + sctp_bh_unlock_sock(sk); |
5746 | + sctp_chunk_free(chunk); |
5747 | + skb = NULL; /* sctp_chunk_free already freed the skb */ |
5748 | + goto discard_release; |
5749 | + } |
5750 | SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG); |
5751 | - sctp_add_backlog(sk, skb); |
5752 | } else { |
5753 | SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ); |
5754 | sctp_inq_push(&chunk->rcvr->inqueue, chunk); |
5755 | @@ -336,8 +341,10 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) |
5756 | sctp_bh_lock_sock(sk); |
5757 | |
5758 | if (sock_owned_by_user(sk)) { |
5759 | - sk_add_backlog(sk, skb); |
5760 | - backloged = 1; |
5761 | + if (sk_add_backlog(sk, skb)) |
5762 | + sctp_chunk_free(chunk); |
5763 | + else |
5764 | + backloged = 1; |
5765 | } else |
5766 | sctp_inq_push(inqueue, chunk); |
5767 | |
5768 | @@ -362,22 +369,27 @@ done: |
5769 | return 0; |
5770 | } |
5771 | |
5772 | -static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb) |
5773 | +static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb) |
5774 | { |
5775 | struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; |
5776 | struct sctp_ep_common *rcvr = chunk->rcvr; |
5777 | + int ret; |
5778 | |
5779 | - /* Hold the assoc/ep while hanging on the backlog queue. |
5780 | - * This way, we know structures we need will not disappear from us |
5781 | - */ |
5782 | - if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) |
5783 | - sctp_association_hold(sctp_assoc(rcvr)); |
5784 | - else if (SCTP_EP_TYPE_SOCKET == rcvr->type) |
5785 | - sctp_endpoint_hold(sctp_ep(rcvr)); |
5786 | - else |
5787 | - BUG(); |
5788 | + ret = sk_add_backlog(sk, skb); |
5789 | + if (!ret) { |
5790 | + /* Hold the assoc/ep while hanging on the backlog queue. |
5791 | + * This way, we know structures we need will not disappear |
5792 | + * from us |
5793 | + */ |
5794 | + if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) |
5795 | + sctp_association_hold(sctp_assoc(rcvr)); |
5796 | + else if (SCTP_EP_TYPE_SOCKET == rcvr->type) |
5797 | + sctp_endpoint_hold(sctp_ep(rcvr)); |
5798 | + else |
5799 | + BUG(); |
5800 | + } |
5801 | + return ret; |
5802 | |
5803 | - sk_add_backlog(sk, skb); |
5804 | } |
5805 | |
5806 | /* Handle icmp frag needed error. */ |
5807 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
5808 | index 67fdac9..9bd9d82 100644 |
5809 | --- a/net/sctp/socket.c |
5810 | +++ b/net/sctp/socket.c |
5811 | @@ -3720,6 +3720,9 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk) |
5812 | SCTP_DBG_OBJCNT_INC(sock); |
5813 | percpu_counter_inc(&sctp_sockets_allocated); |
5814 | |
5815 | + /* Set socket backlog limit. */ |
5816 | + sk->sk_backlog.limit = sysctl_sctp_rmem[1]; |
5817 | + |
5818 | local_bh_disable(); |
5819 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); |
5820 | local_bh_enable(); |
5821 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c |
5822 | index f7a7f83..50346a6 100644 |
5823 | --- a/net/sunrpc/auth_gss/auth_gss.c |
5824 | +++ b/net/sunrpc/auth_gss/auth_gss.c |
5825 | @@ -1273,9 +1273,8 @@ alloc_enc_pages(struct rpc_rqst *rqstp) |
5826 | rqstp->rq_release_snd_buf = priv_release_snd_buf; |
5827 | return 0; |
5828 | out_free: |
5829 | - for (i--; i >= 0; i--) { |
5830 | - __free_page(rqstp->rq_enc_pages[i]); |
5831 | - } |
5832 | + rqstp->rq_enc_pages_num = i; |
5833 | + priv_release_snd_buf(rqstp); |
5834 | out: |
5835 | return -EAGAIN; |
5836 | } |
5837 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c |
5838 | index 49278f8..27a2378 100644 |
5839 | --- a/net/sunrpc/rpc_pipe.c |
5840 | +++ b/net/sunrpc/rpc_pipe.c |
5841 | @@ -587,6 +587,8 @@ static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent, |
5842 | struct dentry *dentry; |
5843 | |
5844 | dentry = __rpc_lookup_create(parent, name); |
5845 | + if (IS_ERR(dentry)) |
5846 | + return dentry; |
5847 | if (dentry->d_inode == NULL) |
5848 | return dentry; |
5849 | dput(dentry); |
5850 | diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c |
5851 | index 4f30336..6bd41a9 100644 |
5852 | --- a/net/sunrpc/svc_xprt.c |
5853 | +++ b/net/sunrpc/svc_xprt.c |
5854 | @@ -699,8 +699,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) |
5855 | spin_unlock_bh(&pool->sp_lock); |
5856 | |
5857 | len = 0; |
5858 | - if (test_bit(XPT_LISTENER, &xprt->xpt_flags) && |
5859 | - !test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
5860 | + if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
5861 | + dprintk("svc_recv: found XPT_CLOSE\n"); |
5862 | + svc_delete_xprt(xprt); |
5863 | + } else if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { |
5864 | struct svc_xprt *newxpt; |
5865 | newxpt = xprt->xpt_ops->xpo_accept(xprt); |
5866 | if (newxpt) { |
5867 | @@ -726,7 +728,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) |
5868 | svc_xprt_received(newxpt); |
5869 | } |
5870 | svc_xprt_received(xprt); |
5871 | - } else if (!test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
5872 | + } else { |
5873 | dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n", |
5874 | rqstp, pool->sp_id, xprt, |
5875 | atomic_read(&xprt->xpt_ref.refcount)); |
5876 | @@ -739,11 +741,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) |
5877 | dprintk("svc: got len=%d\n", len); |
5878 | } |
5879 | |
5880 | - if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { |
5881 | - dprintk("svc_recv: found XPT_CLOSE\n"); |
5882 | - svc_delete_xprt(xprt); |
5883 | - } |
5884 | - |
5885 | /* No data, incomplete (TCP) read, or accept() */ |
5886 | if (len == 0 || len == -EAGAIN) { |
5887 | rqstp->rq_res.len = 0; |
5888 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
5889 | index 870929e..528efef 100644 |
5890 | --- a/net/sunrpc/svcsock.c |
5891 | +++ b/net/sunrpc/svcsock.c |
5892 | @@ -968,6 +968,7 @@ static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp) |
5893 | return len; |
5894 | err_delete: |
5895 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); |
5896 | + svc_xprt_received(&svsk->sk_xprt); |
5897 | err_again: |
5898 | return -EAGAIN; |
5899 | } |
5900 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c |
5901 | index 1ea64f0..4b235fc 100644 |
5902 | --- a/net/tipc/socket.c |
5903 | +++ b/net/tipc/socket.c |
5904 | @@ -1322,8 +1322,10 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf) |
5905 | if (!sock_owned_by_user(sk)) { |
5906 | res = filter_rcv(sk, buf); |
5907 | } else { |
5908 | - sk_add_backlog(sk, buf); |
5909 | - res = TIPC_OK; |
5910 | + if (sk_add_backlog(sk, buf)) |
5911 | + res = TIPC_ERR_OVERLOAD; |
5912 | + else |
5913 | + res = TIPC_OK; |
5914 | } |
5915 | bh_unlock_sock(sk); |
5916 | |
5917 | diff --git a/net/x25/x25_dev.c b/net/x25/x25_dev.c |
5918 | index 3e1efe5..52e3042 100644 |
5919 | --- a/net/x25/x25_dev.c |
5920 | +++ b/net/x25/x25_dev.c |
5921 | @@ -53,7 +53,7 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb) |
5922 | if (!sock_owned_by_user(sk)) { |
5923 | queued = x25_process_rx_frame(sk, skb); |
5924 | } else { |
5925 | - sk_add_backlog(sk, skb); |
5926 | + queued = !sk_add_backlog(sk, skb); |
5927 | } |
5928 | bh_unlock_sock(sk); |
5929 | sock_put(sk); |
5930 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c |
5931 | index 0ecb16a..f12dd3d 100644 |
5932 | --- a/net/xfrm/xfrm_policy.c |
5933 | +++ b/net/xfrm/xfrm_policy.c |
5934 | @@ -1354,7 +1354,8 @@ static inline int xfrm_init_path(struct xfrm_dst *path, struct dst_entry *dst, |
5935 | return err; |
5936 | } |
5937 | |
5938 | -static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) |
5939 | +static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, |
5940 | + struct flowi *fl) |
5941 | { |
5942 | struct xfrm_policy_afinfo *afinfo = |
5943 | xfrm_policy_get_afinfo(xdst->u.dst.ops->family); |
5944 | @@ -1363,7 +1364,7 @@ static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) |
5945 | if (!afinfo) |
5946 | return -EINVAL; |
5947 | |
5948 | - err = afinfo->fill_dst(xdst, dev); |
5949 | + err = afinfo->fill_dst(xdst, dev, fl); |
5950 | |
5951 | xfrm_policy_put_afinfo(afinfo); |
5952 | |
5953 | @@ -1468,7 +1469,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, |
5954 | for (dst_prev = dst0; dst_prev != dst; dst_prev = dst_prev->child) { |
5955 | struct xfrm_dst *xdst = (struct xfrm_dst *)dst_prev; |
5956 | |
5957 | - err = xfrm_fill_dst(xdst, dev); |
5958 | + err = xfrm_fill_dst(xdst, dev, fl); |
5959 | if (err) |
5960 | goto free_dst; |
5961 | |
5962 | diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c |
5963 | index d9266ba..4e5f2f7 100644 |
5964 | --- a/sound/pci/ac97/ac97_patch.c |
5965 | +++ b/sound/pci/ac97/ac97_patch.c |
5966 | @@ -1867,12 +1867,14 @@ static unsigned int ad1981_jacks_blacklist[] = { |
5967 | 0x10140523, /* Thinkpad R40 */ |
5968 | 0x10140534, /* Thinkpad X31 */ |
5969 | 0x10140537, /* Thinkpad T41p */ |
5970 | + 0x1014053e, /* Thinkpad R40e */ |
5971 | 0x10140554, /* Thinkpad T42p/R50p */ |
5972 | 0x10140567, /* Thinkpad T43p 2668-G7U */ |
5973 | 0x10140581, /* Thinkpad X41-2527 */ |
5974 | 0x10280160, /* Dell Dimension 2400 */ |
5975 | 0x104380b0, /* Asus A7V8X-MX */ |
5976 | 0x11790241, /* Toshiba Satellite A-15 S127 */ |
5977 | + 0x1179ff10, /* Toshiba P500 */ |
5978 | 0x144dc01a, /* Samsung NP-X20C004/SEG */ |
5979 | 0 /* end */ |
5980 | }; |
5981 | diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c |
5982 | index a312bae..bbaec22 100644 |
5983 | --- a/sound/pci/cmipci.c |
5984 | +++ b/sound/pci/cmipci.c |
5985 | @@ -941,13 +941,21 @@ static snd_pcm_uframes_t snd_cmipci_pcm_pointer(struct cmipci *cm, struct cmipci |
5986 | struct snd_pcm_substream *substream) |
5987 | { |
5988 | size_t ptr; |
5989 | - unsigned int reg; |
5990 | + unsigned int reg, rem, tries; |
5991 | + |
5992 | if (!rec->running) |
5993 | return 0; |
5994 | #if 1 // this seems better.. |
5995 | reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; |
5996 | - ptr = rec->dma_size - (snd_cmipci_read_w(cm, reg) + 1); |
5997 | - ptr >>= rec->shift; |
5998 | + for (tries = 0; tries < 3; tries++) { |
5999 | + rem = snd_cmipci_read_w(cm, reg); |
6000 | + if (rem < rec->dma_size) |
6001 | + goto ok; |
6002 | + } |
6003 | + printk(KERN_ERR "cmipci: invalid PCM pointer: %#x\n", rem); |
6004 | + return SNDRV_PCM_POS_XRUN; |
6005 | +ok: |
6006 | + ptr = (rec->dma_size - (rem + 1)) >> rec->shift; |
6007 | #else |
6008 | reg = rec->ch ? CM_REG_CH1_FRAME1 : CM_REG_CH0_FRAME1; |
6009 | ptr = snd_cmipci_read(cm, reg) - rec->offset; |
6010 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
6011 | index 6d6e307..9ace8eb 100644 |
6012 | --- a/sound/pci/hda/hda_intel.c |
6013 | +++ b/sound/pci/hda/hda_intel.c |
6014 | @@ -2265,8 +2265,10 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { |
6015 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
6016 | SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB), |
6017 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
6018 | + SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB), |
6019 | SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), |
6020 | SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), |
6021 | + SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), |
6022 | {} |
6023 | }; |
6024 | |
6025 | @@ -2354,6 +2356,7 @@ static void __devinit check_probe_mask(struct azx *chip, int dev) |
6026 | static struct snd_pci_quirk msi_black_list[] __devinitdata = { |
6027 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ |
6028 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ |
6029 | + SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ |
6030 | {} |
6031 | }; |
6032 | |
6033 | @@ -2372,6 +2375,13 @@ static void __devinit check_msi(struct azx *chip) |
6034 | "hda_intel: msi for device %04x:%04x set to %d\n", |
6035 | q->subvendor, q->subdevice, q->value); |
6036 | chip->msi = q->value; |
6037 | + return; |
6038 | + } |
6039 | + |
6040 | + /* NVidia chipsets seem to cause troubles with MSI */ |
6041 | + if (chip->driver_type == AZX_DRIVER_NVIDIA) { |
6042 | + printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n"); |
6043 | + chip->msi = 0; |
6044 | } |
6045 | } |
6046 | |
6047 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
6048 | index c578c28..71b7a96 100644 |
6049 | --- a/sound/pci/hda/patch_conexant.c |
6050 | +++ b/sound/pci/hda/patch_conexant.c |
6051 | @@ -1570,6 +1570,21 @@ static int patch_cxt5047(struct hda_codec *codec) |
6052 | #endif |
6053 | } |
6054 | spec->vmaster_nid = 0x13; |
6055 | + |
6056 | + switch (codec->subsystem_id >> 16) { |
6057 | + case 0x103c: |
6058 | + /* HP laptops have really bad sound over 0 dB on NID 0x10. |
6059 | + * Fix max PCM level to 0 dB (originally it has 0x1e steps |
6060 | + * with 0 dB offset 0x17) |
6061 | + */ |
6062 | + snd_hda_override_amp_caps(codec, 0x10, HDA_INPUT, |
6063 | + (0x17 << AC_AMPCAP_OFFSET_SHIFT) | |
6064 | + (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | |
6065 | + (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | |
6066 | + (1 << AC_AMPCAP_MUTE_SHIFT)); |
6067 | + break; |
6068 | + } |
6069 | + |
6070 | return 0; |
6071 | } |
6072 | |
6073 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
6074 | index da34095..a79f841 100644 |
6075 | --- a/sound/pci/hda/patch_realtek.c |
6076 | +++ b/sound/pci/hda/patch_realtek.c |
6077 | @@ -407,6 +407,8 @@ static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, |
6078 | unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); |
6079 | if (mux_idx >= spec->num_mux_defs) |
6080 | mux_idx = 0; |
6081 | + if (!spec->input_mux[mux_idx].num_items && mux_idx > 0) |
6082 | + mux_idx = 0; |
6083 | return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); |
6084 | } |
6085 | |
6086 | @@ -435,6 +437,8 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, |
6087 | |
6088 | mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; |
6089 | imux = &spec->input_mux[mux_idx]; |
6090 | + if (!imux->num_items && mux_idx > 0) |
6091 | + imux = &spec->input_mux[0]; |
6092 | |
6093 | type = get_wcaps_type(get_wcaps(codec, nid)); |
6094 | if (type == AC_WID_AUD_MIX) { |
6095 | @@ -6380,7 +6384,7 @@ static struct alc_config_preset alc260_presets[] = { |
6096 | .num_dacs = ARRAY_SIZE(alc260_dac_nids), |
6097 | .dac_nids = alc260_dac_nids, |
6098 | .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), |
6099 | - .adc_nids = alc260_adc_nids, |
6100 | + .adc_nids = alc260_dual_adc_nids, |
6101 | .num_channel_mode = ARRAY_SIZE(alc260_modes), |
6102 | .channel_mode = alc260_modes, |
6103 | .input_mux = &alc260_capture_source, |
6104 | @@ -9097,7 +9101,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { |
6105 | SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), |
6106 | SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), |
6107 | SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), |
6108 | - SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), |
6109 | + SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG), |
6110 | |
6111 | {} |
6112 | }; |
6113 | @@ -9941,6 +9945,8 @@ static void alc882_auto_init_input_src(struct hda_codec *codec) |
6114 | continue; |
6115 | mux_idx = c >= spec->num_mux_defs ? 0 : c; |
6116 | imux = &spec->input_mux[mux_idx]; |
6117 | + if (!imux->num_items && mux_idx > 0) |
6118 | + imux = &spec->input_mux[0]; |
6119 | for (idx = 0; idx < conns; idx++) { |
6120 | /* if the current connection is the selected one, |
6121 | * unmute it as default - otherwise mute it |
6122 | diff --git a/tools/perf/Documentation/Makefile b/tools/perf/Documentation/Makefile |
6123 | index bdd3b7e..bd498d4 100644 |
6124 | --- a/tools/perf/Documentation/Makefile |
6125 | +++ b/tools/perf/Documentation/Makefile |
6126 | @@ -24,7 +24,10 @@ DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT)) |
6127 | DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT)) |
6128 | DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT)) |
6129 | |
6130 | +# Make the path relative to DESTDIR, not prefix |
6131 | +ifndef DESTDIR |
6132 | prefix?=$(HOME) |
6133 | +endif |
6134 | bindir?=$(prefix)/bin |
6135 | htmldir?=$(prefix)/share/doc/perf-doc |
6136 | pdfdir?=$(prefix)/share/doc/perf-doc |
6137 | @@ -32,7 +35,6 @@ mandir?=$(prefix)/share/man |
6138 | man1dir=$(mandir)/man1 |
6139 | man5dir=$(mandir)/man5 |
6140 | man7dir=$(mandir)/man7 |
6141 | -# DESTDIR= |
6142 | |
6143 | ASCIIDOC=asciidoc |
6144 | ASCIIDOC_EXTRA = --unsafe |
6145 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile |
6146 | index 2e7fa3a..03eb7c9 100644 |
6147 | --- a/tools/perf/Makefile |
6148 | +++ b/tools/perf/Makefile |
6149 | @@ -216,7 +216,10 @@ STRIP ?= strip |
6150 | # runtime figures out where they are based on the path to the executable. |
6151 | # This can help installing the suite in a relocatable way. |
6152 | |
6153 | +# Make the path relative to DESTDIR, not to prefix |
6154 | +ifndef DESTDIR |
6155 | prefix = $(HOME) |
6156 | +endif |
6157 | bindir_relative = bin |
6158 | bindir = $(prefix)/$(bindir_relative) |
6159 | mandir = share/man |
6160 | @@ -233,7 +236,6 @@ sysconfdir = $(prefix)/etc |
6161 | ETC_PERFCONFIG = etc/perfconfig |
6162 | endif |
6163 | lib = lib |
6164 | -# DESTDIR= |
6165 | |
6166 | export prefix bindir sharedir sysconfdir |
6167 | |
6168 | diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c |
6169 | index 593ff25..0b1ba36 100644 |
6170 | --- a/tools/perf/builtin-annotate.c |
6171 | +++ b/tools/perf/builtin-annotate.c |
6172 | @@ -53,32 +53,20 @@ struct sym_priv { |
6173 | |
6174 | static const char *sym_hist_filter; |
6175 | |
6176 | -static int symbol_filter(struct map *map __used, struct symbol *sym) |
6177 | +static int sym__alloc_hist(struct symbol *self) |
6178 | { |
6179 | - if (sym_hist_filter == NULL || |
6180 | - strcmp(sym->name, sym_hist_filter) == 0) { |
6181 | - struct sym_priv *priv = symbol__priv(sym); |
6182 | - const int size = (sizeof(*priv->hist) + |
6183 | - (sym->end - sym->start) * sizeof(u64)); |
6184 | + struct sym_priv *priv = symbol__priv(self); |
6185 | + const int size = (sizeof(*priv->hist) + |
6186 | + (self->end - self->start) * sizeof(u64)); |
6187 | |
6188 | - priv->hist = malloc(size); |
6189 | - if (priv->hist) |
6190 | - memset(priv->hist, 0, size); |
6191 | - return 0; |
6192 | - } |
6193 | - /* |
6194 | - * FIXME: We should really filter it out, as we don't want to go thru symbols |
6195 | - * we're not interested, and if a DSO ends up with no symbols, delete it too, |
6196 | - * but right now the kernel loading routines in symbol.c bail out if no symbols |
6197 | - * are found, fix it later. |
6198 | - */ |
6199 | - return 0; |
6200 | + priv->hist = zalloc(size); |
6201 | + return priv->hist == NULL ? -1 : 0; |
6202 | } |
6203 | |
6204 | /* |
6205 | * collect histogram counts |
6206 | */ |
6207 | -static void hist_hit(struct hist_entry *he, u64 ip) |
6208 | +static int annotate__hist_hit(struct hist_entry *he, u64 ip) |
6209 | { |
6210 | unsigned int sym_size, offset; |
6211 | struct symbol *sym = he->sym; |
6212 | @@ -88,11 +76,11 @@ static void hist_hit(struct hist_entry *he, u64 ip) |
6213 | he->count++; |
6214 | |
6215 | if (!sym || !he->map) |
6216 | - return; |
6217 | + return 0; |
6218 | |
6219 | priv = symbol__priv(sym); |
6220 | - if (!priv->hist) |
6221 | - return; |
6222 | + if (priv->hist == NULL && sym__alloc_hist(sym) < 0) |
6223 | + return -ENOMEM; |
6224 | |
6225 | sym_size = sym->end - sym->start; |
6226 | offset = ip - sym->start; |
6227 | @@ -102,7 +90,7 @@ static void hist_hit(struct hist_entry *he, u64 ip) |
6228 | he->map->unmap_ip(he->map, ip)); |
6229 | |
6230 | if (offset >= sym_size) |
6231 | - return; |
6232 | + return 0; |
6233 | |
6234 | h = priv->hist; |
6235 | h->sum++; |
6236 | @@ -114,18 +102,31 @@ static void hist_hit(struct hist_entry *he, u64 ip) |
6237 | he->sym->name, |
6238 | (void *)(unsigned long)ip, ip - he->sym->start, |
6239 | h->ip[offset]); |
6240 | + return 0; |
6241 | } |
6242 | |
6243 | static int perf_session__add_hist_entry(struct perf_session *self, |
6244 | struct addr_location *al, u64 count) |
6245 | { |
6246 | - bool hit; |
6247 | - struct hist_entry *he = __perf_session__add_hist_entry(self, al, NULL, |
6248 | - count, &hit); |
6249 | - if (he == NULL) |
6250 | - return -ENOMEM; |
6251 | - hist_hit(he, al->addr); |
6252 | - return 0; |
6253 | + bool hit; |
6254 | + struct hist_entry *he; |
6255 | + |
6256 | + if (sym_hist_filter != NULL && |
6257 | + (al->sym == NULL || strcmp(sym_hist_filter, al->sym->name) != 0)) { |
6258 | + /* We're only interested in a symbol named sym_hist_filter */ |
6259 | + if (al->sym != NULL) { |
6260 | + rb_erase(&al->sym->rb_node, |
6261 | + &al->map->dso->symbols[al->map->type]); |
6262 | + symbol__delete(al->sym); |
6263 | + } |
6264 | + return 0; |
6265 | + } |
6266 | + |
6267 | + he = __perf_session__add_hist_entry(self, al, NULL, count, &hit); |
6268 | + if (he == NULL) |
6269 | + return -ENOMEM; |
6270 | + |
6271 | + return annotate__hist_hit(he, al->addr); |
6272 | } |
6273 | |
6274 | static int process_sample_event(event_t *event, struct perf_session *session) |
6275 | @@ -135,7 +136,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) |
6276 | dump_printf("(IP, %d): %d: %p\n", event->header.misc, |
6277 | event->ip.pid, (void *)(long)event->ip.ip); |
6278 | |
6279 | - if (event__preprocess_sample(event, session, &al, symbol_filter) < 0) { |
6280 | + if (event__preprocess_sample(event, session, &al, NULL) < 0) { |
6281 | fprintf(stderr, "problem processing %d event, skipping it.\n", |
6282 | event->header.type); |
6283 | return -1; |
6284 | diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c |
6285 | index c1e6774..fa626eb 100644 |
6286 | --- a/tools/perf/builtin-probe.c |
6287 | +++ b/tools/perf/builtin-probe.c |
6288 | @@ -48,7 +48,6 @@ |
6289 | #include "util/probe-event.h" |
6290 | |
6291 | #define MAX_PATH_LEN 256 |
6292 | -#define MAX_PROBES 128 |
6293 | |
6294 | /* Session management structure */ |
6295 | static struct { |
6296 | diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c |
6297 | index 4b852c0..7f81ded 100644 |
6298 | --- a/tools/perf/util/probe-finder.c |
6299 | +++ b/tools/perf/util/probe-finder.c |
6300 | @@ -544,6 +544,9 @@ static void show_probepoint(Dwarf_Die sp_die, Dwarf_Signed offs, |
6301 | } |
6302 | free_current_frame_base(pf); |
6303 | |
6304 | + if (pp->found == MAX_PROBES) |
6305 | + die("Too many( > %d) probe point found.\n", MAX_PROBES); |
6306 | + |
6307 | pp->probes[pp->found] = strdup(tmp); |
6308 | pp->found++; |
6309 | } |
6310 | diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c |
6311 | index 72547b9..fcb8919 100644 |
6312 | --- a/tools/perf/util/symbol.c |
6313 | +++ b/tools/perf/util/symbol.c |
6314 | @@ -149,7 +149,7 @@ static struct symbol *symbol__new(u64 start, u64 len, const char *name) |
6315 | return self; |
6316 | } |
6317 | |
6318 | -static void symbol__delete(struct symbol *self) |
6319 | +void symbol__delete(struct symbol *self) |
6320 | { |
6321 | free(((void *)self) - symbol_conf.priv_size); |
6322 | } |
6323 | diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h |
6324 | index 8aded23..400227a 100644 |
6325 | --- a/tools/perf/util/symbol.h |
6326 | +++ b/tools/perf/util/symbol.h |
6327 | @@ -49,6 +49,8 @@ struct symbol { |
6328 | char name[0]; |
6329 | }; |
6330 | |
6331 | +void symbol__delete(struct symbol *self); |
6332 | + |
6333 | struct strlist; |
6334 | |
6335 | struct symbol_conf { |