Contents of /trunk/kernel26-alx/patches-3.10/0120-3.10.21-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(show annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 89991 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 89991 byte(s)
-3.10.84-alx-r1
1 | diff --git a/Makefile b/Makefile |
2 | index ba784b7b0f51..c0635fbab87f 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 20 |
9 | +SUBLEVEL = 21 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c |
14 | index 84ba67b982c0..e04613906f1b 100644 |
15 | --- a/arch/arm/kvm/mmu.c |
16 | +++ b/arch/arm/kvm/mmu.c |
17 | @@ -313,6 +313,17 @@ out: |
18 | return err; |
19 | } |
20 | |
21 | +static phys_addr_t kvm_kaddr_to_phys(void *kaddr) |
22 | +{ |
23 | + if (!is_vmalloc_addr(kaddr)) { |
24 | + BUG_ON(!virt_addr_valid(kaddr)); |
25 | + return __pa(kaddr); |
26 | + } else { |
27 | + return page_to_phys(vmalloc_to_page(kaddr)) + |
28 | + offset_in_page(kaddr); |
29 | + } |
30 | +} |
31 | + |
32 | /** |
33 | * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode |
34 | * @from: The virtual kernel start address of the range |
35 | @@ -324,16 +335,27 @@ out: |
36 | */ |
37 | int create_hyp_mappings(void *from, void *to) |
38 | { |
39 | - unsigned long phys_addr = virt_to_phys(from); |
40 | + phys_addr_t phys_addr; |
41 | + unsigned long virt_addr; |
42 | unsigned long start = KERN_TO_HYP((unsigned long)from); |
43 | unsigned long end = KERN_TO_HYP((unsigned long)to); |
44 | |
45 | - /* Check for a valid kernel memory mapping */ |
46 | - if (!virt_addr_valid(from) || !virt_addr_valid(to - 1)) |
47 | - return -EINVAL; |
48 | + start = start & PAGE_MASK; |
49 | + end = PAGE_ALIGN(end); |
50 | |
51 | - return __create_hyp_mappings(hyp_pgd, start, end, |
52 | - __phys_to_pfn(phys_addr), PAGE_HYP); |
53 | + for (virt_addr = start; virt_addr < end; virt_addr += PAGE_SIZE) { |
54 | + int err; |
55 | + |
56 | + phys_addr = kvm_kaddr_to_phys(from + virt_addr - start); |
57 | + err = __create_hyp_mappings(hyp_pgd, virt_addr, |
58 | + virt_addr + PAGE_SIZE, |
59 | + __phys_to_pfn(phys_addr), |
60 | + PAGE_HYP); |
61 | + if (err) |
62 | + return err; |
63 | + } |
64 | + |
65 | + return 0; |
66 | } |
67 | |
68 | /** |
69 | diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h |
70 | index ac12ae2b9286..db9a16c704f3 100644 |
71 | --- a/arch/cris/include/asm/io.h |
72 | +++ b/arch/cris/include/asm/io.h |
73 | @@ -3,6 +3,7 @@ |
74 | |
75 | #include <asm/page.h> /* for __va, __pa */ |
76 | #include <arch/io.h> |
77 | +#include <asm-generic/iomap.h> |
78 | #include <linux/kernel.h> |
79 | |
80 | struct cris_io_operations |
81 | diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h |
82 | index e0a899a1a8a6..5a84b3a50741 100644 |
83 | --- a/arch/ia64/include/asm/processor.h |
84 | +++ b/arch/ia64/include/asm/processor.h |
85 | @@ -319,7 +319,7 @@ struct thread_struct { |
86 | regs->loadrs = 0; \ |
87 | regs->r8 = get_dumpable(current->mm); /* set "don't zap registers" flag */ \ |
88 | regs->r12 = new_sp - 16; /* allocate 16 byte scratch area */ \ |
89 | - if (unlikely(!get_dumpable(current->mm))) { \ |
90 | + if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) { \ |
91 | /* \ |
92 | * Zap scratch regs to avoid leaking bits between processes with different \ |
93 | * uid/privileges. \ |
94 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
95 | index 0f83122e6676..323309963cd3 100644 |
96 | --- a/arch/powerpc/kernel/signal_32.c |
97 | +++ b/arch/powerpc/kernel/signal_32.c |
98 | @@ -454,7 +454,15 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, |
99 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) |
100 | return 1; |
101 | msr |= MSR_VSX; |
102 | - } |
103 | + } else if (!ctx_has_vsx_region) |
104 | + /* |
105 | + * With a small context structure we can't hold the VSX |
106 | + * registers, hence clear the MSR value to indicate the state |
107 | + * was not saved. |
108 | + */ |
109 | + msr &= ~MSR_VSX; |
110 | + |
111 | + |
112 | #endif /* CONFIG_VSX */ |
113 | #ifdef CONFIG_SPE |
114 | /* save spe registers */ |
115 | diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c |
116 | index 2d845d8199fc..56d2e72c85de 100644 |
117 | --- a/arch/powerpc/kernel/vio.c |
118 | +++ b/arch/powerpc/kernel/vio.c |
119 | @@ -1530,12 +1530,12 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, |
120 | |
121 | dn = dev->of_node; |
122 | if (!dn) { |
123 | - strcat(buf, "\n"); |
124 | + strcpy(buf, "\n"); |
125 | return strlen(buf); |
126 | } |
127 | cp = of_get_property(dn, "compatible", NULL); |
128 | if (!cp) { |
129 | - strcat(buf, "\n"); |
130 | + strcpy(buf, "\n"); |
131 | return strlen(buf); |
132 | } |
133 | |
134 | diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c |
135 | index 3e99c149271a..7ce9cf3b6988 100644 |
136 | --- a/arch/powerpc/mm/slice.c |
137 | +++ b/arch/powerpc/mm/slice.c |
138 | @@ -258,7 +258,7 @@ static bool slice_scan_available(unsigned long addr, |
139 | slice = GET_HIGH_SLICE_INDEX(addr); |
140 | *boundary_addr = (slice + end) ? |
141 | ((slice + end) << SLICE_HIGH_SHIFT) : SLICE_LOW_TOP; |
142 | - return !!(available.high_slices & (1u << slice)); |
143 | + return !!(available.high_slices & (1ul << slice)); |
144 | } |
145 | } |
146 | |
147 | diff --git a/arch/powerpc/platforms/52xx/Kconfig b/arch/powerpc/platforms/52xx/Kconfig |
148 | index 90f4496017e4..af54174801f7 100644 |
149 | --- a/arch/powerpc/platforms/52xx/Kconfig |
150 | +++ b/arch/powerpc/platforms/52xx/Kconfig |
151 | @@ -57,5 +57,5 @@ config PPC_MPC5200_BUGFIX |
152 | |
153 | config PPC_MPC5200_LPBFIFO |
154 | tristate "MPC5200 LocalPlus bus FIFO driver" |
155 | - depends on PPC_MPC52xx |
156 | + depends on PPC_MPC52xx && PPC_BESTCOMM |
157 | select PPC_BESTCOMM_GEN_BD |
158 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c |
159 | index 7816beff1db8..f75607c93e8a 100644 |
160 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c |
161 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c |
162 | @@ -151,13 +151,23 @@ static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) |
163 | rid_end = pe->rid + 1; |
164 | } |
165 | |
166 | - /* Associate PE in PELT */ |
167 | + /* |
168 | + * Associate PE in PELT. We need add the PE into the |
169 | + * corresponding PELT-V as well. Otherwise, the error |
170 | + * originated from the PE might contribute to other |
171 | + * PEs. |
172 | + */ |
173 | rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, |
174 | bcomp, dcomp, fcomp, OPAL_MAP_PE); |
175 | if (rc) { |
176 | pe_err(pe, "OPAL error %ld trying to setup PELT table\n", rc); |
177 | return -ENXIO; |
178 | } |
179 | + |
180 | + rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, |
181 | + pe->pe_number, OPAL_ADD_PE_TO_DOMAIN); |
182 | + if (rc) |
183 | + pe_warn(pe, "OPAL error %d adding self to PELTV\n", rc); |
184 | opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, |
185 | OPAL_EEH_ACTION_CLEAR_FREEZE_ALL); |
186 | |
187 | diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c |
188 | index b4dbade8ca24..2e4b5be31a1b 100644 |
189 | --- a/arch/s390/crypto/aes_s390.c |
190 | +++ b/arch/s390/crypto/aes_s390.c |
191 | @@ -35,7 +35,6 @@ static u8 *ctrblk; |
192 | static char keylen_flag; |
193 | |
194 | struct s390_aes_ctx { |
195 | - u8 iv[AES_BLOCK_SIZE]; |
196 | u8 key[AES_MAX_KEY_SIZE]; |
197 | long enc; |
198 | long dec; |
199 | @@ -441,30 +440,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
200 | return aes_set_key(tfm, in_key, key_len); |
201 | } |
202 | |
203 | -static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, |
204 | +static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, |
205 | struct blkcipher_walk *walk) |
206 | { |
207 | + struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
208 | int ret = blkcipher_walk_virt(desc, walk); |
209 | unsigned int nbytes = walk->nbytes; |
210 | + struct { |
211 | + u8 iv[AES_BLOCK_SIZE]; |
212 | + u8 key[AES_MAX_KEY_SIZE]; |
213 | + } param; |
214 | |
215 | if (!nbytes) |
216 | goto out; |
217 | |
218 | - memcpy(param, walk->iv, AES_BLOCK_SIZE); |
219 | + memcpy(param.iv, walk->iv, AES_BLOCK_SIZE); |
220 | + memcpy(param.key, sctx->key, sctx->key_len); |
221 | do { |
222 | /* only use complete blocks */ |
223 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); |
224 | u8 *out = walk->dst.virt.addr; |
225 | u8 *in = walk->src.virt.addr; |
226 | |
227 | - ret = crypt_s390_kmc(func, param, out, in, n); |
228 | + ret = crypt_s390_kmc(func, ¶m, out, in, n); |
229 | if (ret < 0 || ret != n) |
230 | return -EIO; |
231 | |
232 | nbytes &= AES_BLOCK_SIZE - 1; |
233 | ret = blkcipher_walk_done(desc, walk, nbytes); |
234 | } while ((nbytes = walk->nbytes)); |
235 | - memcpy(walk->iv, param, AES_BLOCK_SIZE); |
236 | + memcpy(walk->iv, param.iv, AES_BLOCK_SIZE); |
237 | |
238 | out: |
239 | return ret; |
240 | @@ -481,7 +486,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, |
241 | return fallback_blk_enc(desc, dst, src, nbytes); |
242 | |
243 | blkcipher_walk_init(&walk, dst, src, nbytes); |
244 | - return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); |
245 | + return cbc_aes_crypt(desc, sctx->enc, &walk); |
246 | } |
247 | |
248 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, |
249 | @@ -495,7 +500,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, |
250 | return fallback_blk_dec(desc, dst, src, nbytes); |
251 | |
252 | blkcipher_walk_init(&walk, dst, src, nbytes); |
253 | - return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); |
254 | + return cbc_aes_crypt(desc, sctx->dec, &walk); |
255 | } |
256 | |
257 | static struct crypto_alg cbc_aes_alg = { |
258 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c |
259 | index 4f977d0d25c2..14647fe09d0c 100644 |
260 | --- a/arch/s390/kernel/smp.c |
261 | +++ b/arch/s390/kernel/smp.c |
262 | @@ -933,7 +933,7 @@ static ssize_t show_idle_count(struct device *dev, |
263 | idle_count = ACCESS_ONCE(idle->idle_count); |
264 | if (ACCESS_ONCE(idle->clock_idle_enter)) |
265 | idle_count++; |
266 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
267 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
268 | return sprintf(buf, "%llu\n", idle_count); |
269 | } |
270 | static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL); |
271 | @@ -951,7 +951,7 @@ static ssize_t show_idle_time(struct device *dev, |
272 | idle_time = ACCESS_ONCE(idle->idle_time); |
273 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); |
274 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); |
275 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
276 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
277 | idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0; |
278 | return sprintf(buf, "%llu\n", idle_time >> 12); |
279 | } |
280 | diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c |
281 | index 3fb09359eda6..737d50caa4fe 100644 |
282 | --- a/arch/s390/kernel/vtime.c |
283 | +++ b/arch/s390/kernel/vtime.c |
284 | @@ -190,7 +190,7 @@ cputime64_t s390_get_idle_time(int cpu) |
285 | sequence = ACCESS_ONCE(idle->sequence); |
286 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); |
287 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); |
288 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
289 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
290 | return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0; |
291 | } |
292 | |
293 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c |
294 | index 42a392a9fd02..d4bdd253fea7 100644 |
295 | --- a/arch/x86/kernel/ftrace.c |
296 | +++ b/arch/x86/kernel/ftrace.c |
297 | @@ -248,6 +248,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func) |
298 | return ret; |
299 | } |
300 | |
301 | +static int is_ftrace_caller(unsigned long ip) |
302 | +{ |
303 | + if (ip == (unsigned long)(&ftrace_call) || |
304 | + ip == (unsigned long)(&ftrace_regs_call)) |
305 | + return 1; |
306 | + |
307 | + return 0; |
308 | +} |
309 | + |
310 | /* |
311 | * A breakpoint was added to the code address we are about to |
312 | * modify, and this is the handle that will just skip over it. |
313 | @@ -257,10 +266,13 @@ int ftrace_update_ftrace_func(ftrace_func_t func) |
314 | */ |
315 | int ftrace_int3_handler(struct pt_regs *regs) |
316 | { |
317 | + unsigned long ip; |
318 | + |
319 | if (WARN_ON_ONCE(!regs)) |
320 | return 0; |
321 | |
322 | - if (!ftrace_location(regs->ip - 1)) |
323 | + ip = regs->ip - 1; |
324 | + if (!ftrace_location(ip) && !is_ftrace_caller(ip)) |
325 | return 0; |
326 | |
327 | regs->ip += MCOUNT_INSN_SIZE - 1; |
328 | diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c |
329 | index efdec7cd8e01..b516dfb411ec 100644 |
330 | --- a/arch/x86/kernel/microcode_amd.c |
331 | +++ b/arch/x86/kernel/microcode_amd.c |
332 | @@ -430,7 +430,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, |
333 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); |
334 | |
335 | if (request_firmware(&fw, (const char *)fw_name, device)) { |
336 | - pr_err("failed to load file %s\n", fw_name); |
337 | + pr_debug("failed to load file %s\n", fw_name); |
338 | goto out; |
339 | } |
340 | |
341 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c |
342 | index 81a5f5e8f142..59b90379cb6a 100644 |
343 | --- a/arch/x86/kernel/process.c |
344 | +++ b/arch/x86/kernel/process.c |
345 | @@ -391,9 +391,9 @@ static void amd_e400_idle(void) |
346 | * The switch back from broadcast mode needs to be |
347 | * called with interrupts disabled. |
348 | */ |
349 | - local_irq_disable(); |
350 | - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); |
351 | - local_irq_enable(); |
352 | + local_irq_disable(); |
353 | + clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); |
354 | + local_irq_enable(); |
355 | } else |
356 | default_idle(); |
357 | } |
358 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
359 | index 5953dcea752d..5484d54582ca 100644 |
360 | --- a/arch/x86/kvm/emulate.c |
361 | +++ b/arch/x86/kvm/emulate.c |
362 | @@ -4207,7 +4207,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, |
363 | case OpMem8: |
364 | ctxt->memop.bytes = 1; |
365 | if (ctxt->memop.type == OP_REG) { |
366 | - ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); |
367 | + int highbyte_regs = ctxt->rex_prefix == 0; |
368 | + |
369 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, |
370 | + highbyte_regs); |
371 | fetch_register_operand(&ctxt->memop); |
372 | } |
373 | goto mem_common; |
374 | diff --git a/block/blk-core.c b/block/blk-core.c |
375 | index d5745b5833c9..45f3a51f6b56 100644 |
376 | --- a/block/blk-core.c |
377 | +++ b/block/blk-core.c |
378 | @@ -2229,6 +2229,7 @@ void blk_start_request(struct request *req) |
379 | if (unlikely(blk_bidi_rq(req))) |
380 | req->next_rq->resid_len = blk_rq_bytes(req->next_rq); |
381 | |
382 | + BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); |
383 | blk_add_timer(req); |
384 | } |
385 | EXPORT_SYMBOL(blk_start_request); |
386 | diff --git a/block/blk-settings.c b/block/blk-settings.c |
387 | index c50ecf0ea3b1..53309333c2f0 100644 |
388 | --- a/block/blk-settings.c |
389 | +++ b/block/blk-settings.c |
390 | @@ -144,6 +144,7 @@ void blk_set_stacking_limits(struct queue_limits *lim) |
391 | lim->discard_zeroes_data = 1; |
392 | lim->max_segments = USHRT_MAX; |
393 | lim->max_hw_sectors = UINT_MAX; |
394 | + lim->max_segment_size = UINT_MAX; |
395 | lim->max_sectors = UINT_MAX; |
396 | lim->max_write_same_sectors = UINT_MAX; |
397 | } |
398 | diff --git a/block/blk-timeout.c b/block/blk-timeout.c |
399 | index 6e4744cbfb56..5a6296ef9a81 100644 |
400 | --- a/block/blk-timeout.c |
401 | +++ b/block/blk-timeout.c |
402 | @@ -90,8 +90,8 @@ static void blk_rq_timed_out(struct request *req) |
403 | __blk_complete_request(req); |
404 | break; |
405 | case BLK_EH_RESET_TIMER: |
406 | - blk_clear_rq_complete(req); |
407 | blk_add_timer(req); |
408 | + blk_clear_rq_complete(req); |
409 | break; |
410 | case BLK_EH_NOT_HANDLED: |
411 | /* |
412 | @@ -173,7 +173,6 @@ void blk_add_timer(struct request *req) |
413 | return; |
414 | |
415 | BUG_ON(!list_empty(&req->timeout_list)); |
416 | - BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); |
417 | |
418 | /* |
419 | * Some LLDs, like scsi, peek at the timeout to prevent a |
420 | diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c |
421 | index c0bb3778f1ae..666f1962a160 100644 |
422 | --- a/crypto/ansi_cprng.c |
423 | +++ b/crypto/ansi_cprng.c |
424 | @@ -230,11 +230,11 @@ remainder: |
425 | */ |
426 | if (byte_count < DEFAULT_BLK_SZ) { |
427 | empty_rbuf: |
428 | - for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; |
429 | - ctx->rand_data_valid++) { |
430 | + while (ctx->rand_data_valid < DEFAULT_BLK_SZ) { |
431 | *ptr = ctx->rand_data[ctx->rand_data_valid]; |
432 | ptr++; |
433 | byte_count--; |
434 | + ctx->rand_data_valid++; |
435 | if (byte_count == 0) |
436 | goto done; |
437 | } |
438 | diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c |
439 | index b60c877f5906..c3241b188434 100644 |
440 | --- a/drivers/acpi/acpica/exoparg1.c |
441 | +++ b/drivers/acpi/acpica/exoparg1.c |
442 | @@ -963,10 +963,17 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) |
443 | */ |
444 | return_desc = |
445 | *(operand[0]->reference.where); |
446 | - if (return_desc) { |
447 | - acpi_ut_add_reference |
448 | - (return_desc); |
449 | + if (!return_desc) { |
450 | + /* |
451 | + * Element is NULL, do not allow the dereference. |
452 | + * This provides compatibility with other ACPI |
453 | + * implementations. |
454 | + */ |
455 | + return_ACPI_STATUS |
456 | + (AE_AML_UNINITIALIZED_ELEMENT); |
457 | } |
458 | + |
459 | + acpi_ut_add_reference(return_desc); |
460 | break; |
461 | |
462 | default: |
463 | @@ -991,11 +998,40 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) |
464 | acpi_namespace_node |
465 | *) |
466 | return_desc); |
467 | - } |
468 | + if (!return_desc) { |
469 | + break; |
470 | + } |
471 | |
472 | - /* Add another reference to the object! */ |
473 | + /* |
474 | + * June 2013: |
475 | + * buffer_fields/field_units require additional resolution |
476 | + */ |
477 | + switch (return_desc->common.type) { |
478 | + case ACPI_TYPE_BUFFER_FIELD: |
479 | + case ACPI_TYPE_LOCAL_REGION_FIELD: |
480 | + case ACPI_TYPE_LOCAL_BANK_FIELD: |
481 | + case ACPI_TYPE_LOCAL_INDEX_FIELD: |
482 | |
483 | - acpi_ut_add_reference(return_desc); |
484 | + status = |
485 | + acpi_ex_read_data_from_field |
486 | + (walk_state, return_desc, |
487 | + &temp_desc); |
488 | + if (ACPI_FAILURE(status)) { |
489 | + goto cleanup; |
490 | + } |
491 | + |
492 | + return_desc = temp_desc; |
493 | + break; |
494 | + |
495 | + default: |
496 | + |
497 | + /* Add another reference to the object */ |
498 | + |
499 | + acpi_ut_add_reference |
500 | + (return_desc); |
501 | + break; |
502 | + } |
503 | + } |
504 | break; |
505 | |
506 | default: |
507 | diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c |
508 | index 93c6049c2d75..b1ad39443cb6 100644 |
509 | --- a/drivers/acpi/acpica/exstore.c |
510 | +++ b/drivers/acpi/acpica/exstore.c |
511 | @@ -57,6 +57,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, |
512 | union acpi_operand_object *dest_desc, |
513 | struct acpi_walk_state *walk_state); |
514 | |
515 | +static acpi_status |
516 | +acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, |
517 | + struct acpi_namespace_node *node, |
518 | + struct acpi_walk_state *walk_state); |
519 | + |
520 | /******************************************************************************* |
521 | * |
522 | * FUNCTION: acpi_ex_store |
523 | @@ -376,7 +381,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, |
524 | * When storing into an object the data is converted to the |
525 | * target object type then stored in the object. This means |
526 | * that the target object type (for an initialized target) will |
527 | - * not be changed by a store operation. |
528 | + * not be changed by a store operation. A copy_object can change |
529 | + * the target type, however. |
530 | + * |
531 | + * The implicit_conversion flag is set to NO/FALSE only when |
532 | + * storing to an arg_x -- as per the rules of the ACPI spec. |
533 | * |
534 | * Assumes parameters are already validated. |
535 | * |
536 | @@ -400,7 +409,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, |
537 | target_type = acpi_ns_get_type(node); |
538 | target_desc = acpi_ns_get_attached_object(node); |
539 | |
540 | - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n", |
541 | + ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n", |
542 | source_desc, |
543 | acpi_ut_get_object_type_name(source_desc), node, |
544 | acpi_ut_get_type_name(target_type))); |
545 | @@ -414,46 +423,31 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, |
546 | return_ACPI_STATUS(status); |
547 | } |
548 | |
549 | - /* If no implicit conversion, drop into the default case below */ |
550 | - |
551 | - if ((!implicit_conversion) || |
552 | - ((walk_state->opcode == AML_COPY_OP) && |
553 | - (target_type != ACPI_TYPE_LOCAL_REGION_FIELD) && |
554 | - (target_type != ACPI_TYPE_LOCAL_BANK_FIELD) && |
555 | - (target_type != ACPI_TYPE_LOCAL_INDEX_FIELD))) { |
556 | - /* |
557 | - * Force execution of default (no implicit conversion). Note: |
558 | - * copy_object does not perform an implicit conversion, as per the ACPI |
559 | - * spec -- except in case of region/bank/index fields -- because these |
560 | - * objects must retain their original type permanently. |
561 | - */ |
562 | - target_type = ACPI_TYPE_ANY; |
563 | - } |
564 | - |
565 | /* Do the actual store operation */ |
566 | |
567 | switch (target_type) { |
568 | - case ACPI_TYPE_BUFFER_FIELD: |
569 | - case ACPI_TYPE_LOCAL_REGION_FIELD: |
570 | - case ACPI_TYPE_LOCAL_BANK_FIELD: |
571 | - case ACPI_TYPE_LOCAL_INDEX_FIELD: |
572 | - |
573 | - /* For fields, copy the source data to the target field. */ |
574 | - |
575 | - status = acpi_ex_write_data_to_field(source_desc, target_desc, |
576 | - &walk_state->result_obj); |
577 | - break; |
578 | - |
579 | case ACPI_TYPE_INTEGER: |
580 | case ACPI_TYPE_STRING: |
581 | case ACPI_TYPE_BUFFER: |
582 | |
583 | /* |
584 | - * These target types are all of type Integer/String/Buffer, and |
585 | - * therefore support implicit conversion before the store. |
586 | - * |
587 | - * Copy and/or convert the source object to a new target object |
588 | + * The simple data types all support implicit source operand |
589 | + * conversion before the store. |
590 | */ |
591 | + |
592 | + if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) { |
593 | + /* |
594 | + * However, copy_object and Stores to arg_x do not perform |
595 | + * an implicit conversion, as per the ACPI specification. |
596 | + * A direct store is performed instead. |
597 | + */ |
598 | + status = acpi_ex_store_direct_to_node(source_desc, node, |
599 | + walk_state); |
600 | + break; |
601 | + } |
602 | + |
603 | + /* Store with implicit source operand conversion support */ |
604 | + |
605 | status = |
606 | acpi_ex_store_object_to_object(source_desc, target_desc, |
607 | &new_desc, walk_state); |
608 | @@ -467,13 +461,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, |
609 | * the Name's type to that of the value being stored in it. |
610 | * source_desc reference count is incremented by attach_object. |
611 | * |
612 | - * Note: This may change the type of the node if an explicit store |
613 | - * has been performed such that the node/object type has been |
614 | - * changed. |
615 | + * Note: This may change the type of the node if an explicit |
616 | + * store has been performed such that the node/object type |
617 | + * has been changed. |
618 | */ |
619 | - status = |
620 | - acpi_ns_attach_object(node, new_desc, |
621 | - new_desc->common.type); |
622 | + status = acpi_ns_attach_object(node, new_desc, |
623 | + new_desc->common.type); |
624 | |
625 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
626 | "Store %s into %s via Convert/Attach\n", |
627 | @@ -484,38 +477,83 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, |
628 | } |
629 | break; |
630 | |
631 | - default: |
632 | - |
633 | - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
634 | - "Storing [%s] (%p) directly into node [%s] (%p)" |
635 | - " with no implicit conversion\n", |
636 | - acpi_ut_get_object_type_name(source_desc), |
637 | - source_desc, |
638 | - acpi_ut_get_object_type_name(target_desc), |
639 | - node)); |
640 | + case ACPI_TYPE_BUFFER_FIELD: |
641 | + case ACPI_TYPE_LOCAL_REGION_FIELD: |
642 | + case ACPI_TYPE_LOCAL_BANK_FIELD: |
643 | + case ACPI_TYPE_LOCAL_INDEX_FIELD: |
644 | + /* |
645 | + * For all fields, always write the source data to the target |
646 | + * field. Any required implicit source operand conversion is |
647 | + * performed in the function below as necessary. Note, field |
648 | + * objects must retain their original type permanently. |
649 | + */ |
650 | + status = acpi_ex_write_data_to_field(source_desc, target_desc, |
651 | + &walk_state->result_obj); |
652 | + break; |
653 | |
654 | + default: |
655 | /* |
656 | * No conversions for all other types. Directly store a copy of |
657 | - * the source object. NOTE: This is a departure from the ACPI |
658 | - * spec, which states "If conversion is impossible, abort the |
659 | - * running control method". |
660 | + * the source object. This is the ACPI spec-defined behavior for |
661 | + * the copy_object operator. |
662 | * |
663 | - * This code implements "If conversion is impossible, treat the |
664 | - * Store operation as a CopyObject". |
665 | + * NOTE: For the Store operator, this is a departure from the |
666 | + * ACPI spec, which states "If conversion is impossible, abort |
667 | + * the running control method". Instead, this code implements |
668 | + * "If conversion is impossible, treat the Store operation as |
669 | + * a CopyObject". |
670 | */ |
671 | - status = |
672 | - acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, |
673 | - walk_state); |
674 | - if (ACPI_FAILURE(status)) { |
675 | - return_ACPI_STATUS(status); |
676 | - } |
677 | - |
678 | - status = |
679 | - acpi_ns_attach_object(node, new_desc, |
680 | - new_desc->common.type); |
681 | - acpi_ut_remove_reference(new_desc); |
682 | + status = acpi_ex_store_direct_to_node(source_desc, node, |
683 | + walk_state); |
684 | break; |
685 | } |
686 | |
687 | return_ACPI_STATUS(status); |
688 | } |
689 | + |
690 | +/******************************************************************************* |
691 | + * |
692 | + * FUNCTION: acpi_ex_store_direct_to_node |
693 | + * |
694 | + * PARAMETERS: source_desc - Value to be stored |
695 | + * node - Named object to receive the value |
696 | + * walk_state - Current walk state |
697 | + * |
698 | + * RETURN: Status |
699 | + * |
700 | + * DESCRIPTION: "Store" an object directly to a node. This involves a copy |
701 | + * and an attach. |
702 | + * |
703 | + ******************************************************************************/ |
704 | + |
705 | +static acpi_status |
706 | +acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, |
707 | + struct acpi_namespace_node *node, |
708 | + struct acpi_walk_state *walk_state) |
709 | +{ |
710 | + acpi_status status; |
711 | + union acpi_operand_object *new_desc; |
712 | + |
713 | + ACPI_FUNCTION_TRACE(ex_store_direct_to_node); |
714 | + |
715 | + ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
716 | + "Storing [%s] (%p) directly into node [%s] (%p)" |
717 | + " with no implicit conversion\n", |
718 | + acpi_ut_get_object_type_name(source_desc), |
719 | + source_desc, acpi_ut_get_type_name(node->type), |
720 | + node)); |
721 | + |
722 | + /* Copy the source object to a new object */ |
723 | + |
724 | + status = |
725 | + acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, walk_state); |
726 | + if (ACPI_FAILURE(status)) { |
727 | + return_ACPI_STATUS(status); |
728 | + } |
729 | + |
730 | + /* Attach the new object to the node */ |
731 | + |
732 | + status = acpi_ns_attach_object(node, new_desc, new_desc->common.type); |
733 | + acpi_ut_remove_reference(new_desc); |
734 | + return_ACPI_STATUS(status); |
735 | +} |
736 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
737 | index 45af90a1ec1b..1ad5a4f9e0c3 100644 |
738 | --- a/drivers/acpi/ec.c |
739 | +++ b/drivers/acpi/ec.c |
740 | @@ -175,9 +175,10 @@ static void start_transaction(struct acpi_ec *ec) |
741 | static void advance_transaction(struct acpi_ec *ec, u8 status) |
742 | { |
743 | unsigned long flags; |
744 | - struct transaction *t = ec->curr; |
745 | + struct transaction *t; |
746 | |
747 | spin_lock_irqsave(&ec->lock, flags); |
748 | + t = ec->curr; |
749 | if (!t) |
750 | goto unlock; |
751 | if (t->wlen > t->wi) { |
752 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
753 | index e427dc516c76..e36842b9e1fa 100644 |
754 | --- a/drivers/acpi/pci_root.c |
755 | +++ b/drivers/acpi/pci_root.c |
756 | @@ -614,9 +614,12 @@ static void handle_root_bridge_removal(struct acpi_device *device) |
757 | ej_event->device = device; |
758 | ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; |
759 | |
760 | + get_device(&device->dev); |
761 | status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); |
762 | - if (ACPI_FAILURE(status)) |
763 | + if (ACPI_FAILURE(status)) { |
764 | + put_device(&device->dev); |
765 | kfree(ej_event); |
766 | + } |
767 | } |
768 | |
769 | static void _handle_hotplug_event_root(struct work_struct *work) |
770 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c |
771 | index eb133c77aadb..4056d3175178 100644 |
772 | --- a/drivers/acpi/processor_idle.c |
773 | +++ b/drivers/acpi/processor_idle.c |
774 | @@ -121,17 +121,10 @@ static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = { |
775 | */ |
776 | static void acpi_safe_halt(void) |
777 | { |
778 | - current_thread_info()->status &= ~TS_POLLING; |
779 | - /* |
780 | - * TS_POLLING-cleared state must be visible before we |
781 | - * test NEED_RESCHED: |
782 | - */ |
783 | - smp_mb(); |
784 | - if (!need_resched()) { |
785 | + if (!tif_need_resched()) { |
786 | safe_halt(); |
787 | local_irq_disable(); |
788 | } |
789 | - current_thread_info()->status |= TS_POLLING; |
790 | } |
791 | |
792 | #ifdef ARCH_APICTIMER_STOPS_ON_C3 |
793 | @@ -739,6 +732,11 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, |
794 | if (unlikely(!pr)) |
795 | return -EINVAL; |
796 | |
797 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
798 | + if (current_set_polling_and_test()) |
799 | + return -EINVAL; |
800 | + } |
801 | + |
802 | lapic_timer_state_broadcast(pr, cx, 1); |
803 | acpi_idle_do_entry(cx); |
804 | |
805 | @@ -792,18 +790,9 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, |
806 | if (unlikely(!pr)) |
807 | return -EINVAL; |
808 | |
809 | - if (cx->entry_method != ACPI_CSTATE_FFH) { |
810 | - current_thread_info()->status &= ~TS_POLLING; |
811 | - /* |
812 | - * TS_POLLING-cleared state must be visible before we test |
813 | - * NEED_RESCHED: |
814 | - */ |
815 | - smp_mb(); |
816 | - |
817 | - if (unlikely(need_resched())) { |
818 | - current_thread_info()->status |= TS_POLLING; |
819 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
820 | + if (current_set_polling_and_test()) |
821 | return -EINVAL; |
822 | - } |
823 | } |
824 | |
825 | /* |
826 | @@ -821,9 +810,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, |
827 | |
828 | sched_clock_idle_wakeup_event(0); |
829 | |
830 | - if (cx->entry_method != ACPI_CSTATE_FFH) |
831 | - current_thread_info()->status |= TS_POLLING; |
832 | - |
833 | lapic_timer_state_broadcast(pr, cx, 0); |
834 | return index; |
835 | } |
836 | @@ -860,18 +846,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, |
837 | } |
838 | } |
839 | |
840 | - if (cx->entry_method != ACPI_CSTATE_FFH) { |
841 | - current_thread_info()->status &= ~TS_POLLING; |
842 | - /* |
843 | - * TS_POLLING-cleared state must be visible before we test |
844 | - * NEED_RESCHED: |
845 | - */ |
846 | - smp_mb(); |
847 | - |
848 | - if (unlikely(need_resched())) { |
849 | - current_thread_info()->status |= TS_POLLING; |
850 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
851 | + if (current_set_polling_and_test()) |
852 | return -EINVAL; |
853 | - } |
854 | } |
855 | |
856 | acpi_unlazy_tlb(smp_processor_id()); |
857 | @@ -917,9 +894,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, |
858 | |
859 | sched_clock_idle_wakeup_event(0); |
860 | |
861 | - if (cx->entry_method != ACPI_CSTATE_FFH) |
862 | - current_thread_info()->status |= TS_POLLING; |
863 | - |
864 | lapic_timer_state_broadcast(pr, cx, 0); |
865 | return index; |
866 | } |
867 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
868 | index af658b2ff279..362f0c2aa1ea 100644 |
869 | --- a/drivers/acpi/scan.c |
870 | +++ b/drivers/acpi/scan.c |
871 | @@ -244,8 +244,6 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) |
872 | goto out; |
873 | } |
874 | } |
875 | - acpi_evaluate_hotplug_ost(handle, ost_source, |
876 | - ACPI_OST_SC_INSERT_IN_PROGRESS, NULL); |
877 | error = acpi_bus_scan(handle); |
878 | if (error) { |
879 | acpi_handle_warn(handle, "Namespace scan failure\n"); |
880 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
881 | index 0e4b96b62c75..055dfdfd7348 100644 |
882 | --- a/drivers/acpi/video.c |
883 | +++ b/drivers/acpi/video.c |
884 | @@ -846,7 +846,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) |
885 | for (i = 2; i < br->count; i++) |
886 | if (level_old == br->levels[i]) |
887 | break; |
888 | - if (i == br->count) |
889 | + if (i == br->count || !level) |
890 | level = max_level; |
891 | } |
892 | |
893 | diff --git a/drivers/block/brd.c b/drivers/block/brd.c |
894 | index 9bf4371755f2..d91f1a56e861 100644 |
895 | --- a/drivers/block/brd.c |
896 | +++ b/drivers/block/brd.c |
897 | @@ -545,7 +545,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) |
898 | |
899 | mutex_lock(&brd_devices_mutex); |
900 | brd = brd_init_one(MINOR(dev) >> part_shift); |
901 | - kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM); |
902 | + kobj = brd ? get_disk(brd->brd_disk) : NULL; |
903 | mutex_unlock(&brd_devices_mutex); |
904 | |
905 | *part = 0; |
906 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c |
907 | index d92d50fd84b7..00559736cee4 100644 |
908 | --- a/drivers/block/loop.c |
909 | +++ b/drivers/block/loop.c |
910 | @@ -1741,7 +1741,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data) |
911 | if (err < 0) |
912 | err = loop_add(&lo, MINOR(dev) >> part_shift); |
913 | if (err < 0) |
914 | - kobj = ERR_PTR(err); |
915 | + kobj = NULL; |
916 | else |
917 | kobj = get_disk(lo->lo_disk); |
918 | mutex_unlock(&loop_index_mutex); |
919 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c |
920 | index b95159b33c39..eb760a218da4 100644 |
921 | --- a/drivers/firmware/dmi_scan.c |
922 | +++ b/drivers/firmware/dmi_scan.c |
923 | @@ -551,9 +551,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi) |
924 | int s = dmi->matches[i].slot; |
925 | if (s == DMI_NONE) |
926 | break; |
927 | - if (dmi_ident[s] |
928 | - && strstr(dmi_ident[s], dmi->matches[i].substr)) |
929 | - continue; |
930 | + if (dmi_ident[s]) { |
931 | + if (!dmi->matches[i].exact_match && |
932 | + strstr(dmi_ident[s], dmi->matches[i].substr)) |
933 | + continue; |
934 | + else if (dmi->matches[i].exact_match && |
935 | + !strcmp(dmi_ident[s], dmi->matches[i].substr)) |
936 | + continue; |
937 | + } |
938 | + |
939 | /* No match */ |
940 | return false; |
941 | } |
942 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
943 | index 29412cc89c7a..f77d42f74427 100644 |
944 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
945 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
946 | @@ -869,6 +869,30 @@ static const struct dmi_system_id intel_no_lvds[] = { |
947 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Q900"), |
948 | }, |
949 | }, |
950 | + { |
951 | + .callback = intel_no_lvds_dmi_callback, |
952 | + .ident = "Intel D410PT", |
953 | + .matches = { |
954 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
955 | + DMI_MATCH(DMI_BOARD_NAME, "D410PT"), |
956 | + }, |
957 | + }, |
958 | + { |
959 | + .callback = intel_no_lvds_dmi_callback, |
960 | + .ident = "Intel D425KT", |
961 | + .matches = { |
962 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
963 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "D425KT"), |
964 | + }, |
965 | + }, |
966 | + { |
967 | + .callback = intel_no_lvds_dmi_callback, |
968 | + .ident = "Intel D510MO", |
969 | + .matches = { |
970 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), |
971 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "D510MO"), |
972 | + }, |
973 | + }, |
974 | |
975 | { } /* terminating entry */ |
976 | }; |
977 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c |
978 | index 373dbcc523b2..a19e7d79b847 100644 |
979 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c |
980 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c |
981 | @@ -36,6 +36,8 @@ nva3_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size) |
982 | if (data && data[0]) { |
983 | for (i = 0; i < size; i++) |
984 | nv_wr32(priv, 0x61c440 + soff, (i << 8) | data[i]); |
985 | + for (; i < 0x60; i++) |
986 | + nv_wr32(priv, 0x61c440 + soff, (i << 8)); |
987 | nv_mask(priv, 0x61c448 + soff, 0x80000003, 0x80000003); |
988 | } else |
989 | if (data) { |
990 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c |
991 | index dc57e24fc1df..717639386ced 100644 |
992 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c |
993 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c |
994 | @@ -41,6 +41,8 @@ nvd0_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size) |
995 | if (data && data[0]) { |
996 | for (i = 0; i < size; i++) |
997 | nv_wr32(priv, 0x10ec00 + soff, (i << 8) | data[i]); |
998 | + for (; i < 0x60; i++) |
999 | + nv_wr32(priv, 0x10ec00 + soff, (i << 8)); |
1000 | nv_mask(priv, 0x10ec10 + soff, 0x80000003, 0x80000003); |
1001 | } else |
1002 | if (data) { |
1003 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c |
1004 | index ab1e918469a8..526b75242899 100644 |
1005 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c |
1006 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c |
1007 | @@ -47,14 +47,8 @@ int |
1008 | nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) |
1009 | { |
1010 | struct nv50_disp_priv *priv = (void *)object->engine; |
1011 | - struct nouveau_bios *bios = nouveau_bios(priv); |
1012 | - const u16 type = (mthd & NV50_DISP_SOR_MTHD_TYPE) >> 12; |
1013 | const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3; |
1014 | - const u8 link = (mthd & NV50_DISP_SOR_MTHD_LINK) >> 2; |
1015 | const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR); |
1016 | - const u16 mask = (0x0100 << head) | (0x0040 << link) | (0x0001 << or); |
1017 | - struct dcb_output outp; |
1018 | - u8 ver, hdr; |
1019 | u32 data; |
1020 | int ret = -EINVAL; |
1021 | |
1022 | @@ -62,8 +56,6 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) |
1023 | return -EINVAL; |
1024 | data = *(u32 *)args; |
1025 | |
1026 | - if (type && !dcb_outp_match(bios, type, mask, &ver, &hdr, &outp)) |
1027 | - return -ENODEV; |
1028 | |
1029 | switch (mthd & ~0x3f) { |
1030 | case NV50_DISP_SOR_PWR: |
1031 | diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c |
1032 | index 8eeb141c85ac..74813130d211 100644 |
1033 | --- a/drivers/hwmon/lm90.c |
1034 | +++ b/drivers/hwmon/lm90.c |
1035 | @@ -278,7 +278,7 @@ static const struct lm90_params lm90_params[] = { |
1036 | [max6696] = { |
1037 | .flags = LM90_HAVE_EMERGENCY |
1038 | | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, |
1039 | - .alert_alarms = 0x187c, |
1040 | + .alert_alarms = 0x1c7c, |
1041 | .max_convrate = 6, |
1042 | .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, |
1043 | }, |
1044 | @@ -1500,19 +1500,22 @@ static void lm90_alert(struct i2c_client *client, unsigned int flag) |
1045 | if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) { |
1046 | dev_info(&client->dev, "Everything OK\n"); |
1047 | } else { |
1048 | - if (alarms & 0x61) |
1049 | + if ((alarms & 0x61) || (alarms2 & 0x80)) |
1050 | dev_warn(&client->dev, |
1051 | "temp%d out of range, please check!\n", 1); |
1052 | - if (alarms & 0x1a) |
1053 | + if ((alarms & 0x1a) || (alarms2 & 0x20)) |
1054 | dev_warn(&client->dev, |
1055 | "temp%d out of range, please check!\n", 2); |
1056 | if (alarms & 0x04) |
1057 | dev_warn(&client->dev, |
1058 | "temp%d diode open, please check!\n", 2); |
1059 | |
1060 | - if (alarms2 & 0x18) |
1061 | + if (alarms2 & 0x5a) |
1062 | dev_warn(&client->dev, |
1063 | "temp%d out of range, please check!\n", 3); |
1064 | + if (alarms2 & 0x04) |
1065 | + dev_warn(&client->dev, |
1066 | + "temp%d diode open, please check!\n", 3); |
1067 | |
1068 | /* |
1069 | * Disable ALERT# output, because these chips don't implement |
1070 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c |
1071 | index fa6964d8681a..f116d664b473 100644 |
1072 | --- a/drivers/idle/intel_idle.c |
1073 | +++ b/drivers/idle/intel_idle.c |
1074 | @@ -359,7 +359,7 @@ static int intel_idle(struct cpuidle_device *dev, |
1075 | if (!(lapic_timer_reliable_states & (1 << (cstate)))) |
1076 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); |
1077 | |
1078 | - if (!need_resched()) { |
1079 | + if (!current_set_polling_and_test()) { |
1080 | |
1081 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
1082 | smp_mb(); |
1083 | diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c |
1084 | index d0c6907dfd92..994ca4aff1a3 100644 |
1085 | --- a/drivers/misc/mei/nfc.c |
1086 | +++ b/drivers/misc/mei/nfc.c |
1087 | @@ -485,8 +485,11 @@ int mei_nfc_host_init(struct mei_device *dev) |
1088 | if (ndev->cl_info) |
1089 | return 0; |
1090 | |
1091 | - cl_info = mei_cl_allocate(dev); |
1092 | - cl = mei_cl_allocate(dev); |
1093 | + ndev->cl_info = mei_cl_allocate(dev); |
1094 | + ndev->cl = mei_cl_allocate(dev); |
1095 | + |
1096 | + cl = ndev->cl; |
1097 | + cl_info = ndev->cl_info; |
1098 | |
1099 | if (!cl || !cl_info) { |
1100 | ret = -ENOMEM; |
1101 | @@ -527,10 +530,9 @@ int mei_nfc_host_init(struct mei_device *dev) |
1102 | |
1103 | cl->device_uuid = mei_nfc_guid; |
1104 | |
1105 | + |
1106 | list_add_tail(&cl->device_link, &dev->device_list); |
1107 | |
1108 | - ndev->cl_info = cl_info; |
1109 | - ndev->cl = cl; |
1110 | ndev->req_id = 1; |
1111 | |
1112 | INIT_WORK(&ndev->init_work, mei_nfc_init); |
1113 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c |
1114 | index a668cd491cb3..e3fc07cf2f62 100644 |
1115 | --- a/drivers/net/can/c_can/c_can.c |
1116 | +++ b/drivers/net/can/c_can/c_can.c |
1117 | @@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) |
1118 | msg_ctrl_save = priv->read_reg(priv, |
1119 | C_CAN_IFACE(MSGCTRL_REG, 0)); |
1120 | |
1121 | - if (msg_ctrl_save & IF_MCONT_EOB) |
1122 | - return num_rx_pkts; |
1123 | - |
1124 | if (msg_ctrl_save & IF_MCONT_MSGLST) { |
1125 | c_can_handle_lost_msg_obj(dev, 0, msg_obj); |
1126 | num_rx_pkts++; |
1127 | @@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) |
1128 | continue; |
1129 | } |
1130 | |
1131 | + if (msg_ctrl_save & IF_MCONT_EOB) |
1132 | + return num_rx_pkts; |
1133 | + |
1134 | if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) |
1135 | continue; |
1136 | |
1137 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c |
1138 | index 3b9546588240..4b2d5ed62b11 100644 |
1139 | --- a/drivers/net/can/usb/kvaser_usb.c |
1140 | +++ b/drivers/net/can/usb/kvaser_usb.c |
1141 | @@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf, |
1142 | return 0; |
1143 | } |
1144 | |
1145 | -static void kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1146 | - struct usb_endpoint_descriptor **in, |
1147 | - struct usb_endpoint_descriptor **out) |
1148 | +static int kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1149 | + struct usb_endpoint_descriptor **in, |
1150 | + struct usb_endpoint_descriptor **out) |
1151 | { |
1152 | const struct usb_host_interface *iface_desc; |
1153 | struct usb_endpoint_descriptor *endpoint; |
1154 | @@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1155 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
1156 | endpoint = &iface_desc->endpoint[i].desc; |
1157 | |
1158 | - if (usb_endpoint_is_bulk_in(endpoint)) |
1159 | + if (!*in && usb_endpoint_is_bulk_in(endpoint)) |
1160 | *in = endpoint; |
1161 | |
1162 | - if (usb_endpoint_is_bulk_out(endpoint)) |
1163 | + if (!*out && usb_endpoint_is_bulk_out(endpoint)) |
1164 | *out = endpoint; |
1165 | + |
1166 | + /* use first bulk endpoint for in and out */ |
1167 | + if (*in && *out) |
1168 | + return 0; |
1169 | } |
1170 | + |
1171 | + return -ENODEV; |
1172 | } |
1173 | |
1174 | static int kvaser_usb_probe(struct usb_interface *intf, |
1175 | @@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf, |
1176 | if (!dev) |
1177 | return -ENOMEM; |
1178 | |
1179 | - kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
1180 | - if (!dev->bulk_in || !dev->bulk_out) { |
1181 | + err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
1182 | + if (err) { |
1183 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); |
1184 | return err; |
1185 | } |
1186 | diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c |
1187 | index 668dd27616a0..cc6a0a586f0b 100644 |
1188 | --- a/drivers/net/wireless/libertas/debugfs.c |
1189 | +++ b/drivers/net/wireless/libertas/debugfs.c |
1190 | @@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, |
1191 | char *p2; |
1192 | struct debug_data *d = f->private_data; |
1193 | |
1194 | - pdata = kmalloc(cnt, GFP_KERNEL); |
1195 | + if (cnt == 0) |
1196 | + return 0; |
1197 | + |
1198 | + pdata = kmalloc(cnt + 1, GFP_KERNEL); |
1199 | if (pdata == NULL) |
1200 | return 0; |
1201 | |
1202 | @@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, |
1203 | kfree(pdata); |
1204 | return 0; |
1205 | } |
1206 | + pdata[cnt] = '\0'; |
1207 | |
1208 | p0 = pdata; |
1209 | for (i = 0; i < num_of_items; i++) { |
1210 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c |
1211 | index f281971919f5..12652d204f7e 100644 |
1212 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c |
1213 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c |
1214 | @@ -3400,10 +3400,13 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, |
1215 | |
1216 | vgc = rt2800_get_default_vgc(rt2x00dev); |
1217 | |
1218 | - if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65) |
1219 | - vgc += 0x20; |
1220 | - else if (qual->rssi > -80) |
1221 | - vgc += 0x10; |
1222 | + if (rt2x00_rt(rt2x00dev, RT5592)) { |
1223 | + if (qual->rssi > -65) |
1224 | + vgc += 0x20; |
1225 | + } else { |
1226 | + if (qual->rssi > -80) |
1227 | + vgc += 0x10; |
1228 | + } |
1229 | |
1230 | rt2800_set_vgc(rt2x00dev, qual, vgc); |
1231 | } |
1232 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c |
1233 | index ac854d75bd6c..9ef0711a5cc1 100644 |
1234 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c |
1235 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c |
1236 | @@ -148,6 +148,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) |
1237 | return false; |
1238 | } |
1239 | |
1240 | +#define TXSTATUS_READ_INTERVAL 1000000 |
1241 | + |
1242 | static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, |
1243 | int urb_status, u32 tx_status) |
1244 | { |
1245 | @@ -176,8 +178,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, |
1246 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); |
1247 | |
1248 | if (rt2800usb_txstatus_pending(rt2x00dev)) { |
1249 | - /* Read register after 250 us */ |
1250 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), |
1251 | + /* Read register after 1 ms */ |
1252 | + hrtimer_start(&rt2x00dev->txstatus_timer, |
1253 | + ktime_set(0, TXSTATUS_READ_INTERVAL), |
1254 | HRTIMER_MODE_REL); |
1255 | return false; |
1256 | } |
1257 | @@ -202,8 +205,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev) |
1258 | if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) |
1259 | return; |
1260 | |
1261 | - /* Read TX_STA_FIFO register after 500 us */ |
1262 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), |
1263 | + /* Read TX_STA_FIFO register after 2 ms */ |
1264 | + hrtimer_start(&rt2x00dev->txstatus_timer, |
1265 | + ktime_set(0, 2*TXSTATUS_READ_INTERVAL), |
1266 | HRTIMER_MODE_REL); |
1267 | } |
1268 | |
1269 | diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c |
1270 | index 90dc14336980..a2889d1cfe37 100644 |
1271 | --- a/drivers/net/wireless/rt2x00/rt2x00dev.c |
1272 | +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c |
1273 | @@ -181,6 +181,7 @@ static void rt2x00lib_autowakeup(struct work_struct *work) |
1274 | static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, |
1275 | struct ieee80211_vif *vif) |
1276 | { |
1277 | + struct ieee80211_tx_control control = {}; |
1278 | struct rt2x00_dev *rt2x00dev = data; |
1279 | struct sk_buff *skb; |
1280 | |
1281 | @@ -195,7 +196,7 @@ static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, |
1282 | */ |
1283 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); |
1284 | while (skb) { |
1285 | - rt2x00mac_tx(rt2x00dev->hw, NULL, skb); |
1286 | + rt2x00mac_tx(rt2x00dev->hw, &control, skb); |
1287 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); |
1288 | } |
1289 | } |
1290 | diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h |
1291 | index a0935987fa3a..7f40ab8e1bd8 100644 |
1292 | --- a/drivers/net/wireless/rt2x00/rt2x00lib.h |
1293 | +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h |
1294 | @@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); |
1295 | * @local: frame is not from mac80211 |
1296 | */ |
1297 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1298 | - bool local); |
1299 | + struct ieee80211_sta *sta, bool local); |
1300 | |
1301 | /** |
1302 | * rt2x00queue_update_beacon - Send new beacon from mac80211 |
1303 | diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c |
1304 | index f883802f3505..f8cff1f0b6b7 100644 |
1305 | --- a/drivers/net/wireless/rt2x00/rt2x00mac.c |
1306 | +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c |
1307 | @@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, |
1308 | frag_skb->data, data_length, tx_info, |
1309 | (struct ieee80211_rts *)(skb->data)); |
1310 | |
1311 | - retval = rt2x00queue_write_tx_frame(queue, skb, true); |
1312 | + retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true); |
1313 | if (retval) { |
1314 | dev_kfree_skb_any(skb); |
1315 | rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); |
1316 | @@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, |
1317 | goto exit_fail; |
1318 | } |
1319 | |
1320 | - if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) |
1321 | + if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false))) |
1322 | goto exit_fail; |
1323 | |
1324 | /* |
1325 | @@ -754,6 +754,9 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop) |
1326 | struct rt2x00_dev *rt2x00dev = hw->priv; |
1327 | struct data_queue *queue; |
1328 | |
1329 | + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) |
1330 | + return; |
1331 | + |
1332 | tx_queue_for_each(rt2x00dev, queue) |
1333 | rt2x00queue_flush_queue(queue, drop); |
1334 | } |
1335 | diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c |
1336 | index d955741e48ff..1f17f5b64625 100644 |
1337 | --- a/drivers/net/wireless/rt2x00/rt2x00queue.c |
1338 | +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c |
1339 | @@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry) |
1340 | } |
1341 | |
1342 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1343 | - bool local) |
1344 | + struct ieee80211_sta *sta, bool local) |
1345 | { |
1346 | struct ieee80211_tx_info *tx_info; |
1347 | struct queue_entry *entry; |
1348 | @@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1349 | * after that we are free to use the skb->cb array |
1350 | * for our information. |
1351 | */ |
1352 | - rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL); |
1353 | + rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta); |
1354 | |
1355 | /* |
1356 | * All information is retrieved from the skb->cb array, |
1357 | diff --git a/drivers/pci/access.c b/drivers/pci/access.c |
1358 | index 1cc23661f79b..061da8c3ab4b 100644 |
1359 | --- a/drivers/pci/access.c |
1360 | +++ b/drivers/pci/access.c |
1361 | @@ -484,28 +484,29 @@ static inline bool pcie_cap_has_lnkctl(const struct pci_dev *dev) |
1362 | { |
1363 | int type = pci_pcie_type(dev); |
1364 | |
1365 | - return pcie_cap_version(dev) > 1 || |
1366 | + return type == PCI_EXP_TYPE_ENDPOINT || |
1367 | + type == PCI_EXP_TYPE_LEG_END || |
1368 | type == PCI_EXP_TYPE_ROOT_PORT || |
1369 | - type == PCI_EXP_TYPE_ENDPOINT || |
1370 | - type == PCI_EXP_TYPE_LEG_END; |
1371 | + type == PCI_EXP_TYPE_UPSTREAM || |
1372 | + type == PCI_EXP_TYPE_DOWNSTREAM || |
1373 | + type == PCI_EXP_TYPE_PCI_BRIDGE || |
1374 | + type == PCI_EXP_TYPE_PCIE_BRIDGE; |
1375 | } |
1376 | |
1377 | static inline bool pcie_cap_has_sltctl(const struct pci_dev *dev) |
1378 | { |
1379 | int type = pci_pcie_type(dev); |
1380 | |
1381 | - return pcie_cap_version(dev) > 1 || |
1382 | - type == PCI_EXP_TYPE_ROOT_PORT || |
1383 | - (type == PCI_EXP_TYPE_DOWNSTREAM && |
1384 | - pcie_caps_reg(dev) & PCI_EXP_FLAGS_SLOT); |
1385 | + return (type == PCI_EXP_TYPE_ROOT_PORT || |
1386 | + type == PCI_EXP_TYPE_DOWNSTREAM) && |
1387 | + pcie_caps_reg(dev) & PCI_EXP_FLAGS_SLOT; |
1388 | } |
1389 | |
1390 | static inline bool pcie_cap_has_rtctl(const struct pci_dev *dev) |
1391 | { |
1392 | int type = pci_pcie_type(dev); |
1393 | |
1394 | - return pcie_cap_version(dev) > 1 || |
1395 | - type == PCI_EXP_TYPE_ROOT_PORT || |
1396 | + return type == PCI_EXP_TYPE_ROOT_PORT || |
1397 | type == PCI_EXP_TYPE_RC_EC; |
1398 | } |
1399 | |
1400 | diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c |
1401 | index 1ef041bc60c8..ee6caddd978c 100644 |
1402 | --- a/drivers/scsi/aacraid/commctrl.c |
1403 | +++ b/drivers/scsi/aacraid/commctrl.c |
1404 | @@ -510,7 +510,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) |
1405 | goto cleanup; |
1406 | } |
1407 | |
1408 | - if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) { |
1409 | + if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) || |
1410 | + (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) { |
1411 | rcode = -EINVAL; |
1412 | goto cleanup; |
1413 | } |
1414 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1415 | index c8b9fa0e9275..1424a8988849 100644 |
1416 | --- a/drivers/usb/core/hub.c |
1417 | +++ b/drivers/usb/core/hub.c |
1418 | @@ -1129,6 +1129,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) |
1419 | usb_clear_port_feature(hub->hdev, port1, |
1420 | USB_PORT_FEAT_C_ENABLE); |
1421 | } |
1422 | + if (portchange & USB_PORT_STAT_C_RESET) { |
1423 | + need_debounce_delay = true; |
1424 | + usb_clear_port_feature(hub->hdev, port1, |
1425 | + USB_PORT_FEAT_C_RESET); |
1426 | + } |
1427 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && |
1428 | hub_is_superspeed(hub->hdev)) { |
1429 | need_debounce_delay = true; |
1430 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c |
1431 | index 2c1749da1f7e..8b3d0abe7e14 100644 |
1432 | --- a/drivers/usb/serial/mos7840.c |
1433 | +++ b/drivers/usb/serial/mos7840.c |
1434 | @@ -1593,7 +1593,11 @@ static int mos7840_tiocmget(struct tty_struct *tty) |
1435 | return -ENODEV; |
1436 | |
1437 | status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); |
1438 | + if (status != 1) |
1439 | + return -EIO; |
1440 | status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); |
1441 | + if (status != 1) |
1442 | + return -EIO; |
1443 | result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) |
1444 | | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) |
1445 | | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) |
1446 | diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c |
1447 | index 7aabc6ad4e9b..fa38d076697d 100644 |
1448 | --- a/fs/configfs/dir.c |
1449 | +++ b/fs/configfs/dir.c |
1450 | @@ -56,10 +56,19 @@ static void configfs_d_iput(struct dentry * dentry, |
1451 | struct configfs_dirent *sd = dentry->d_fsdata; |
1452 | |
1453 | if (sd) { |
1454 | - BUG_ON(sd->s_dentry != dentry); |
1455 | /* Coordinate with configfs_readdir */ |
1456 | spin_lock(&configfs_dirent_lock); |
1457 | - sd->s_dentry = NULL; |
1458 | + /* Coordinate with configfs_attach_attr where will increase |
1459 | + * sd->s_count and update sd->s_dentry to new allocated one. |
1460 | + * Only set sd->dentry to null when this dentry is the only |
1461 | + * sd owner. |
1462 | + * If not do so, configfs_d_iput may run just after |
1463 | + * configfs_attach_attr and set sd->s_dentry to null |
1464 | + * even it's still in use. |
1465 | + */ |
1466 | + if (atomic_read(&sd->s_count) <= 2) |
1467 | + sd->s_dentry = NULL; |
1468 | + |
1469 | spin_unlock(&configfs_dirent_lock); |
1470 | configfs_put(sd); |
1471 | } |
1472 | @@ -426,8 +435,11 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den |
1473 | struct configfs_attribute * attr = sd->s_element; |
1474 | int error; |
1475 | |
1476 | + spin_lock(&configfs_dirent_lock); |
1477 | dentry->d_fsdata = configfs_get(sd); |
1478 | sd->s_dentry = dentry; |
1479 | + spin_unlock(&configfs_dirent_lock); |
1480 | + |
1481 | error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG, |
1482 | configfs_init_file); |
1483 | if (error) { |
1484 | diff --git a/fs/exec.c b/fs/exec.c |
1485 | index 1f446705636b..bb60cda5ee30 100644 |
1486 | --- a/fs/exec.c |
1487 | +++ b/fs/exec.c |
1488 | @@ -1669,6 +1669,12 @@ int __get_dumpable(unsigned long mm_flags) |
1489 | return (ret > SUID_DUMP_USER) ? SUID_DUMP_ROOT : ret; |
1490 | } |
1491 | |
1492 | +/* |
1493 | + * This returns the actual value of the suid_dumpable flag. For things |
1494 | + * that are using this for checking for privilege transitions, it must |
1495 | + * test against SUID_DUMP_USER rather than treating it as a boolean |
1496 | + * value. |
1497 | + */ |
1498 | int get_dumpable(struct mm_struct *mm) |
1499 | { |
1500 | return __get_dumpable(mm->flags); |
1501 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1502 | index d7ba5616989c..e78b8c2656ee 100644 |
1503 | --- a/fs/nfs/nfs4proc.c |
1504 | +++ b/fs/nfs/nfs4proc.c |
1505 | @@ -1160,29 +1160,24 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) |
1506 | int ret; |
1507 | |
1508 | if (!data->rpc_done) { |
1509 | - ret = data->rpc_status; |
1510 | - goto err; |
1511 | + if (data->rpc_status) { |
1512 | + ret = data->rpc_status; |
1513 | + goto err; |
1514 | + } |
1515 | + /* cached opens have already been processed */ |
1516 | + goto update; |
1517 | } |
1518 | |
1519 | - ret = -ESTALE; |
1520 | - if (!(data->f_attr.valid & NFS_ATTR_FATTR_TYPE) || |
1521 | - !(data->f_attr.valid & NFS_ATTR_FATTR_FILEID) || |
1522 | - !(data->f_attr.valid & NFS_ATTR_FATTR_CHANGE)) |
1523 | - goto err; |
1524 | - |
1525 | - ret = -ENOMEM; |
1526 | - state = nfs4_get_open_state(inode, data->owner); |
1527 | - if (state == NULL) |
1528 | - goto err; |
1529 | - |
1530 | ret = nfs_refresh_inode(inode, &data->f_attr); |
1531 | if (ret) |
1532 | goto err; |
1533 | |
1534 | if (data->o_res.delegation_type != 0) |
1535 | nfs4_opendata_check_deleg(data, state); |
1536 | +update: |
1537 | update_open_stateid(state, &data->o_res.stateid, NULL, |
1538 | data->o_arg.fmode); |
1539 | + atomic_inc(&state->count); |
1540 | |
1541 | return state; |
1542 | err: |
1543 | @@ -4572,6 +4567,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock |
1544 | status = 0; |
1545 | } |
1546 | request->fl_ops->fl_release_private(request); |
1547 | + request->fl_ops = NULL; |
1548 | out: |
1549 | return status; |
1550 | } |
1551 | diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c |
1552 | index 5f38ea36e266..af51cf9bf2e3 100644 |
1553 | --- a/fs/nfsd/export.c |
1554 | +++ b/fs/nfsd/export.c |
1555 | @@ -536,16 +536,12 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) |
1556 | if (err) |
1557 | goto out3; |
1558 | exp.ex_anon_uid= make_kuid(&init_user_ns, an_int); |
1559 | - if (!uid_valid(exp.ex_anon_uid)) |
1560 | - goto out3; |
1561 | |
1562 | /* anon gid */ |
1563 | err = get_int(&mesg, &an_int); |
1564 | if (err) |
1565 | goto out3; |
1566 | exp.ex_anon_gid= make_kgid(&init_user_ns, an_int); |
1567 | - if (!gid_valid(exp.ex_anon_gid)) |
1568 | - goto out3; |
1569 | |
1570 | /* fsid */ |
1571 | err = get_int(&mesg, &an_int); |
1572 | @@ -583,6 +579,17 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) |
1573 | exp.ex_uuid); |
1574 | if (err) |
1575 | goto out4; |
1576 | + /* |
1577 | + * For some reason exportfs has been passing down an |
1578 | + * invalid (-1) uid & gid on the "dummy" export which it |
1579 | + * uses to test export support. To make sure exportfs |
1580 | + * sees errors from check_export we therefore need to |
1581 | + * delay these checks till after check_export: |
1582 | + */ |
1583 | + if (!uid_valid(exp.ex_anon_uid)) |
1584 | + goto out4; |
1585 | + if (!gid_valid(exp.ex_anon_gid)) |
1586 | + goto out4; |
1587 | } |
1588 | |
1589 | expp = svc_export_lookup(&exp); |
1590 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
1591 | index baf149a85263..62fd6616801d 100644 |
1592 | --- a/fs/nfsd/vfs.c |
1593 | +++ b/fs/nfsd/vfs.c |
1594 | @@ -297,41 +297,12 @@ commit_metadata(struct svc_fh *fhp) |
1595 | } |
1596 | |
1597 | /* |
1598 | - * Set various file attributes. |
1599 | - * N.B. After this call fhp needs an fh_put |
1600 | + * Go over the attributes and take care of the small differences between |
1601 | + * NFS semantics and what Linux expects. |
1602 | */ |
1603 | -__be32 |
1604 | -nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
1605 | - int check_guard, time_t guardtime) |
1606 | +static void |
1607 | +nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap) |
1608 | { |
1609 | - struct dentry *dentry; |
1610 | - struct inode *inode; |
1611 | - int accmode = NFSD_MAY_SATTR; |
1612 | - umode_t ftype = 0; |
1613 | - __be32 err; |
1614 | - int host_err; |
1615 | - int size_change = 0; |
1616 | - |
1617 | - if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
1618 | - accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; |
1619 | - if (iap->ia_valid & ATTR_SIZE) |
1620 | - ftype = S_IFREG; |
1621 | - |
1622 | - /* Get inode */ |
1623 | - err = fh_verify(rqstp, fhp, ftype, accmode); |
1624 | - if (err) |
1625 | - goto out; |
1626 | - |
1627 | - dentry = fhp->fh_dentry; |
1628 | - inode = dentry->d_inode; |
1629 | - |
1630 | - /* Ignore any mode updates on symlinks */ |
1631 | - if (S_ISLNK(inode->i_mode)) |
1632 | - iap->ia_valid &= ~ATTR_MODE; |
1633 | - |
1634 | - if (!iap->ia_valid) |
1635 | - goto out; |
1636 | - |
1637 | /* |
1638 | * NFSv2 does not differentiate between "set-[ac]time-to-now" |
1639 | * which only requires access, and "set-[ac]time-to-X" which |
1640 | @@ -341,8 +312,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
1641 | * convert to "set to now" instead of "set to explicit time" |
1642 | * |
1643 | * We only call inode_change_ok as the last test as technically |
1644 | - * it is not an interface that we should be using. It is only |
1645 | - * valid if the filesystem does not define it's own i_op->setattr. |
1646 | + * it is not an interface that we should be using. |
1647 | */ |
1648 | #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET) |
1649 | #define MAX_TOUCH_TIME_ERROR (30*60) |
1650 | @@ -368,30 +338,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
1651 | iap->ia_valid &= ~BOTH_TIME_SET; |
1652 | } |
1653 | } |
1654 | - |
1655 | - /* |
1656 | - * The size case is special. |
1657 | - * It changes the file as well as the attributes. |
1658 | - */ |
1659 | - if (iap->ia_valid & ATTR_SIZE) { |
1660 | - if (iap->ia_size < inode->i_size) { |
1661 | - err = nfsd_permission(rqstp, fhp->fh_export, dentry, |
1662 | - NFSD_MAY_TRUNC|NFSD_MAY_OWNER_OVERRIDE); |
1663 | - if (err) |
1664 | - goto out; |
1665 | - } |
1666 | - |
1667 | - host_err = get_write_access(inode); |
1668 | - if (host_err) |
1669 | - goto out_nfserr; |
1670 | - |
1671 | - size_change = 1; |
1672 | - host_err = locks_verify_truncate(inode, NULL, iap->ia_size); |
1673 | - if (host_err) { |
1674 | - put_write_access(inode); |
1675 | - goto out_nfserr; |
1676 | - } |
1677 | - } |
1678 | |
1679 | /* sanitize the mode change */ |
1680 | if (iap->ia_valid & ATTR_MODE) { |
1681 | @@ -414,32 +360,111 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
1682 | iap->ia_valid |= (ATTR_KILL_SUID | ATTR_KILL_SGID); |
1683 | } |
1684 | } |
1685 | +} |
1686 | |
1687 | - /* Change the attributes. */ |
1688 | +static __be32 |
1689 | +nfsd_get_write_access(struct svc_rqst *rqstp, struct svc_fh *fhp, |
1690 | + struct iattr *iap) |
1691 | +{ |
1692 | + struct inode *inode = fhp->fh_dentry->d_inode; |
1693 | + int host_err; |
1694 | |
1695 | - iap->ia_valid |= ATTR_CTIME; |
1696 | + if (iap->ia_size < inode->i_size) { |
1697 | + __be32 err; |
1698 | |
1699 | - err = nfserr_notsync; |
1700 | - if (!check_guard || guardtime == inode->i_ctime.tv_sec) { |
1701 | - host_err = nfsd_break_lease(inode); |
1702 | - if (host_err) |
1703 | - goto out_nfserr; |
1704 | - fh_lock(fhp); |
1705 | + err = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, |
1706 | + NFSD_MAY_TRUNC | NFSD_MAY_OWNER_OVERRIDE); |
1707 | + if (err) |
1708 | + return err; |
1709 | + } |
1710 | |
1711 | - host_err = notify_change(dentry, iap); |
1712 | - err = nfserrno(host_err); |
1713 | - fh_unlock(fhp); |
1714 | + host_err = get_write_access(inode); |
1715 | + if (host_err) |
1716 | + goto out_nfserrno; |
1717 | + |
1718 | + host_err = locks_verify_truncate(inode, NULL, iap->ia_size); |
1719 | + if (host_err) |
1720 | + goto out_put_write_access; |
1721 | + return 0; |
1722 | + |
1723 | +out_put_write_access: |
1724 | + put_write_access(inode); |
1725 | +out_nfserrno: |
1726 | + return nfserrno(host_err); |
1727 | +} |
1728 | + |
1729 | +/* |
1730 | + * Set various file attributes. After this call fhp needs an fh_put. |
1731 | + */ |
1732 | +__be32 |
1733 | +nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
1734 | + int check_guard, time_t guardtime) |
1735 | +{ |
1736 | + struct dentry *dentry; |
1737 | + struct inode *inode; |
1738 | + int accmode = NFSD_MAY_SATTR; |
1739 | + umode_t ftype = 0; |
1740 | + __be32 err; |
1741 | + int host_err; |
1742 | + int size_change = 0; |
1743 | + |
1744 | + if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
1745 | + accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; |
1746 | + if (iap->ia_valid & ATTR_SIZE) |
1747 | + ftype = S_IFREG; |
1748 | + |
1749 | + /* Get inode */ |
1750 | + err = fh_verify(rqstp, fhp, ftype, accmode); |
1751 | + if (err) |
1752 | + goto out; |
1753 | + |
1754 | + dentry = fhp->fh_dentry; |
1755 | + inode = dentry->d_inode; |
1756 | + |
1757 | + /* Ignore any mode updates on symlinks */ |
1758 | + if (S_ISLNK(inode->i_mode)) |
1759 | + iap->ia_valid &= ~ATTR_MODE; |
1760 | + |
1761 | + if (!iap->ia_valid) |
1762 | + goto out; |
1763 | + |
1764 | + nfsd_sanitize_attrs(inode, iap); |
1765 | + |
1766 | + /* |
1767 | + * The size case is special, it changes the file in addition to the |
1768 | + * attributes. |
1769 | + */ |
1770 | + if (iap->ia_valid & ATTR_SIZE) { |
1771 | + err = nfsd_get_write_access(rqstp, fhp, iap); |
1772 | + if (err) |
1773 | + goto out; |
1774 | + size_change = 1; |
1775 | } |
1776 | + |
1777 | + iap->ia_valid |= ATTR_CTIME; |
1778 | + |
1779 | + if (check_guard && guardtime != inode->i_ctime.tv_sec) { |
1780 | + err = nfserr_notsync; |
1781 | + goto out_put_write_access; |
1782 | + } |
1783 | + |
1784 | + host_err = nfsd_break_lease(inode); |
1785 | + if (host_err) |
1786 | + goto out_put_write_access_nfserror; |
1787 | + |
1788 | + fh_lock(fhp); |
1789 | + host_err = notify_change(dentry, iap); |
1790 | + fh_unlock(fhp); |
1791 | + |
1792 | +out_put_write_access_nfserror: |
1793 | + err = nfserrno(host_err); |
1794 | +out_put_write_access: |
1795 | if (size_change) |
1796 | put_write_access(inode); |
1797 | if (!err) |
1798 | commit_metadata(fhp); |
1799 | out: |
1800 | return err; |
1801 | - |
1802 | -out_nfserr: |
1803 | - err = nfserrno(host_err); |
1804 | - goto out; |
1805 | } |
1806 | |
1807 | #if defined(CONFIG_NFSD_V2_ACL) || \ |
1808 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h |
1809 | index 70cf138690e9..df97ca4aae52 100644 |
1810 | --- a/include/linux/binfmts.h |
1811 | +++ b/include/linux/binfmts.h |
1812 | @@ -99,9 +99,6 @@ extern void setup_new_exec(struct linux_binprm * bprm); |
1813 | extern void would_dump(struct linux_binprm *, struct file *); |
1814 | |
1815 | extern int suid_dumpable; |
1816 | -#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ |
1817 | -#define SUID_DUMP_USER 1 /* Dump as user of process */ |
1818 | -#define SUID_DUMP_ROOT 2 /* Dump as root */ |
1819 | |
1820 | /* Stack area protections */ |
1821 | #define EXSTACK_DEFAULT 0 /* Whatever the arch defaults to */ |
1822 | diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h |
1823 | index b508016fb76d..b3bd7e737e8b 100644 |
1824 | --- a/include/linux/mod_devicetable.h |
1825 | +++ b/include/linux/mod_devicetable.h |
1826 | @@ -456,7 +456,8 @@ enum dmi_field { |
1827 | }; |
1828 | |
1829 | struct dmi_strmatch { |
1830 | - unsigned char slot; |
1831 | + unsigned char slot:7; |
1832 | + unsigned char exact_match:1; |
1833 | char substr[79]; |
1834 | }; |
1835 | |
1836 | @@ -474,7 +475,8 @@ struct dmi_system_id { |
1837 | */ |
1838 | #define dmi_device_id dmi_system_id |
1839 | |
1840 | -#define DMI_MATCH(a, b) { a, b } |
1841 | +#define DMI_MATCH(a, b) { .slot = a, .substr = b } |
1842 | +#define DMI_EXACT_MATCH(a, b) { .slot = a, .substr = b, .exact_match = 1 } |
1843 | |
1844 | #define PLATFORM_NAME_SIZE 20 |
1845 | #define PLATFORM_MODULE_PREFIX "platform:" |
1846 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
1847 | index 178a8d909f14..597c8ab005a0 100644 |
1848 | --- a/include/linux/sched.h |
1849 | +++ b/include/linux/sched.h |
1850 | @@ -332,6 +332,10 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) {} |
1851 | extern void set_dumpable(struct mm_struct *mm, int value); |
1852 | extern int get_dumpable(struct mm_struct *mm); |
1853 | |
1854 | +#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ |
1855 | +#define SUID_DUMP_USER 1 /* Dump as user of process */ |
1856 | +#define SUID_DUMP_ROOT 2 /* Dump as root */ |
1857 | + |
1858 | /* mm flags */ |
1859 | /* dumpable bits */ |
1860 | #define MMF_DUMPABLE 0 /* core dump is permitted */ |
1861 | @@ -2469,34 +2473,98 @@ static inline int tsk_is_polling(struct task_struct *p) |
1862 | { |
1863 | return task_thread_info(p)->status & TS_POLLING; |
1864 | } |
1865 | -static inline void current_set_polling(void) |
1866 | +static inline void __current_set_polling(void) |
1867 | { |
1868 | current_thread_info()->status |= TS_POLLING; |
1869 | } |
1870 | |
1871 | -static inline void current_clr_polling(void) |
1872 | +static inline bool __must_check current_set_polling_and_test(void) |
1873 | +{ |
1874 | + __current_set_polling(); |
1875 | + |
1876 | + /* |
1877 | + * Polling state must be visible before we test NEED_RESCHED, |
1878 | + * paired by resched_task() |
1879 | + */ |
1880 | + smp_mb(); |
1881 | + |
1882 | + return unlikely(tif_need_resched()); |
1883 | +} |
1884 | + |
1885 | +static inline void __current_clr_polling(void) |
1886 | { |
1887 | current_thread_info()->status &= ~TS_POLLING; |
1888 | - smp_mb__after_clear_bit(); |
1889 | +} |
1890 | + |
1891 | +static inline bool __must_check current_clr_polling_and_test(void) |
1892 | +{ |
1893 | + __current_clr_polling(); |
1894 | + |
1895 | + /* |
1896 | + * Polling state must be visible before we test NEED_RESCHED, |
1897 | + * paired by resched_task() |
1898 | + */ |
1899 | + smp_mb(); |
1900 | + |
1901 | + return unlikely(tif_need_resched()); |
1902 | } |
1903 | #elif defined(TIF_POLLING_NRFLAG) |
1904 | static inline int tsk_is_polling(struct task_struct *p) |
1905 | { |
1906 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); |
1907 | } |
1908 | -static inline void current_set_polling(void) |
1909 | + |
1910 | +static inline void __current_set_polling(void) |
1911 | { |
1912 | set_thread_flag(TIF_POLLING_NRFLAG); |
1913 | } |
1914 | |
1915 | -static inline void current_clr_polling(void) |
1916 | +static inline bool __must_check current_set_polling_and_test(void) |
1917 | +{ |
1918 | + __current_set_polling(); |
1919 | + |
1920 | + /* |
1921 | + * Polling state must be visible before we test NEED_RESCHED, |
1922 | + * paired by resched_task() |
1923 | + * |
1924 | + * XXX: assumes set/clear bit are identical barrier wise. |
1925 | + */ |
1926 | + smp_mb__after_clear_bit(); |
1927 | + |
1928 | + return unlikely(tif_need_resched()); |
1929 | +} |
1930 | + |
1931 | +static inline void __current_clr_polling(void) |
1932 | { |
1933 | clear_thread_flag(TIF_POLLING_NRFLAG); |
1934 | } |
1935 | + |
1936 | +static inline bool __must_check current_clr_polling_and_test(void) |
1937 | +{ |
1938 | + __current_clr_polling(); |
1939 | + |
1940 | + /* |
1941 | + * Polling state must be visible before we test NEED_RESCHED, |
1942 | + * paired by resched_task() |
1943 | + */ |
1944 | + smp_mb__after_clear_bit(); |
1945 | + |
1946 | + return unlikely(tif_need_resched()); |
1947 | +} |
1948 | + |
1949 | #else |
1950 | static inline int tsk_is_polling(struct task_struct *p) { return 0; } |
1951 | -static inline void current_set_polling(void) { } |
1952 | -static inline void current_clr_polling(void) { } |
1953 | +static inline void __current_set_polling(void) { } |
1954 | +static inline void __current_clr_polling(void) { } |
1955 | + |
1956 | +static inline bool __must_check current_set_polling_and_test(void) |
1957 | +{ |
1958 | + return unlikely(tif_need_resched()); |
1959 | +} |
1960 | +static inline bool __must_check current_clr_polling_and_test(void) |
1961 | +{ |
1962 | + return unlikely(tif_need_resched()); |
1963 | +} |
1964 | #endif |
1965 | |
1966 | /* |
1967 | diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h |
1968 | index e7e04736802f..4ae6f32c8033 100644 |
1969 | --- a/include/linux/thread_info.h |
1970 | +++ b/include/linux/thread_info.h |
1971 | @@ -107,6 +107,8 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) |
1972 | #define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) |
1973 | #define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) |
1974 | |
1975 | +#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) |
1976 | + |
1977 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK |
1978 | /* |
1979 | * An arch can define its own version of set_restore_sigmask() to get the |
1980 | diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h |
1981 | index 9031a26249b5..ae6c3b8ed2f5 100644 |
1982 | --- a/include/sound/compress_driver.h |
1983 | +++ b/include/sound/compress_driver.h |
1984 | @@ -171,4 +171,13 @@ static inline void snd_compr_fragment_elapsed(struct snd_compr_stream *stream) |
1985 | wake_up(&stream->runtime->sleep); |
1986 | } |
1987 | |
1988 | +static inline void snd_compr_drain_notify(struct snd_compr_stream *stream) |
1989 | +{ |
1990 | + if (snd_BUG_ON(!stream)) |
1991 | + return; |
1992 | + |
1993 | + stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
1994 | + wake_up(&stream->runtime->sleep); |
1995 | +} |
1996 | + |
1997 | #endif |
1998 | diff --git a/ipc/shm.c b/ipc/shm.c |
1999 | index 7b87bea5245b..6dc55af8a29b 100644 |
2000 | --- a/ipc/shm.c |
2001 | +++ b/ipc/shm.c |
2002 | @@ -208,15 +208,18 @@ static void shm_open(struct vm_area_struct *vma) |
2003 | */ |
2004 | static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) |
2005 | { |
2006 | + struct file *shm_file; |
2007 | + |
2008 | + shm_file = shp->shm_file; |
2009 | + shp->shm_file = NULL; |
2010 | ns->shm_tot -= (shp->shm_segsz + PAGE_SIZE - 1) >> PAGE_SHIFT; |
2011 | shm_rmid(ns, shp); |
2012 | shm_unlock(shp); |
2013 | - if (!is_file_hugepages(shp->shm_file)) |
2014 | - shmem_lock(shp->shm_file, 0, shp->mlock_user); |
2015 | + if (!is_file_hugepages(shm_file)) |
2016 | + shmem_lock(shm_file, 0, shp->mlock_user); |
2017 | else if (shp->mlock_user) |
2018 | - user_shm_unlock(file_inode(shp->shm_file)->i_size, |
2019 | - shp->mlock_user); |
2020 | - fput (shp->shm_file); |
2021 | + user_shm_unlock(file_inode(shm_file)->i_size, shp->mlock_user); |
2022 | + fput(shm_file); |
2023 | ipc_rcu_putref(shp, shm_rcu_free); |
2024 | } |
2025 | |
2026 | @@ -974,15 +977,25 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) |
2027 | ipc_lock_object(&shp->shm_perm); |
2028 | if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) { |
2029 | kuid_t euid = current_euid(); |
2030 | - err = -EPERM; |
2031 | if (!uid_eq(euid, shp->shm_perm.uid) && |
2032 | - !uid_eq(euid, shp->shm_perm.cuid)) |
2033 | + !uid_eq(euid, shp->shm_perm.cuid)) { |
2034 | + err = -EPERM; |
2035 | goto out_unlock0; |
2036 | - if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) |
2037 | + } |
2038 | + if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) { |
2039 | + err = -EPERM; |
2040 | goto out_unlock0; |
2041 | + } |
2042 | } |
2043 | |
2044 | shm_file = shp->shm_file; |
2045 | + |
2046 | + /* check if shm_destroy() is tearing down shp */ |
2047 | + if (shm_file == NULL) { |
2048 | + err = -EIDRM; |
2049 | + goto out_unlock0; |
2050 | + } |
2051 | + |
2052 | if (is_file_hugepages(shm_file)) |
2053 | goto out_unlock0; |
2054 | |
2055 | @@ -1101,6 +1114,14 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, |
2056 | goto out_unlock; |
2057 | |
2058 | ipc_lock_object(&shp->shm_perm); |
2059 | + |
2060 | + /* check if shm_destroy() is tearing down shp */ |
2061 | + if (shp->shm_file == NULL) { |
2062 | + ipc_unlock_object(&shp->shm_perm); |
2063 | + err = -EIDRM; |
2064 | + goto out_unlock; |
2065 | + } |
2066 | + |
2067 | path = shp->shm_file->f_path; |
2068 | path_get(&path); |
2069 | shp->shm_nattch++; |
2070 | diff --git a/kernel/cpu/idle.c b/kernel/cpu/idle.c |
2071 | index e695c0a0bcb5..c261409500e4 100644 |
2072 | --- a/kernel/cpu/idle.c |
2073 | +++ b/kernel/cpu/idle.c |
2074 | @@ -44,7 +44,7 @@ static inline int cpu_idle_poll(void) |
2075 | rcu_idle_enter(); |
2076 | trace_cpu_idle_rcuidle(0, smp_processor_id()); |
2077 | local_irq_enable(); |
2078 | - while (!need_resched()) |
2079 | + while (!tif_need_resched()) |
2080 | cpu_relax(); |
2081 | trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); |
2082 | rcu_idle_exit(); |
2083 | @@ -92,8 +92,7 @@ static void cpu_idle_loop(void) |
2084 | if (cpu_idle_force_poll || tick_check_broadcast_expired()) { |
2085 | cpu_idle_poll(); |
2086 | } else { |
2087 | - current_clr_polling(); |
2088 | - if (!need_resched()) { |
2089 | + if (!current_clr_polling_and_test()) { |
2090 | stop_critical_timings(); |
2091 | rcu_idle_enter(); |
2092 | arch_cpu_idle(); |
2093 | @@ -103,7 +102,7 @@ static void cpu_idle_loop(void) |
2094 | } else { |
2095 | local_irq_enable(); |
2096 | } |
2097 | - current_set_polling(); |
2098 | + __current_set_polling(); |
2099 | } |
2100 | arch_cpu_idle_exit(); |
2101 | } |
2102 | @@ -129,7 +128,7 @@ void cpu_startup_entry(enum cpuhp_state state) |
2103 | */ |
2104 | boot_init_stack_canary(); |
2105 | #endif |
2106 | - current_set_polling(); |
2107 | + __current_set_polling(); |
2108 | arch_cpu_idle_prepare(); |
2109 | cpu_idle_loop(); |
2110 | } |
2111 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c |
2112 | index 335a7ae697f5..afadcf7b4a22 100644 |
2113 | --- a/kernel/ptrace.c |
2114 | +++ b/kernel/ptrace.c |
2115 | @@ -257,7 +257,8 @@ ok: |
2116 | if (task->mm) |
2117 | dumpable = get_dumpable(task->mm); |
2118 | rcu_read_lock(); |
2119 | - if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { |
2120 | + if (dumpable != SUID_DUMP_USER && |
2121 | + !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { |
2122 | rcu_read_unlock(); |
2123 | return -EPERM; |
2124 | } |
2125 | diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c |
2126 | index 84b1e045faba..8354dc81ae64 100644 |
2127 | --- a/kernel/trace/trace_event_perf.c |
2128 | +++ b/kernel/trace/trace_event_perf.c |
2129 | @@ -26,7 +26,7 @@ static int perf_trace_event_perm(struct ftrace_event_call *tp_event, |
2130 | { |
2131 | /* The ftrace function trace is allowed only for root. */ |
2132 | if (ftrace_event_is_function(tp_event) && |
2133 | - perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) |
2134 | + perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN)) |
2135 | return -EPERM; |
2136 | |
2137 | /* No tracing, just counting, so no obvious leak */ |
2138 | diff --git a/mm/slub.c b/mm/slub.c |
2139 | index 57707f01bcfb..c34bd44e8be9 100644 |
2140 | --- a/mm/slub.c |
2141 | +++ b/mm/slub.c |
2142 | @@ -1201,8 +1201,8 @@ static unsigned long kmem_cache_flags(unsigned long object_size, |
2143 | /* |
2144 | * Enable debugging if selected on the kernel commandline. |
2145 | */ |
2146 | - if (slub_debug && (!slub_debug_slabs || |
2147 | - !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs)))) |
2148 | + if (slub_debug && (!slub_debug_slabs || (name && |
2149 | + !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs))))) |
2150 | flags |= slub_debug; |
2151 | |
2152 | return flags; |
2153 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
2154 | index 426f8fcc4c6c..5b1bf7b530f1 100644 |
2155 | --- a/net/sunrpc/clnt.c |
2156 | +++ b/net/sunrpc/clnt.c |
2157 | @@ -1407,9 +1407,9 @@ call_refreshresult(struct rpc_task *task) |
2158 | return; |
2159 | case -ETIMEDOUT: |
2160 | rpc_delay(task, 3*HZ); |
2161 | - case -EKEYEXPIRED: |
2162 | case -EAGAIN: |
2163 | status = -EACCES; |
2164 | + case -EKEYEXPIRED: |
2165 | if (!task->tk_cred_retry) |
2166 | break; |
2167 | task->tk_cred_retry--; |
2168 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
2169 | index ffd50348a509..8a0e04d0928a 100644 |
2170 | --- a/net/sunrpc/xprtsock.c |
2171 | +++ b/net/sunrpc/xprtsock.c |
2172 | @@ -391,8 +391,10 @@ static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, |
2173 | return kernel_sendmsg(sock, &msg, NULL, 0, 0); |
2174 | } |
2175 | |
2176 | -static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more) |
2177 | +static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy) |
2178 | { |
2179 | + ssize_t (*do_sendpage)(struct socket *sock, struct page *page, |
2180 | + int offset, size_t size, int flags); |
2181 | struct page **ppage; |
2182 | unsigned int remainder; |
2183 | int err, sent = 0; |
2184 | @@ -401,6 +403,9 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
2185 | base += xdr->page_base; |
2186 | ppage = xdr->pages + (base >> PAGE_SHIFT); |
2187 | base &= ~PAGE_MASK; |
2188 | + do_sendpage = sock->ops->sendpage; |
2189 | + if (!zerocopy) |
2190 | + do_sendpage = sock_no_sendpage; |
2191 | for(;;) { |
2192 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); |
2193 | int flags = XS_SENDMSG_FLAGS; |
2194 | @@ -408,7 +413,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
2195 | remainder -= len; |
2196 | if (remainder != 0 || more) |
2197 | flags |= MSG_MORE; |
2198 | - err = sock->ops->sendpage(sock, *ppage, base, len, flags); |
2199 | + err = do_sendpage(sock, *ppage, base, len, flags); |
2200 | if (remainder == 0 || err != len) |
2201 | break; |
2202 | sent += err; |
2203 | @@ -429,9 +434,10 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
2204 | * @addrlen: UDP only -- length of destination address |
2205 | * @xdr: buffer containing this request |
2206 | * @base: starting position in the buffer |
2207 | + * @zerocopy: true if it is safe to use sendpage() |
2208 | * |
2209 | */ |
2210 | -static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base) |
2211 | +static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy) |
2212 | { |
2213 | unsigned int remainder = xdr->len - base; |
2214 | int err, sent = 0; |
2215 | @@ -459,7 +465,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, |
2216 | if (base < xdr->page_len) { |
2217 | unsigned int len = xdr->page_len - base; |
2218 | remainder -= len; |
2219 | - err = xs_send_pagedata(sock, xdr, base, remainder != 0); |
2220 | + err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy); |
2221 | if (remainder == 0 || err != len) |
2222 | goto out; |
2223 | sent += err; |
2224 | @@ -562,7 +568,7 @@ static int xs_local_send_request(struct rpc_task *task) |
2225 | req->rq_svec->iov_base, req->rq_svec->iov_len); |
2226 | |
2227 | status = xs_sendpages(transport->sock, NULL, 0, |
2228 | - xdr, req->rq_bytes_sent); |
2229 | + xdr, req->rq_bytes_sent, true); |
2230 | dprintk("RPC: %s(%u) = %d\n", |
2231 | __func__, xdr->len - req->rq_bytes_sent, status); |
2232 | if (likely(status >= 0)) { |
2233 | @@ -618,7 +624,7 @@ static int xs_udp_send_request(struct rpc_task *task) |
2234 | status = xs_sendpages(transport->sock, |
2235 | xs_addr(xprt), |
2236 | xprt->addrlen, xdr, |
2237 | - req->rq_bytes_sent); |
2238 | + req->rq_bytes_sent, true); |
2239 | |
2240 | dprintk("RPC: xs_udp_send_request(%u) = %d\n", |
2241 | xdr->len - req->rq_bytes_sent, status); |
2242 | @@ -689,6 +695,7 @@ static int xs_tcp_send_request(struct rpc_task *task) |
2243 | struct rpc_xprt *xprt = req->rq_xprt; |
2244 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
2245 | struct xdr_buf *xdr = &req->rq_snd_buf; |
2246 | + bool zerocopy = true; |
2247 | int status; |
2248 | |
2249 | xs_encode_stream_record_marker(&req->rq_snd_buf); |
2250 | @@ -696,13 +703,20 @@ static int xs_tcp_send_request(struct rpc_task *task) |
2251 | xs_pktdump("packet data:", |
2252 | req->rq_svec->iov_base, |
2253 | req->rq_svec->iov_len); |
2254 | + /* Don't use zero copy if this is a resend. If the RPC call |
2255 | + * completes while the socket holds a reference to the pages, |
2256 | + * then we may end up resending corrupted data. |
2257 | + */ |
2258 | + if (task->tk_flags & RPC_TASK_SENT) |
2259 | + zerocopy = false; |
2260 | |
2261 | /* Continue transmitting the packet/record. We must be careful |
2262 | * to cope with writespace callbacks arriving _after_ we have |
2263 | * called sendmsg(). */ |
2264 | while (1) { |
2265 | status = xs_sendpages(transport->sock, |
2266 | - NULL, 0, xdr, req->rq_bytes_sent); |
2267 | + NULL, 0, xdr, req->rq_bytes_sent, |
2268 | + zerocopy); |
2269 | |
2270 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", |
2271 | xdr->len - req->rq_bytes_sent, status); |
2272 | diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c |
2273 | index 399433ad614e..a9c3d3cd1990 100644 |
2274 | --- a/security/integrity/ima/ima_policy.c |
2275 | +++ b/security/integrity/ima/ima_policy.c |
2276 | @@ -73,7 +73,6 @@ static struct ima_rule_entry default_rules[] = { |
2277 | {.action = DONT_MEASURE,.fsmagic = SYSFS_MAGIC,.flags = IMA_FSMAGIC}, |
2278 | {.action = DONT_MEASURE,.fsmagic = DEBUGFS_MAGIC,.flags = IMA_FSMAGIC}, |
2279 | {.action = DONT_MEASURE,.fsmagic = TMPFS_MAGIC,.flags = IMA_FSMAGIC}, |
2280 | - {.action = DONT_MEASURE,.fsmagic = RAMFS_MAGIC,.flags = IMA_FSMAGIC}, |
2281 | {.action = DONT_MEASURE,.fsmagic = DEVPTS_SUPER_MAGIC,.flags = IMA_FSMAGIC}, |
2282 | {.action = DONT_MEASURE,.fsmagic = BINFMTFS_MAGIC,.flags = IMA_FSMAGIC}, |
2283 | {.action = DONT_MEASURE,.fsmagic = SECURITYFS_MAGIC,.flags = IMA_FSMAGIC}, |
2284 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c |
2285 | index 5863ba6dd12b..19799931c51d 100644 |
2286 | --- a/sound/core/compress_offload.c |
2287 | +++ b/sound/core/compress_offload.c |
2288 | @@ -668,14 +668,48 @@ static int snd_compr_stop(struct snd_compr_stream *stream) |
2289 | return -EPERM; |
2290 | retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); |
2291 | if (!retval) { |
2292 | - stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
2293 | - wake_up(&stream->runtime->sleep); |
2294 | + snd_compr_drain_notify(stream); |
2295 | stream->runtime->total_bytes_available = 0; |
2296 | stream->runtime->total_bytes_transferred = 0; |
2297 | } |
2298 | return retval; |
2299 | } |
2300 | |
2301 | +static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) |
2302 | +{ |
2303 | + int ret; |
2304 | + |
2305 | + /* |
2306 | + * We are called with lock held. So drop the lock while we wait for |
2307 | + * drain complete notfication from the driver |
2308 | + * |
2309 | + * It is expected that driver will notify the drain completion and then |
2310 | + * stream will be moved to SETUP state, even if draining resulted in an |
2311 | + * error. We can trigger next track after this. |
2312 | + */ |
2313 | + stream->runtime->state = SNDRV_PCM_STATE_DRAINING; |
2314 | + mutex_unlock(&stream->device->lock); |
2315 | + |
2316 | + /* we wait for drain to complete here, drain can return when |
2317 | + * interruption occurred, wait returned error or success. |
2318 | + * For the first two cases we don't do anything different here and |
2319 | + * return after waking up |
2320 | + */ |
2321 | + |
2322 | + ret = wait_event_interruptible(stream->runtime->sleep, |
2323 | + (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); |
2324 | + if (ret == -ERESTARTSYS) |
2325 | + pr_debug("wait aborted by a signal"); |
2326 | + else if (ret) |
2327 | + pr_debug("wait for drain failed with %d\n", ret); |
2328 | + |
2329 | + |
2330 | + wake_up(&stream->runtime->sleep); |
2331 | + mutex_lock(&stream->device->lock); |
2332 | + |
2333 | + return ret; |
2334 | +} |
2335 | + |
2336 | static int snd_compr_drain(struct snd_compr_stream *stream) |
2337 | { |
2338 | int retval; |
2339 | @@ -683,12 +717,15 @@ static int snd_compr_drain(struct snd_compr_stream *stream) |
2340 | if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || |
2341 | stream->runtime->state == SNDRV_PCM_STATE_SETUP) |
2342 | return -EPERM; |
2343 | + |
2344 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); |
2345 | - if (!retval) { |
2346 | - stream->runtime->state = SNDRV_PCM_STATE_DRAINING; |
2347 | + if (retval) { |
2348 | + pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval); |
2349 | wake_up(&stream->runtime->sleep); |
2350 | + return retval; |
2351 | } |
2352 | - return retval; |
2353 | + |
2354 | + return snd_compress_wait_for_drain(stream); |
2355 | } |
2356 | |
2357 | static int snd_compr_next_track(struct snd_compr_stream *stream) |
2358 | @@ -724,9 +761,14 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) |
2359 | return -EPERM; |
2360 | |
2361 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); |
2362 | + if (retval) { |
2363 | + pr_debug("Partial drain returned failure\n"); |
2364 | + wake_up(&stream->runtime->sleep); |
2365 | + return retval; |
2366 | + } |
2367 | |
2368 | stream->next_track = false; |
2369 | - return retval; |
2370 | + return snd_compress_wait_for_drain(stream); |
2371 | } |
2372 | |
2373 | static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) |
2374 | diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c |
2375 | index ddabb406b14c..3a7946ebbe23 100644 |
2376 | --- a/sound/isa/msnd/msnd_pinnacle.c |
2377 | +++ b/sound/isa/msnd/msnd_pinnacle.c |
2378 | @@ -73,9 +73,11 @@ |
2379 | #ifdef MSND_CLASSIC |
2380 | # include "msnd_classic.h" |
2381 | # define LOGNAME "msnd_classic" |
2382 | +# define DEV_NAME "msnd-classic" |
2383 | #else |
2384 | # include "msnd_pinnacle.h" |
2385 | # define LOGNAME "snd_msnd_pinnacle" |
2386 | +# define DEV_NAME "msnd-pinnacle" |
2387 | #endif |
2388 | |
2389 | static void set_default_audio_parameters(struct snd_msnd *chip) |
2390 | @@ -1068,8 +1070,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev) |
2391 | return 0; |
2392 | } |
2393 | |
2394 | -#define DEV_NAME "msnd-pinnacle" |
2395 | - |
2396 | static struct isa_driver snd_msnd_driver = { |
2397 | .match = snd_msnd_isa_match, |
2398 | .probe = snd_msnd_isa_probe, |
2399 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
2400 | index 31461ba32d3c..aeefec74a061 100644 |
2401 | --- a/sound/pci/hda/hda_codec.c |
2402 | +++ b/sound/pci/hda/hda_codec.c |
2403 | @@ -2517,9 +2517,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) |
2404 | cancel_delayed_work_sync(&codec->jackpoll_work); |
2405 | #ifdef CONFIG_PM |
2406 | cancel_delayed_work_sync(&codec->power_work); |
2407 | - codec->power_on = 0; |
2408 | - codec->power_transition = 0; |
2409 | - codec->power_jiffies = jiffies; |
2410 | flush_workqueue(bus->workq); |
2411 | #endif |
2412 | snd_hda_ctls_clear(codec); |
2413 | @@ -3927,6 +3924,10 @@ static void hda_call_codec_resume(struct hda_codec *codec) |
2414 | * in the resume / power-save sequence |
2415 | */ |
2416 | hda_keep_power_on(codec); |
2417 | + if (codec->pm_down_notified) { |
2418 | + codec->pm_down_notified = 0; |
2419 | + hda_call_pm_notify(codec->bus, true); |
2420 | + } |
2421 | hda_set_power_state(codec, AC_PWRST_D0); |
2422 | restore_shutup_pins(codec); |
2423 | hda_exec_init_verbs(codec); |
2424 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
2425 | index d0cc796f778a..26ed56f00b7c 100644 |
2426 | --- a/sound/pci/hda/hda_generic.c |
2427 | +++ b/sound/pci/hda/hda_generic.c |
2428 | @@ -786,10 +786,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) |
2429 | if (spec->own_eapd_ctl || |
2430 | !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)) |
2431 | return; |
2432 | - if (codec->inv_eapd) |
2433 | - enable = !enable; |
2434 | if (spec->keep_eapd_on && !enable) |
2435 | return; |
2436 | + if (codec->inv_eapd) |
2437 | + enable = !enable; |
2438 | snd_hda_codec_update_cache(codec, pin, 0, |
2439 | AC_VERB_SET_EAPD_BTLENABLE, |
2440 | enable ? 0x02 : 0x00); |
2441 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
2442 | index d97f0d61a15b..e17b55a95bc5 100644 |
2443 | --- a/sound/pci/hda/patch_analog.c |
2444 | +++ b/sound/pci/hda/patch_analog.c |
2445 | @@ -1197,8 +1197,12 @@ static int alloc_ad_spec(struct hda_codec *codec) |
2446 | static void ad_fixup_inv_jack_detect(struct hda_codec *codec, |
2447 | const struct hda_fixup *fix, int action) |
2448 | { |
2449 | - if (action == HDA_FIXUP_ACT_PRE_PROBE) |
2450 | + struct ad198x_spec *spec = codec->spec; |
2451 | + |
2452 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { |
2453 | codec->inv_jack_detect = 1; |
2454 | + spec->gen.keep_eapd_on = 1; |
2455 | + } |
2456 | } |
2457 | |
2458 | enum { |
2459 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
2460 | index c96e1945059d..1868d3a6e310 100644 |
2461 | --- a/sound/pci/hda/patch_conexant.c |
2462 | +++ b/sound/pci/hda/patch_conexant.c |
2463 | @@ -3491,6 +3491,8 @@ static const struct hda_codec_preset snd_hda_preset_conexant[] = { |
2464 | .patch = patch_conexant_auto }, |
2465 | { .id = 0x14f15115, .name = "CX20757", |
2466 | .patch = patch_conexant_auto }, |
2467 | + { .id = 0x14f151d7, .name = "CX20952", |
2468 | + .patch = patch_conexant_auto }, |
2469 | {} /* terminator */ |
2470 | }; |
2471 | |
2472 | @@ -3517,6 +3519,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15111"); |
2473 | MODULE_ALIAS("snd-hda-codec-id:14f15113"); |
2474 | MODULE_ALIAS("snd-hda-codec-id:14f15114"); |
2475 | MODULE_ALIAS("snd-hda-codec-id:14f15115"); |
2476 | +MODULE_ALIAS("snd-hda-codec-id:14f151d7"); |
2477 | |
2478 | MODULE_LICENSE("GPL"); |
2479 | MODULE_DESCRIPTION("Conexant HD-audio codec"); |
2480 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2481 | index 4496e0ab693d..8bce044583ed 100644 |
2482 | --- a/sound/pci/hda/patch_realtek.c |
2483 | +++ b/sound/pci/hda/patch_realtek.c |
2484 | @@ -1037,6 +1037,7 @@ enum { |
2485 | ALC880_FIXUP_UNIWILL, |
2486 | ALC880_FIXUP_UNIWILL_DIG, |
2487 | ALC880_FIXUP_Z71V, |
2488 | + ALC880_FIXUP_ASUS_W5A, |
2489 | ALC880_FIXUP_3ST_BASE, |
2490 | ALC880_FIXUP_3ST, |
2491 | ALC880_FIXUP_3ST_DIG, |
2492 | @@ -1207,6 +1208,26 @@ static const struct hda_fixup alc880_fixups[] = { |
2493 | { } |
2494 | } |
2495 | }, |
2496 | + [ALC880_FIXUP_ASUS_W5A] = { |
2497 | + .type = HDA_FIXUP_PINS, |
2498 | + .v.pins = (const struct hda_pintbl[]) { |
2499 | + /* set up the whole pins as BIOS is utterly broken */ |
2500 | + { 0x14, 0x0121411f }, /* HP */ |
2501 | + { 0x15, 0x411111f0 }, /* N/A */ |
2502 | + { 0x16, 0x411111f0 }, /* N/A */ |
2503 | + { 0x17, 0x411111f0 }, /* N/A */ |
2504 | + { 0x18, 0x90a60160 }, /* mic */ |
2505 | + { 0x19, 0x411111f0 }, /* N/A */ |
2506 | + { 0x1a, 0x411111f0 }, /* N/A */ |
2507 | + { 0x1b, 0x411111f0 }, /* N/A */ |
2508 | + { 0x1c, 0x411111f0 }, /* N/A */ |
2509 | + { 0x1d, 0x411111f0 }, /* N/A */ |
2510 | + { 0x1e, 0xb743111e }, /* SPDIF out */ |
2511 | + { } |
2512 | + }, |
2513 | + .chained = true, |
2514 | + .chain_id = ALC880_FIXUP_GPIO1, |
2515 | + }, |
2516 | [ALC880_FIXUP_3ST_BASE] = { |
2517 | .type = HDA_FIXUP_PINS, |
2518 | .v.pins = (const struct hda_pintbl[]) { |
2519 | @@ -1328,6 +1349,7 @@ static const struct hda_fixup alc880_fixups[] = { |
2520 | |
2521 | static const struct snd_pci_quirk alc880_fixup_tbl[] = { |
2522 | SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810), |
2523 | + SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A), |
2524 | SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V), |
2525 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1), |
2526 | SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2), |
2527 | @@ -1473,6 +1495,7 @@ enum { |
2528 | ALC260_FIXUP_KN1, |
2529 | ALC260_FIXUP_FSC_S7020, |
2530 | ALC260_FIXUP_FSC_S7020_JWSE, |
2531 | + ALC260_FIXUP_VAIO_PINS, |
2532 | }; |
2533 | |
2534 | static void alc260_gpio1_automute(struct hda_codec *codec) |
2535 | @@ -1613,6 +1636,24 @@ static const struct hda_fixup alc260_fixups[] = { |
2536 | .chained = true, |
2537 | .chain_id = ALC260_FIXUP_FSC_S7020, |
2538 | }, |
2539 | + [ALC260_FIXUP_VAIO_PINS] = { |
2540 | + .type = HDA_FIXUP_PINS, |
2541 | + .v.pins = (const struct hda_pintbl[]) { |
2542 | + /* Pin configs are missing completely on some VAIOs */ |
2543 | + { 0x0f, 0x01211020 }, |
2544 | + { 0x10, 0x0001003f }, |
2545 | + { 0x11, 0x411111f0 }, |
2546 | + { 0x12, 0x01a15930 }, |
2547 | + { 0x13, 0x411111f0 }, |
2548 | + { 0x14, 0x411111f0 }, |
2549 | + { 0x15, 0x411111f0 }, |
2550 | + { 0x16, 0x411111f0 }, |
2551 | + { 0x17, 0x411111f0 }, |
2552 | + { 0x18, 0x411111f0 }, |
2553 | + { 0x19, 0x411111f0 }, |
2554 | + { } |
2555 | + } |
2556 | + }, |
2557 | }; |
2558 | |
2559 | static const struct snd_pci_quirk alc260_fixup_tbl[] = { |
2560 | @@ -1621,6 +1662,8 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = { |
2561 | SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1), |
2562 | SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), |
2563 | SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), |
2564 | + SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS), |
2565 | + SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F), |
2566 | SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020), |
2567 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), |
2568 | SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1), |
2569 | @@ -2380,6 +2423,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = { |
2570 | enum { |
2571 | ALC268_FIXUP_INV_DMIC, |
2572 | ALC268_FIXUP_HP_EAPD, |
2573 | + ALC268_FIXUP_SPDIF, |
2574 | }; |
2575 | |
2576 | static const struct hda_fixup alc268_fixups[] = { |
2577 | @@ -2394,6 +2438,13 @@ static const struct hda_fixup alc268_fixups[] = { |
2578 | {} |
2579 | } |
2580 | }, |
2581 | + [ALC268_FIXUP_SPDIF] = { |
2582 | + .type = HDA_FIXUP_PINS, |
2583 | + .v.pins = (const struct hda_pintbl[]) { |
2584 | + { 0x1e, 0x014b1180 }, /* enable SPDIF out */ |
2585 | + {} |
2586 | + } |
2587 | + }, |
2588 | }; |
2589 | |
2590 | static const struct hda_model_fixup alc268_fixup_models[] = { |
2591 | @@ -2403,6 +2454,7 @@ static const struct hda_model_fixup alc268_fixup_models[] = { |
2592 | }; |
2593 | |
2594 | static const struct snd_pci_quirk alc268_fixup_tbl[] = { |
2595 | + SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF), |
2596 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), |
2597 | /* below is codec SSID since multiple Toshiba laptops have the |
2598 | * same PCI SSID 1179:ff00 |
2599 | @@ -2531,6 +2583,7 @@ enum { |
2600 | ALC269_TYPE_ALC282, |
2601 | ALC269_TYPE_ALC284, |
2602 | ALC269_TYPE_ALC286, |
2603 | + ALC269_TYPE_ALC255, |
2604 | }; |
2605 | |
2606 | /* |
2607 | @@ -2555,6 +2608,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) |
2608 | case ALC269_TYPE_ALC269VD: |
2609 | case ALC269_TYPE_ALC282: |
2610 | case ALC269_TYPE_ALC286: |
2611 | + case ALC269_TYPE_ALC255: |
2612 | ssids = alc269_ssids; |
2613 | break; |
2614 | default: |
2615 | @@ -2754,6 +2808,23 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) |
2616 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); |
2617 | } |
2618 | |
2619 | +/* Make sure the led works even in runtime suspend */ |
2620 | +static unsigned int led_power_filter(struct hda_codec *codec, |
2621 | + hda_nid_t nid, |
2622 | + unsigned int power_state) |
2623 | +{ |
2624 | + struct alc_spec *spec = codec->spec; |
2625 | + |
2626 | + if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid) |
2627 | + return power_state; |
2628 | + |
2629 | + /* Set pin ctl again, it might have just been set to 0 */ |
2630 | + snd_hda_set_pin_ctl(codec, nid, |
2631 | + snd_hda_codec_get_pin_target(codec, nid)); |
2632 | + |
2633 | + return AC_PWRST_D0; |
2634 | +} |
2635 | + |
2636 | static void alc269_fixup_hp_mute_led(struct hda_codec *codec, |
2637 | const struct hda_fixup *fix, int action) |
2638 | { |
2639 | @@ -2773,6 +2844,7 @@ static void alc269_fixup_hp_mute_led(struct hda_codec *codec, |
2640 | spec->mute_led_nid = pin - 0x0a + 0x18; |
2641 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
2642 | spec->gen.vmaster_mute_enum = 1; |
2643 | + codec->power_filter = led_power_filter; |
2644 | snd_printd("Detected mute LED for %x:%d\n", spec->mute_led_nid, |
2645 | spec->mute_led_polarity); |
2646 | break; |
2647 | @@ -2788,6 +2860,7 @@ static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec, |
2648 | spec->mute_led_nid = 0x18; |
2649 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
2650 | spec->gen.vmaster_mute_enum = 1; |
2651 | + codec->power_filter = led_power_filter; |
2652 | } |
2653 | } |
2654 | |
2655 | @@ -2800,6 +2873,7 @@ static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec, |
2656 | spec->mute_led_nid = 0x19; |
2657 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
2658 | spec->gen.vmaster_mute_enum = 1; |
2659 | + codec->power_filter = led_power_filter; |
2660 | } |
2661 | } |
2662 | |
2663 | @@ -3040,8 +3114,10 @@ static void alc_update_headset_mode(struct hda_codec *codec) |
2664 | else |
2665 | new_headset_mode = ALC_HEADSET_MODE_HEADPHONE; |
2666 | |
2667 | - if (new_headset_mode == spec->current_headset_mode) |
2668 | + if (new_headset_mode == spec->current_headset_mode) { |
2669 | + snd_hda_gen_update_outputs(codec); |
2670 | return; |
2671 | + } |
2672 | |
2673 | switch (new_headset_mode) { |
2674 | case ALC_HEADSET_MODE_UNPLUGGED: |
2675 | @@ -3545,6 +3621,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
2676 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
2677 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
2678 | SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
2679 | + SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
2680 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS), |
2681 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
2682 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
2683 | @@ -3765,6 +3842,9 @@ static int patch_alc269(struct hda_codec *codec) |
2684 | case 0x10ec0286: |
2685 | spec->codec_variant = ALC269_TYPE_ALC286; |
2686 | break; |
2687 | + case 0x10ec0255: |
2688 | + spec->codec_variant = ALC269_TYPE_ALC255; |
2689 | + break; |
2690 | } |
2691 | |
2692 | /* automatic parse from the BIOS config */ |
2693 | @@ -4472,6 +4552,7 @@ static int patch_alc680(struct hda_codec *codec) |
2694 | static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
2695 | { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, |
2696 | { .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 }, |
2697 | + { .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 }, |
2698 | { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, |
2699 | { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, |
2700 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, |
2701 | diff --git a/sound/usb/6fire/chip.c b/sound/usb/6fire/chip.c |
2702 | index 4394ae796356..0716ba691398 100644 |
2703 | --- a/sound/usb/6fire/chip.c |
2704 | +++ b/sound/usb/6fire/chip.c |
2705 | @@ -101,7 +101,7 @@ static int usb6fire_chip_probe(struct usb_interface *intf, |
2706 | usb_set_intfdata(intf, chips[i]); |
2707 | mutex_unlock(®ister_mutex); |
2708 | return 0; |
2709 | - } else if (regidx < 0) |
2710 | + } else if (!devices[i] && regidx < 0) |
2711 | regidx = i; |
2712 | } |
2713 | if (regidx < 0) { |
2714 | diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c |
2715 | index 72a130bc448a..c329c8fc57f4 100644 |
2716 | --- a/virt/kvm/iommu.c |
2717 | +++ b/virt/kvm/iommu.c |
2718 | @@ -103,6 +103,10 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) |
2719 | while ((gfn << PAGE_SHIFT) & (page_size - 1)) |
2720 | page_size >>= 1; |
2721 | |
2722 | + /* Make sure hva is aligned to the page size we want to map */ |
2723 | + while (__gfn_to_hva_memslot(slot, gfn) & (page_size - 1)) |
2724 | + page_size >>= 1; |
2725 | + |
2726 | /* |
2727 | * Pin all pages we are about to map in memory. This is |
2728 | * important because we unmap and unpin in 4kb steps later. |