Contents of /trunk/kernel-magellan/patches-4.11/0107-4.11.8-all-fixes.patch
Parent Directory | Revision Log
Revision 2950 -
(show annotations)
(download)
Tue Jul 4 08:38:28 2017 UTC (7 years, 4 months ago) by niro
File size: 86606 byte(s)
Tue Jul 4 08:38:28 2017 UTC (7 years, 4 months ago) by niro
File size: 86606 byte(s)
-linux-4.11.8
1 | diff --git a/Makefile b/Makefile |
2 | index 1b0fe238d633..8c5c94ca56d9 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 11 |
8 | -SUBLEVEL = 7 |
9 | +SUBLEVEL = 8 |
10 | EXTRAVERSION = |
11 | NAME = Fearless Coyote |
12 | |
13 | diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c |
14 | index 41b6e31f8f55..d0cb007fa482 100644 |
15 | --- a/arch/arm64/kernel/vdso.c |
16 | +++ b/arch/arm64/kernel/vdso.c |
17 | @@ -221,10 +221,11 @@ void update_vsyscall(struct timekeeper *tk) |
18 | /* tkr_mono.cycle_last == tkr_raw.cycle_last */ |
19 | vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last; |
20 | vdso_data->raw_time_sec = tk->raw_time.tv_sec; |
21 | - vdso_data->raw_time_nsec = tk->raw_time.tv_nsec; |
22 | + vdso_data->raw_time_nsec = (tk->raw_time.tv_nsec << |
23 | + tk->tkr_raw.shift) + |
24 | + tk->tkr_raw.xtime_nsec; |
25 | vdso_data->xtime_clock_sec = tk->xtime_sec; |
26 | vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec; |
27 | - /* tkr_raw.xtime_nsec == 0 */ |
28 | vdso_data->cs_mono_mult = tk->tkr_mono.mult; |
29 | vdso_data->cs_raw_mult = tk->tkr_raw.mult; |
30 | /* tkr_mono.shift == tkr_raw.shift */ |
31 | diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S |
32 | index e00b4671bd7c..76320e920965 100644 |
33 | --- a/arch/arm64/kernel/vdso/gettimeofday.S |
34 | +++ b/arch/arm64/kernel/vdso/gettimeofday.S |
35 | @@ -256,7 +256,6 @@ monotonic_raw: |
36 | seqcnt_check fail=monotonic_raw |
37 | |
38 | /* All computations are done with left-shifted nsecs. */ |
39 | - lsl x14, x14, x12 |
40 | get_nsec_per_sec res=x9 |
41 | lsl x9, x9, x12 |
42 | |
43 | diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c |
44 | index 2819eb793345..3b5b7936345c 100644 |
45 | --- a/arch/mips/kvm/tlb.c |
46 | +++ b/arch/mips/kvm/tlb.c |
47 | @@ -147,7 +147,11 @@ static int _kvm_mips_host_tlb_inv(unsigned long entryhi) |
48 | int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long va, |
49 | bool user, bool kernel) |
50 | { |
51 | - int idx_user, idx_kernel; |
52 | + /* |
53 | + * Initialize idx_user and idx_kernel to workaround bogus |
54 | + * maybe-initialized warning when using GCC 6. |
55 | + */ |
56 | + int idx_user = 0, idx_kernel = 0; |
57 | unsigned long flags, old_entryhi; |
58 | |
59 | local_irq_save(flags); |
60 | diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S |
61 | index 6353019966e6..a59880c81d52 100644 |
62 | --- a/arch/powerpc/kernel/exceptions-64s.S |
63 | +++ b/arch/powerpc/kernel/exceptions-64s.S |
64 | @@ -1425,10 +1425,8 @@ USE_TEXT_SECTION() |
65 | .balign IFETCH_ALIGN_BYTES |
66 | do_hash_page: |
67 | #ifdef CONFIG_PPC_STD_MMU_64 |
68 | - andis. r0,r4,0xa410 /* weird error? */ |
69 | + andis. r0,r4,0xa450 /* weird error? */ |
70 | bne- handle_page_fault /* if not, try to insert a HPTE */ |
71 | - andis. r0,r4,DSISR_DABRMATCH@h |
72 | - bne- handle_dabr_fault |
73 | CURRENT_THREAD_INFO(r11, r1) |
74 | lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */ |
75 | andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */ |
76 | @@ -1452,11 +1450,16 @@ do_hash_page: |
77 | |
78 | /* Error */ |
79 | blt- 13f |
80 | + |
81 | + /* Reload DSISR into r4 for the DABR check below */ |
82 | + ld r4,_DSISR(r1) |
83 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
84 | |
85 | /* Here we have a page fault that hash_page can't handle. */ |
86 | handle_page_fault: |
87 | -11: ld r4,_DAR(r1) |
88 | +11: andis. r0,r4,DSISR_DABRMATCH@h |
89 | + bne- handle_dabr_fault |
90 | + ld r4,_DAR(r1) |
91 | ld r5,_DSISR(r1) |
92 | addi r3,r1,STACK_FRAME_OVERHEAD |
93 | bl do_page_fault |
94 | diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c |
95 | index fce05a38851c..49d5f193438a 100644 |
96 | --- a/arch/powerpc/kernel/kprobes.c |
97 | +++ b/arch/powerpc/kernel/kprobes.c |
98 | @@ -495,6 +495,15 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) |
99 | regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc); |
100 | #endif |
101 | |
102 | + /* |
103 | + * jprobes use jprobe_return() which skips the normal return |
104 | + * path of the function, and this messes up the accounting of the |
105 | + * function graph tracer. |
106 | + * |
107 | + * Pause function graph tracing while performing the jprobe function. |
108 | + */ |
109 | + pause_graph_tracing(); |
110 | + |
111 | return 1; |
112 | } |
113 | |
114 | @@ -517,6 +526,8 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) |
115 | * saved regs... |
116 | */ |
117 | memcpy(regs, &kcb->jprobe_saved_regs, sizeof(struct pt_regs)); |
118 | + /* It's OK to start function graph tracing again */ |
119 | + unpause_graph_tracing(); |
120 | preempt_enable_no_resched(); |
121 | return 1; |
122 | } |
123 | diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c |
124 | index 1ec86d9e2a82..e6a94bd2b158 100644 |
125 | --- a/arch/powerpc/kvm/book3s_hv.c |
126 | +++ b/arch/powerpc/kvm/book3s_hv.c |
127 | @@ -1481,6 +1481,14 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id, |
128 | r = set_vpa(vcpu, &vcpu->arch.dtl, addr, len); |
129 | break; |
130 | case KVM_REG_PPC_TB_OFFSET: |
131 | + /* |
132 | + * POWER9 DD1 has an erratum where writing TBU40 causes |
133 | + * the timebase to lose ticks. So we don't let the |
134 | + * timebase offset be changed on P9 DD1. (It is |
135 | + * initialized to zero.) |
136 | + */ |
137 | + if (cpu_has_feature(CPU_FTR_POWER9_DD1)) |
138 | + break; |
139 | /* round up to multiple of 2^24 */ |
140 | vcpu->arch.vcore->tb_offset = |
141 | ALIGN(set_reg_val(id, *val), 1UL << 24); |
142 | @@ -2902,12 +2910,36 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) |
143 | { |
144 | int r; |
145 | int srcu_idx; |
146 | + unsigned long ebb_regs[3] = {}; /* shut up GCC */ |
147 | + unsigned long user_tar = 0; |
148 | + unsigned int user_vrsave; |
149 | |
150 | if (!vcpu->arch.sane) { |
151 | run->exit_reason = KVM_EXIT_INTERNAL_ERROR; |
152 | return -EINVAL; |
153 | } |
154 | |
155 | + /* |
156 | + * Don't allow entry with a suspended transaction, because |
157 | + * the guest entry/exit code will lose it. |
158 | + * If the guest has TM enabled, save away their TM-related SPRs |
159 | + * (they will get restored by the TM unavailable interrupt). |
160 | + */ |
161 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
162 | + if (cpu_has_feature(CPU_FTR_TM) && current->thread.regs && |
163 | + (current->thread.regs->msr & MSR_TM)) { |
164 | + if (MSR_TM_ACTIVE(current->thread.regs->msr)) { |
165 | + run->exit_reason = KVM_EXIT_FAIL_ENTRY; |
166 | + run->fail_entry.hardware_entry_failure_reason = 0; |
167 | + return -EINVAL; |
168 | + } |
169 | + current->thread.tm_tfhar = mfspr(SPRN_TFHAR); |
170 | + current->thread.tm_tfiar = mfspr(SPRN_TFIAR); |
171 | + current->thread.tm_texasr = mfspr(SPRN_TEXASR); |
172 | + current->thread.regs->msr &= ~MSR_TM; |
173 | + } |
174 | +#endif |
175 | + |
176 | kvmppc_core_prepare_to_enter(vcpu); |
177 | |
178 | /* No need to go into the guest when all we'll do is come back out */ |
179 | @@ -2929,6 +2961,15 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) |
180 | |
181 | flush_all_to_thread(current); |
182 | |
183 | + /* Save userspace EBB and other register values */ |
184 | + if (cpu_has_feature(CPU_FTR_ARCH_207S)) { |
185 | + ebb_regs[0] = mfspr(SPRN_EBBHR); |
186 | + ebb_regs[1] = mfspr(SPRN_EBBRR); |
187 | + ebb_regs[2] = mfspr(SPRN_BESCR); |
188 | + user_tar = mfspr(SPRN_TAR); |
189 | + } |
190 | + user_vrsave = mfspr(SPRN_VRSAVE); |
191 | + |
192 | vcpu->arch.wqp = &vcpu->arch.vcore->wq; |
193 | vcpu->arch.pgdir = current->mm->pgd; |
194 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; |
195 | @@ -2951,6 +2992,16 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) |
196 | r = kvmppc_xics_rm_complete(vcpu, 0); |
197 | } while (is_kvmppc_resume_guest(r)); |
198 | |
199 | + /* Restore userspace EBB and other register values */ |
200 | + if (cpu_has_feature(CPU_FTR_ARCH_207S)) { |
201 | + mtspr(SPRN_EBBHR, ebb_regs[0]); |
202 | + mtspr(SPRN_EBBRR, ebb_regs[1]); |
203 | + mtspr(SPRN_BESCR, ebb_regs[2]); |
204 | + mtspr(SPRN_TAR, user_tar); |
205 | + mtspr(SPRN_FSCR, current->thread.fscr); |
206 | + } |
207 | + mtspr(SPRN_VRSAVE, user_vrsave); |
208 | + |
209 | out: |
210 | vcpu->arch.state = KVMPPC_VCPU_NOTREADY; |
211 | atomic_dec(&vcpu->kvm->arch.vcpus_running); |
212 | diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S |
213 | index 0fdc4a28970b..404deb512844 100644 |
214 | --- a/arch/powerpc/kvm/book3s_hv_interrupts.S |
215 | +++ b/arch/powerpc/kvm/book3s_hv_interrupts.S |
216 | @@ -121,10 +121,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
217 | * Put whatever is in the decrementer into the |
218 | * hypervisor decrementer. |
219 | */ |
220 | +BEGIN_FTR_SECTION |
221 | + ld r5, HSTATE_KVM_VCORE(r13) |
222 | + ld r6, VCORE_KVM(r5) |
223 | + ld r9, KVM_HOST_LPCR(r6) |
224 | + andis. r9, r9, LPCR_LD@h |
225 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
226 | mfspr r8,SPRN_DEC |
227 | mftb r7 |
228 | - mtspr SPRN_HDEC,r8 |
229 | +BEGIN_FTR_SECTION |
230 | + /* On POWER9, don't sign-extend if host LPCR[LD] bit is set */ |
231 | + bne 32f |
232 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
233 | extsw r8,r8 |
234 | +32: mtspr SPRN_HDEC,r8 |
235 | add r8,r8,r7 |
236 | std r8,HSTATE_DECEXP(r13) |
237 | |
238 | diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
239 | index 7c6477d1840a..9250866cc900 100644 |
240 | --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
241 | +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
242 | @@ -31,12 +31,29 @@ |
243 | #include <asm/tm.h> |
244 | #include <asm/opal.h> |
245 | |
246 | +/* Sign-extend HDEC if not on POWER9 */ |
247 | +#define EXTEND_HDEC(reg) \ |
248 | +BEGIN_FTR_SECTION; \ |
249 | + extsw reg, reg; \ |
250 | +END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) |
251 | + |
252 | #define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM) |
253 | |
254 | /* Values in HSTATE_NAPPING(r13) */ |
255 | #define NAPPING_CEDE 1 |
256 | #define NAPPING_NOVCPU 2 |
257 | |
258 | +/* Stack frame offsets for kvmppc_hv_entry */ |
259 | +#define SFS 144 |
260 | +#define STACK_SLOT_TRAP (SFS-4) |
261 | +#define STACK_SLOT_TID (SFS-16) |
262 | +#define STACK_SLOT_PSSCR (SFS-24) |
263 | +#define STACK_SLOT_PID (SFS-32) |
264 | +#define STACK_SLOT_IAMR (SFS-40) |
265 | +#define STACK_SLOT_CIABR (SFS-48) |
266 | +#define STACK_SLOT_DAWR (SFS-56) |
267 | +#define STACK_SLOT_DAWRX (SFS-64) |
268 | + |
269 | /* |
270 | * Call kvmppc_hv_entry in real mode. |
271 | * Must be called with interrupts hard-disabled. |
272 | @@ -213,6 +230,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
273 | kvmppc_primary_no_guest: |
274 | /* We handle this much like a ceded vcpu */ |
275 | /* put the HDEC into the DEC, since HDEC interrupts don't wake us */ |
276 | + /* HDEC may be larger than DEC for arch >= v3.00, but since the */ |
277 | + /* HDEC value came from DEC in the first place, it will fit */ |
278 | mfspr r3, SPRN_HDEC |
279 | mtspr SPRN_DEC, r3 |
280 | /* |
281 | @@ -294,8 +313,9 @@ kvm_novcpu_wakeup: |
282 | |
283 | /* See if our timeslice has expired (HDEC is negative) */ |
284 | mfspr r0, SPRN_HDEC |
285 | + EXTEND_HDEC(r0) |
286 | li r12, BOOK3S_INTERRUPT_HV_DECREMENTER |
287 | - cmpwi r0, 0 |
288 | + cmpdi r0, 0 |
289 | blt kvm_novcpu_exit |
290 | |
291 | /* Got an IPI but other vcpus aren't yet exiting, must be a latecomer */ |
292 | @@ -318,10 +338,10 @@ kvm_novcpu_exit: |
293 | bl kvmhv_accumulate_time |
294 | #endif |
295 | 13: mr r3, r12 |
296 | - stw r12, 112-4(r1) |
297 | + stw r12, STACK_SLOT_TRAP(r1) |
298 | bl kvmhv_commence_exit |
299 | nop |
300 | - lwz r12, 112-4(r1) |
301 | + lwz r12, STACK_SLOT_TRAP(r1) |
302 | b kvmhv_switch_to_host |
303 | |
304 | /* |
305 | @@ -389,8 +409,8 @@ kvm_secondary_got_guest: |
306 | lbz r4, HSTATE_PTID(r13) |
307 | cmpwi r4, 0 |
308 | bne 63f |
309 | - lis r6, 0x7fff |
310 | - ori r6, r6, 0xffff |
311 | + LOAD_REG_ADDR(r6, decrementer_max) |
312 | + ld r6, 0(r6) |
313 | mtspr SPRN_HDEC, r6 |
314 | /* and set per-LPAR registers, if doing dynamic micro-threading */ |
315 | ld r6, HSTATE_SPLIT_MODE(r13) |
316 | @@ -544,11 +564,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
317 | * * |
318 | *****************************************************************************/ |
319 | |
320 | -/* Stack frame offsets */ |
321 | -#define STACK_SLOT_TID (112-16) |
322 | -#define STACK_SLOT_PSSCR (112-24) |
323 | -#define STACK_SLOT_PID (112-32) |
324 | - |
325 | .global kvmppc_hv_entry |
326 | kvmppc_hv_entry: |
327 | |
328 | @@ -564,7 +579,7 @@ kvmppc_hv_entry: |
329 | */ |
330 | mflr r0 |
331 | std r0, PPC_LR_STKOFF(r1) |
332 | - stdu r1, -112(r1) |
333 | + stdu r1, -SFS(r1) |
334 | |
335 | /* Save R1 in the PACA */ |
336 | std r1, HSTATE_HOST_R1(r13) |
337 | @@ -748,10 +763,20 @@ BEGIN_FTR_SECTION |
338 | mfspr r5, SPRN_TIDR |
339 | mfspr r6, SPRN_PSSCR |
340 | mfspr r7, SPRN_PID |
341 | + mfspr r8, SPRN_IAMR |
342 | std r5, STACK_SLOT_TID(r1) |
343 | std r6, STACK_SLOT_PSSCR(r1) |
344 | std r7, STACK_SLOT_PID(r1) |
345 | + std r8, STACK_SLOT_IAMR(r1) |
346 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
347 | +BEGIN_FTR_SECTION |
348 | + mfspr r5, SPRN_CIABR |
349 | + mfspr r6, SPRN_DAWR |
350 | + mfspr r7, SPRN_DAWRX |
351 | + std r5, STACK_SLOT_CIABR(r1) |
352 | + std r6, STACK_SLOT_DAWR(r1) |
353 | + std r7, STACK_SLOT_DAWRX(r1) |
354 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
355 | |
356 | BEGIN_FTR_SECTION |
357 | /* Set partition DABR */ |
358 | @@ -967,7 +992,8 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300) |
359 | |
360 | /* Check if HDEC expires soon */ |
361 | mfspr r3, SPRN_HDEC |
362 | - cmpwi r3, 512 /* 1 microsecond */ |
363 | + EXTEND_HDEC(r3) |
364 | + cmpdi r3, 512 /* 1 microsecond */ |
365 | blt hdec_soon |
366 | |
367 | deliver_guest_interrupt: |
368 | @@ -1451,11 +1477,10 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300) |
369 | * set by the guest could disrupt the host. |
370 | */ |
371 | li r0, 0 |
372 | - mtspr SPRN_IAMR, r0 |
373 | - mtspr SPRN_CIABR, r0 |
374 | - mtspr SPRN_DAWRX, r0 |
375 | + mtspr SPRN_PSPB, r0 |
376 | mtspr SPRN_WORT, r0 |
377 | BEGIN_FTR_SECTION |
378 | + mtspr SPRN_IAMR, r0 |
379 | mtspr SPRN_TCSCR, r0 |
380 | /* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */ |
381 | li r0, 1 |
382 | @@ -1471,6 +1496,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) |
383 | std r6,VCPU_UAMOR(r9) |
384 | li r6,0 |
385 | mtspr SPRN_AMR,r6 |
386 | + mtspr SPRN_UAMOR, r6 |
387 | |
388 | /* Switch DSCR back to host value */ |
389 | mfspr r8, SPRN_DSCR |
390 | @@ -1616,12 +1642,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
391 | |
392 | /* Restore host values of some registers */ |
393 | BEGIN_FTR_SECTION |
394 | + ld r5, STACK_SLOT_CIABR(r1) |
395 | + ld r6, STACK_SLOT_DAWR(r1) |
396 | + ld r7, STACK_SLOT_DAWRX(r1) |
397 | + mtspr SPRN_CIABR, r5 |
398 | + mtspr SPRN_DAWR, r6 |
399 | + mtspr SPRN_DAWRX, r7 |
400 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
401 | +BEGIN_FTR_SECTION |
402 | ld r5, STACK_SLOT_TID(r1) |
403 | ld r6, STACK_SLOT_PSSCR(r1) |
404 | ld r7, STACK_SLOT_PID(r1) |
405 | + ld r8, STACK_SLOT_IAMR(r1) |
406 | mtspr SPRN_TIDR, r5 |
407 | mtspr SPRN_PSSCR, r6 |
408 | mtspr SPRN_PID, r7 |
409 | + mtspr SPRN_IAMR, r8 |
410 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
411 | BEGIN_FTR_SECTION |
412 | PPC_INVALIDATE_ERAT |
413 | @@ -1765,8 +1801,8 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX) |
414 | li r0, KVM_GUEST_MODE_NONE |
415 | stb r0, HSTATE_IN_GUEST(r13) |
416 | |
417 | - ld r0, 112+PPC_LR_STKOFF(r1) |
418 | - addi r1, r1, 112 |
419 | + ld r0, SFS+PPC_LR_STKOFF(r1) |
420 | + addi r1, r1, SFS |
421 | mtlr r0 |
422 | blr |
423 | |
424 | @@ -2308,12 +2344,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM) |
425 | mfspr r3, SPRN_DEC |
426 | mfspr r4, SPRN_HDEC |
427 | mftb r5 |
428 | - cmpw r3, r4 |
429 | + extsw r3, r3 |
430 | + EXTEND_HDEC(r4) |
431 | + cmpd r3, r4 |
432 | ble 67f |
433 | mtspr SPRN_DEC, r4 |
434 | 67: |
435 | /* save expiry time of guest decrementer */ |
436 | - extsw r3, r3 |
437 | add r3, r3, r5 |
438 | ld r4, HSTATE_KVM_VCPU(r13) |
439 | ld r5, HSTATE_KVM_VCORE(r13) |
440 | diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c |
441 | index cbd82fde5770..09ceea6175ba 100644 |
442 | --- a/arch/powerpc/perf/perf_regs.c |
443 | +++ b/arch/powerpc/perf/perf_regs.c |
444 | @@ -101,5 +101,6 @@ void perf_get_regs_user(struct perf_regs *regs_user, |
445 | struct pt_regs *regs_user_copy) |
446 | { |
447 | regs_user->regs = task_pt_regs(current); |
448 | - regs_user->abi = perf_reg_abi(current); |
449 | + regs_user->abi = (regs_user->regs) ? perf_reg_abi(current) : |
450 | + PERF_SAMPLE_REGS_ABI_NONE; |
451 | } |
452 | diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c |
453 | index ddbffb715b40..e92f5bd9d0b4 100644 |
454 | --- a/arch/s390/kvm/gaccess.c |
455 | +++ b/arch/s390/kvm/gaccess.c |
456 | @@ -977,11 +977,12 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, |
457 | ptr = asce.origin * 4096; |
458 | if (asce.r) { |
459 | *fake = 1; |
460 | + ptr = 0; |
461 | asce.dt = ASCE_TYPE_REGION1; |
462 | } |
463 | switch (asce.dt) { |
464 | case ASCE_TYPE_REGION1: |
465 | - if (vaddr.rfx01 > asce.tl && !asce.r) |
466 | + if (vaddr.rfx01 > asce.tl && !*fake) |
467 | return PGM_REGION_FIRST_TRANS; |
468 | break; |
469 | case ASCE_TYPE_REGION2: |
470 | @@ -1009,8 +1010,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, |
471 | union region1_table_entry rfte; |
472 | |
473 | if (*fake) { |
474 | - /* offset in 16EB guest memory block */ |
475 | - ptr = ptr + ((unsigned long) vaddr.rsx << 53UL); |
476 | + ptr += (unsigned long) vaddr.rfx << 53; |
477 | rfte.val = ptr; |
478 | goto shadow_r2t; |
479 | } |
480 | @@ -1036,8 +1036,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, |
481 | union region2_table_entry rste; |
482 | |
483 | if (*fake) { |
484 | - /* offset in 8PB guest memory block */ |
485 | - ptr = ptr + ((unsigned long) vaddr.rtx << 42UL); |
486 | + ptr += (unsigned long) vaddr.rsx << 42; |
487 | rste.val = ptr; |
488 | goto shadow_r3t; |
489 | } |
490 | @@ -1064,8 +1063,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, |
491 | union region3_table_entry rtte; |
492 | |
493 | if (*fake) { |
494 | - /* offset in 4TB guest memory block */ |
495 | - ptr = ptr + ((unsigned long) vaddr.sx << 31UL); |
496 | + ptr += (unsigned long) vaddr.rtx << 31; |
497 | rtte.val = ptr; |
498 | goto shadow_sgt; |
499 | } |
500 | @@ -1101,8 +1099,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, |
501 | union segment_table_entry ste; |
502 | |
503 | if (*fake) { |
504 | - /* offset in 2G guest memory block */ |
505 | - ptr = ptr + ((unsigned long) vaddr.sx << 20UL); |
506 | + ptr += (unsigned long) vaddr.sx << 20; |
507 | ste.val = ptr; |
508 | goto shadow_pgt; |
509 | } |
510 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c |
511 | index eb1484c86bb4..65c2ca578556 100644 |
512 | --- a/arch/x86/events/intel/core.c |
513 | +++ b/arch/x86/events/intel/core.c |
514 | @@ -431,11 +431,11 @@ static __initconst const u64 skl_hw_cache_event_ids |
515 | [ C(DTLB) ] = { |
516 | [ C(OP_READ) ] = { |
517 | [ C(RESULT_ACCESS) ] = 0x81d0, /* MEM_INST_RETIRED.ALL_LOADS */ |
518 | - [ C(RESULT_MISS) ] = 0x608, /* DTLB_LOAD_MISSES.WALK_COMPLETED */ |
519 | + [ C(RESULT_MISS) ] = 0xe08, /* DTLB_LOAD_MISSES.WALK_COMPLETED */ |
520 | }, |
521 | [ C(OP_WRITE) ] = { |
522 | [ C(RESULT_ACCESS) ] = 0x82d0, /* MEM_INST_RETIRED.ALL_STORES */ |
523 | - [ C(RESULT_MISS) ] = 0x649, /* DTLB_STORE_MISSES.WALK_COMPLETED */ |
524 | + [ C(RESULT_MISS) ] = 0xe49, /* DTLB_STORE_MISSES.WALK_COMPLETED */ |
525 | }, |
526 | [ C(OP_PREFETCH) ] = { |
527 | [ C(RESULT_ACCESS) ] = 0x0, |
528 | diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h |
529 | index 3e8c287090e4..d5f83cda1dea 100644 |
530 | --- a/arch/x86/include/asm/kvm_emulate.h |
531 | +++ b/arch/x86/include/asm/kvm_emulate.h |
532 | @@ -294,6 +294,7 @@ struct x86_emulate_ctxt { |
533 | |
534 | bool perm_ok; /* do not check permissions if true */ |
535 | bool ud; /* inject an #UD if host doesn't support insn */ |
536 | + bool tf; /* TF value before instruction (after for syscall/sysret) */ |
537 | |
538 | bool have_exception; |
539 | struct x86_exception exception; |
540 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
541 | index 45c7306c8780..ce7f80baa664 100644 |
542 | --- a/arch/x86/kvm/emulate.c |
543 | +++ b/arch/x86/kvm/emulate.c |
544 | @@ -2742,6 +2742,7 @@ static int em_syscall(struct x86_emulate_ctxt *ctxt) |
545 | ctxt->eflags &= ~(X86_EFLAGS_VM | X86_EFLAGS_IF); |
546 | } |
547 | |
548 | + ctxt->tf = (ctxt->eflags & X86_EFLAGS_TF) != 0; |
549 | return X86EMUL_CONTINUE; |
550 | } |
551 | |
552 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
553 | index 6557c790c8c1..dd1fe338c5f5 100644 |
554 | --- a/arch/x86/kvm/x86.c |
555 | +++ b/arch/x86/kvm/x86.c |
556 | @@ -5330,6 +5330,8 @@ static void init_emulate_ctxt(struct kvm_vcpu *vcpu) |
557 | kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l); |
558 | |
559 | ctxt->eflags = kvm_get_rflags(vcpu); |
560 | + ctxt->tf = (ctxt->eflags & X86_EFLAGS_TF) != 0; |
561 | + |
562 | ctxt->eip = kvm_rip_read(vcpu); |
563 | ctxt->mode = (!is_protmode(vcpu)) ? X86EMUL_MODE_REAL : |
564 | (ctxt->eflags & X86_EFLAGS_VM) ? X86EMUL_MODE_VM86 : |
565 | @@ -5546,36 +5548,25 @@ static int kvm_vcpu_check_hw_bp(unsigned long addr, u32 type, u32 dr7, |
566 | return dr6; |
567 | } |
568 | |
569 | -static void kvm_vcpu_check_singlestep(struct kvm_vcpu *vcpu, unsigned long rflags, int *r) |
570 | +static void kvm_vcpu_do_singlestep(struct kvm_vcpu *vcpu, int *r) |
571 | { |
572 | struct kvm_run *kvm_run = vcpu->run; |
573 | |
574 | - /* |
575 | - * rflags is the old, "raw" value of the flags. The new value has |
576 | - * not been saved yet. |
577 | - * |
578 | - * This is correct even for TF set by the guest, because "the |
579 | - * processor will not generate this exception after the instruction |
580 | - * that sets the TF flag". |
581 | - */ |
582 | - if (unlikely(rflags & X86_EFLAGS_TF)) { |
583 | - if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { |
584 | - kvm_run->debug.arch.dr6 = DR6_BS | DR6_FIXED_1 | |
585 | - DR6_RTM; |
586 | - kvm_run->debug.arch.pc = vcpu->arch.singlestep_rip; |
587 | - kvm_run->debug.arch.exception = DB_VECTOR; |
588 | - kvm_run->exit_reason = KVM_EXIT_DEBUG; |
589 | - *r = EMULATE_USER_EXIT; |
590 | - } else { |
591 | - /* |
592 | - * "Certain debug exceptions may clear bit 0-3. The |
593 | - * remaining contents of the DR6 register are never |
594 | - * cleared by the processor". |
595 | - */ |
596 | - vcpu->arch.dr6 &= ~15; |
597 | - vcpu->arch.dr6 |= DR6_BS | DR6_RTM; |
598 | - kvm_queue_exception(vcpu, DB_VECTOR); |
599 | - } |
600 | + if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { |
601 | + kvm_run->debug.arch.dr6 = DR6_BS | DR6_FIXED_1 | DR6_RTM; |
602 | + kvm_run->debug.arch.pc = vcpu->arch.singlestep_rip; |
603 | + kvm_run->debug.arch.exception = DB_VECTOR; |
604 | + kvm_run->exit_reason = KVM_EXIT_DEBUG; |
605 | + *r = EMULATE_USER_EXIT; |
606 | + } else { |
607 | + /* |
608 | + * "Certain debug exceptions may clear bit 0-3. The |
609 | + * remaining contents of the DR6 register are never |
610 | + * cleared by the processor". |
611 | + */ |
612 | + vcpu->arch.dr6 &= ~15; |
613 | + vcpu->arch.dr6 |= DR6_BS | DR6_RTM; |
614 | + kvm_queue_exception(vcpu, DB_VECTOR); |
615 | } |
616 | } |
617 | |
618 | @@ -5585,7 +5576,17 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vcpu) |
619 | int r = EMULATE_DONE; |
620 | |
621 | kvm_x86_ops->skip_emulated_instruction(vcpu); |
622 | - kvm_vcpu_check_singlestep(vcpu, rflags, &r); |
623 | + |
624 | + /* |
625 | + * rflags is the old, "raw" value of the flags. The new value has |
626 | + * not been saved yet. |
627 | + * |
628 | + * This is correct even for TF set by the guest, because "the |
629 | + * processor will not generate this exception after the instruction |
630 | + * that sets the TF flag". |
631 | + */ |
632 | + if (unlikely(rflags & X86_EFLAGS_TF)) |
633 | + kvm_vcpu_do_singlestep(vcpu, &r); |
634 | return r == EMULATE_DONE; |
635 | } |
636 | EXPORT_SYMBOL_GPL(kvm_skip_emulated_instruction); |
637 | @@ -5746,8 +5747,9 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, |
638 | if (vcpu->arch.hflags != ctxt->emul_flags) |
639 | kvm_set_hflags(vcpu, ctxt->emul_flags); |
640 | kvm_rip_write(vcpu, ctxt->eip); |
641 | - if (r == EMULATE_DONE) |
642 | - kvm_vcpu_check_singlestep(vcpu, rflags, &r); |
643 | + if (r == EMULATE_DONE && |
644 | + (ctxt->tf || (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP))) |
645 | + kvm_vcpu_do_singlestep(vcpu, &r); |
646 | if (!ctxt->have_exception || |
647 | exception_type(ctxt->exception.vector) == EXCPT_TRAP) |
648 | __kvm_set_rflags(vcpu, ctxt->eflags); |
649 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
650 | index 2433569b02ef..bc9adb4a2fd7 100644 |
651 | --- a/drivers/acpi/scan.c |
652 | +++ b/drivers/acpi/scan.c |
653 | @@ -1433,6 +1433,37 @@ static void acpi_init_coherency(struct acpi_device *adev) |
654 | adev->flags.coherent_dma = cca; |
655 | } |
656 | |
657 | +static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data) |
658 | +{ |
659 | + bool *is_spi_i2c_slave_p = data; |
660 | + |
661 | + if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) |
662 | + return 1; |
663 | + |
664 | + /* |
665 | + * devices that are connected to UART still need to be enumerated to |
666 | + * platform bus |
667 | + */ |
668 | + if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART) |
669 | + *is_spi_i2c_slave_p = true; |
670 | + |
671 | + /* no need to do more checking */ |
672 | + return -1; |
673 | +} |
674 | + |
675 | +static bool acpi_is_spi_i2c_slave(struct acpi_device *device) |
676 | +{ |
677 | + struct list_head resource_list; |
678 | + bool is_spi_i2c_slave = false; |
679 | + |
680 | + INIT_LIST_HEAD(&resource_list); |
681 | + acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave, |
682 | + &is_spi_i2c_slave); |
683 | + acpi_dev_free_resource_list(&resource_list); |
684 | + |
685 | + return is_spi_i2c_slave; |
686 | +} |
687 | + |
688 | void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, |
689 | int type, unsigned long long sta) |
690 | { |
691 | @@ -1448,6 +1479,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, |
692 | acpi_bus_get_flags(device); |
693 | device->flags.match_driver = false; |
694 | device->flags.initialized = true; |
695 | + device->flags.spi_i2c_slave = acpi_is_spi_i2c_slave(device); |
696 | acpi_device_clear_enumerated(device); |
697 | device_initialize(&device->dev); |
698 | dev_set_uevent_suppress(&device->dev, true); |
699 | @@ -1732,38 +1764,13 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used, |
700 | return AE_OK; |
701 | } |
702 | |
703 | -static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data) |
704 | -{ |
705 | - bool *is_spi_i2c_slave_p = data; |
706 | - |
707 | - if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) |
708 | - return 1; |
709 | - |
710 | - /* |
711 | - * devices that are connected to UART still need to be enumerated to |
712 | - * platform bus |
713 | - */ |
714 | - if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART) |
715 | - *is_spi_i2c_slave_p = true; |
716 | - |
717 | - /* no need to do more checking */ |
718 | - return -1; |
719 | -} |
720 | - |
721 | static void acpi_default_enumeration(struct acpi_device *device) |
722 | { |
723 | - struct list_head resource_list; |
724 | - bool is_spi_i2c_slave = false; |
725 | - |
726 | /* |
727 | * Do not enumerate SPI/I2C slaves as they will be enumerated by their |
728 | * respective parents. |
729 | */ |
730 | - INIT_LIST_HEAD(&resource_list); |
731 | - acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave, |
732 | - &is_spi_i2c_slave); |
733 | - acpi_dev_free_resource_list(&resource_list); |
734 | - if (!is_spi_i2c_slave) { |
735 | + if (!device->flags.spi_i2c_slave) { |
736 | acpi_create_platform_device(device, NULL); |
737 | acpi_device_set_enumerated(device); |
738 | } else { |
739 | @@ -1857,7 +1864,7 @@ static void acpi_bus_attach(struct acpi_device *device) |
740 | return; |
741 | |
742 | device->flags.match_driver = true; |
743 | - if (ret > 0) { |
744 | + if (ret > 0 && !device->flags.spi_i2c_slave) { |
745 | acpi_device_set_enumerated(device); |
746 | goto ok; |
747 | } |
748 | @@ -1866,7 +1873,7 @@ static void acpi_bus_attach(struct acpi_device *device) |
749 | if (ret < 0) |
750 | return; |
751 | |
752 | - if (ret > 0 || !device->pnp.type.platform_id) |
753 | + if (!device->pnp.type.platform_id && !device->flags.spi_i2c_slave) |
754 | acpi_device_set_enumerated(device); |
755 | else |
756 | acpi_default_enumeration(device); |
757 | diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c |
758 | index 726c32e35db9..fbe0dfdffc0d 100644 |
759 | --- a/drivers/block/xen-blkback/blkback.c |
760 | +++ b/drivers/block/xen-blkback/blkback.c |
761 | @@ -1436,34 +1436,35 @@ static int dispatch_rw_block_io(struct xen_blkif_ring *ring, |
762 | static void make_response(struct xen_blkif_ring *ring, u64 id, |
763 | unsigned short op, int st) |
764 | { |
765 | - struct blkif_response resp; |
766 | + struct blkif_response *resp; |
767 | unsigned long flags; |
768 | union blkif_back_rings *blk_rings; |
769 | int notify; |
770 | |
771 | - resp.id = id; |
772 | - resp.operation = op; |
773 | - resp.status = st; |
774 | - |
775 | spin_lock_irqsave(&ring->blk_ring_lock, flags); |
776 | blk_rings = &ring->blk_rings; |
777 | /* Place on the response ring for the relevant domain. */ |
778 | switch (ring->blkif->blk_protocol) { |
779 | case BLKIF_PROTOCOL_NATIVE: |
780 | - memcpy(RING_GET_RESPONSE(&blk_rings->native, blk_rings->native.rsp_prod_pvt), |
781 | - &resp, sizeof(resp)); |
782 | + resp = RING_GET_RESPONSE(&blk_rings->native, |
783 | + blk_rings->native.rsp_prod_pvt); |
784 | break; |
785 | case BLKIF_PROTOCOL_X86_32: |
786 | - memcpy(RING_GET_RESPONSE(&blk_rings->x86_32, blk_rings->x86_32.rsp_prod_pvt), |
787 | - &resp, sizeof(resp)); |
788 | + resp = RING_GET_RESPONSE(&blk_rings->x86_32, |
789 | + blk_rings->x86_32.rsp_prod_pvt); |
790 | break; |
791 | case BLKIF_PROTOCOL_X86_64: |
792 | - memcpy(RING_GET_RESPONSE(&blk_rings->x86_64, blk_rings->x86_64.rsp_prod_pvt), |
793 | - &resp, sizeof(resp)); |
794 | + resp = RING_GET_RESPONSE(&blk_rings->x86_64, |
795 | + blk_rings->x86_64.rsp_prod_pvt); |
796 | break; |
797 | default: |
798 | BUG(); |
799 | } |
800 | + |
801 | + resp->id = id; |
802 | + resp->operation = op; |
803 | + resp->status = st; |
804 | + |
805 | blk_rings->common.rsp_prod_pvt++; |
806 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify); |
807 | spin_unlock_irqrestore(&ring->blk_ring_lock, flags); |
808 | diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h |
809 | index dea61f6ab8cb..ecb35fe8ca8d 100644 |
810 | --- a/drivers/block/xen-blkback/common.h |
811 | +++ b/drivers/block/xen-blkback/common.h |
812 | @@ -75,9 +75,8 @@ extern unsigned int xenblk_max_queues; |
813 | struct blkif_common_request { |
814 | char dummy; |
815 | }; |
816 | -struct blkif_common_response { |
817 | - char dummy; |
818 | -}; |
819 | + |
820 | +/* i386 protocol version */ |
821 | |
822 | struct blkif_x86_32_request_rw { |
823 | uint8_t nr_segments; /* number of segments */ |
824 | @@ -129,14 +128,6 @@ struct blkif_x86_32_request { |
825 | } u; |
826 | } __attribute__((__packed__)); |
827 | |
828 | -/* i386 protocol version */ |
829 | -#pragma pack(push, 4) |
830 | -struct blkif_x86_32_response { |
831 | - uint64_t id; /* copied from request */ |
832 | - uint8_t operation; /* copied from request */ |
833 | - int16_t status; /* BLKIF_RSP_??? */ |
834 | -}; |
835 | -#pragma pack(pop) |
836 | /* x86_64 protocol version */ |
837 | |
838 | struct blkif_x86_64_request_rw { |
839 | @@ -193,18 +184,12 @@ struct blkif_x86_64_request { |
840 | } u; |
841 | } __attribute__((__packed__)); |
842 | |
843 | -struct blkif_x86_64_response { |
844 | - uint64_t __attribute__((__aligned__(8))) id; |
845 | - uint8_t operation; /* copied from request */ |
846 | - int16_t status; /* BLKIF_RSP_??? */ |
847 | -}; |
848 | - |
849 | DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, |
850 | - struct blkif_common_response); |
851 | + struct blkif_response); |
852 | DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, |
853 | - struct blkif_x86_32_response); |
854 | + struct blkif_response __packed); |
855 | DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, |
856 | - struct blkif_x86_64_response); |
857 | + struct blkif_response); |
858 | |
859 | union blkif_back_rings { |
860 | struct blkif_back_ring native; |
861 | @@ -281,6 +266,7 @@ struct xen_blkif_ring { |
862 | |
863 | wait_queue_head_t wq; |
864 | atomic_t inflight; |
865 | + bool active; |
866 | /* One thread per blkif ring. */ |
867 | struct task_struct *xenblkd; |
868 | unsigned int waiting_reqs; |
869 | diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c |
870 | index 8fe61b5dc5a6..dcabf52425ff 100644 |
871 | --- a/drivers/block/xen-blkback/xenbus.c |
872 | +++ b/drivers/block/xen-blkback/xenbus.c |
873 | @@ -159,7 +159,7 @@ static int xen_blkif_alloc_rings(struct xen_blkif *blkif) |
874 | init_waitqueue_head(&ring->shutdown_wq); |
875 | ring->blkif = blkif; |
876 | ring->st_print = jiffies; |
877 | - xen_blkif_get(blkif); |
878 | + ring->active = true; |
879 | } |
880 | |
881 | return 0; |
882 | @@ -249,6 +249,9 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
883 | struct xen_blkif_ring *ring = &blkif->rings[r]; |
884 | unsigned int i = 0; |
885 | |
886 | + if (!ring->active) |
887 | + continue; |
888 | + |
889 | if (ring->xenblkd) { |
890 | kthread_stop(ring->xenblkd); |
891 | wake_up(&ring->shutdown_wq); |
892 | @@ -296,7 +299,7 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif) |
893 | BUG_ON(ring->free_pages_num != 0); |
894 | BUG_ON(ring->persistent_gnt_c != 0); |
895 | WARN_ON(i != (XEN_BLKIF_REQS_PER_PAGE * blkif->nr_ring_pages)); |
896 | - xen_blkif_put(blkif); |
897 | + ring->active = false; |
898 | } |
899 | blkif->nr_ring_pages = 0; |
900 | /* |
901 | diff --git a/drivers/char/random.c b/drivers/char/random.c |
902 | index 2291e6224ed3..8944a844ca95 100644 |
903 | --- a/drivers/char/random.c |
904 | +++ b/drivers/char/random.c |
905 | @@ -803,13 +803,13 @@ static int crng_fast_load(const char *cp, size_t len) |
906 | p[crng_init_cnt % CHACHA20_KEY_SIZE] ^= *cp; |
907 | cp++; crng_init_cnt++; len--; |
908 | } |
909 | + spin_unlock_irqrestore(&primary_crng.lock, flags); |
910 | if (crng_init_cnt >= CRNG_INIT_CNT_THRESH) { |
911 | invalidate_batched_entropy(); |
912 | crng_init = 1; |
913 | wake_up_interruptible(&crng_init_wait); |
914 | pr_notice("random: fast init done\n"); |
915 | } |
916 | - spin_unlock_irqrestore(&primary_crng.lock, flags); |
917 | return 1; |
918 | } |
919 | |
920 | @@ -841,6 +841,7 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r) |
921 | } |
922 | memzero_explicit(&buf, sizeof(buf)); |
923 | crng->init_time = jiffies; |
924 | + spin_unlock_irqrestore(&primary_crng.lock, flags); |
925 | if (crng == &primary_crng && crng_init < 2) { |
926 | invalidate_batched_entropy(); |
927 | crng_init = 2; |
928 | @@ -848,7 +849,6 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r) |
929 | wake_up_interruptible(&crng_init_wait); |
930 | pr_notice("random: crng init done\n"); |
931 | } |
932 | - spin_unlock_irqrestore(&primary_crng.lock, flags); |
933 | } |
934 | |
935 | static inline void crng_wait_ready(void) |
936 | @@ -2037,8 +2037,8 @@ static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u64); |
937 | u64 get_random_u64(void) |
938 | { |
939 | u64 ret; |
940 | - bool use_lock = crng_init < 2; |
941 | - unsigned long flags; |
942 | + bool use_lock = READ_ONCE(crng_init) < 2; |
943 | + unsigned long flags = 0; |
944 | struct batched_entropy *batch; |
945 | |
946 | #if BITS_PER_LONG == 64 |
947 | @@ -2069,8 +2069,8 @@ static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u32); |
948 | u32 get_random_u32(void) |
949 | { |
950 | u32 ret; |
951 | - bool use_lock = crng_init < 2; |
952 | - unsigned long flags; |
953 | + bool use_lock = READ_ONCE(crng_init) < 2; |
954 | + unsigned long flags = 0; |
955 | struct batched_entropy *batch; |
956 | |
957 | if (arch_get_random_int(&ret)) |
958 | diff --git a/drivers/clk/sunxi-ng/ccu-sun5i.c b/drivers/clk/sunxi-ng/ccu-sun5i.c |
959 | index 06edaa523479..2999618e1a59 100644 |
960 | --- a/drivers/clk/sunxi-ng/ccu-sun5i.c |
961 | +++ b/drivers/clk/sunxi-ng/ccu-sun5i.c |
962 | @@ -243,7 +243,7 @@ static SUNXI_CCU_GATE(ahb_ss_clk, "ahb-ss", "ahb", |
963 | static SUNXI_CCU_GATE(ahb_dma_clk, "ahb-dma", "ahb", |
964 | 0x060, BIT(6), 0); |
965 | static SUNXI_CCU_GATE(ahb_bist_clk, "ahb-bist", "ahb", |
966 | - 0x060, BIT(6), 0); |
967 | + 0x060, BIT(7), 0); |
968 | static SUNXI_CCU_GATE(ahb_mmc0_clk, "ahb-mmc0", "ahb", |
969 | 0x060, BIT(8), 0); |
970 | static SUNXI_CCU_GATE(ahb_mmc1_clk, "ahb-mmc1", "ahb", |
971 | diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
972 | index 89e68d29bf45..df97e25aec76 100644 |
973 | --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
974 | +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
975 | @@ -556,7 +556,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(lcd0_ch1_clk, "lcd0-ch1", lcd_ch1_parents, |
976 | 0x12c, 0, 4, 24, 3, BIT(31), |
977 | CLK_SET_RATE_PARENT); |
978 | static SUNXI_CCU_M_WITH_MUX_GATE(lcd1_ch1_clk, "lcd1-ch1", lcd_ch1_parents, |
979 | - 0x12c, 0, 4, 24, 3, BIT(31), |
980 | + 0x130, 0, 4, 24, 3, BIT(31), |
981 | CLK_SET_RATE_PARENT); |
982 | |
983 | static const char * const csi_sclk_parents[] = { "pll-video0", "pll-video1", |
984 | diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
985 | index e58706b40ae9..6297add857b5 100644 |
986 | --- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
987 | +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
988 | @@ -537,7 +537,7 @@ static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { |
989 | [RST_BUS_EMAC] = { 0x2c0, BIT(17) }, |
990 | [RST_BUS_HSTIMER] = { 0x2c0, BIT(19) }, |
991 | [RST_BUS_SPI0] = { 0x2c0, BIT(20) }, |
992 | - [RST_BUS_OTG] = { 0x2c0, BIT(23) }, |
993 | + [RST_BUS_OTG] = { 0x2c0, BIT(24) }, |
994 | [RST_BUS_EHCI0] = { 0x2c0, BIT(26) }, |
995 | [RST_BUS_OHCI0] = { 0x2c0, BIT(29) }, |
996 | |
997 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
998 | index 56a86dd5789e..2de6475a684e 100644 |
999 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
1000 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c |
1001 | @@ -693,6 +693,10 @@ int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev) |
1002 | DRM_INFO("Changing default dispclk from %dMhz to 600Mhz\n", |
1003 | adev->clock.default_dispclk / 100); |
1004 | adev->clock.default_dispclk = 60000; |
1005 | + } else if (adev->clock.default_dispclk <= 60000) { |
1006 | + DRM_INFO("Changing default dispclk from %dMhz to 625Mhz\n", |
1007 | + adev->clock.default_dispclk / 100); |
1008 | + adev->clock.default_dispclk = 62500; |
1009 | } |
1010 | adev->clock.dp_extclk = |
1011 | le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); |
1012 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
1013 | index b76cd699eb0d..b1f02277be79 100644 |
1014 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
1015 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
1016 | @@ -422,6 +422,7 @@ static const struct pci_device_id pciidlist[] = { |
1017 | {0x1002, 0x6986, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, |
1018 | {0x1002, 0x6987, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, |
1019 | {0x1002, 0x6995, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, |
1020 | + {0x1002, 0x6997, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, |
1021 | {0x1002, 0x699F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS12}, |
1022 | |
1023 | {0, 0, 0} |
1024 | diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c b/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c |
1025 | index 8c9bc75a9c2d..8a0818b23ea4 100644 |
1026 | --- a/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c |
1027 | +++ b/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c |
1028 | @@ -165,7 +165,7 @@ void amdgpu_atombios_crtc_powergate(struct drm_crtc *crtc, int state) |
1029 | struct drm_device *dev = crtc->dev; |
1030 | struct amdgpu_device *adev = dev->dev_private; |
1031 | int index = GetIndexIntoMasterTable(COMMAND, EnableDispPowerGating); |
1032 | - ENABLE_DISP_POWER_GATING_PARAMETERS_V2_1 args; |
1033 | + ENABLE_DISP_POWER_GATING_PS_ALLOCATION args; |
1034 | |
1035 | memset(&args, 0, sizeof(args)); |
1036 | |
1037 | @@ -178,7 +178,7 @@ void amdgpu_atombios_crtc_powergate(struct drm_crtc *crtc, int state) |
1038 | void amdgpu_atombios_crtc_powergate_init(struct amdgpu_device *adev) |
1039 | { |
1040 | int index = GetIndexIntoMasterTable(COMMAND, EnableDispPowerGating); |
1041 | - ENABLE_DISP_POWER_GATING_PARAMETERS_V2_1 args; |
1042 | + ENABLE_DISP_POWER_GATING_PS_ALLOCATION args; |
1043 | |
1044 | memset(&args, 0, sizeof(args)); |
1045 | |
1046 | diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c |
1047 | index 45464c8b797d..2a6059ce3842 100644 |
1048 | --- a/drivers/gpu/drm/drm_connector.c |
1049 | +++ b/drivers/gpu/drm/drm_connector.c |
1050 | @@ -1169,21 +1169,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, |
1051 | if (!connector) |
1052 | return -ENOENT; |
1053 | |
1054 | - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
1055 | - encoder = drm_connector_get_encoder(connector); |
1056 | - if (encoder) |
1057 | - out_resp->encoder_id = encoder->base.id; |
1058 | - else |
1059 | - out_resp->encoder_id = 0; |
1060 | - |
1061 | - ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, |
1062 | - (uint32_t __user *)(unsigned long)(out_resp->props_ptr), |
1063 | - (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), |
1064 | - &out_resp->count_props); |
1065 | - drm_modeset_unlock(&dev->mode_config.connection_mutex); |
1066 | - if (ret) |
1067 | - goto out_unref; |
1068 | - |
1069 | for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) |
1070 | if (connector->encoder_ids[i] != 0) |
1071 | encoders_count++; |
1072 | @@ -1196,7 +1181,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, |
1073 | if (put_user(connector->encoder_ids[i], |
1074 | encoder_ptr + copied)) { |
1075 | ret = -EFAULT; |
1076 | - goto out_unref; |
1077 | + goto out; |
1078 | } |
1079 | copied++; |
1080 | } |
1081 | @@ -1240,15 +1225,32 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, |
1082 | if (copy_to_user(mode_ptr + copied, |
1083 | &u_mode, sizeof(u_mode))) { |
1084 | ret = -EFAULT; |
1085 | + mutex_unlock(&dev->mode_config.mutex); |
1086 | + |
1087 | goto out; |
1088 | } |
1089 | copied++; |
1090 | } |
1091 | } |
1092 | out_resp->count_modes = mode_count; |
1093 | -out: |
1094 | mutex_unlock(&dev->mode_config.mutex); |
1095 | -out_unref: |
1096 | + |
1097 | + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); |
1098 | + encoder = drm_connector_get_encoder(connector); |
1099 | + if (encoder) |
1100 | + out_resp->encoder_id = encoder->base.id; |
1101 | + else |
1102 | + out_resp->encoder_id = 0; |
1103 | + |
1104 | + /* Only grab properties after probing, to make sure EDID and other |
1105 | + * properties reflect the latest status. */ |
1106 | + ret = drm_mode_object_get_properties(&connector->base, file_priv->atomic, |
1107 | + (uint32_t __user *)(unsigned long)(out_resp->props_ptr), |
1108 | + (uint64_t __user *)(unsigned long)(out_resp->prop_values_ptr), |
1109 | + &out_resp->count_props); |
1110 | + drm_modeset_unlock(&dev->mode_config.connection_mutex); |
1111 | + |
1112 | +out: |
1113 | drm_connector_unreference(connector); |
1114 | |
1115 | return ret; |
1116 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
1117 | index 432480ff9d22..3178ba0c537c 100644 |
1118 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
1119 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
1120 | @@ -3393,6 +3393,13 @@ void radeon_combios_asic_init(struct drm_device *dev) |
1121 | rdev->pdev->subsystem_vendor == 0x103c && |
1122 | rdev->pdev->subsystem_device == 0x280a) |
1123 | return; |
1124 | + /* quirk for rs4xx Toshiba Sattellite L20-183 latop to make it resume |
1125 | + * - it hangs on resume inside the dynclk 1 table. |
1126 | + */ |
1127 | + if (rdev->family == CHIP_RS400 && |
1128 | + rdev->pdev->subsystem_vendor == 0x1179 && |
1129 | + rdev->pdev->subsystem_device == 0xff31) |
1130 | + return; |
1131 | |
1132 | /* DYN CLK 1 */ |
1133 | table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); |
1134 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
1135 | index 4b0c388be3f5..5cdc39125b42 100644 |
1136 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
1137 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
1138 | @@ -136,6 +136,10 @@ static struct radeon_px_quirk radeon_px_quirk_list[] = { |
1139 | * https://bugzilla.kernel.org/show_bug.cgi?id=51381 |
1140 | */ |
1141 | { PCI_VENDOR_ID_ATI, 0x6840, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX }, |
1142 | + /* Asus K53TK laptop with AMD A6-3420M APU and Radeon 7670m GPU |
1143 | + * https://bugs.freedesktop.org/show_bug.cgi?id=101491 |
1144 | + */ |
1145 | + { PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX }, |
1146 | /* macbook pro 8.2 */ |
1147 | { PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP }, |
1148 | { 0, 0, 0, 0, 0 }, |
1149 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
1150 | index b26c030926c1..d3793867adae 100644 |
1151 | --- a/drivers/hid/hid-ids.h |
1152 | +++ b/drivers/hid/hid-ids.h |
1153 | @@ -315,6 +315,9 @@ |
1154 | #define USB_VENDOR_ID_DELCOM 0x0fc5 |
1155 | #define USB_DEVICE_ID_DELCOM_VISUAL_IND 0xb080 |
1156 | |
1157 | +#define USB_VENDOR_ID_DELL 0x413c |
1158 | +#define USB_DEVICE_ID_DELL_PIXART_USB_OPTICAL_MOUSE 0x301a |
1159 | + |
1160 | #define USB_VENDOR_ID_DELORME 0x1163 |
1161 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 |
1162 | #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 |
1163 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c |
1164 | index a69a3c88ab29..9f9eb32ab7db 100644 |
1165 | --- a/drivers/hid/usbhid/hid-quirks.c |
1166 | +++ b/drivers/hid/usbhid/hid-quirks.c |
1167 | @@ -84,6 +84,7 @@ static const struct hid_blacklist { |
1168 | { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE, HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL }, |
1169 | { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB, HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL }, |
1170 | { USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51, HID_QUIRK_NOGET }, |
1171 | + { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, |
1172 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
1173 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT }, |
1174 | { USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3, HID_QUIRK_MULTI_INPUT }, |
1175 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
1176 | index 09720d950686..f932a83b4990 100644 |
1177 | --- a/drivers/input/serio/i8042-x86ia64io.h |
1178 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
1179 | @@ -723,6 +723,13 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { |
1180 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), |
1181 | }, |
1182 | }, |
1183 | + { |
1184 | + /* Fujitsu UH554 laptop */ |
1185 | + .matches = { |
1186 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
1187 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"), |
1188 | + }, |
1189 | + }, |
1190 | { } |
1191 | }; |
1192 | |
1193 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1194 | index 012194bc92d3..1238c4ec5215 100644 |
1195 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1196 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c |
1197 | @@ -2192,9 +2192,10 @@ static int cxgb_up(struct adapter *adap) |
1198 | { |
1199 | int err; |
1200 | |
1201 | + mutex_lock(&uld_mutex); |
1202 | err = setup_sge_queues(adap); |
1203 | if (err) |
1204 | - goto out; |
1205 | + goto rel_lock; |
1206 | err = setup_rss(adap); |
1207 | if (err) |
1208 | goto freeq; |
1209 | @@ -2218,7 +2219,6 @@ static int cxgb_up(struct adapter *adap) |
1210 | goto irq_err; |
1211 | } |
1212 | |
1213 | - mutex_lock(&uld_mutex); |
1214 | enable_rx(adap); |
1215 | t4_sge_start(adap); |
1216 | t4_intr_enable(adap); |
1217 | @@ -2231,13 +2231,15 @@ static int cxgb_up(struct adapter *adap) |
1218 | #endif |
1219 | /* Initialize hash mac addr list*/ |
1220 | INIT_LIST_HEAD(&adap->mac_hlist); |
1221 | - out: |
1222 | return err; |
1223 | + |
1224 | irq_err: |
1225 | dev_err(adap->pdev_dev, "request_irq failed, err %d\n", err); |
1226 | freeq: |
1227 | t4_free_sge_resources(adap); |
1228 | - goto out; |
1229 | + rel_lock: |
1230 | + mutex_unlock(&uld_mutex); |
1231 | + return err; |
1232 | } |
1233 | |
1234 | static void cxgb_down(struct adapter *adapter) |
1235 | diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c |
1236 | index 9097e42bec2e..57297ba23987 100644 |
1237 | --- a/drivers/net/phy/marvell.c |
1238 | +++ b/drivers/net/phy/marvell.c |
1239 | @@ -1127,8 +1127,6 @@ static int marvell_read_status_page(struct phy_device *phydev, int page) |
1240 | if (adv < 0) |
1241 | return adv; |
1242 | |
1243 | - lpa &= adv; |
1244 | - |
1245 | if (status & MII_M1011_PHY_STATUS_FULLDUPLEX) |
1246 | phydev->duplex = DUPLEX_FULL; |
1247 | else |
1248 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c |
1249 | index c7c1e9906500..d231042f19d6 100644 |
1250 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c |
1251 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c |
1252 | @@ -442,7 +442,7 @@ struct brcmf_fw { |
1253 | const char *nvram_name; |
1254 | u16 domain_nr; |
1255 | u16 bus_nr; |
1256 | - void (*done)(struct device *dev, const struct firmware *fw, |
1257 | + void (*done)(struct device *dev, int err, const struct firmware *fw, |
1258 | void *nvram_image, u32 nvram_len); |
1259 | }; |
1260 | |
1261 | @@ -477,52 +477,51 @@ static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) |
1262 | if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL)) |
1263 | goto fail; |
1264 | |
1265 | - fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); |
1266 | + fwctx->done(fwctx->dev, 0, fwctx->code, nvram, nvram_length); |
1267 | kfree(fwctx); |
1268 | return; |
1269 | |
1270 | fail: |
1271 | brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); |
1272 | release_firmware(fwctx->code); |
1273 | - device_release_driver(fwctx->dev); |
1274 | + fwctx->done(fwctx->dev, -ENOENT, NULL, NULL, 0); |
1275 | kfree(fwctx); |
1276 | } |
1277 | |
1278 | static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx) |
1279 | { |
1280 | struct brcmf_fw *fwctx = ctx; |
1281 | - int ret; |
1282 | + int ret = 0; |
1283 | |
1284 | brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev)); |
1285 | - if (!fw) |
1286 | + if (!fw) { |
1287 | + ret = -ENOENT; |
1288 | goto fail; |
1289 | - |
1290 | - /* only requested code so done here */ |
1291 | - if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { |
1292 | - fwctx->done(fwctx->dev, fw, NULL, 0); |
1293 | - kfree(fwctx); |
1294 | - return; |
1295 | } |
1296 | + /* only requested code so done here */ |
1297 | + if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) |
1298 | + goto done; |
1299 | + |
1300 | fwctx->code = fw; |
1301 | ret = request_firmware_nowait(THIS_MODULE, true, fwctx->nvram_name, |
1302 | fwctx->dev, GFP_KERNEL, fwctx, |
1303 | brcmf_fw_request_nvram_done); |
1304 | |
1305 | - if (!ret) |
1306 | - return; |
1307 | - |
1308 | - brcmf_fw_request_nvram_done(NULL, fwctx); |
1309 | + /* pass NULL to nvram callback for bcm47xx fallback */ |
1310 | + if (ret) |
1311 | + brcmf_fw_request_nvram_done(NULL, fwctx); |
1312 | return; |
1313 | |
1314 | fail: |
1315 | brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); |
1316 | - device_release_driver(fwctx->dev); |
1317 | +done: |
1318 | + fwctx->done(fwctx->dev, ret, fw, NULL, 0); |
1319 | kfree(fwctx); |
1320 | } |
1321 | |
1322 | int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags, |
1323 | const char *code, const char *nvram, |
1324 | - void (*fw_cb)(struct device *dev, |
1325 | + void (*fw_cb)(struct device *dev, int err, |
1326 | const struct firmware *fw, |
1327 | void *nvram_image, u32 nvram_len), |
1328 | u16 domain_nr, u16 bus_nr) |
1329 | @@ -555,7 +554,7 @@ int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags, |
1330 | |
1331 | int brcmf_fw_get_firmwares(struct device *dev, u16 flags, |
1332 | const char *code, const char *nvram, |
1333 | - void (*fw_cb)(struct device *dev, |
1334 | + void (*fw_cb)(struct device *dev, int err, |
1335 | const struct firmware *fw, |
1336 | void *nvram_image, u32 nvram_len)) |
1337 | { |
1338 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h |
1339 | index d3c9f0d52ae3..8fa4b7e1ab3d 100644 |
1340 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h |
1341 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h |
1342 | @@ -73,13 +73,13 @@ void brcmf_fw_nvram_free(void *nvram); |
1343 | */ |
1344 | int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags, |
1345 | const char *code, const char *nvram, |
1346 | - void (*fw_cb)(struct device *dev, |
1347 | + void (*fw_cb)(struct device *dev, int err, |
1348 | const struct firmware *fw, |
1349 | void *nvram_image, u32 nvram_len), |
1350 | u16 domain_nr, u16 bus_nr); |
1351 | int brcmf_fw_get_firmwares(struct device *dev, u16 flags, |
1352 | const char *code, const char *nvram, |
1353 | - void (*fw_cb)(struct device *dev, |
1354 | + void (*fw_cb)(struct device *dev, int err, |
1355 | const struct firmware *fw, |
1356 | void *nvram_image, u32 nvram_len)); |
1357 | |
1358 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
1359 | index 6fae4cf3f6ab..42c081d9fb9a 100644 |
1360 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
1361 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
1362 | @@ -1650,16 +1650,23 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { |
1363 | .write32 = brcmf_pcie_buscore_write32, |
1364 | }; |
1365 | |
1366 | -static void brcmf_pcie_setup(struct device *dev, const struct firmware *fw, |
1367 | +static void brcmf_pcie_setup(struct device *dev, int ret, |
1368 | + const struct firmware *fw, |
1369 | void *nvram, u32 nvram_len) |
1370 | { |
1371 | - struct brcmf_bus *bus = dev_get_drvdata(dev); |
1372 | - struct brcmf_pciedev *pcie_bus_dev = bus->bus_priv.pcie; |
1373 | - struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo; |
1374 | + struct brcmf_bus *bus; |
1375 | + struct brcmf_pciedev *pcie_bus_dev; |
1376 | + struct brcmf_pciedev_info *devinfo; |
1377 | struct brcmf_commonring **flowrings; |
1378 | - int ret; |
1379 | u32 i; |
1380 | |
1381 | + /* check firmware loading result */ |
1382 | + if (ret) |
1383 | + goto fail; |
1384 | + |
1385 | + bus = dev_get_drvdata(dev); |
1386 | + pcie_bus_dev = bus->bus_priv.pcie; |
1387 | + devinfo = pcie_bus_dev->devinfo; |
1388 | brcmf_pcie_attach(devinfo); |
1389 | |
1390 | /* Some of the firmwares have the size of the memory of the device |
1391 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
1392 | index 65689469c5a1..67bff5b8cd60 100644 |
1393 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
1394 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |
1395 | @@ -3976,21 +3976,26 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { |
1396 | .get_memdump = brcmf_sdio_bus_get_memdump, |
1397 | }; |
1398 | |
1399 | -static void brcmf_sdio_firmware_callback(struct device *dev, |
1400 | +static void brcmf_sdio_firmware_callback(struct device *dev, int err, |
1401 | const struct firmware *code, |
1402 | void *nvram, u32 nvram_len) |
1403 | { |
1404 | - struct brcmf_bus *bus_if = dev_get_drvdata(dev); |
1405 | - struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; |
1406 | - struct brcmf_sdio *bus = sdiodev->bus; |
1407 | - int err = 0; |
1408 | + struct brcmf_bus *bus_if; |
1409 | + struct brcmf_sdio_dev *sdiodev; |
1410 | + struct brcmf_sdio *bus; |
1411 | u8 saveclk; |
1412 | |
1413 | - brcmf_dbg(TRACE, "Enter: dev=%s\n", dev_name(dev)); |
1414 | + brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err); |
1415 | + bus_if = dev_get_drvdata(dev); |
1416 | + sdiodev = bus_if->bus_priv.sdio; |
1417 | + if (err) |
1418 | + goto fail; |
1419 | |
1420 | if (!bus_if->drvr) |
1421 | return; |
1422 | |
1423 | + bus = sdiodev->bus; |
1424 | + |
1425 | /* try to download image and nvram to the dongle */ |
1426 | bus->alp_only = true; |
1427 | err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len); |
1428 | @@ -4077,6 +4082,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, |
1429 | fail: |
1430 | brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err); |
1431 | device_release_driver(dev); |
1432 | + device_release_driver(&sdiodev->func[2]->dev); |
1433 | } |
1434 | |
1435 | struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) |
1436 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
1437 | index d93ebbdc7737..1242c3f05aad 100644 |
1438 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
1439 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
1440 | @@ -1158,17 +1158,18 @@ static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo) |
1441 | return ret; |
1442 | } |
1443 | |
1444 | -static void brcmf_usb_probe_phase2(struct device *dev, |
1445 | +static void brcmf_usb_probe_phase2(struct device *dev, int ret, |
1446 | const struct firmware *fw, |
1447 | void *nvram, u32 nvlen) |
1448 | { |
1449 | struct brcmf_bus *bus = dev_get_drvdata(dev); |
1450 | - struct brcmf_usbdev_info *devinfo; |
1451 | - int ret; |
1452 | + struct brcmf_usbdev_info *devinfo = bus->bus_priv.usb->devinfo; |
1453 | + |
1454 | + if (ret) |
1455 | + goto error; |
1456 | |
1457 | brcmf_dbg(USB, "Start fw downloading\n"); |
1458 | |
1459 | - devinfo = bus->bus_priv.usb->devinfo; |
1460 | ret = check_file(fw->data); |
1461 | if (ret < 0) { |
1462 | brcmf_err("invalid firmware\n"); |
1463 | diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
1464 | index 90b5b2efafbf..b4a8bb7759b2 100644 |
1465 | --- a/drivers/spi/spi.c |
1466 | +++ b/drivers/spi/spi.c |
1467 | @@ -1015,7 +1015,7 @@ static int spi_transfer_one_message(struct spi_master *master, |
1468 | ret = 0; |
1469 | ms = 8LL * 1000LL * xfer->len; |
1470 | do_div(ms, xfer->speed_hz); |
1471 | - ms += ms + 100; /* some tolerance */ |
1472 | + ms += ms + 200; /* some tolerance */ |
1473 | |
1474 | if (ms > UINT_MAX) |
1475 | ms = UINT_MAX; |
1476 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
1477 | index fd45b48480cb..86433ef7f953 100644 |
1478 | --- a/drivers/target/iscsi/iscsi_target.c |
1479 | +++ b/drivers/target/iscsi/iscsi_target.c |
1480 | @@ -1289,6 +1289,18 @@ iscsit_get_immediate_data(struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr, |
1481 | */ |
1482 | if (dump_payload) |
1483 | goto after_immediate_data; |
1484 | + /* |
1485 | + * Check for underflow case where both EDTL and immediate data payload |
1486 | + * exceeds what is presented by CDB's TRANSFER LENGTH, and what has |
1487 | + * already been set in target_cmd_size_check() as se_cmd->data_length. |
1488 | + * |
1489 | + * For this special case, fail the command and dump the immediate data |
1490 | + * payload. |
1491 | + */ |
1492 | + if (cmd->first_burst_len > cmd->se_cmd.data_length) { |
1493 | + cmd->sense_reason = TCM_INVALID_CDB_FIELD; |
1494 | + goto after_immediate_data; |
1495 | + } |
1496 | |
1497 | immed_ret = iscsit_handle_immediate_data(cmd, hdr, |
1498 | cmd->first_burst_len); |
1499 | @@ -4443,8 +4455,11 @@ static void iscsit_logout_post_handler_closesession( |
1500 | * always sleep waiting for RX/TX thread shutdown to complete |
1501 | * within iscsit_close_connection(). |
1502 | */ |
1503 | - if (!conn->conn_transport->rdma_shutdown) |
1504 | + if (!conn->conn_transport->rdma_shutdown) { |
1505 | sleep = cmpxchg(&conn->tx_thread_active, true, false); |
1506 | + if (!sleep) |
1507 | + return; |
1508 | + } |
1509 | |
1510 | atomic_set(&conn->conn_logout_remove, 0); |
1511 | complete(&conn->conn_logout_comp); |
1512 | @@ -4460,8 +4475,11 @@ static void iscsit_logout_post_handler_samecid( |
1513 | { |
1514 | int sleep = 1; |
1515 | |
1516 | - if (!conn->conn_transport->rdma_shutdown) |
1517 | + if (!conn->conn_transport->rdma_shutdown) { |
1518 | sleep = cmpxchg(&conn->tx_thread_active, true, false); |
1519 | + if (!sleep) |
1520 | + return; |
1521 | + } |
1522 | |
1523 | atomic_set(&conn->conn_logout_remove, 0); |
1524 | complete(&conn->conn_logout_comp); |
1525 | diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h |
1526 | index 9ab7090f7c83..0912de7c0cf8 100644 |
1527 | --- a/drivers/target/target_core_internal.h |
1528 | +++ b/drivers/target/target_core_internal.h |
1529 | @@ -136,7 +136,7 @@ int init_se_kmem_caches(void); |
1530 | void release_se_kmem_caches(void); |
1531 | u32 scsi_get_new_index(scsi_index_t); |
1532 | void transport_subsystem_check_init(void); |
1533 | -void transport_cmd_finish_abort(struct se_cmd *, int); |
1534 | +int transport_cmd_finish_abort(struct se_cmd *, int); |
1535 | unsigned char *transport_dump_cmd_direction(struct se_cmd *); |
1536 | void transport_dump_dev_state(struct se_device *, char *, int *); |
1537 | void transport_dump_dev_info(struct se_device *, struct se_lun *, |
1538 | diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c |
1539 | index dce1e1b47316..13f47bf4d16b 100644 |
1540 | --- a/drivers/target/target_core_tmr.c |
1541 | +++ b/drivers/target/target_core_tmr.c |
1542 | @@ -75,7 +75,7 @@ void core_tmr_release_req(struct se_tmr_req *tmr) |
1543 | kfree(tmr); |
1544 | } |
1545 | |
1546 | -static void core_tmr_handle_tas_abort(struct se_cmd *cmd, int tas) |
1547 | +static int core_tmr_handle_tas_abort(struct se_cmd *cmd, int tas) |
1548 | { |
1549 | unsigned long flags; |
1550 | bool remove = true, send_tas; |
1551 | @@ -91,7 +91,7 @@ static void core_tmr_handle_tas_abort(struct se_cmd *cmd, int tas) |
1552 | transport_send_task_abort(cmd); |
1553 | } |
1554 | |
1555 | - transport_cmd_finish_abort(cmd, remove); |
1556 | + return transport_cmd_finish_abort(cmd, remove); |
1557 | } |
1558 | |
1559 | static int target_check_cdb_and_preempt(struct list_head *list, |
1560 | @@ -184,8 +184,8 @@ void core_tmr_abort_task( |
1561 | cancel_work_sync(&se_cmd->work); |
1562 | transport_wait_for_tasks(se_cmd); |
1563 | |
1564 | - transport_cmd_finish_abort(se_cmd, true); |
1565 | - target_put_sess_cmd(se_cmd); |
1566 | + if (!transport_cmd_finish_abort(se_cmd, true)) |
1567 | + target_put_sess_cmd(se_cmd); |
1568 | |
1569 | printk("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for" |
1570 | " ref_tag: %llu\n", ref_tag); |
1571 | @@ -281,8 +281,8 @@ static void core_tmr_drain_tmr_list( |
1572 | cancel_work_sync(&cmd->work); |
1573 | transport_wait_for_tasks(cmd); |
1574 | |
1575 | - transport_cmd_finish_abort(cmd, 1); |
1576 | - target_put_sess_cmd(cmd); |
1577 | + if (!transport_cmd_finish_abort(cmd, 1)) |
1578 | + target_put_sess_cmd(cmd); |
1579 | } |
1580 | } |
1581 | |
1582 | @@ -380,8 +380,8 @@ static void core_tmr_drain_state_list( |
1583 | cancel_work_sync(&cmd->work); |
1584 | transport_wait_for_tasks(cmd); |
1585 | |
1586 | - core_tmr_handle_tas_abort(cmd, tas); |
1587 | - target_put_sess_cmd(cmd); |
1588 | + if (!core_tmr_handle_tas_abort(cmd, tas)) |
1589 | + target_put_sess_cmd(cmd); |
1590 | } |
1591 | } |
1592 | |
1593 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
1594 | index ff26626d94ef..690c790431dd 100644 |
1595 | --- a/drivers/target/target_core_transport.c |
1596 | +++ b/drivers/target/target_core_transport.c |
1597 | @@ -651,9 +651,10 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd) |
1598 | percpu_ref_put(&lun->lun_ref); |
1599 | } |
1600 | |
1601 | -void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) |
1602 | +int transport_cmd_finish_abort(struct se_cmd *cmd, int remove) |
1603 | { |
1604 | bool ack_kref = (cmd->se_cmd_flags & SCF_ACK_KREF); |
1605 | + int ret = 0; |
1606 | |
1607 | if (cmd->se_cmd_flags & SCF_SE_LUN_CMD) |
1608 | transport_lun_remove_cmd(cmd); |
1609 | @@ -665,9 +666,11 @@ void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) |
1610 | cmd->se_tfo->aborted_task(cmd); |
1611 | |
1612 | if (transport_cmd_check_stop_to_fabric(cmd)) |
1613 | - return; |
1614 | + return 1; |
1615 | if (remove && ack_kref) |
1616 | - transport_put_cmd(cmd); |
1617 | + ret = transport_put_cmd(cmd); |
1618 | + |
1619 | + return ret; |
1620 | } |
1621 | |
1622 | static void target_complete_failure_work(struct work_struct *work) |
1623 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
1624 | index a0085571824d..4c32c96f9c90 100644 |
1625 | --- a/drivers/usb/gadget/function/f_fs.c |
1626 | +++ b/drivers/usb/gadget/function/f_fs.c |
1627 | @@ -1859,12 +1859,12 @@ static int ffs_func_eps_enable(struct ffs_function *func) |
1628 | ep->ep->driver_data = ep; |
1629 | ep->ep->desc = ds; |
1630 | |
1631 | - comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + |
1632 | - USB_DT_ENDPOINT_SIZE); |
1633 | - ep->ep->maxburst = comp_desc->bMaxBurst + 1; |
1634 | - |
1635 | - if (needs_comp_desc) |
1636 | + if (needs_comp_desc) { |
1637 | + comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + |
1638 | + USB_DT_ENDPOINT_SIZE); |
1639 | + ep->ep->maxburst = comp_desc->bMaxBurst + 1; |
1640 | ep->ep->comp_desc = comp_desc; |
1641 | + } |
1642 | |
1643 | ret = usb_ep_enable(ep->ep); |
1644 | if (likely(!ret)) { |
1645 | diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c |
1646 | index 734cbf8d9676..dd9f1bebb5a3 100644 |
1647 | --- a/fs/autofs4/dev-ioctl.c |
1648 | +++ b/fs/autofs4/dev-ioctl.c |
1649 | @@ -344,7 +344,7 @@ static int autofs_dev_ioctl_fail(struct file *fp, |
1650 | int status; |
1651 | |
1652 | token = (autofs_wqt_t) param->fail.token; |
1653 | - status = param->fail.status ? param->fail.status : -ENOENT; |
1654 | + status = param->fail.status < 0 ? param->fail.status : -ENOENT; |
1655 | return autofs4_wait_release(sbi, token, status); |
1656 | } |
1657 | |
1658 | diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c |
1659 | index 27bc360c7ffd..a723df3e0197 100644 |
1660 | --- a/fs/cifs/smb1ops.c |
1661 | +++ b/fs/cifs/smb1ops.c |
1662 | @@ -849,8 +849,13 @@ cifs_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, |
1663 | struct cifs_fid *fid, __u16 search_flags, |
1664 | struct cifs_search_info *srch_inf) |
1665 | { |
1666 | - return CIFSFindFirst(xid, tcon, path, cifs_sb, |
1667 | - &fid->netfid, search_flags, srch_inf, true); |
1668 | + int rc; |
1669 | + |
1670 | + rc = CIFSFindFirst(xid, tcon, path, cifs_sb, |
1671 | + &fid->netfid, search_flags, srch_inf, true); |
1672 | + if (rc) |
1673 | + cifs_dbg(FYI, "find first failed=%d\n", rc); |
1674 | + return rc; |
1675 | } |
1676 | |
1677 | static int |
1678 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
1679 | index c58691834eb2..7e48561abd29 100644 |
1680 | --- a/fs/cifs/smb2ops.c |
1681 | +++ b/fs/cifs/smb2ops.c |
1682 | @@ -982,7 +982,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, |
1683 | rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL); |
1684 | kfree(utf16_path); |
1685 | if (rc) { |
1686 | - cifs_dbg(VFS, "open dir failed\n"); |
1687 | + cifs_dbg(FYI, "open dir failed rc=%d\n", rc); |
1688 | return rc; |
1689 | } |
1690 | |
1691 | @@ -992,7 +992,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, |
1692 | rc = SMB2_query_directory(xid, tcon, fid->persistent_fid, |
1693 | fid->volatile_fid, 0, srch_inf); |
1694 | if (rc) { |
1695 | - cifs_dbg(VFS, "query directory failed\n"); |
1696 | + cifs_dbg(FYI, "query directory failed rc=%d\n", rc); |
1697 | SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); |
1698 | } |
1699 | return rc; |
1700 | @@ -1809,7 +1809,8 @@ crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc) |
1701 | |
1702 | sg = init_sg(rqst, sign); |
1703 | if (!sg) { |
1704 | - cifs_dbg(VFS, "%s: Failed to init sg %d", __func__, rc); |
1705 | + cifs_dbg(VFS, "%s: Failed to init sg", __func__); |
1706 | + rc = -ENOMEM; |
1707 | goto free_req; |
1708 | } |
1709 | |
1710 | @@ -1817,6 +1818,7 @@ crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc) |
1711 | iv = kzalloc(iv_len, GFP_KERNEL); |
1712 | if (!iv) { |
1713 | cifs_dbg(VFS, "%s: Failed to alloc IV", __func__); |
1714 | + rc = -ENOMEM; |
1715 | goto free_sg; |
1716 | } |
1717 | iv[0] = 3; |
1718 | diff --git a/fs/dax.c b/fs/dax.c |
1719 | index 285f4ab6f498..08a793c61580 100644 |
1720 | --- a/fs/dax.c |
1721 | +++ b/fs/dax.c |
1722 | @@ -875,6 +875,7 @@ int dax_writeback_mapping_range(struct address_space *mapping, |
1723 | if (ret < 0) |
1724 | return ret; |
1725 | } |
1726 | + start_index = indices[pvec.nr - 1] + 1; |
1727 | } |
1728 | return 0; |
1729 | } |
1730 | diff --git a/fs/exec.c b/fs/exec.c |
1731 | index 65145a3df065..ce0901e65c40 100644 |
1732 | --- a/fs/exec.c |
1733 | +++ b/fs/exec.c |
1734 | @@ -220,8 +220,26 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, |
1735 | |
1736 | if (write) { |
1737 | unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start; |
1738 | + unsigned long ptr_size; |
1739 | struct rlimit *rlim; |
1740 | |
1741 | + /* |
1742 | + * Since the stack will hold pointers to the strings, we |
1743 | + * must account for them as well. |
1744 | + * |
1745 | + * The size calculation is the entire vma while each arg page is |
1746 | + * built, so each time we get here it's calculating how far it |
1747 | + * is currently (rather than each call being just the newly |
1748 | + * added size from the arg page). As a result, we need to |
1749 | + * always add the entire size of the pointers, so that on the |
1750 | + * last call to get_arg_page() we'll actually have the entire |
1751 | + * correct size. |
1752 | + */ |
1753 | + ptr_size = (bprm->argc + bprm->envc) * sizeof(void *); |
1754 | + if (ptr_size > ULONG_MAX - size) |
1755 | + goto fail; |
1756 | + size += ptr_size; |
1757 | + |
1758 | acct_arg_size(bprm, size / PAGE_SIZE); |
1759 | |
1760 | /* |
1761 | @@ -239,13 +257,15 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, |
1762 | * to work from. |
1763 | */ |
1764 | rlim = current->signal->rlim; |
1765 | - if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur) / 4) { |
1766 | - put_page(page); |
1767 | - return NULL; |
1768 | - } |
1769 | + if (size > READ_ONCE(rlim[RLIMIT_STACK].rlim_cur) / 4) |
1770 | + goto fail; |
1771 | } |
1772 | |
1773 | return page; |
1774 | + |
1775 | +fail: |
1776 | + put_page(page); |
1777 | + return NULL; |
1778 | } |
1779 | |
1780 | static void put_arg_page(struct page *page) |
1781 | diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h |
1782 | index ef0ae8aaa567..94f18da4be87 100644 |
1783 | --- a/include/acpi/acpi_bus.h |
1784 | +++ b/include/acpi/acpi_bus.h |
1785 | @@ -209,7 +209,8 @@ struct acpi_device_flags { |
1786 | u32 of_compatible_ok:1; |
1787 | u32 coherent_dma:1; |
1788 | u32 cca_seen:1; |
1789 | - u32 reserved:20; |
1790 | + u32 spi_i2c_slave:1; |
1791 | + u32 reserved:19; |
1792 | }; |
1793 | |
1794 | /* File System */ |
1795 | diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h |
1796 | index be378cf47fcc..b3044c2c62cb 100644 |
1797 | --- a/include/linux/netfilter/x_tables.h |
1798 | +++ b/include/linux/netfilter/x_tables.h |
1799 | @@ -294,7 +294,7 @@ int xt_match_to_user(const struct xt_entry_match *m, |
1800 | int xt_target_to_user(const struct xt_entry_target *t, |
1801 | struct xt_entry_target __user *u); |
1802 | int xt_data_to_user(void __user *dst, const void *src, |
1803 | - int usersize, int size); |
1804 | + int usersize, int size, int aligned_size); |
1805 | |
1806 | void *xt_copy_counters_from_user(const void __user *user, unsigned int len, |
1807 | struct xt_counters_info *info, bool compat); |
1808 | diff --git a/include/linux/timekeeper_internal.h b/include/linux/timekeeper_internal.h |
1809 | index 110f4532188c..f7043ccca81c 100644 |
1810 | --- a/include/linux/timekeeper_internal.h |
1811 | +++ b/include/linux/timekeeper_internal.h |
1812 | @@ -29,7 +29,6 @@ |
1813 | */ |
1814 | struct tk_read_base { |
1815 | struct clocksource *clock; |
1816 | - u64 (*read)(struct clocksource *cs); |
1817 | u64 mask; |
1818 | u64 cycle_last; |
1819 | u32 mult; |
1820 | @@ -58,7 +57,7 @@ struct tk_read_base { |
1821 | * interval. |
1822 | * @xtime_remainder: Shifted nano seconds left over when rounding |
1823 | * @cycle_interval |
1824 | - * @raw_interval: Raw nano seconds accumulated per NTP interval. |
1825 | + * @raw_interval: Shifted raw nano seconds accumulated per NTP interval. |
1826 | * @ntp_error: Difference between accumulated time and NTP time in ntp |
1827 | * shifted nano seconds. |
1828 | * @ntp_error_shift: Shift conversion between clock shifted nano seconds and |
1829 | @@ -100,7 +99,7 @@ struct timekeeper { |
1830 | u64 cycle_interval; |
1831 | u64 xtime_interval; |
1832 | s64 xtime_remainder; |
1833 | - u32 raw_interval; |
1834 | + u64 raw_interval; |
1835 | /* The ntp_tick_length() value currently being used. |
1836 | * This cached copy ensures we consistently apply the tick |
1837 | * length for an entire tick, as ntp_tick_length may change |
1838 | diff --git a/kernel/signal.c b/kernel/signal.c |
1839 | index 7e59ebc2c25e..e75e9601817e 100644 |
1840 | --- a/kernel/signal.c |
1841 | +++ b/kernel/signal.c |
1842 | @@ -510,7 +510,8 @@ int unhandled_signal(struct task_struct *tsk, int sig) |
1843 | return !tsk->ptrace; |
1844 | } |
1845 | |
1846 | -static void collect_signal(int sig, struct sigpending *list, siginfo_t *info) |
1847 | +static void collect_signal(int sig, struct sigpending *list, siginfo_t *info, |
1848 | + bool *resched_timer) |
1849 | { |
1850 | struct sigqueue *q, *first = NULL; |
1851 | |
1852 | @@ -532,6 +533,12 @@ static void collect_signal(int sig, struct sigpending *list, siginfo_t *info) |
1853 | still_pending: |
1854 | list_del_init(&first->list); |
1855 | copy_siginfo(info, &first->info); |
1856 | + |
1857 | + *resched_timer = |
1858 | + (first->flags & SIGQUEUE_PREALLOC) && |
1859 | + (info->si_code == SI_TIMER) && |
1860 | + (info->si_sys_private); |
1861 | + |
1862 | __sigqueue_free(first); |
1863 | } else { |
1864 | /* |
1865 | @@ -548,12 +555,12 @@ static void collect_signal(int sig, struct sigpending *list, siginfo_t *info) |
1866 | } |
1867 | |
1868 | static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, |
1869 | - siginfo_t *info) |
1870 | + siginfo_t *info, bool *resched_timer) |
1871 | { |
1872 | int sig = next_signal(pending, mask); |
1873 | |
1874 | if (sig) |
1875 | - collect_signal(sig, pending, info); |
1876 | + collect_signal(sig, pending, info, resched_timer); |
1877 | return sig; |
1878 | } |
1879 | |
1880 | @@ -565,15 +572,16 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, |
1881 | */ |
1882 | int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) |
1883 | { |
1884 | + bool resched_timer = false; |
1885 | int signr; |
1886 | |
1887 | /* We only dequeue private signals from ourselves, we don't let |
1888 | * signalfd steal them |
1889 | */ |
1890 | - signr = __dequeue_signal(&tsk->pending, mask, info); |
1891 | + signr = __dequeue_signal(&tsk->pending, mask, info, &resched_timer); |
1892 | if (!signr) { |
1893 | signr = __dequeue_signal(&tsk->signal->shared_pending, |
1894 | - mask, info); |
1895 | + mask, info, &resched_timer); |
1896 | #ifdef CONFIG_POSIX_TIMERS |
1897 | /* |
1898 | * itimer signal ? |
1899 | @@ -621,7 +629,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) |
1900 | current->jobctl |= JOBCTL_STOP_DEQUEUED; |
1901 | } |
1902 | #ifdef CONFIG_POSIX_TIMERS |
1903 | - if ((info->si_code & __SI_MASK) == __SI_TIMER && info->si_sys_private) { |
1904 | + if (resched_timer) { |
1905 | /* |
1906 | * Release the siglock to ensure proper locking order |
1907 | * of timer locks outside of siglocks. Note, we leave |
1908 | diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c |
1909 | index 5b63a2102c29..0eaf309aae63 100644 |
1910 | --- a/kernel/time/timekeeping.c |
1911 | +++ b/kernel/time/timekeeping.c |
1912 | @@ -118,6 +118,26 @@ static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) |
1913 | tk->offs_boot = ktime_add(tk->offs_boot, delta); |
1914 | } |
1915 | |
1916 | +/* |
1917 | + * tk_clock_read - atomic clocksource read() helper |
1918 | + * |
1919 | + * This helper is necessary to use in the read paths because, while the |
1920 | + * seqlock ensures we don't return a bad value while structures are updated, |
1921 | + * it doesn't protect from potential crashes. There is the possibility that |
1922 | + * the tkr's clocksource may change between the read reference, and the |
1923 | + * clock reference passed to the read function. This can cause crashes if |
1924 | + * the wrong clocksource is passed to the wrong read function. |
1925 | + * This isn't necessary to use when holding the timekeeper_lock or doing |
1926 | + * a read of the fast-timekeeper tkrs (which is protected by its own locking |
1927 | + * and update logic). |
1928 | + */ |
1929 | +static inline u64 tk_clock_read(struct tk_read_base *tkr) |
1930 | +{ |
1931 | + struct clocksource *clock = READ_ONCE(tkr->clock); |
1932 | + |
1933 | + return clock->read(clock); |
1934 | +} |
1935 | + |
1936 | #ifdef CONFIG_DEBUG_TIMEKEEPING |
1937 | #define WARNING_FREQ (HZ*300) /* 5 minute rate-limiting */ |
1938 | |
1939 | @@ -175,7 +195,7 @@ static inline u64 timekeeping_get_delta(struct tk_read_base *tkr) |
1940 | */ |
1941 | do { |
1942 | seq = read_seqcount_begin(&tk_core.seq); |
1943 | - now = tkr->read(tkr->clock); |
1944 | + now = tk_clock_read(tkr); |
1945 | last = tkr->cycle_last; |
1946 | mask = tkr->mask; |
1947 | max = tkr->clock->max_cycles; |
1948 | @@ -209,7 +229,7 @@ static inline u64 timekeeping_get_delta(struct tk_read_base *tkr) |
1949 | u64 cycle_now, delta; |
1950 | |
1951 | /* read clocksource */ |
1952 | - cycle_now = tkr->read(tkr->clock); |
1953 | + cycle_now = tk_clock_read(tkr); |
1954 | |
1955 | /* calculate the delta since the last update_wall_time */ |
1956 | delta = clocksource_delta(cycle_now, tkr->cycle_last, tkr->mask); |
1957 | @@ -238,12 +258,10 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) |
1958 | ++tk->cs_was_changed_seq; |
1959 | old_clock = tk->tkr_mono.clock; |
1960 | tk->tkr_mono.clock = clock; |
1961 | - tk->tkr_mono.read = clock->read; |
1962 | tk->tkr_mono.mask = clock->mask; |
1963 | - tk->tkr_mono.cycle_last = tk->tkr_mono.read(clock); |
1964 | + tk->tkr_mono.cycle_last = tk_clock_read(&tk->tkr_mono); |
1965 | |
1966 | tk->tkr_raw.clock = clock; |
1967 | - tk->tkr_raw.read = clock->read; |
1968 | tk->tkr_raw.mask = clock->mask; |
1969 | tk->tkr_raw.cycle_last = tk->tkr_mono.cycle_last; |
1970 | |
1971 | @@ -262,7 +280,7 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) |
1972 | /* Go back from cycles -> shifted ns */ |
1973 | tk->xtime_interval = interval * clock->mult; |
1974 | tk->xtime_remainder = ntpinterval - tk->xtime_interval; |
1975 | - tk->raw_interval = (interval * clock->mult) >> clock->shift; |
1976 | + tk->raw_interval = interval * clock->mult; |
1977 | |
1978 | /* if changing clocks, convert xtime_nsec shift units */ |
1979 | if (old_clock) { |
1980 | @@ -404,7 +422,7 @@ static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf) |
1981 | |
1982 | now += timekeeping_delta_to_ns(tkr, |
1983 | clocksource_delta( |
1984 | - tkr->read(tkr->clock), |
1985 | + tk_clock_read(tkr), |
1986 | tkr->cycle_last, |
1987 | tkr->mask)); |
1988 | } while (read_seqcount_retry(&tkf->seq, seq)); |
1989 | @@ -461,6 +479,10 @@ static u64 dummy_clock_read(struct clocksource *cs) |
1990 | return cycles_at_suspend; |
1991 | } |
1992 | |
1993 | +static struct clocksource dummy_clock = { |
1994 | + .read = dummy_clock_read, |
1995 | +}; |
1996 | + |
1997 | /** |
1998 | * halt_fast_timekeeper - Prevent fast timekeeper from accessing clocksource. |
1999 | * @tk: Timekeeper to snapshot. |
2000 | @@ -477,13 +499,13 @@ static void halt_fast_timekeeper(struct timekeeper *tk) |
2001 | struct tk_read_base *tkr = &tk->tkr_mono; |
2002 | |
2003 | memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); |
2004 | - cycles_at_suspend = tkr->read(tkr->clock); |
2005 | - tkr_dummy.read = dummy_clock_read; |
2006 | + cycles_at_suspend = tk_clock_read(tkr); |
2007 | + tkr_dummy.clock = &dummy_clock; |
2008 | update_fast_timekeeper(&tkr_dummy, &tk_fast_mono); |
2009 | |
2010 | tkr = &tk->tkr_raw; |
2011 | memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); |
2012 | - tkr_dummy.read = dummy_clock_read; |
2013 | + tkr_dummy.clock = &dummy_clock; |
2014 | update_fast_timekeeper(&tkr_dummy, &tk_fast_raw); |
2015 | } |
2016 | |
2017 | @@ -649,11 +671,10 @@ static void timekeeping_update(struct timekeeper *tk, unsigned int action) |
2018 | */ |
2019 | static void timekeeping_forward_now(struct timekeeper *tk) |
2020 | { |
2021 | - struct clocksource *clock = tk->tkr_mono.clock; |
2022 | u64 cycle_now, delta; |
2023 | u64 nsec; |
2024 | |
2025 | - cycle_now = tk->tkr_mono.read(clock); |
2026 | + cycle_now = tk_clock_read(&tk->tkr_mono); |
2027 | delta = clocksource_delta(cycle_now, tk->tkr_mono.cycle_last, tk->tkr_mono.mask); |
2028 | tk->tkr_mono.cycle_last = cycle_now; |
2029 | tk->tkr_raw.cycle_last = cycle_now; |
2030 | @@ -929,8 +950,7 @@ void ktime_get_snapshot(struct system_time_snapshot *systime_snapshot) |
2031 | |
2032 | do { |
2033 | seq = read_seqcount_begin(&tk_core.seq); |
2034 | - |
2035 | - now = tk->tkr_mono.read(tk->tkr_mono.clock); |
2036 | + now = tk_clock_read(&tk->tkr_mono); |
2037 | systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq; |
2038 | systime_snapshot->clock_was_set_seq = tk->clock_was_set_seq; |
2039 | base_real = ktime_add(tk->tkr_mono.base, |
2040 | @@ -1109,7 +1129,7 @@ int get_device_system_crosststamp(int (*get_time_fn) |
2041 | * Check whether the system counter value provided by the |
2042 | * device driver is on the current timekeeping interval. |
2043 | */ |
2044 | - now = tk->tkr_mono.read(tk->tkr_mono.clock); |
2045 | + now = tk_clock_read(&tk->tkr_mono); |
2046 | interval_start = tk->tkr_mono.cycle_last; |
2047 | if (!cycle_between(interval_start, cycles, now)) { |
2048 | clock_was_set_seq = tk->clock_was_set_seq; |
2049 | @@ -1630,7 +1650,7 @@ void timekeeping_resume(void) |
2050 | * The less preferred source will only be tried if there is no better |
2051 | * usable source. The rtc part is handled separately in rtc core code. |
2052 | */ |
2053 | - cycle_now = tk->tkr_mono.read(clock); |
2054 | + cycle_now = tk_clock_read(&tk->tkr_mono); |
2055 | if ((clock->flags & CLOCK_SOURCE_SUSPEND_NONSTOP) && |
2056 | cycle_now > tk->tkr_mono.cycle_last) { |
2057 | u64 nsec, cyc_delta; |
2058 | @@ -1977,7 +1997,7 @@ static u64 logarithmic_accumulation(struct timekeeper *tk, u64 offset, |
2059 | u32 shift, unsigned int *clock_set) |
2060 | { |
2061 | u64 interval = tk->cycle_interval << shift; |
2062 | - u64 raw_nsecs; |
2063 | + u64 snsec_per_sec; |
2064 | |
2065 | /* If the offset is smaller than a shifted interval, do nothing */ |
2066 | if (offset < interval) |
2067 | @@ -1992,14 +2012,15 @@ static u64 logarithmic_accumulation(struct timekeeper *tk, u64 offset, |
2068 | *clock_set |= accumulate_nsecs_to_secs(tk); |
2069 | |
2070 | /* Accumulate raw time */ |
2071 | - raw_nsecs = (u64)tk->raw_interval << shift; |
2072 | - raw_nsecs += tk->raw_time.tv_nsec; |
2073 | - if (raw_nsecs >= NSEC_PER_SEC) { |
2074 | - u64 raw_secs = raw_nsecs; |
2075 | - raw_nsecs = do_div(raw_secs, NSEC_PER_SEC); |
2076 | - tk->raw_time.tv_sec += raw_secs; |
2077 | + tk->tkr_raw.xtime_nsec += (u64)tk->raw_time.tv_nsec << tk->tkr_raw.shift; |
2078 | + tk->tkr_raw.xtime_nsec += tk->raw_interval << shift; |
2079 | + snsec_per_sec = (u64)NSEC_PER_SEC << tk->tkr_raw.shift; |
2080 | + while (tk->tkr_raw.xtime_nsec >= snsec_per_sec) { |
2081 | + tk->tkr_raw.xtime_nsec -= snsec_per_sec; |
2082 | + tk->raw_time.tv_sec++; |
2083 | } |
2084 | - tk->raw_time.tv_nsec = raw_nsecs; |
2085 | + tk->raw_time.tv_nsec = tk->tkr_raw.xtime_nsec >> tk->tkr_raw.shift; |
2086 | + tk->tkr_raw.xtime_nsec -= (u64)tk->raw_time.tv_nsec << tk->tkr_raw.shift; |
2087 | |
2088 | /* Accumulate error between NTP and clock interval */ |
2089 | tk->ntp_error += tk->ntp_tick << shift; |
2090 | @@ -2031,7 +2052,7 @@ void update_wall_time(void) |
2091 | #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET |
2092 | offset = real_tk->cycle_interval; |
2093 | #else |
2094 | - offset = clocksource_delta(tk->tkr_mono.read(tk->tkr_mono.clock), |
2095 | + offset = clocksource_delta(tk_clock_read(&tk->tkr_mono), |
2096 | tk->tkr_mono.cycle_last, tk->tkr_mono.mask); |
2097 | #endif |
2098 | |
2099 | diff --git a/lib/cmdline.c b/lib/cmdline.c |
2100 | index 8f13cf73c2ec..79069d7938ea 100644 |
2101 | --- a/lib/cmdline.c |
2102 | +++ b/lib/cmdline.c |
2103 | @@ -22,14 +22,14 @@ |
2104 | * the values[M, M+1, ..., N] into the ints array in get_options. |
2105 | */ |
2106 | |
2107 | -static int get_range(char **str, int *pint) |
2108 | +static int get_range(char **str, int *pint, int n) |
2109 | { |
2110 | int x, inc_counter, upper_range; |
2111 | |
2112 | (*str)++; |
2113 | upper_range = simple_strtol((*str), NULL, 0); |
2114 | inc_counter = upper_range - *pint; |
2115 | - for (x = *pint; x < upper_range; x++) |
2116 | + for (x = *pint; n && x < upper_range; x++, n--) |
2117 | *pint++ = x; |
2118 | return inc_counter; |
2119 | } |
2120 | @@ -96,7 +96,7 @@ char *get_options(const char *str, int nints, int *ints) |
2121 | break; |
2122 | if (res == 3) { |
2123 | int range_nums; |
2124 | - range_nums = get_range((char **)&str, ints + i); |
2125 | + range_nums = get_range((char **)&str, ints + i, nints - i); |
2126 | if (range_nums < 0) |
2127 | break; |
2128 | /* |
2129 | diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c |
2130 | index 79b69917f521..656c259bcc14 100644 |
2131 | --- a/net/bridge/netfilter/ebtables.c |
2132 | +++ b/net/bridge/netfilter/ebtables.c |
2133 | @@ -1358,7 +1358,8 @@ static inline int ebt_obj_to_user(char __user *um, const char *_name, |
2134 | strlcpy(name, _name, sizeof(name)); |
2135 | if (copy_to_user(um, name, EBT_FUNCTION_MAXNAMELEN) || |
2136 | put_user(datasize, (int __user *)(um + EBT_FUNCTION_MAXNAMELEN)) || |
2137 | - xt_data_to_user(um + entrysize, data, usersize, datasize)) |
2138 | + xt_data_to_user(um + entrysize, data, usersize, datasize, |
2139 | + XT_ALIGN(datasize))) |
2140 | return -EFAULT; |
2141 | |
2142 | return 0; |
2143 | @@ -1643,7 +1644,8 @@ static int compat_match_to_user(struct ebt_entry_match *m, void __user **dstptr, |
2144 | if (match->compat_to_user(cm->data, m->data)) |
2145 | return -EFAULT; |
2146 | } else { |
2147 | - if (xt_data_to_user(cm->data, m->data, match->usersize, msize)) |
2148 | + if (xt_data_to_user(cm->data, m->data, match->usersize, msize, |
2149 | + COMPAT_XT_ALIGN(msize))) |
2150 | return -EFAULT; |
2151 | } |
2152 | |
2153 | @@ -1672,7 +1674,8 @@ static int compat_target_to_user(struct ebt_entry_target *t, |
2154 | if (target->compat_to_user(cm->data, t->data)) |
2155 | return -EFAULT; |
2156 | } else { |
2157 | - if (xt_data_to_user(cm->data, t->data, target->usersize, tsize)) |
2158 | + if (xt_data_to_user(cm->data, t->data, target->usersize, tsize, |
2159 | + COMPAT_XT_ALIGN(tsize))) |
2160 | return -EFAULT; |
2161 | } |
2162 | |
2163 | diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c |
2164 | index 14857afc9937..32488c09cfb9 100644 |
2165 | --- a/net/netfilter/x_tables.c |
2166 | +++ b/net/netfilter/x_tables.c |
2167 | @@ -283,28 +283,30 @@ static int xt_obj_to_user(u16 __user *psize, u16 size, |
2168 | &U->u.user.revision, K->u.kernel.TYPE->revision) |
2169 | |
2170 | int xt_data_to_user(void __user *dst, const void *src, |
2171 | - int usersize, int size) |
2172 | + int usersize, int size, int aligned_size) |
2173 | { |
2174 | usersize = usersize ? : size; |
2175 | if (copy_to_user(dst, src, usersize)) |
2176 | return -EFAULT; |
2177 | - if (usersize != size && clear_user(dst + usersize, size - usersize)) |
2178 | + if (usersize != aligned_size && |
2179 | + clear_user(dst + usersize, aligned_size - usersize)) |
2180 | return -EFAULT; |
2181 | |
2182 | return 0; |
2183 | } |
2184 | EXPORT_SYMBOL_GPL(xt_data_to_user); |
2185 | |
2186 | -#define XT_DATA_TO_USER(U, K, TYPE, C_SIZE) \ |
2187 | +#define XT_DATA_TO_USER(U, K, TYPE) \ |
2188 | xt_data_to_user(U->data, K->data, \ |
2189 | K->u.kernel.TYPE->usersize, \ |
2190 | - C_SIZE ? : K->u.kernel.TYPE->TYPE##size) |
2191 | + K->u.kernel.TYPE->TYPE##size, \ |
2192 | + XT_ALIGN(K->u.kernel.TYPE->TYPE##size)) |
2193 | |
2194 | int xt_match_to_user(const struct xt_entry_match *m, |
2195 | struct xt_entry_match __user *u) |
2196 | { |
2197 | return XT_OBJ_TO_USER(u, m, match, 0) || |
2198 | - XT_DATA_TO_USER(u, m, match, 0); |
2199 | + XT_DATA_TO_USER(u, m, match); |
2200 | } |
2201 | EXPORT_SYMBOL_GPL(xt_match_to_user); |
2202 | |
2203 | @@ -312,7 +314,7 @@ int xt_target_to_user(const struct xt_entry_target *t, |
2204 | struct xt_entry_target __user *u) |
2205 | { |
2206 | return XT_OBJ_TO_USER(u, t, target, 0) || |
2207 | - XT_DATA_TO_USER(u, t, target, 0); |
2208 | + XT_DATA_TO_USER(u, t, target); |
2209 | } |
2210 | EXPORT_SYMBOL_GPL(xt_target_to_user); |
2211 | |
2212 | @@ -611,6 +613,12 @@ void xt_compat_match_from_user(struct xt_entry_match *m, void **dstptr, |
2213 | } |
2214 | EXPORT_SYMBOL_GPL(xt_compat_match_from_user); |
2215 | |
2216 | +#define COMPAT_XT_DATA_TO_USER(U, K, TYPE, C_SIZE) \ |
2217 | + xt_data_to_user(U->data, K->data, \ |
2218 | + K->u.kernel.TYPE->usersize, \ |
2219 | + C_SIZE, \ |
2220 | + COMPAT_XT_ALIGN(C_SIZE)) |
2221 | + |
2222 | int xt_compat_match_to_user(const struct xt_entry_match *m, |
2223 | void __user **dstptr, unsigned int *size) |
2224 | { |
2225 | @@ -626,7 +634,7 @@ int xt_compat_match_to_user(const struct xt_entry_match *m, |
2226 | if (match->compat_to_user((void __user *)cm->data, m->data)) |
2227 | return -EFAULT; |
2228 | } else { |
2229 | - if (XT_DATA_TO_USER(cm, m, match, msize - sizeof(*cm))) |
2230 | + if (COMPAT_XT_DATA_TO_USER(cm, m, match, msize - sizeof(*cm))) |
2231 | return -EFAULT; |
2232 | } |
2233 | |
2234 | @@ -981,7 +989,7 @@ int xt_compat_target_to_user(const struct xt_entry_target *t, |
2235 | if (target->compat_to_user((void __user *)ct->data, t->data)) |
2236 | return -EFAULT; |
2237 | } else { |
2238 | - if (XT_DATA_TO_USER(ct, t, target, tsize - sizeof(*ct))) |
2239 | + if (COMPAT_XT_DATA_TO_USER(ct, t, target, tsize - sizeof(*ct))) |
2240 | return -EFAULT; |
2241 | } |
2242 | |
2243 | diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c |
2244 | index 0a4e28477ad9..54369225766e 100644 |
2245 | --- a/net/rxrpc/key.c |
2246 | +++ b/net/rxrpc/key.c |
2247 | @@ -217,7 +217,7 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ, |
2248 | unsigned int *_toklen) |
2249 | { |
2250 | const __be32 *xdr = *_xdr; |
2251 | - unsigned int toklen = *_toklen, n_parts, loop, tmp; |
2252 | + unsigned int toklen = *_toklen, n_parts, loop, tmp, paddedlen; |
2253 | |
2254 | /* there must be at least one name, and at least #names+1 length |
2255 | * words */ |
2256 | @@ -247,16 +247,16 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ, |
2257 | toklen -= 4; |
2258 | if (tmp <= 0 || tmp > AFSTOKEN_STRING_MAX) |
2259 | return -EINVAL; |
2260 | - if (tmp > toklen) |
2261 | + paddedlen = (tmp + 3) & ~3; |
2262 | + if (paddedlen > toklen) |
2263 | return -EINVAL; |
2264 | princ->name_parts[loop] = kmalloc(tmp + 1, GFP_KERNEL); |
2265 | if (!princ->name_parts[loop]) |
2266 | return -ENOMEM; |
2267 | memcpy(princ->name_parts[loop], xdr, tmp); |
2268 | princ->name_parts[loop][tmp] = 0; |
2269 | - tmp = (tmp + 3) & ~3; |
2270 | - toklen -= tmp; |
2271 | - xdr += tmp >> 2; |
2272 | + toklen -= paddedlen; |
2273 | + xdr += paddedlen >> 2; |
2274 | } |
2275 | |
2276 | if (toklen < 4) |
2277 | @@ -265,16 +265,16 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ, |
2278 | toklen -= 4; |
2279 | if (tmp <= 0 || tmp > AFSTOKEN_K5_REALM_MAX) |
2280 | return -EINVAL; |
2281 | - if (tmp > toklen) |
2282 | + paddedlen = (tmp + 3) & ~3; |
2283 | + if (paddedlen > toklen) |
2284 | return -EINVAL; |
2285 | princ->realm = kmalloc(tmp + 1, GFP_KERNEL); |
2286 | if (!princ->realm) |
2287 | return -ENOMEM; |
2288 | memcpy(princ->realm, xdr, tmp); |
2289 | princ->realm[tmp] = 0; |
2290 | - tmp = (tmp + 3) & ~3; |
2291 | - toklen -= tmp; |
2292 | - xdr += tmp >> 2; |
2293 | + toklen -= paddedlen; |
2294 | + xdr += paddedlen >> 2; |
2295 | |
2296 | _debug("%s/...@%s", princ->name_parts[0], princ->realm); |
2297 | |
2298 | @@ -293,7 +293,7 @@ static int rxrpc_krb5_decode_tagged_data(struct krb5_tagged_data *td, |
2299 | unsigned int *_toklen) |
2300 | { |
2301 | const __be32 *xdr = *_xdr; |
2302 | - unsigned int toklen = *_toklen, len; |
2303 | + unsigned int toklen = *_toklen, len, paddedlen; |
2304 | |
2305 | /* there must be at least one tag and one length word */ |
2306 | if (toklen <= 8) |
2307 | @@ -307,15 +307,17 @@ static int rxrpc_krb5_decode_tagged_data(struct krb5_tagged_data *td, |
2308 | toklen -= 8; |
2309 | if (len > max_data_size) |
2310 | return -EINVAL; |
2311 | + paddedlen = (len + 3) & ~3; |
2312 | + if (paddedlen > toklen) |
2313 | + return -EINVAL; |
2314 | td->data_len = len; |
2315 | |
2316 | if (len > 0) { |
2317 | td->data = kmemdup(xdr, len, GFP_KERNEL); |
2318 | if (!td->data) |
2319 | return -ENOMEM; |
2320 | - len = (len + 3) & ~3; |
2321 | - toklen -= len; |
2322 | - xdr += len >> 2; |
2323 | + toklen -= paddedlen; |
2324 | + xdr += paddedlen >> 2; |
2325 | } |
2326 | |
2327 | _debug("tag %x len %x", td->tag, td->data_len); |
2328 | @@ -387,7 +389,7 @@ static int rxrpc_krb5_decode_ticket(u8 **_ticket, u16 *_tktlen, |
2329 | const __be32 **_xdr, unsigned int *_toklen) |
2330 | { |
2331 | const __be32 *xdr = *_xdr; |
2332 | - unsigned int toklen = *_toklen, len; |
2333 | + unsigned int toklen = *_toklen, len, paddedlen; |
2334 | |
2335 | /* there must be at least one length word */ |
2336 | if (toklen <= 4) |
2337 | @@ -399,6 +401,9 @@ static int rxrpc_krb5_decode_ticket(u8 **_ticket, u16 *_tktlen, |
2338 | toklen -= 4; |
2339 | if (len > AFSTOKEN_K5_TIX_MAX) |
2340 | return -EINVAL; |
2341 | + paddedlen = (len + 3) & ~3; |
2342 | + if (paddedlen > toklen) |
2343 | + return -EINVAL; |
2344 | *_tktlen = len; |
2345 | |
2346 | _debug("ticket len %u", len); |
2347 | @@ -407,9 +412,8 @@ static int rxrpc_krb5_decode_ticket(u8 **_ticket, u16 *_tktlen, |
2348 | *_ticket = kmemdup(xdr, len, GFP_KERNEL); |
2349 | if (!*_ticket) |
2350 | return -ENOMEM; |
2351 | - len = (len + 3) & ~3; |
2352 | - toklen -= len; |
2353 | - xdr += len >> 2; |
2354 | + toklen -= paddedlen; |
2355 | + xdr += paddedlen >> 2; |
2356 | } |
2357 | |
2358 | *_xdr = xdr; |
2359 | @@ -552,7 +556,7 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep) |
2360 | { |
2361 | const __be32 *xdr = prep->data, *token; |
2362 | const char *cp; |
2363 | - unsigned int len, tmp, loop, ntoken, toklen, sec_ix; |
2364 | + unsigned int len, paddedlen, loop, ntoken, toklen, sec_ix; |
2365 | size_t datalen = prep->datalen; |
2366 | int ret; |
2367 | |
2368 | @@ -578,22 +582,21 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep) |
2369 | if (len < 1 || len > AFSTOKEN_CELL_MAX) |
2370 | goto not_xdr; |
2371 | datalen -= 4; |
2372 | - tmp = (len + 3) & ~3; |
2373 | - if (tmp > datalen) |
2374 | + paddedlen = (len + 3) & ~3; |
2375 | + if (paddedlen > datalen) |
2376 | goto not_xdr; |
2377 | |
2378 | cp = (const char *) xdr; |
2379 | for (loop = 0; loop < len; loop++) |
2380 | if (!isprint(cp[loop])) |
2381 | goto not_xdr; |
2382 | - if (len < tmp) |
2383 | - for (; loop < tmp; loop++) |
2384 | - if (cp[loop]) |
2385 | - goto not_xdr; |
2386 | + for (; loop < paddedlen; loop++) |
2387 | + if (cp[loop]) |
2388 | + goto not_xdr; |
2389 | _debug("cellname: [%u/%u] '%*.*s'", |
2390 | - len, tmp, len, len, (const char *) xdr); |
2391 | - datalen -= tmp; |
2392 | - xdr += tmp >> 2; |
2393 | + len, paddedlen, len, len, (const char *) xdr); |
2394 | + datalen -= paddedlen; |
2395 | + xdr += paddedlen >> 2; |
2396 | |
2397 | /* get the token count */ |
2398 | if (datalen < 12) |
2399 | @@ -614,10 +617,11 @@ static int rxrpc_preparse_xdr(struct key_preparsed_payload *prep) |
2400 | sec_ix = ntohl(*xdr); |
2401 | datalen -= 4; |
2402 | _debug("token: [%x/%zx] %x", toklen, datalen, sec_ix); |
2403 | - if (toklen < 20 || toklen > datalen) |
2404 | + paddedlen = (toklen + 3) & ~3; |
2405 | + if (toklen < 20 || toklen > datalen || paddedlen > datalen) |
2406 | goto not_xdr; |
2407 | - datalen -= (toklen + 3) & ~3; |
2408 | - xdr += (toklen + 3) >> 2; |
2409 | + datalen -= paddedlen; |
2410 | + xdr += paddedlen >> 2; |
2411 | |
2412 | } while (--loop > 0); |
2413 | |
2414 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c |
2415 | index 5088d4b8db22..009e6c98754e 100644 |
2416 | --- a/sound/core/pcm_lib.c |
2417 | +++ b/sound/core/pcm_lib.c |
2418 | @@ -2492,7 +2492,7 @@ static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol, |
2419 | struct snd_pcm_substream *substream; |
2420 | const struct snd_pcm_chmap_elem *map; |
2421 | |
2422 | - if (snd_BUG_ON(!info->chmap)) |
2423 | + if (!info->chmap) |
2424 | return -EINVAL; |
2425 | substream = snd_pcm_chmap_substream(info, idx); |
2426 | if (!substream) |
2427 | @@ -2524,7 +2524,7 @@ static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag, |
2428 | unsigned int __user *dst; |
2429 | int c, count = 0; |
2430 | |
2431 | - if (snd_BUG_ON(!info->chmap)) |
2432 | + if (!info->chmap) |
2433 | return -EINVAL; |
2434 | if (size < 8) |
2435 | return -ENOMEM; |
2436 | diff --git a/sound/firewire/amdtp-stream.c b/sound/firewire/amdtp-stream.c |
2437 | index 00060c4a9deb..9741757436be 100644 |
2438 | --- a/sound/firewire/amdtp-stream.c |
2439 | +++ b/sound/firewire/amdtp-stream.c |
2440 | @@ -606,7 +606,9 @@ static void out_stream_callback(struct fw_iso_context *context, u32 tstamp, |
2441 | cycle = increment_cycle_count(cycle, 1); |
2442 | if (handle_out_packet(s, cycle, i) < 0) { |
2443 | s->packet_index = -1; |
2444 | - amdtp_stream_pcm_abort(s); |
2445 | + if (in_interrupt()) |
2446 | + amdtp_stream_pcm_abort(s); |
2447 | + WRITE_ONCE(s->pcm_buffer_pointer, SNDRV_PCM_POS_XRUN); |
2448 | return; |
2449 | } |
2450 | } |
2451 | @@ -658,7 +660,9 @@ static void in_stream_callback(struct fw_iso_context *context, u32 tstamp, |
2452 | /* Queueing error or detecting invalid payload. */ |
2453 | if (i < packets) { |
2454 | s->packet_index = -1; |
2455 | - amdtp_stream_pcm_abort(s); |
2456 | + if (in_interrupt()) |
2457 | + amdtp_stream_pcm_abort(s); |
2458 | + WRITE_ONCE(s->pcm_buffer_pointer, SNDRV_PCM_POS_XRUN); |
2459 | return; |
2460 | } |
2461 | |
2462 | diff --git a/sound/firewire/amdtp-stream.h b/sound/firewire/amdtp-stream.h |
2463 | index c1bc7fad056e..f7c054bc9d92 100644 |
2464 | --- a/sound/firewire/amdtp-stream.h |
2465 | +++ b/sound/firewire/amdtp-stream.h |
2466 | @@ -124,7 +124,7 @@ struct amdtp_stream { |
2467 | /* For a PCM substream processing. */ |
2468 | struct snd_pcm_substream *pcm; |
2469 | struct tasklet_struct period_tasklet; |
2470 | - unsigned int pcm_buffer_pointer; |
2471 | + snd_pcm_uframes_t pcm_buffer_pointer; |
2472 | unsigned int pcm_period_pointer; |
2473 | |
2474 | /* To wait for first packet. */ |
2475 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
2476 | index 23d685636a67..69097cc96660 100644 |
2477 | --- a/sound/pci/hda/hda_intel.c |
2478 | +++ b/sound/pci/hda/hda_intel.c |
2479 | @@ -369,10 +369,12 @@ enum { |
2480 | #define IS_KBL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d71) |
2481 | #define IS_KBL_H(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa2f0) |
2482 | #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) |
2483 | +#define IS_BXT_T(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x1a98) |
2484 | #define IS_GLK(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x3198) |
2485 | -#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci)) || \ |
2486 | - IS_KBL(pci) || IS_KBL_LP(pci) || IS_KBL_H(pci) || \ |
2487 | - IS_GLK(pci) |
2488 | +#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) |
2489 | +#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci) || \ |
2490 | + IS_BXT_T(pci) || IS_KBL(pci) || IS_KBL_LP(pci) || \ |
2491 | + IS_KBL_H(pci) || IS_GLK(pci) || IS_CFL(pci)) |
2492 | |
2493 | static char *driver_short_names[] = { |
2494 | [AZX_DRIVER_ICH] = "HDA Intel", |
2495 | @@ -2251,6 +2253,9 @@ static const struct pci_device_id azx_ids[] = { |
2496 | /* Kabylake-H */ |
2497 | { PCI_DEVICE(0x8086, 0xa2f0), |
2498 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE }, |
2499 | + /* Coffelake */ |
2500 | + { PCI_DEVICE(0x8086, 0xa348), |
2501 | + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE}, |
2502 | /* Broxton-P(Apollolake) */ |
2503 | { PCI_DEVICE(0x8086, 0x5a98), |
2504 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON }, |
2505 | diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c |
2506 | index 28fb62c32678..e0f9e6a20556 100644 |
2507 | --- a/tools/perf/util/probe-event.c |
2508 | +++ b/tools/perf/util/probe-event.c |
2509 | @@ -615,7 +615,7 @@ static int post_process_probe_trace_point(struct probe_trace_point *tp, |
2510 | struct map *map, unsigned long offs) |
2511 | { |
2512 | struct symbol *sym; |
2513 | - u64 addr = tp->address + tp->offset - offs; |
2514 | + u64 addr = tp->address - offs; |
2515 | |
2516 | sym = map__find_symbol(map, addr); |
2517 | if (!sym) |