Annotation of /trunk/kernel-magellan/patches-4.13/0112-4.13.13-all-fixes.patch
Parent Directory | Revision Log
Revision 3023 -
(hide annotations)
(download)
Thu Nov 16 11:09:13 2017 UTC (6 years, 10 months ago) by niro
File size: 49155 byte(s)
Thu Nov 16 11:09:13 2017 UTC (6 years, 10 months ago) by niro
File size: 49155 byte(s)
-linux-4.13.13
1 | niro | 3023 | diff --git a/Makefile b/Makefile |
2 | index a7c847f495b0..1608a9b71381 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 13 | ||
8 | -SUBLEVEL = 12 | ||
9 | +SUBLEVEL = 13 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Fearless Coyote | ||
12 | |||
13 | diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c | ||
14 | index 948c648fea00..0fcd82f01388 100644 | ||
15 | --- a/arch/arm/kernel/traps.c | ||
16 | +++ b/arch/arm/kernel/traps.c | ||
17 | @@ -154,30 +154,26 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom, | ||
18 | set_fs(fs); | ||
19 | } | ||
20 | |||
21 | -static void dump_instr(const char *lvl, struct pt_regs *regs) | ||
22 | +static void __dump_instr(const char *lvl, struct pt_regs *regs) | ||
23 | { | ||
24 | unsigned long addr = instruction_pointer(regs); | ||
25 | const int thumb = thumb_mode(regs); | ||
26 | const int width = thumb ? 4 : 8; | ||
27 | - mm_segment_t fs; | ||
28 | char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str; | ||
29 | int i; | ||
30 | |||
31 | /* | ||
32 | - * We need to switch to kernel mode so that we can use __get_user | ||
33 | - * to safely read from kernel space. Note that we now dump the | ||
34 | - * code first, just in case the backtrace kills us. | ||
35 | + * Note that we now dump the code first, just in case the backtrace | ||
36 | + * kills us. | ||
37 | */ | ||
38 | - fs = get_fs(); | ||
39 | - set_fs(KERNEL_DS); | ||
40 | |||
41 | for (i = -4; i < 1 + !!thumb; i++) { | ||
42 | unsigned int val, bad; | ||
43 | |||
44 | if (thumb) | ||
45 | - bad = __get_user(val, &((u16 *)addr)[i]); | ||
46 | + bad = get_user(val, &((u16 *)addr)[i]); | ||
47 | else | ||
48 | - bad = __get_user(val, &((u32 *)addr)[i]); | ||
49 | + bad = get_user(val, &((u32 *)addr)[i]); | ||
50 | |||
51 | if (!bad) | ||
52 | p += sprintf(p, i == 0 ? "(%0*x) " : "%0*x ", | ||
53 | @@ -188,8 +184,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs) | ||
54 | } | ||
55 | } | ||
56 | printk("%sCode: %s\n", lvl, str); | ||
57 | +} | ||
58 | |||
59 | - set_fs(fs); | ||
60 | +static void dump_instr(const char *lvl, struct pt_regs *regs) | ||
61 | +{ | ||
62 | + mm_segment_t fs; | ||
63 | + | ||
64 | + if (!user_mode(regs)) { | ||
65 | + fs = get_fs(); | ||
66 | + set_fs(KERNEL_DS); | ||
67 | + __dump_instr(lvl, regs); | ||
68 | + set_fs(fs); | ||
69 | + } else { | ||
70 | + __dump_instr(lvl, regs); | ||
71 | + } | ||
72 | } | ||
73 | |||
74 | #ifdef CONFIG_ARM_UNWIND | ||
75 | diff --git a/arch/mips/ar7/platform.c b/arch/mips/ar7/platform.c | ||
76 | index df7acea3747a..4674f1efbe7a 100644 | ||
77 | --- a/arch/mips/ar7/platform.c | ||
78 | +++ b/arch/mips/ar7/platform.c | ||
79 | @@ -575,6 +575,7 @@ static int __init ar7_register_uarts(void) | ||
80 | uart_port.type = PORT_AR7; | ||
81 | uart_port.uartclk = clk_get_rate(bus_clk) / 2; | ||
82 | uart_port.iotype = UPIO_MEM32; | ||
83 | + uart_port.flags = UPF_FIXED_TYPE; | ||
84 | uart_port.regshift = 2; | ||
85 | |||
86 | uart_port.line = 0; | ||
87 | @@ -653,6 +654,10 @@ static int __init ar7_register_devices(void) | ||
88 | u32 val; | ||
89 | int res; | ||
90 | |||
91 | + res = ar7_gpio_init(); | ||
92 | + if (res) | ||
93 | + pr_warn("unable to register gpios: %d\n", res); | ||
94 | + | ||
95 | res = ar7_register_uarts(); | ||
96 | if (res) | ||
97 | pr_err("unable to setup uart(s): %d\n", res); | ||
98 | diff --git a/arch/mips/ar7/prom.c b/arch/mips/ar7/prom.c | ||
99 | index 4fd83336131a..dd53987a690f 100644 | ||
100 | --- a/arch/mips/ar7/prom.c | ||
101 | +++ b/arch/mips/ar7/prom.c | ||
102 | @@ -246,8 +246,6 @@ void __init prom_init(void) | ||
103 | ar7_init_cmdline(fw_arg0, (char **)fw_arg1); | ||
104 | ar7_init_env((struct env_var *)fw_arg2); | ||
105 | console_config(); | ||
106 | - | ||
107 | - ar7_gpio_init(); | ||
108 | } | ||
109 | |||
110 | #define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4))) | ||
111 | diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h | ||
112 | index cfdbab015769..163317fd3d7e 100644 | ||
113 | --- a/arch/mips/include/asm/mips-cm.h | ||
114 | +++ b/arch/mips/include/asm/mips-cm.h | ||
115 | @@ -240,8 +240,8 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80) | ||
116 | #define CM_GCR_BASE_GCRBASE_MSK (_ULCAST_(0x1ffff) << 15) | ||
117 | #define CM_GCR_BASE_CMDEFTGT_SHF 0 | ||
118 | #define CM_GCR_BASE_CMDEFTGT_MSK (_ULCAST_(0x3) << 0) | ||
119 | -#define CM_GCR_BASE_CMDEFTGT_DISABLED 0 | ||
120 | -#define CM_GCR_BASE_CMDEFTGT_MEM 1 | ||
121 | +#define CM_GCR_BASE_CMDEFTGT_MEM 0 | ||
122 | +#define CM_GCR_BASE_CMDEFTGT_RESERVED 1 | ||
123 | #define CM_GCR_BASE_CMDEFTGT_IOCU0 2 | ||
124 | #define CM_GCR_BASE_CMDEFTGT_IOCU1 3 | ||
125 | |||
126 | diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c | ||
127 | index 1b070a76fcdd..5e0d87f4958f 100644 | ||
128 | --- a/arch/mips/kernel/smp-bmips.c | ||
129 | +++ b/arch/mips/kernel/smp-bmips.c | ||
130 | @@ -589,11 +589,11 @@ void __init bmips_cpu_setup(void) | ||
131 | |||
132 | /* Flush and enable RAC */ | ||
133 | cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG); | ||
134 | - __raw_writel(cfg | 0x100, BMIPS_RAC_CONFIG); | ||
135 | + __raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG); | ||
136 | __raw_readl(cbr + BMIPS_RAC_CONFIG); | ||
137 | |||
138 | cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG); | ||
139 | - __raw_writel(cfg | 0xf, BMIPS_RAC_CONFIG); | ||
140 | + __raw_writel(cfg | 0xf, cbr + BMIPS_RAC_CONFIG); | ||
141 | __raw_readl(cbr + BMIPS_RAC_CONFIG); | ||
142 | |||
143 | cfg = __raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE); | ||
144 | diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
145 | index b42812e014c0..1fcc30ff9569 100644 | ||
146 | --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
147 | +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
148 | @@ -645,6 +645,16 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
149 | hnow_v = hpte_new_to_old_v(hnow_v, hnow_r); | ||
150 | hnow_r = hpte_new_to_old_r(hnow_r); | ||
151 | } | ||
152 | + | ||
153 | + /* | ||
154 | + * If the HPT is being resized, don't update the HPTE, | ||
155 | + * instead let the guest retry after the resize operation is complete. | ||
156 | + * The synchronization for hpte_setup_done test vs. set is provided | ||
157 | + * by the HPTE lock. | ||
158 | + */ | ||
159 | + if (!kvm->arch.hpte_setup_done) | ||
160 | + goto out_unlock; | ||
161 | + | ||
162 | if ((hnow_v & ~HPTE_V_HVLOCK) != hpte[0] || hnow_r != hpte[1] || | ||
163 | rev->guest_rpte != hpte[2]) | ||
164 | /* HPTE has been changed under us; let the guest retry */ | ||
165 | diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c | ||
166 | index 9ecd9aea0b54..c059541743f0 100644 | ||
167 | --- a/arch/powerpc/kvm/book3s_hv.c | ||
168 | +++ b/arch/powerpc/kvm/book3s_hv.c | ||
169 | @@ -2688,11 +2688,14 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc) | ||
170 | * Hard-disable interrupts, and check resched flag and signals. | ||
171 | * If we need to reschedule or deliver a signal, clean up | ||
172 | * and return without going into the guest(s). | ||
173 | + * If the hpte_setup_done flag has been cleared, don't go into the | ||
174 | + * guest because that means a HPT resize operation is in progress. | ||
175 | */ | ||
176 | local_irq_disable(); | ||
177 | hard_irq_disable(); | ||
178 | if (lazy_irq_pending() || need_resched() || | ||
179 | - recheck_signals(&core_info)) { | ||
180 | + recheck_signals(&core_info) || | ||
181 | + (!kvm_is_radix(vc->kvm) && !vc->kvm->arch.hpte_setup_done)) { | ||
182 | local_irq_enable(); | ||
183 | vc->vcore_state = VCORE_INACTIVE; | ||
184 | /* Unlock all except the primary vcore */ | ||
185 | @@ -3061,7 +3064,7 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc) | ||
186 | |||
187 | static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | ||
188 | { | ||
189 | - int n_ceded, i; | ||
190 | + int n_ceded, i, r; | ||
191 | struct kvmppc_vcore *vc; | ||
192 | struct kvm_vcpu *v; | ||
193 | |||
194 | @@ -3115,6 +3118,20 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | ||
195 | |||
196 | while (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE && | ||
197 | !signal_pending(current)) { | ||
198 | + /* See if the HPT and VRMA are ready to go */ | ||
199 | + if (!kvm_is_radix(vcpu->kvm) && | ||
200 | + !vcpu->kvm->arch.hpte_setup_done) { | ||
201 | + spin_unlock(&vc->lock); | ||
202 | + r = kvmppc_hv_setup_htab_rma(vcpu); | ||
203 | + spin_lock(&vc->lock); | ||
204 | + if (r) { | ||
205 | + kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY; | ||
206 | + kvm_run->fail_entry.hardware_entry_failure_reason = 0; | ||
207 | + vcpu->arch.ret = r; | ||
208 | + break; | ||
209 | + } | ||
210 | + } | ||
211 | + | ||
212 | if (vc->vcore_state == VCORE_PREEMPT && vc->runner == NULL) | ||
213 | kvmppc_vcore_end_preempt(vc); | ||
214 | |||
215 | @@ -3232,13 +3249,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) | ||
216 | /* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */ | ||
217 | smp_mb(); | ||
218 | |||
219 | - /* On the first time here, set up HTAB and VRMA */ | ||
220 | - if (!kvm_is_radix(vcpu->kvm) && !vcpu->kvm->arch.hpte_setup_done) { | ||
221 | - r = kvmppc_hv_setup_htab_rma(vcpu); | ||
222 | - if (r) | ||
223 | - goto out; | ||
224 | - } | ||
225 | - | ||
226 | flush_all_to_thread(current); | ||
227 | |||
228 | /* Save userspace EBB and other register values */ | ||
229 | @@ -3286,7 +3296,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu) | ||
230 | } | ||
231 | mtspr(SPRN_VRSAVE, user_vrsave); | ||
232 | |||
233 | - out: | ||
234 | vcpu->arch.state = KVMPPC_VCPU_NOTREADY; | ||
235 | atomic_dec(&vcpu->kvm->arch.vcpus_running); | ||
236 | return r; | ||
237 | diff --git a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | ||
238 | index 93b945597ecf..7cfba738f104 100644 | ||
239 | --- a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | ||
240 | +++ b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | ||
241 | @@ -157,8 +157,8 @@ LABEL skip_ %I | ||
242 | .endr | ||
243 | |||
244 | # Find min length | ||
245 | - vmovdqa _lens+0*16(state), %xmm0 | ||
246 | - vmovdqa _lens+1*16(state), %xmm1 | ||
247 | + vmovdqu _lens+0*16(state), %xmm0 | ||
248 | + vmovdqu _lens+1*16(state), %xmm1 | ||
249 | |||
250 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | ||
251 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | ||
252 | @@ -178,8 +178,8 @@ LABEL skip_ %I | ||
253 | vpsubd %xmm2, %xmm0, %xmm0 | ||
254 | vpsubd %xmm2, %xmm1, %xmm1 | ||
255 | |||
256 | - vmovdqa %xmm0, _lens+0*16(state) | ||
257 | - vmovdqa %xmm1, _lens+1*16(state) | ||
258 | + vmovdqu %xmm0, _lens+0*16(state) | ||
259 | + vmovdqu %xmm1, _lens+1*16(state) | ||
260 | |||
261 | # "state" and "args" are the same address, arg1 | ||
262 | # len is arg2 | ||
263 | @@ -235,8 +235,8 @@ ENTRY(sha1_mb_mgr_get_comp_job_avx2) | ||
264 | jc .return_null | ||
265 | |||
266 | # Find min length | ||
267 | - vmovdqa _lens(state), %xmm0 | ||
268 | - vmovdqa _lens+1*16(state), %xmm1 | ||
269 | + vmovdqu _lens(state), %xmm0 | ||
270 | + vmovdqu _lens+1*16(state), %xmm1 | ||
271 | |||
272 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | ||
273 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | ||
274 | diff --git a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | ||
275 | index 8fe6338bcc84..16c4ccb1f154 100644 | ||
276 | --- a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | ||
277 | +++ b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | ||
278 | @@ -155,8 +155,8 @@ LABEL skip_ %I | ||
279 | .endr | ||
280 | |||
281 | # Find min length | ||
282 | - vmovdqa _lens+0*16(state), %xmm0 | ||
283 | - vmovdqa _lens+1*16(state), %xmm1 | ||
284 | + vmovdqu _lens+0*16(state), %xmm0 | ||
285 | + vmovdqu _lens+1*16(state), %xmm1 | ||
286 | |||
287 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | ||
288 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | ||
289 | @@ -176,8 +176,8 @@ LABEL skip_ %I | ||
290 | vpsubd %xmm2, %xmm0, %xmm0 | ||
291 | vpsubd %xmm2, %xmm1, %xmm1 | ||
292 | |||
293 | - vmovdqa %xmm0, _lens+0*16(state) | ||
294 | - vmovdqa %xmm1, _lens+1*16(state) | ||
295 | + vmovdqu %xmm0, _lens+0*16(state) | ||
296 | + vmovdqu %xmm1, _lens+1*16(state) | ||
297 | |||
298 | # "state" and "args" are the same address, arg1 | ||
299 | # len is arg2 | ||
300 | @@ -234,8 +234,8 @@ ENTRY(sha256_mb_mgr_get_comp_job_avx2) | ||
301 | jc .return_null | ||
302 | |||
303 | # Find min length | ||
304 | - vmovdqa _lens(state), %xmm0 | ||
305 | - vmovdqa _lens+1*16(state), %xmm1 | ||
306 | + vmovdqu _lens(state), %xmm0 | ||
307 | + vmovdqu _lens+1*16(state), %xmm1 | ||
308 | |||
309 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | ||
310 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | ||
311 | diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile | ||
312 | index 836877e2da22..cdf82492b770 100644 | ||
313 | --- a/arch/x86/kernel/cpu/Makefile | ||
314 | +++ b/arch/x86/kernel/cpu/Makefile | ||
315 | @@ -21,7 +21,7 @@ obj-y += common.o | ||
316 | obj-y += rdrand.o | ||
317 | obj-y += match.o | ||
318 | obj-y += bugs.o | ||
319 | -obj-y += aperfmperf.o | ||
320 | +obj-$(CONFIG_CPU_FREQ) += aperfmperf.o | ||
321 | |||
322 | obj-$(CONFIG_PROC_FS) += proc.o | ||
323 | obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o | ||
324 | diff --git a/arch/x86/kernel/cpu/aperfmperf.c b/arch/x86/kernel/cpu/aperfmperf.c | ||
325 | index 957813e0180d..0ee83321a313 100644 | ||
326 | --- a/arch/x86/kernel/cpu/aperfmperf.c | ||
327 | +++ b/arch/x86/kernel/cpu/aperfmperf.c | ||
328 | @@ -42,6 +42,10 @@ static void aperfmperf_snapshot_khz(void *dummy) | ||
329 | s64 time_delta = ktime_ms_delta(now, s->time); | ||
330 | unsigned long flags; | ||
331 | |||
332 | + /* Don't bother re-computing within the cache threshold time. */ | ||
333 | + if (time_delta < APERFMPERF_CACHE_THRESHOLD_MS) | ||
334 | + return; | ||
335 | + | ||
336 | local_irq_save(flags); | ||
337 | rdmsrl(MSR_IA32_APERF, aperf); | ||
338 | rdmsrl(MSR_IA32_MPERF, mperf); | ||
339 | @@ -70,7 +74,6 @@ static void aperfmperf_snapshot_khz(void *dummy) | ||
340 | |||
341 | unsigned int arch_freq_get_on_cpu(int cpu) | ||
342 | { | ||
343 | - s64 time_delta; | ||
344 | unsigned int khz; | ||
345 | |||
346 | if (!cpu_khz) | ||
347 | @@ -79,12 +82,6 @@ unsigned int arch_freq_get_on_cpu(int cpu) | ||
348 | if (!static_cpu_has(X86_FEATURE_APERFMPERF)) | ||
349 | return 0; | ||
350 | |||
351 | - /* Don't bother re-computing within the cache threshold time. */ | ||
352 | - time_delta = ktime_ms_delta(ktime_get(), per_cpu(samples.time, cpu)); | ||
353 | - khz = per_cpu(samples.khz, cpu); | ||
354 | - if (khz && time_delta < APERFMPERF_CACHE_THRESHOLD_MS) | ||
355 | - return khz; | ||
356 | - | ||
357 | smp_call_function_single(cpu, aperfmperf_snapshot_khz, NULL, 1); | ||
358 | khz = per_cpu(samples.khz, cpu); | ||
359 | if (khz) | ||
360 | diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c | ||
361 | index 510e69596278..6df621ae62a7 100644 | ||
362 | --- a/arch/x86/kernel/cpu/proc.c | ||
363 | +++ b/arch/x86/kernel/cpu/proc.c | ||
364 | @@ -77,10 +77,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | ||
365 | seq_printf(m, "microcode\t: 0x%x\n", c->microcode); | ||
366 | |||
367 | if (cpu_has(c, X86_FEATURE_TSC)) { | ||
368 | - unsigned int freq = arch_freq_get_on_cpu(cpu); | ||
369 | + unsigned int freq = cpufreq_quick_get(cpu); | ||
370 | |||
371 | - if (!freq) | ||
372 | - freq = cpufreq_quick_get(cpu); | ||
373 | if (!freq) | ||
374 | freq = cpu_khz; | ||
375 | seq_printf(m, "cpu MHz\t\t: %u.%03u\n", | ||
376 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c | ||
377 | index 54b9e89d4d6b..893fd8c849e2 100644 | ||
378 | --- a/arch/x86/kernel/smpboot.c | ||
379 | +++ b/arch/x86/kernel/smpboot.c | ||
380 | @@ -193,6 +193,12 @@ static void smp_callin(void) | ||
381 | */ | ||
382 | smp_store_cpu_info(cpuid); | ||
383 | |||
384 | + /* | ||
385 | + * The topology information must be up to date before | ||
386 | + * calibrate_delay() and notify_cpu_starting(). | ||
387 | + */ | ||
388 | + set_cpu_sibling_map(raw_smp_processor_id()); | ||
389 | + | ||
390 | /* | ||
391 | * Get our bogomips. | ||
392 | * Update loops_per_jiffy in cpu_data. Previous call to | ||
393 | @@ -203,11 +209,6 @@ static void smp_callin(void) | ||
394 | cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy; | ||
395 | pr_debug("Stack at about %p\n", &cpuid); | ||
396 | |||
397 | - /* | ||
398 | - * This must be done before setting cpu_online_mask | ||
399 | - * or calling notify_cpu_starting. | ||
400 | - */ | ||
401 | - set_cpu_sibling_map(raw_smp_processor_id()); | ||
402 | wmb(); | ||
403 | |||
404 | notify_cpu_starting(cpuid); | ||
405 | diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c | ||
406 | index bf54309b85da..b2157d4a5338 100644 | ||
407 | --- a/arch/x86/kernel/traps.c | ||
408 | +++ b/arch/x86/kernel/traps.c | ||
409 | @@ -221,9 +221,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, | ||
410 | if (fixup_exception(regs, trapnr)) | ||
411 | return 0; | ||
412 | |||
413 | - if (fixup_bug(regs, trapnr)) | ||
414 | - return 0; | ||
415 | - | ||
416 | tsk->thread.error_code = error_code; | ||
417 | tsk->thread.trap_nr = trapnr; | ||
418 | die(str, regs, error_code); | ||
419 | @@ -304,6 +301,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str, | ||
420 | |||
421 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); | ||
422 | |||
423 | + /* | ||
424 | + * WARN*()s end up here; fix them up before we call the | ||
425 | + * notifier chain. | ||
426 | + */ | ||
427 | + if (!user_mode(regs) && fixup_bug(regs, trapnr)) | ||
428 | + return; | ||
429 | + | ||
430 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != | ||
431 | NOTIFY_STOP) { | ||
432 | cond_local_irq_enable(regs); | ||
433 | diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c | ||
434 | index 796d96bb0821..ad2b925a808e 100644 | ||
435 | --- a/arch/x86/kernel/tsc.c | ||
436 | +++ b/arch/x86/kernel/tsc.c | ||
437 | @@ -1346,12 +1346,10 @@ void __init tsc_init(void) | ||
438 | unsigned long calibrate_delay_is_known(void) | ||
439 | { | ||
440 | int sibling, cpu = smp_processor_id(); | ||
441 | - struct cpumask *mask = topology_core_cpumask(cpu); | ||
442 | + int constant_tsc = cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC); | ||
443 | + const struct cpumask *mask = topology_core_cpumask(cpu); | ||
444 | |||
445 | - if (!tsc_disabled && !cpu_has(&cpu_data(cpu), X86_FEATURE_CONSTANT_TSC)) | ||
446 | - return 0; | ||
447 | - | ||
448 | - if (!mask) | ||
449 | + if (tsc_disabled || !constant_tsc || !mask) | ||
450 | return 0; | ||
451 | |||
452 | sibling = cpumask_any_but(mask, cpu); | ||
453 | diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c | ||
454 | index 350f7096baac..7913b6921959 100644 | ||
455 | --- a/arch/x86/oprofile/op_model_ppro.c | ||
456 | +++ b/arch/x86/oprofile/op_model_ppro.c | ||
457 | @@ -212,8 +212,8 @@ static void arch_perfmon_setup_counters(void) | ||
458 | eax.full = cpuid_eax(0xa); | ||
459 | |||
460 | /* Workaround for BIOS bugs in 6/15. Taken from perfmon2 */ | ||
461 | - if (eax.split.version_id == 0 && __this_cpu_read(cpu_info.x86) == 6 && | ||
462 | - __this_cpu_read(cpu_info.x86_model) == 15) { | ||
463 | + if (eax.split.version_id == 0 && boot_cpu_data.x86 == 6 && | ||
464 | + boot_cpu_data.x86_model == 15) { | ||
465 | eax.split.version_id = 2; | ||
466 | eax.split.num_counters = 2; | ||
467 | eax.split.bit_width = 40; | ||
468 | diff --git a/crypto/ccm.c b/crypto/ccm.c | ||
469 | index 1ce37ae0ce56..0a083342ec8c 100644 | ||
470 | --- a/crypto/ccm.c | ||
471 | +++ b/crypto/ccm.c | ||
472 | @@ -363,7 +363,7 @@ static int crypto_ccm_decrypt(struct aead_request *req) | ||
473 | unsigned int cryptlen = req->cryptlen; | ||
474 | u8 *authtag = pctx->auth_tag; | ||
475 | u8 *odata = pctx->odata; | ||
476 | - u8 *iv = req->iv; | ||
477 | + u8 *iv = pctx->idata; | ||
478 | int err; | ||
479 | |||
480 | cryptlen -= authsize; | ||
481 | @@ -379,6 +379,8 @@ static int crypto_ccm_decrypt(struct aead_request *req) | ||
482 | if (req->src != req->dst) | ||
483 | dst = pctx->dst; | ||
484 | |||
485 | + memcpy(iv, req->iv, 16); | ||
486 | + | ||
487 | skcipher_request_set_tfm(skreq, ctx->ctr); | ||
488 | skcipher_request_set_callback(skreq, pctx->flags, | ||
489 | crypto_ccm_decrypt_done, req); | ||
490 | diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c | ||
491 | index 9c941947a063..3a3cb8624f41 100644 | ||
492 | --- a/drivers/acpi/acpica/evgpeblk.c | ||
493 | +++ b/drivers/acpi/acpica/evgpeblk.c | ||
494 | @@ -440,9 +440,11 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
495 | void *ignored) | ||
496 | { | ||
497 | acpi_status status; | ||
498 | + acpi_event_status event_status; | ||
499 | struct acpi_gpe_event_info *gpe_event_info; | ||
500 | u32 gpe_enabled_count; | ||
501 | u32 gpe_index; | ||
502 | + u32 gpe_number; | ||
503 | u32 i; | ||
504 | u32 j; | ||
505 | |||
506 | @@ -470,30 +472,40 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
507 | |||
508 | gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j; | ||
509 | gpe_event_info = &gpe_block->event_info[gpe_index]; | ||
510 | + gpe_number = gpe_block->block_base_number + gpe_index; | ||
511 | |||
512 | /* | ||
513 | * Ignore GPEs that have no corresponding _Lxx/_Exx method | ||
514 | - * and GPEs that are used to wake the system | ||
515 | + * and GPEs that are used for wakeup | ||
516 | */ | ||
517 | - if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
518 | - ACPI_GPE_DISPATCH_NONE) | ||
519 | - || (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
520 | - ACPI_GPE_DISPATCH_HANDLER) | ||
521 | - || (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
522 | - ACPI_GPE_DISPATCH_RAW_HANDLER) | ||
523 | + if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != | ||
524 | + ACPI_GPE_DISPATCH_METHOD) | ||
525 | || (gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { | ||
526 | continue; | ||
527 | } | ||
528 | |||
529 | + event_status = 0; | ||
530 | + (void)acpi_hw_get_gpe_status(gpe_event_info, | ||
531 | + &event_status); | ||
532 | + | ||
533 | status = acpi_ev_add_gpe_reference(gpe_event_info); | ||
534 | if (ACPI_FAILURE(status)) { | ||
535 | ACPI_EXCEPTION((AE_INFO, status, | ||
536 | "Could not enable GPE 0x%02X", | ||
537 | - gpe_index + | ||
538 | - gpe_block->block_base_number)); | ||
539 | + gpe_number)); | ||
540 | continue; | ||
541 | } | ||
542 | |||
543 | + gpe_event_info->flags |= ACPI_GPE_AUTO_ENABLED; | ||
544 | + | ||
545 | + if (event_status & ACPI_EVENT_FLAG_STATUS_SET) { | ||
546 | + ACPI_INFO(("GPE 0x%02X active on init", | ||
547 | + gpe_number)); | ||
548 | + (void)acpi_ev_gpe_dispatch(gpe_block->node, | ||
549 | + gpe_event_info, | ||
550 | + gpe_number); | ||
551 | + } | ||
552 | + | ||
553 | gpe_enabled_count++; | ||
554 | } | ||
555 | } | ||
556 | diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c | ||
557 | index 57718a3e029a..67c7c4ce276c 100644 | ||
558 | --- a/drivers/acpi/acpica/evxfgpe.c | ||
559 | +++ b/drivers/acpi/acpica/evxfgpe.c | ||
560 | @@ -435,6 +435,14 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device, | ||
561 | */ | ||
562 | gpe_event_info->flags = | ||
563 | (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED); | ||
564 | + } else if (gpe_event_info->flags & ACPI_GPE_AUTO_ENABLED) { | ||
565 | + /* | ||
566 | + * A reference to this GPE has been added during the GPE block | ||
567 | + * initialization, so drop it now to prevent the GPE from being | ||
568 | + * permanently enabled and clear its ACPI_GPE_AUTO_ENABLED flag. | ||
569 | + */ | ||
570 | + (void)acpi_ev_remove_gpe_reference(gpe_event_info); | ||
571 | + gpe_event_info->flags &= ~ACPI_GPE_AUTO_ENABLED; | ||
572 | } | ||
573 | |||
574 | /* | ||
575 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
576 | index 70fd5502c284..b7bdf9d0f5c0 100644 | ||
577 | --- a/drivers/acpi/scan.c | ||
578 | +++ b/drivers/acpi/scan.c | ||
579 | @@ -2058,6 +2058,9 @@ int __init acpi_scan_init(void) | ||
580 | acpi_get_spcr_uart_addr(); | ||
581 | } | ||
582 | |||
583 | + acpi_gpe_apply_masked_gpes(); | ||
584 | + acpi_update_all_gpes(); | ||
585 | + | ||
586 | mutex_lock(&acpi_scan_lock); | ||
587 | /* | ||
588 | * Enumerate devices in the ACPI namespace. | ||
589 | @@ -2082,9 +2085,6 @@ int __init acpi_scan_init(void) | ||
590 | } | ||
591 | } | ||
592 | |||
593 | - acpi_gpe_apply_masked_gpes(); | ||
594 | - acpi_update_all_gpes(); | ||
595 | - | ||
596 | acpi_scan_initialized = true; | ||
597 | |||
598 | out: | ||
599 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c | ||
600 | index fa8243c5c062..59b78e42a58b 100644 | ||
601 | --- a/drivers/acpi/sleep.c | ||
602 | +++ b/drivers/acpi/sleep.c | ||
603 | @@ -160,6 +160,14 @@ static int __init init_nvs_nosave(const struct dmi_system_id *d) | ||
604 | return 0; | ||
605 | } | ||
606 | |||
607 | +static bool acpi_sleep_no_lps0; | ||
608 | + | ||
609 | +static int __init init_no_lps0(const struct dmi_system_id *d) | ||
610 | +{ | ||
611 | + acpi_sleep_no_lps0 = true; | ||
612 | + return 0; | ||
613 | +} | ||
614 | + | ||
615 | static struct dmi_system_id acpisleep_dmi_table[] __initdata = { | ||
616 | { | ||
617 | .callback = init_old_suspend_ordering, | ||
618 | @@ -343,6 +351,19 @@ static struct dmi_system_id acpisleep_dmi_table[] __initdata = { | ||
619 | DMI_MATCH(DMI_PRODUCT_NAME, "80E3"), | ||
620 | }, | ||
621 | }, | ||
622 | + /* | ||
623 | + * https://bugzilla.kernel.org/show_bug.cgi?id=196907 | ||
624 | + * Some Dell XPS13 9360 cannot do suspend-to-idle using the Low Power | ||
625 | + * S0 Idle firmware interface. | ||
626 | + */ | ||
627 | + { | ||
628 | + .callback = init_no_lps0, | ||
629 | + .ident = "Dell XPS13 9360", | ||
630 | + .matches = { | ||
631 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
632 | + DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9360"), | ||
633 | + }, | ||
634 | + }, | ||
635 | {}, | ||
636 | }; | ||
637 | |||
638 | @@ -485,6 +506,7 @@ static void acpi_pm_end(void) | ||
639 | } | ||
640 | #else /* !CONFIG_ACPI_SLEEP */ | ||
641 | #define acpi_target_sleep_state ACPI_STATE_S0 | ||
642 | +#define acpi_sleep_no_lps0 (false) | ||
643 | static inline void acpi_sleep_dmi_check(void) {} | ||
644 | #endif /* CONFIG_ACPI_SLEEP */ | ||
645 | |||
646 | @@ -702,6 +724,12 @@ static int lps0_device_attach(struct acpi_device *adev, | ||
647 | if (lps0_device_handle) | ||
648 | return 0; | ||
649 | |||
650 | + if (acpi_sleep_no_lps0) { | ||
651 | + acpi_handle_info(adev->handle, | ||
652 | + "Low Power S0 Idle interface disabled\n"); | ||
653 | + return 0; | ||
654 | + } | ||
655 | + | ||
656 | if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) | ||
657 | return 0; | ||
658 | |||
659 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
660 | index b008b6a98098..cf54a1cf8c55 100644 | ||
661 | --- a/drivers/block/rbd.c | ||
662 | +++ b/drivers/block/rbd.c | ||
663 | @@ -2692,7 +2692,7 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request) | ||
664 | * from the parent. | ||
665 | */ | ||
666 | page_count = (u32)calc_pages_for(0, length); | ||
667 | - pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); | ||
668 | + pages = ceph_alloc_page_vector(page_count, GFP_NOIO); | ||
669 | if (IS_ERR(pages)) { | ||
670 | result = PTR_ERR(pages); | ||
671 | pages = NULL; | ||
672 | @@ -2827,7 +2827,7 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) | ||
673 | */ | ||
674 | size = sizeof (__le64) + sizeof (__le32) + sizeof (__le32); | ||
675 | page_count = (u32)calc_pages_for(0, size); | ||
676 | - pages = ceph_alloc_page_vector(page_count, GFP_KERNEL); | ||
677 | + pages = ceph_alloc_page_vector(page_count, GFP_NOIO); | ||
678 | if (IS_ERR(pages)) { | ||
679 | ret = PTR_ERR(pages); | ||
680 | goto fail_stat_request; | ||
681 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
682 | index 4436d53ae16c..f160a66b7098 100644 | ||
683 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
684 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
685 | @@ -722,7 +722,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
686 | * allocation taken by fbdev | ||
687 | */ | ||
688 | if (!(dev_priv->capabilities & SVGA_CAP_3D)) | ||
689 | - mem_size *= 2; | ||
690 | + mem_size *= 3; | ||
691 | |||
692 | dev_priv->max_mob_pages = mem_size * 1024 / PAGE_SIZE; | ||
693 | dev_priv->prim_bb_mem = | ||
694 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c | ||
695 | index a6b762271a40..47a9696e7874 100644 | ||
696 | --- a/drivers/input/mouse/elan_i2c_core.c | ||
697 | +++ b/drivers/input/mouse/elan_i2c_core.c | ||
698 | @@ -1253,6 +1253,7 @@ static const struct acpi_device_id elan_acpi_id[] = { | ||
699 | { "ELAN0605", 0 }, | ||
700 | { "ELAN0609", 0 }, | ||
701 | { "ELAN060B", 0 }, | ||
702 | + { "ELAN060C", 0 }, | ||
703 | { "ELAN0611", 0 }, | ||
704 | { "ELAN1000", 0 }, | ||
705 | { } | ||
706 | diff --git a/drivers/net/can/c_can/c_can_pci.c b/drivers/net/can/c_can/c_can_pci.c | ||
707 | index cf7c18947189..d065c0e2d18e 100644 | ||
708 | --- a/drivers/net/can/c_can/c_can_pci.c | ||
709 | +++ b/drivers/net/can/c_can/c_can_pci.c | ||
710 | @@ -178,7 +178,6 @@ static int c_can_pci_probe(struct pci_dev *pdev, | ||
711 | break; | ||
712 | case BOSCH_D_CAN: | ||
713 | priv->regs = reg_map_d_can; | ||
714 | - priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
715 | break; | ||
716 | default: | ||
717 | ret = -EINVAL; | ||
718 | diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c | ||
719 | index e36d10520e24..717530eac70c 100644 | ||
720 | --- a/drivers/net/can/c_can/c_can_platform.c | ||
721 | +++ b/drivers/net/can/c_can/c_can_platform.c | ||
722 | @@ -320,7 +320,6 @@ static int c_can_plat_probe(struct platform_device *pdev) | ||
723 | break; | ||
724 | case BOSCH_D_CAN: | ||
725 | priv->regs = reg_map_d_can; | ||
726 | - priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; | ||
727 | priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; | ||
728 | priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; | ||
729 | priv->read_reg32 = d_can_plat_read_reg32; | ||
730 | diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
731 | index 4d1fe8d95042..2772d05ff11c 100644 | ||
732 | --- a/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
733 | +++ b/drivers/net/can/ifi_canfd/ifi_canfd.c | ||
734 | @@ -670,9 +670,9 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev) | ||
735 | priv->base + IFI_CANFD_FTIME); | ||
736 | |||
737 | /* Configure transmitter delay */ | ||
738 | - tdc = (dbt->brp * (dbt->phase_seg1 + 1)) & IFI_CANFD_TDELAY_MASK; | ||
739 | - writel(IFI_CANFD_TDELAY_EN | IFI_CANFD_TDELAY_ABS | tdc, | ||
740 | - priv->base + IFI_CANFD_TDELAY); | ||
741 | + tdc = dbt->brp * (dbt->prop_seg + dbt->phase_seg1); | ||
742 | + tdc &= IFI_CANFD_TDELAY_MASK; | ||
743 | + writel(IFI_CANFD_TDELAY_EN | tdc, priv->base + IFI_CANFD_TDELAY); | ||
744 | } | ||
745 | |||
746 | static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id, | ||
747 | diff --git a/drivers/net/can/peak_canfd/peak_pciefd_main.c b/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
748 | index 51c2d182a33a..b4efd711f824 100644 | ||
749 | --- a/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
750 | +++ b/drivers/net/can/peak_canfd/peak_pciefd_main.c | ||
751 | @@ -29,14 +29,19 @@ | ||
752 | #include "peak_canfd_user.h" | ||
753 | |||
754 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
755 | -MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCIe FD family cards"); | ||
756 | -MODULE_SUPPORTED_DEVICE("PEAK PCAN PCIe FD CAN cards"); | ||
757 | +MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCIe/M.2 FD family cards"); | ||
758 | +MODULE_SUPPORTED_DEVICE("PEAK PCAN PCIe/M.2 FD CAN cards"); | ||
759 | MODULE_LICENSE("GPL v2"); | ||
760 | |||
761 | #define PCIEFD_DRV_NAME "peak_pciefd" | ||
762 | |||
763 | #define PEAK_PCI_VENDOR_ID 0x001c /* The PCI device and vendor IDs */ | ||
764 | #define PEAK_PCIEFD_ID 0x0013 /* for PCIe slot cards */ | ||
765 | +#define PCAN_CPCIEFD_ID 0x0014 /* for Compact-PCI Serial slot cards */ | ||
766 | +#define PCAN_PCIE104FD_ID 0x0017 /* for PCIe-104 Express slot cards */ | ||
767 | +#define PCAN_MINIPCIEFD_ID 0x0018 /* for mini-PCIe slot cards */ | ||
768 | +#define PCAN_PCIEFD_OEM_ID 0x0019 /* for PCIe slot OEM cards */ | ||
769 | +#define PCAN_M2_ID 0x001a /* for M2 slot cards */ | ||
770 | |||
771 | /* PEAK PCIe board access description */ | ||
772 | #define PCIEFD_BAR0_SIZE (64 * 1024) | ||
773 | @@ -203,6 +208,11 @@ struct pciefd_board { | ||
774 | /* supported device ids. */ | ||
775 | static const struct pci_device_id peak_pciefd_tbl[] = { | ||
776 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
777 | + {PEAK_PCI_VENDOR_ID, PCAN_CPCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
778 | + {PEAK_PCI_VENDOR_ID, PCAN_PCIE104FD_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
779 | + {PEAK_PCI_VENDOR_ID, PCAN_MINIPCIEFD_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
780 | + {PEAK_PCI_VENDOR_ID, PCAN_PCIEFD_OEM_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
781 | + {PEAK_PCI_VENDOR_ID, PCAN_M2_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
782 | {0,} | ||
783 | }; | ||
784 | |||
785 | diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c | ||
786 | index b0c80859f746..1ac2090a1721 100644 | ||
787 | --- a/drivers/net/can/sun4i_can.c | ||
788 | +++ b/drivers/net/can/sun4i_can.c | ||
789 | @@ -539,6 +539,13 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) | ||
790 | } | ||
791 | stats->rx_over_errors++; | ||
792 | stats->rx_errors++; | ||
793 | + | ||
794 | + /* reset the CAN IP by entering reset mode | ||
795 | + * ignoring timeout error | ||
796 | + */ | ||
797 | + set_reset_mode(dev); | ||
798 | + set_normal_mode(dev); | ||
799 | + | ||
800 | /* clear bit */ | ||
801 | sun4i_can_write_cmdreg(priv, SUN4I_CMD_CLEAR_OR_FLAG); | ||
802 | } | ||
803 | @@ -653,8 +660,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id) | ||
804 | netif_wake_queue(dev); | ||
805 | can_led_event(dev, CAN_LED_EVENT_TX); | ||
806 | } | ||
807 | - if (isrc & SUN4I_INT_RBUF_VLD) { | ||
808 | - /* receive interrupt */ | ||
809 | + if ((isrc & SUN4I_INT_RBUF_VLD) && | ||
810 | + !(isrc & SUN4I_INT_DATA_OR)) { | ||
811 | + /* receive interrupt - don't read if overrun occurred */ | ||
812 | while (status & SUN4I_STA_RBUF_RDY) { | ||
813 | /* RX buffer is not empty */ | ||
814 | sun4i_can_rx(dev); | ||
815 | diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h | ||
816 | index 2fcbaec8b368..71eddf645566 100644 | ||
817 | --- a/include/acpi/actypes.h | ||
818 | +++ b/include/acpi/actypes.h | ||
819 | @@ -775,7 +775,7 @@ typedef u32 acpi_event_status; | ||
820 | * | | | | +-- Type of dispatch:to method, handler, notify, or none | ||
821 | * | | | +----- Interrupt type: edge or level triggered | ||
822 | * | | +------- Is a Wake GPE | ||
823 | - * | +--------- Is GPE masked by the software GPE masking mechanism | ||
824 | + * | +--------- Has been enabled automatically at init time | ||
825 | * +------------ <Reserved> | ||
826 | */ | ||
827 | #define ACPI_GPE_DISPATCH_NONE (u8) 0x00 | ||
828 | @@ -791,6 +791,7 @@ typedef u32 acpi_event_status; | ||
829 | #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x08 | ||
830 | |||
831 | #define ACPI_GPE_CAN_WAKE (u8) 0x10 | ||
832 | +#define ACPI_GPE_AUTO_ENABLED (u8) 0x20 | ||
833 | |||
834 | /* | ||
835 | * Flags for GPE and Lock interfaces | ||
836 | diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h | ||
837 | index 48407569585d..a7c2cee39570 100644 | ||
838 | --- a/include/net/netfilter/nf_conntrack.h | ||
839 | +++ b/include/net/netfilter/nf_conntrack.h | ||
840 | @@ -17,7 +17,6 @@ | ||
841 | #include <linux/bitops.h> | ||
842 | #include <linux/compiler.h> | ||
843 | #include <linux/atomic.h> | ||
844 | -#include <linux/rhashtable.h> | ||
845 | |||
846 | #include <linux/netfilter/nf_conntrack_tcp.h> | ||
847 | #include <linux/netfilter/nf_conntrack_dccp.h> | ||
848 | @@ -83,7 +82,7 @@ struct nf_conn { | ||
849 | possible_net_t ct_net; | ||
850 | |||
851 | #if IS_ENABLED(CONFIG_NF_NAT) | ||
852 | - struct rhlist_head nat_bysource; | ||
853 | + struct hlist_node nat_bysource; | ||
854 | #endif | ||
855 | /* all members below initialized via memset */ | ||
856 | u8 __nfct_init_offset[0]; | ||
857 | diff --git a/include/net/netfilter/nf_nat.h b/include/net/netfilter/nf_nat.h | ||
858 | index 05c82a1a4267..b71701302e61 100644 | ||
859 | --- a/include/net/netfilter/nf_nat.h | ||
860 | +++ b/include/net/netfilter/nf_nat.h | ||
861 | @@ -1,6 +1,5 @@ | ||
862 | #ifndef _NF_NAT_H | ||
863 | #define _NF_NAT_H | ||
864 | -#include <linux/rhashtable.h> | ||
865 | #include <linux/netfilter_ipv4.h> | ||
866 | #include <linux/netfilter/nf_nat.h> | ||
867 | #include <net/netfilter/nf_conntrack_tuple.h> | ||
868 | diff --git a/include/sound/seq_kernel.h b/include/sound/seq_kernel.h | ||
869 | index feb58d455560..4b9ee3009aa0 100644 | ||
870 | --- a/include/sound/seq_kernel.h | ||
871 | +++ b/include/sound/seq_kernel.h | ||
872 | @@ -49,7 +49,8 @@ typedef union snd_seq_timestamp snd_seq_timestamp_t; | ||
873 | #define SNDRV_SEQ_DEFAULT_CLIENT_EVENTS 200 | ||
874 | |||
875 | /* max delivery path length */ | ||
876 | -#define SNDRV_SEQ_MAX_HOPS 10 | ||
877 | +/* NOTE: this shouldn't be greater than MAX_LOCKDEP_SUBCLASSES */ | ||
878 | +#define SNDRV_SEQ_MAX_HOPS 8 | ||
879 | |||
880 | /* max size of event size */ | ||
881 | #define SNDRV_SEQ_MAX_EVENT_LEN 0x3fffffff | ||
882 | diff --git a/include/sound/timer.h b/include/sound/timer.h | ||
883 | index c4d76ff056c6..7ae226ab6990 100644 | ||
884 | --- a/include/sound/timer.h | ||
885 | +++ b/include/sound/timer.h | ||
886 | @@ -90,6 +90,8 @@ struct snd_timer { | ||
887 | struct list_head ack_list_head; | ||
888 | struct list_head sack_list_head; /* slow ack list head */ | ||
889 | struct tasklet_struct task_queue; | ||
890 | + int max_instances; /* upper limit of timer instances */ | ||
891 | + int num_instances; /* current number of timer instances */ | ||
892 | }; | ||
893 | |||
894 | struct snd_timer_instance { | ||
895 | diff --git a/kernel/workqueue_internal.h b/kernel/workqueue_internal.h | ||
896 | index 8635417c587b..29fa81f0f51a 100644 | ||
897 | --- a/kernel/workqueue_internal.h | ||
898 | +++ b/kernel/workqueue_internal.h | ||
899 | @@ -9,6 +9,7 @@ | ||
900 | |||
901 | #include <linux/workqueue.h> | ||
902 | #include <linux/kthread.h> | ||
903 | +#include <linux/preempt.h> | ||
904 | |||
905 | struct worker_pool; | ||
906 | |||
907 | @@ -59,7 +60,7 @@ struct worker { | ||
908 | */ | ||
909 | static inline struct worker *current_wq_worker(void) | ||
910 | { | ||
911 | - if (current->flags & PF_WQ_WORKER) | ||
912 | + if (in_task() && (current->flags & PF_WQ_WORKER)) | ||
913 | return kthread_data(current); | ||
914 | return NULL; | ||
915 | } | ||
916 | diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c | ||
917 | index fef5d2e114be..1ef0cec38d78 100644 | ||
918 | --- a/lib/asn1_decoder.c | ||
919 | +++ b/lib/asn1_decoder.c | ||
920 | @@ -228,7 +228,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder, | ||
921 | hdr = 2; | ||
922 | |||
923 | /* Extract a tag from the data */ | ||
924 | - if (unlikely(dp >= datalen - 1)) | ||
925 | + if (unlikely(datalen - dp < 2)) | ||
926 | goto data_overrun_error; | ||
927 | tag = data[dp++]; | ||
928 | if (unlikely((tag & 0x1f) == ASN1_LONG_TAG)) | ||
929 | @@ -274,7 +274,7 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder, | ||
930 | int n = len - 0x80; | ||
931 | if (unlikely(n > 2)) | ||
932 | goto length_too_long; | ||
933 | - if (unlikely(dp >= datalen - n)) | ||
934 | + if (unlikely(n > datalen - dp)) | ||
935 | goto data_overrun_error; | ||
936 | hdr += n; | ||
937 | for (len = 0; n > 0; n--) { | ||
938 | diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c | ||
939 | index b1d3740ae36a..2fb80a4bfb34 100644 | ||
940 | --- a/net/netfilter/nf_nat_core.c | ||
941 | +++ b/net/netfilter/nf_nat_core.c | ||
942 | @@ -30,19 +30,17 @@ | ||
943 | #include <net/netfilter/nf_conntrack_zones.h> | ||
944 | #include <linux/netfilter/nf_nat.h> | ||
945 | |||
946 | +static DEFINE_SPINLOCK(nf_nat_lock); | ||
947 | + | ||
948 | static DEFINE_MUTEX(nf_nat_proto_mutex); | ||
949 | static const struct nf_nat_l3proto __rcu *nf_nat_l3protos[NFPROTO_NUMPROTO] | ||
950 | __read_mostly; | ||
951 | static const struct nf_nat_l4proto __rcu **nf_nat_l4protos[NFPROTO_NUMPROTO] | ||
952 | __read_mostly; | ||
953 | |||
954 | -struct nf_nat_conn_key { | ||
955 | - const struct net *net; | ||
956 | - const struct nf_conntrack_tuple *tuple; | ||
957 | - const struct nf_conntrack_zone *zone; | ||
958 | -}; | ||
959 | - | ||
960 | -static struct rhltable nf_nat_bysource_table; | ||
961 | +static struct hlist_head *nf_nat_bysource __read_mostly; | ||
962 | +static unsigned int nf_nat_htable_size __read_mostly; | ||
963 | +static unsigned int nf_nat_hash_rnd __read_mostly; | ||
964 | |||
965 | inline const struct nf_nat_l3proto * | ||
966 | __nf_nat_l3proto_find(u8 family) | ||
967 | @@ -118,17 +116,19 @@ int nf_xfrm_me_harder(struct net *net, struct sk_buff *skb, unsigned int family) | ||
968 | EXPORT_SYMBOL(nf_xfrm_me_harder); | ||
969 | #endif /* CONFIG_XFRM */ | ||
970 | |||
971 | -static u32 nf_nat_bysource_hash(const void *data, u32 len, u32 seed) | ||
972 | +/* We keep an extra hash for each conntrack, for fast searching. */ | ||
973 | +static unsigned int | ||
974 | +hash_by_src(const struct net *n, const struct nf_conntrack_tuple *tuple) | ||
975 | { | ||
976 | - const struct nf_conntrack_tuple *t; | ||
977 | - const struct nf_conn *ct = data; | ||
978 | + unsigned int hash; | ||
979 | + | ||
980 | + get_random_once(&nf_nat_hash_rnd, sizeof(nf_nat_hash_rnd)); | ||
981 | |||
982 | - t = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple; | ||
983 | /* Original src, to ensure we map it consistently if poss. */ | ||
984 | + hash = jhash2((u32 *)&tuple->src, sizeof(tuple->src) / sizeof(u32), | ||
985 | + tuple->dst.protonum ^ nf_nat_hash_rnd ^ net_hash_mix(n)); | ||
986 | |||
987 | - seed ^= net_hash_mix(nf_ct_net(ct)); | ||
988 | - return jhash2((const u32 *)&t->src, sizeof(t->src) / sizeof(u32), | ||
989 | - t->dst.protonum ^ seed); | ||
990 | + return reciprocal_scale(hash, nf_nat_htable_size); | ||
991 | } | ||
992 | |||
993 | /* Is this tuple already taken? (not by us) */ | ||
994 | @@ -184,28 +184,6 @@ same_src(const struct nf_conn *ct, | ||
995 | t->src.u.all == tuple->src.u.all); | ||
996 | } | ||
997 | |||
998 | -static int nf_nat_bysource_cmp(struct rhashtable_compare_arg *arg, | ||
999 | - const void *obj) | ||
1000 | -{ | ||
1001 | - const struct nf_nat_conn_key *key = arg->key; | ||
1002 | - const struct nf_conn *ct = obj; | ||
1003 | - | ||
1004 | - if (!same_src(ct, key->tuple) || | ||
1005 | - !net_eq(nf_ct_net(ct), key->net) || | ||
1006 | - !nf_ct_zone_equal(ct, key->zone, IP_CT_DIR_ORIGINAL)) | ||
1007 | - return 1; | ||
1008 | - | ||
1009 | - return 0; | ||
1010 | -} | ||
1011 | - | ||
1012 | -static struct rhashtable_params nf_nat_bysource_params = { | ||
1013 | - .head_offset = offsetof(struct nf_conn, nat_bysource), | ||
1014 | - .obj_hashfn = nf_nat_bysource_hash, | ||
1015 | - .obj_cmpfn = nf_nat_bysource_cmp, | ||
1016 | - .nelem_hint = 256, | ||
1017 | - .min_size = 1024, | ||
1018 | -}; | ||
1019 | - | ||
1020 | /* Only called for SRC manip */ | ||
1021 | static int | ||
1022 | find_appropriate_src(struct net *net, | ||
1023 | @@ -216,26 +194,22 @@ find_appropriate_src(struct net *net, | ||
1024 | struct nf_conntrack_tuple *result, | ||
1025 | const struct nf_nat_range *range) | ||
1026 | { | ||
1027 | + unsigned int h = hash_by_src(net, tuple); | ||
1028 | const struct nf_conn *ct; | ||
1029 | - struct nf_nat_conn_key key = { | ||
1030 | - .net = net, | ||
1031 | - .tuple = tuple, | ||
1032 | - .zone = zone | ||
1033 | - }; | ||
1034 | - struct rhlist_head *hl, *h; | ||
1035 | - | ||
1036 | - hl = rhltable_lookup(&nf_nat_bysource_table, &key, | ||
1037 | - nf_nat_bysource_params); | ||
1038 | |||
1039 | - rhl_for_each_entry_rcu(ct, h, hl, nat_bysource) { | ||
1040 | - nf_ct_invert_tuplepr(result, | ||
1041 | - &ct->tuplehash[IP_CT_DIR_REPLY].tuple); | ||
1042 | - result->dst = tuple->dst; | ||
1043 | - | ||
1044 | - if (in_range(l3proto, l4proto, result, range)) | ||
1045 | - return 1; | ||
1046 | + hlist_for_each_entry_rcu(ct, &nf_nat_bysource[h], nat_bysource) { | ||
1047 | + if (same_src(ct, tuple) && | ||
1048 | + net_eq(net, nf_ct_net(ct)) && | ||
1049 | + nf_ct_zone_equal(ct, zone, IP_CT_DIR_ORIGINAL)) { | ||
1050 | + /* Copy source part from reply tuple. */ | ||
1051 | + nf_ct_invert_tuplepr(result, | ||
1052 | + &ct->tuplehash[IP_CT_DIR_REPLY].tuple); | ||
1053 | + result->dst = tuple->dst; | ||
1054 | + | ||
1055 | + if (in_range(l3proto, l4proto, result, range)) | ||
1056 | + return 1; | ||
1057 | + } | ||
1058 | } | ||
1059 | - | ||
1060 | return 0; | ||
1061 | } | ||
1062 | |||
1063 | @@ -408,6 +382,7 @@ nf_nat_setup_info(struct nf_conn *ct, | ||
1064 | const struct nf_nat_range *range, | ||
1065 | enum nf_nat_manip_type maniptype) | ||
1066 | { | ||
1067 | + struct net *net = nf_ct_net(ct); | ||
1068 | struct nf_conntrack_tuple curr_tuple, new_tuple; | ||
1069 | |||
1070 | /* Can't setup nat info for confirmed ct. */ | ||
1071 | @@ -447,19 +422,14 @@ nf_nat_setup_info(struct nf_conn *ct, | ||
1072 | } | ||
1073 | |||
1074 | if (maniptype == NF_NAT_MANIP_SRC) { | ||
1075 | - struct nf_nat_conn_key key = { | ||
1076 | - .net = nf_ct_net(ct), | ||
1077 | - .tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple, | ||
1078 | - .zone = nf_ct_zone(ct), | ||
1079 | - }; | ||
1080 | - int err; | ||
1081 | - | ||
1082 | - err = rhltable_insert_key(&nf_nat_bysource_table, | ||
1083 | - &key, | ||
1084 | - &ct->nat_bysource, | ||
1085 | - nf_nat_bysource_params); | ||
1086 | - if (err) | ||
1087 | - return NF_DROP; | ||
1088 | + unsigned int srchash; | ||
1089 | + | ||
1090 | + srchash = hash_by_src(net, | ||
1091 | + &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); | ||
1092 | + spin_lock_bh(&nf_nat_lock); | ||
1093 | + hlist_add_head_rcu(&ct->nat_bysource, | ||
1094 | + &nf_nat_bysource[srchash]); | ||
1095 | + spin_unlock_bh(&nf_nat_lock); | ||
1096 | } | ||
1097 | |||
1098 | /* It's done. */ | ||
1099 | @@ -568,8 +538,9 @@ static int nf_nat_proto_clean(struct nf_conn *ct, void *data) | ||
1100 | * will delete entry from already-freed table. | ||
1101 | */ | ||
1102 | clear_bit(IPS_SRC_NAT_DONE_BIT, &ct->status); | ||
1103 | - rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource, | ||
1104 | - nf_nat_bysource_params); | ||
1105 | + spin_lock_bh(&nf_nat_lock); | ||
1106 | + hlist_del_rcu(&ct->nat_bysource); | ||
1107 | + spin_unlock_bh(&nf_nat_lock); | ||
1108 | |||
1109 | /* don't delete conntrack. Although that would make things a lot | ||
1110 | * simpler, we'd end up flushing all conntracks on nat rmmod. | ||
1111 | @@ -697,9 +668,11 @@ EXPORT_SYMBOL_GPL(nf_nat_l3proto_unregister); | ||
1112 | /* No one using conntrack by the time this called. */ | ||
1113 | static void nf_nat_cleanup_conntrack(struct nf_conn *ct) | ||
1114 | { | ||
1115 | - if (ct->status & IPS_SRC_NAT_DONE) | ||
1116 | - rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource, | ||
1117 | - nf_nat_bysource_params); | ||
1118 | + if (ct->status & IPS_SRC_NAT_DONE) { | ||
1119 | + spin_lock_bh(&nf_nat_lock); | ||
1120 | + hlist_del_rcu(&ct->nat_bysource); | ||
1121 | + spin_unlock_bh(&nf_nat_lock); | ||
1122 | + } | ||
1123 | } | ||
1124 | |||
1125 | static struct nf_ct_ext_type nat_extend __read_mostly = { | ||
1126 | @@ -823,13 +796,16 @@ static int __init nf_nat_init(void) | ||
1127 | { | ||
1128 | int ret; | ||
1129 | |||
1130 | - ret = rhltable_init(&nf_nat_bysource_table, &nf_nat_bysource_params); | ||
1131 | - if (ret) | ||
1132 | - return ret; | ||
1133 | + /* Leave them the same for the moment. */ | ||
1134 | + nf_nat_htable_size = nf_conntrack_htable_size; | ||
1135 | + | ||
1136 | + nf_nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size, 0); | ||
1137 | + if (!nf_nat_bysource) | ||
1138 | + return -ENOMEM; | ||
1139 | |||
1140 | ret = nf_ct_extend_register(&nat_extend); | ||
1141 | if (ret < 0) { | ||
1142 | - rhltable_destroy(&nf_nat_bysource_table); | ||
1143 | + nf_ct_free_hashtable(nf_nat_bysource, nf_nat_htable_size); | ||
1144 | printk(KERN_ERR "nf_nat_core: Unable to register extension\n"); | ||
1145 | return ret; | ||
1146 | } | ||
1147 | @@ -863,8 +839,8 @@ static void __exit nf_nat_cleanup(void) | ||
1148 | |||
1149 | for (i = 0; i < NFPROTO_NUMPROTO; i++) | ||
1150 | kfree(nf_nat_l4protos[i]); | ||
1151 | - | ||
1152 | - rhltable_destroy(&nf_nat_bysource_table); | ||
1153 | + synchronize_net(); | ||
1154 | + nf_ct_free_hashtable(nf_nat_bysource, nf_nat_htable_size); | ||
1155 | } | ||
1156 | |||
1157 | MODULE_LICENSE("GPL"); | ||
1158 | diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c | ||
1159 | index 0fa01d772c5e..9c0d5a7ce5f9 100644 | ||
1160 | --- a/net/netfilter/nft_set_hash.c | ||
1161 | +++ b/net/netfilter/nft_set_hash.c | ||
1162 | @@ -643,7 +643,6 @@ nft_hash_select_ops(const struct nft_ctx *ctx, const struct nft_set_desc *desc, | ||
1163 | { | ||
1164 | if (desc->size) { | ||
1165 | switch (desc->klen) { | ||
1166 | - case 2: | ||
1167 | case 4: | ||
1168 | return &nft_hash_fast_ops; | ||
1169 | default: | ||
1170 | diff --git a/sound/core/hrtimer.c b/sound/core/hrtimer.c | ||
1171 | index 1ac0c423903e..6e47b823bcaa 100644 | ||
1172 | --- a/sound/core/hrtimer.c | ||
1173 | +++ b/sound/core/hrtimer.c | ||
1174 | @@ -159,6 +159,7 @@ static int __init snd_hrtimer_init(void) | ||
1175 | timer->hw = hrtimer_hw; | ||
1176 | timer->hw.resolution = resolution; | ||
1177 | timer->hw.ticks = NANO_SEC / resolution; | ||
1178 | + timer->max_instances = 100; /* lower the limit */ | ||
1179 | |||
1180 | err = snd_timer_global_register(timer); | ||
1181 | if (err < 0) { | ||
1182 | diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c | ||
1183 | index aaff9ee32695..b30b2139e3f0 100644 | ||
1184 | --- a/sound/core/seq/oss/seq_oss_midi.c | ||
1185 | +++ b/sound/core/seq/oss/seq_oss_midi.c | ||
1186 | @@ -612,9 +612,7 @@ send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq | ||
1187 | if (!dp->timer->running) | ||
1188 | len = snd_seq_oss_timer_start(dp->timer); | ||
1189 | if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { | ||
1190 | - if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) == SNDRV_SEQ_EVENT_LENGTH_VARIABLE) | ||
1191 | - snd_seq_oss_readq_puts(dp->readq, mdev->seq_device, | ||
1192 | - ev->data.ext.ptr, ev->data.ext.len); | ||
1193 | + snd_seq_oss_readq_sysex(dp->readq, mdev->seq_device, ev); | ||
1194 | } else { | ||
1195 | len = snd_midi_event_decode(mdev->coder, msg, sizeof(msg), ev); | ||
1196 | if (len > 0) | ||
1197 | diff --git a/sound/core/seq/oss/seq_oss_readq.c b/sound/core/seq/oss/seq_oss_readq.c | ||
1198 | index 046cb586fb2f..06b21226b4e7 100644 | ||
1199 | --- a/sound/core/seq/oss/seq_oss_readq.c | ||
1200 | +++ b/sound/core/seq/oss/seq_oss_readq.c | ||
1201 | @@ -117,6 +117,35 @@ snd_seq_oss_readq_puts(struct seq_oss_readq *q, int dev, unsigned char *data, in | ||
1202 | return 0; | ||
1203 | } | ||
1204 | |||
1205 | +/* | ||
1206 | + * put MIDI sysex bytes; the event buffer may be chained, thus it has | ||
1207 | + * to be expanded via snd_seq_dump_var_event(). | ||
1208 | + */ | ||
1209 | +struct readq_sysex_ctx { | ||
1210 | + struct seq_oss_readq *readq; | ||
1211 | + int dev; | ||
1212 | +}; | ||
1213 | + | ||
1214 | +static int readq_dump_sysex(void *ptr, void *buf, int count) | ||
1215 | +{ | ||
1216 | + struct readq_sysex_ctx *ctx = ptr; | ||
1217 | + | ||
1218 | + return snd_seq_oss_readq_puts(ctx->readq, ctx->dev, buf, count); | ||
1219 | +} | ||
1220 | + | ||
1221 | +int snd_seq_oss_readq_sysex(struct seq_oss_readq *q, int dev, | ||
1222 | + struct snd_seq_event *ev) | ||
1223 | +{ | ||
1224 | + struct readq_sysex_ctx ctx = { | ||
1225 | + .readq = q, | ||
1226 | + .dev = dev | ||
1227 | + }; | ||
1228 | + | ||
1229 | + if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) | ||
1230 | + return 0; | ||
1231 | + return snd_seq_dump_var_event(ev, readq_dump_sysex, &ctx); | ||
1232 | +} | ||
1233 | + | ||
1234 | /* | ||
1235 | * copy an event to input queue: | ||
1236 | * return zero if enqueued | ||
1237 | diff --git a/sound/core/seq/oss/seq_oss_readq.h b/sound/core/seq/oss/seq_oss_readq.h | ||
1238 | index f1463f1f449e..8d033ca2d23f 100644 | ||
1239 | --- a/sound/core/seq/oss/seq_oss_readq.h | ||
1240 | +++ b/sound/core/seq/oss/seq_oss_readq.h | ||
1241 | @@ -44,6 +44,8 @@ void snd_seq_oss_readq_delete(struct seq_oss_readq *q); | ||
1242 | void snd_seq_oss_readq_clear(struct seq_oss_readq *readq); | ||
1243 | unsigned int snd_seq_oss_readq_poll(struct seq_oss_readq *readq, struct file *file, poll_table *wait); | ||
1244 | int snd_seq_oss_readq_puts(struct seq_oss_readq *readq, int dev, unsigned char *data, int len); | ||
1245 | +int snd_seq_oss_readq_sysex(struct seq_oss_readq *q, int dev, | ||
1246 | + struct snd_seq_event *ev); | ||
1247 | int snd_seq_oss_readq_put_event(struct seq_oss_readq *readq, union evrec *ev); | ||
1248 | int snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *readq, unsigned long curt, int seq_mode); | ||
1249 | int snd_seq_oss_readq_pick(struct seq_oss_readq *q, union evrec *rec); | ||
1250 | diff --git a/sound/core/timer.c b/sound/core/timer.c | ||
1251 | index a9b9a277e00c..c8e4d0da13b4 100644 | ||
1252 | --- a/sound/core/timer.c | ||
1253 | +++ b/sound/core/timer.c | ||
1254 | @@ -180,7 +180,7 @@ static void snd_timer_request(struct snd_timer_id *tid) | ||
1255 | * | ||
1256 | * call this with register_mutex down. | ||
1257 | */ | ||
1258 | -static void snd_timer_check_slave(struct snd_timer_instance *slave) | ||
1259 | +static int snd_timer_check_slave(struct snd_timer_instance *slave) | ||
1260 | { | ||
1261 | struct snd_timer *timer; | ||
1262 | struct snd_timer_instance *master; | ||
1263 | @@ -190,16 +190,21 @@ static void snd_timer_check_slave(struct snd_timer_instance *slave) | ||
1264 | list_for_each_entry(master, &timer->open_list_head, open_list) { | ||
1265 | if (slave->slave_class == master->slave_class && | ||
1266 | slave->slave_id == master->slave_id) { | ||
1267 | + if (master->timer->num_instances >= | ||
1268 | + master->timer->max_instances) | ||
1269 | + return -EBUSY; | ||
1270 | list_move_tail(&slave->open_list, | ||
1271 | &master->slave_list_head); | ||
1272 | + master->timer->num_instances++; | ||
1273 | spin_lock_irq(&slave_active_lock); | ||
1274 | slave->master = master; | ||
1275 | slave->timer = master->timer; | ||
1276 | spin_unlock_irq(&slave_active_lock); | ||
1277 | - return; | ||
1278 | + return 0; | ||
1279 | } | ||
1280 | } | ||
1281 | } | ||
1282 | + return 0; | ||
1283 | } | ||
1284 | |||
1285 | /* | ||
1286 | @@ -208,7 +213,7 @@ static void snd_timer_check_slave(struct snd_timer_instance *slave) | ||
1287 | * | ||
1288 | * call this with register_mutex down. | ||
1289 | */ | ||
1290 | -static void snd_timer_check_master(struct snd_timer_instance *master) | ||
1291 | +static int snd_timer_check_master(struct snd_timer_instance *master) | ||
1292 | { | ||
1293 | struct snd_timer_instance *slave, *tmp; | ||
1294 | |||
1295 | @@ -216,7 +221,11 @@ static void snd_timer_check_master(struct snd_timer_instance *master) | ||
1296 | list_for_each_entry_safe(slave, tmp, &snd_timer_slave_list, open_list) { | ||
1297 | if (slave->slave_class == master->slave_class && | ||
1298 | slave->slave_id == master->slave_id) { | ||
1299 | + if (master->timer->num_instances >= | ||
1300 | + master->timer->max_instances) | ||
1301 | + return -EBUSY; | ||
1302 | list_move_tail(&slave->open_list, &master->slave_list_head); | ||
1303 | + master->timer->num_instances++; | ||
1304 | spin_lock_irq(&slave_active_lock); | ||
1305 | spin_lock(&master->timer->lock); | ||
1306 | slave->master = master; | ||
1307 | @@ -228,8 +237,11 @@ static void snd_timer_check_master(struct snd_timer_instance *master) | ||
1308 | spin_unlock_irq(&slave_active_lock); | ||
1309 | } | ||
1310 | } | ||
1311 | + return 0; | ||
1312 | } | ||
1313 | |||
1314 | +static int snd_timer_close_locked(struct snd_timer_instance *timeri); | ||
1315 | + | ||
1316 | /* | ||
1317 | * open a timer instance | ||
1318 | * when opening a master, the slave id must be here given. | ||
1319 | @@ -240,6 +252,7 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
1320 | { | ||
1321 | struct snd_timer *timer; | ||
1322 | struct snd_timer_instance *timeri = NULL; | ||
1323 | + int err; | ||
1324 | |||
1325 | if (tid->dev_class == SNDRV_TIMER_CLASS_SLAVE) { | ||
1326 | /* open a slave instance */ | ||
1327 | @@ -259,10 +272,14 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
1328 | timeri->slave_id = tid->device; | ||
1329 | timeri->flags |= SNDRV_TIMER_IFLG_SLAVE; | ||
1330 | list_add_tail(&timeri->open_list, &snd_timer_slave_list); | ||
1331 | - snd_timer_check_slave(timeri); | ||
1332 | + err = snd_timer_check_slave(timeri); | ||
1333 | + if (err < 0) { | ||
1334 | + snd_timer_close_locked(timeri); | ||
1335 | + timeri = NULL; | ||
1336 | + } | ||
1337 | mutex_unlock(®ister_mutex); | ||
1338 | *ti = timeri; | ||
1339 | - return 0; | ||
1340 | + return err; | ||
1341 | } | ||
1342 | |||
1343 | /* open a master instance */ | ||
1344 | @@ -288,6 +305,10 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
1345 | return -EBUSY; | ||
1346 | } | ||
1347 | } | ||
1348 | + if (timer->num_instances >= timer->max_instances) { | ||
1349 | + mutex_unlock(®ister_mutex); | ||
1350 | + return -EBUSY; | ||
1351 | + } | ||
1352 | timeri = snd_timer_instance_new(owner, timer); | ||
1353 | if (!timeri) { | ||
1354 | mutex_unlock(®ister_mutex); | ||
1355 | @@ -314,25 +335,27 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
1356 | } | ||
1357 | |||
1358 | list_add_tail(&timeri->open_list, &timer->open_list_head); | ||
1359 | - snd_timer_check_master(timeri); | ||
1360 | + timer->num_instances++; | ||
1361 | + err = snd_timer_check_master(timeri); | ||
1362 | + if (err < 0) { | ||
1363 | + snd_timer_close_locked(timeri); | ||
1364 | + timeri = NULL; | ||
1365 | + } | ||
1366 | mutex_unlock(®ister_mutex); | ||
1367 | *ti = timeri; | ||
1368 | - return 0; | ||
1369 | + return err; | ||
1370 | } | ||
1371 | EXPORT_SYMBOL(snd_timer_open); | ||
1372 | |||
1373 | /* | ||
1374 | * close a timer instance | ||
1375 | + * call this with register_mutex down. | ||
1376 | */ | ||
1377 | -int snd_timer_close(struct snd_timer_instance *timeri) | ||
1378 | +static int snd_timer_close_locked(struct snd_timer_instance *timeri) | ||
1379 | { | ||
1380 | struct snd_timer *timer = NULL; | ||
1381 | struct snd_timer_instance *slave, *tmp; | ||
1382 | |||
1383 | - if (snd_BUG_ON(!timeri)) | ||
1384 | - return -ENXIO; | ||
1385 | - | ||
1386 | - mutex_lock(®ister_mutex); | ||
1387 | list_del(&timeri->open_list); | ||
1388 | |||
1389 | /* force to stop the timer */ | ||
1390 | @@ -340,6 +363,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) | ||
1391 | |||
1392 | timer = timeri->timer; | ||
1393 | if (timer) { | ||
1394 | + timer->num_instances--; | ||
1395 | /* wait, until the active callback is finished */ | ||
1396 | spin_lock_irq(&timer->lock); | ||
1397 | while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { | ||
1398 | @@ -355,6 +379,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) | ||
1399 | list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head, | ||
1400 | open_list) { | ||
1401 | list_move_tail(&slave->open_list, &snd_timer_slave_list); | ||
1402 | + timer->num_instances--; | ||
1403 | slave->master = NULL; | ||
1404 | slave->timer = NULL; | ||
1405 | list_del_init(&slave->ack_list); | ||
1406 | @@ -382,9 +407,24 @@ int snd_timer_close(struct snd_timer_instance *timeri) | ||
1407 | module_put(timer->module); | ||
1408 | } | ||
1409 | |||
1410 | - mutex_unlock(®ister_mutex); | ||
1411 | return 0; | ||
1412 | } | ||
1413 | + | ||
1414 | +/* | ||
1415 | + * close a timer instance | ||
1416 | + */ | ||
1417 | +int snd_timer_close(struct snd_timer_instance *timeri) | ||
1418 | +{ | ||
1419 | + int err; | ||
1420 | + | ||
1421 | + if (snd_BUG_ON(!timeri)) | ||
1422 | + return -ENXIO; | ||
1423 | + | ||
1424 | + mutex_lock(®ister_mutex); | ||
1425 | + err = snd_timer_close_locked(timeri); | ||
1426 | + mutex_unlock(®ister_mutex); | ||
1427 | + return err; | ||
1428 | +} | ||
1429 | EXPORT_SYMBOL(snd_timer_close); | ||
1430 | |||
1431 | unsigned long snd_timer_resolution(struct snd_timer_instance *timeri) | ||
1432 | @@ -855,6 +895,7 @@ int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid, | ||
1433 | spin_lock_init(&timer->lock); | ||
1434 | tasklet_init(&timer->task_queue, snd_timer_tasklet, | ||
1435 | (unsigned long)timer); | ||
1436 | + timer->max_instances = 1000; /* default limit per timer */ | ||
1437 | if (card != NULL) { | ||
1438 | timer->module = card->module; | ||
1439 | err = snd_device_new(card, SNDRV_DEV_TIMER, timer, &ops); | ||
1440 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
1441 | index fe4d06398fc3..c5f0e8d42d22 100644 | ||
1442 | --- a/sound/pci/hda/patch_realtek.c | ||
1443 | +++ b/sound/pci/hda/patch_realtek.c | ||
1444 | @@ -6527,6 +6527,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | ||
1445 | {0x14, 0x90170110}, | ||
1446 | {0x1b, 0x90a70130}, | ||
1447 | {0x21, 0x03211020}), | ||
1448 | + SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
1449 | + {0x12, 0xb7a60130}, | ||
1450 | + {0x13, 0xb8a61140}, | ||
1451 | + {0x16, 0x90170110}, | ||
1452 | + {0x21, 0x04211020}), | ||
1453 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | ||
1454 | {0x12, 0x90a60130}, | ||
1455 | {0x14, 0x90170110}, | ||
1456 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
1457 | index 0e54fe490458..f910c4fd932b 100644 | ||
1458 | --- a/sound/usb/quirks.c | ||
1459 | +++ b/sound/usb/quirks.c | ||
1460 | @@ -1373,6 +1373,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, | ||
1461 | case 0x199: | ||
1462 | return SNDRV_PCM_FMTBIT_DSD_U32_LE; | ||
1463 | case 0x19b: | ||
1464 | + case 0x203: | ||
1465 | return SNDRV_PCM_FMTBIT_DSD_U32_BE; | ||
1466 | default: | ||
1467 | break; |