Annotation of /trunk/kernel26-alx/patches-2.6.33-r2/0101-2.6.33.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1192 -
(hide annotations)
(download)
Sat Nov 20 15:43:20 2010 UTC (13 years, 10 months ago) by niro
File size: 204495 byte(s)
Sat Nov 20 15:43:20 2010 UTC (13 years, 10 months ago) by niro
File size: 204495 byte(s)
added fixes for intel-agp and i915 module loading issues
1 | niro | 1192 | 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 { |