Contents of /trunk/kernel-alx/patches-4.9/0109-4.9.10-all-fixes.patch
Parent Directory | Revision Log
Revision 2956 -
(show annotations)
(download)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 73914 byte(s)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 73914 byte(s)
-added patches-4.9
1 | diff --git a/Makefile b/Makefile |
2 | index c0c41c9fac0c..d2fe757a979d 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 9 |
9 | +SUBLEVEL = 10 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c |
14 | index 91ebe382147f..5f69c3bd59bb 100644 |
15 | --- a/arch/arc/kernel/unaligned.c |
16 | +++ b/arch/arc/kernel/unaligned.c |
17 | @@ -243,7 +243,7 @@ int misaligned_fixup(unsigned long address, struct pt_regs *regs, |
18 | |
19 | /* clear any remanants of delay slot */ |
20 | if (delay_mode(regs)) { |
21 | - regs->ret = regs->bta ~1U; |
22 | + regs->ret = regs->bta & ~1U; |
23 | regs->status32 &= ~STATUS_DE_MASK; |
24 | } else { |
25 | regs->ret += state.instr_len; |
26 | diff --git a/arch/arm/boot/dts/imx6dl.dtsi b/arch/arm/boot/dts/imx6dl.dtsi |
27 | index 1ade1951e620..7aa120fbdc71 100644 |
28 | --- a/arch/arm/boot/dts/imx6dl.dtsi |
29 | +++ b/arch/arm/boot/dts/imx6dl.dtsi |
30 | @@ -137,7 +137,7 @@ |
31 | &gpio4 { |
32 | gpio-ranges = <&iomuxc 5 136 1>, <&iomuxc 6 145 1>, <&iomuxc 7 150 1>, |
33 | <&iomuxc 8 146 1>, <&iomuxc 9 151 1>, <&iomuxc 10 147 1>, |
34 | - <&iomuxc 11 151 1>, <&iomuxc 12 148 1>, <&iomuxc 13 153 1>, |
35 | + <&iomuxc 11 152 1>, <&iomuxc 12 148 1>, <&iomuxc 13 153 1>, |
36 | <&iomuxc 14 149 1>, <&iomuxc 15 154 1>, <&iomuxc 16 39 7>, |
37 | <&iomuxc 23 56 1>, <&iomuxc 24 61 7>, <&iomuxc 31 46 1>; |
38 | }; |
39 | diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c |
40 | index ce131ed5939d..ae738a6319f6 100644 |
41 | --- a/arch/arm/kernel/ptrace.c |
42 | +++ b/arch/arm/kernel/ptrace.c |
43 | @@ -600,7 +600,7 @@ static int gpr_set(struct task_struct *target, |
44 | const void *kbuf, const void __user *ubuf) |
45 | { |
46 | int ret; |
47 | - struct pt_regs newregs; |
48 | + struct pt_regs newregs = *task_pt_regs(target); |
49 | |
50 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
51 | &newregs, |
52 | diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c |
53 | index 3a2e678b8d30..0122ad1a6027 100644 |
54 | --- a/arch/arm/mm/fault.c |
55 | +++ b/arch/arm/mm/fault.c |
56 | @@ -610,9 +610,9 @@ static int __init early_abort_handler(unsigned long addr, unsigned int fsr, |
57 | |
58 | void __init early_abt_enable(void) |
59 | { |
60 | - fsr_info[22].fn = early_abort_handler; |
61 | + fsr_info[FSR_FS_AEA].fn = early_abort_handler; |
62 | local_abt_enable(); |
63 | - fsr_info[22].fn = do_bad; |
64 | + fsr_info[FSR_FS_AEA].fn = do_bad; |
65 | } |
66 | |
67 | #ifndef CONFIG_ARM_LPAE |
68 | diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h |
69 | index 67532f242271..afc1f84e763b 100644 |
70 | --- a/arch/arm/mm/fault.h |
71 | +++ b/arch/arm/mm/fault.h |
72 | @@ -11,11 +11,15 @@ |
73 | #define FSR_FS5_0 (0x3f) |
74 | |
75 | #ifdef CONFIG_ARM_LPAE |
76 | +#define FSR_FS_AEA 17 |
77 | + |
78 | static inline int fsr_fs(unsigned int fsr) |
79 | { |
80 | return fsr & FSR_FS5_0; |
81 | } |
82 | #else |
83 | +#define FSR_FS_AEA 22 |
84 | + |
85 | static inline int fsr_fs(unsigned int fsr) |
86 | { |
87 | return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; |
88 | diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h |
89 | index 9e1499f98def..13f5fad21066 100644 |
90 | --- a/arch/powerpc/include/asm/reg.h |
91 | +++ b/arch/powerpc/include/asm/reg.h |
92 | @@ -641,9 +641,10 @@ |
93 | #define SRR1_ISI_N_OR_G 0x10000000 /* ISI: Access is no-exec or G */ |
94 | #define SRR1_ISI_PROT 0x08000000 /* ISI: Other protection fault */ |
95 | #define SRR1_WAKEMASK 0x00380000 /* reason for wakeup */ |
96 | -#define SRR1_WAKEMASK_P8 0x003c0000 /* reason for wakeup on POWER8 */ |
97 | +#define SRR1_WAKEMASK_P8 0x003c0000 /* reason for wakeup on POWER8 and 9 */ |
98 | #define SRR1_WAKESYSERR 0x00300000 /* System error */ |
99 | #define SRR1_WAKEEE 0x00200000 /* External interrupt */ |
100 | +#define SRR1_WAKEHVI 0x00240000 /* Hypervisor Virtualization Interrupt (P9) */ |
101 | #define SRR1_WAKEMT 0x00280000 /* mtctrl */ |
102 | #define SRR1_WAKEHMI 0x00280000 /* Hypervisor maintenance */ |
103 | #define SRR1_WAKEDEC 0x00180000 /* Decrementer interrupt */ |
104 | diff --git a/arch/powerpc/include/asm/xics.h b/arch/powerpc/include/asm/xics.h |
105 | index f0b238516e9b..e0b9e576905a 100644 |
106 | --- a/arch/powerpc/include/asm/xics.h |
107 | +++ b/arch/powerpc/include/asm/xics.h |
108 | @@ -44,6 +44,7 @@ static inline int icp_hv_init(void) { return -ENODEV; } |
109 | |
110 | #ifdef CONFIG_PPC_POWERNV |
111 | extern int icp_opal_init(void); |
112 | +extern void icp_opal_flush_interrupt(void); |
113 | #else |
114 | static inline int icp_opal_init(void) { return -ENODEV; } |
115 | #endif |
116 | diff --git a/arch/powerpc/mm/tlb-radix.c b/arch/powerpc/mm/tlb-radix.c |
117 | index 3493cf4e0452..71697ff70879 100644 |
118 | --- a/arch/powerpc/mm/tlb-radix.c |
119 | +++ b/arch/powerpc/mm/tlb-radix.c |
120 | @@ -50,9 +50,7 @@ static inline void _tlbiel_pid(unsigned long pid, unsigned long ric) |
121 | for (set = 0; set < POWER9_TLB_SETS_RADIX ; set++) { |
122 | __tlbiel_pid(pid, set, ric); |
123 | } |
124 | - if (cpu_has_feature(CPU_FTR_POWER9_DD1)) |
125 | - asm volatile(PPC_INVALIDATE_ERAT : : :"memory"); |
126 | - return; |
127 | + asm volatile(PPC_INVALIDATE_ERAT "; isync" : : :"memory"); |
128 | } |
129 | |
130 | static inline void _tlbie_pid(unsigned long pid, unsigned long ric) |
131 | @@ -85,8 +83,6 @@ static inline void _tlbiel_va(unsigned long va, unsigned long pid, |
132 | asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1) |
133 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); |
134 | asm volatile("ptesync": : :"memory"); |
135 | - if (cpu_has_feature(CPU_FTR_POWER9_DD1)) |
136 | - asm volatile(PPC_INVALIDATE_ERAT : : :"memory"); |
137 | } |
138 | |
139 | static inline void _tlbie_va(unsigned long va, unsigned long pid, |
140 | diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c |
141 | index c789258ae1e1..eec0e8d0454d 100644 |
142 | --- a/arch/powerpc/platforms/powernv/smp.c |
143 | +++ b/arch/powerpc/platforms/powernv/smp.c |
144 | @@ -155,8 +155,10 @@ static void pnv_smp_cpu_kill_self(void) |
145 | wmask = SRR1_WAKEMASK_P8; |
146 | |
147 | idle_states = pnv_get_supported_cpuidle_states(); |
148 | + |
149 | /* We don't want to take decrementer interrupts while we are offline, |
150 | - * so clear LPCR:PECE1. We keep PECE2 enabled. |
151 | + * so clear LPCR:PECE1. We keep PECE2 (and LPCR_PECE_HVEE on P9) |
152 | + * enabled as to let IPIs in. |
153 | */ |
154 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); |
155 | |
156 | @@ -206,8 +208,12 @@ static void pnv_smp_cpu_kill_self(void) |
157 | * contains 0. |
158 | */ |
159 | if (((srr1 & wmask) == SRR1_WAKEEE) || |
160 | + ((srr1 & wmask) == SRR1_WAKEHVI) || |
161 | (local_paca->irq_happened & PACA_IRQ_EE)) { |
162 | - icp_native_flush_interrupt(); |
163 | + if (cpu_has_feature(CPU_FTR_ARCH_300)) |
164 | + icp_opal_flush_interrupt(); |
165 | + else |
166 | + icp_native_flush_interrupt(); |
167 | } else if ((srr1 & wmask) == SRR1_WAKEHDBELL) { |
168 | unsigned long msg = PPC_DBELL_TYPE(PPC_DBELL_SERVER); |
169 | asm volatile(PPC_MSGCLR(%0) : : "r" (msg)); |
170 | @@ -221,6 +227,8 @@ static void pnv_smp_cpu_kill_self(void) |
171 | if (srr1 && !generic_check_cpu_restart(cpu)) |
172 | DBG("CPU%d Unexpected exit while offline !\n", cpu); |
173 | } |
174 | + |
175 | + /* Re-enable decrementer interrupts */ |
176 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) | LPCR_PECE1); |
177 | DBG("CPU%d coming online...\n", cpu); |
178 | } |
179 | diff --git a/arch/powerpc/sysdev/xics/icp-opal.c b/arch/powerpc/sysdev/xics/icp-opal.c |
180 | index 60c57657c772..c96c0cb95d87 100644 |
181 | --- a/arch/powerpc/sysdev/xics/icp-opal.c |
182 | +++ b/arch/powerpc/sysdev/xics/icp-opal.c |
183 | @@ -132,6 +132,35 @@ static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id) |
184 | return smp_ipi_demux(); |
185 | } |
186 | |
187 | +/* |
188 | + * Called when an interrupt is received on an off-line CPU to |
189 | + * clear the interrupt, so that the CPU can go back to nap mode. |
190 | + */ |
191 | +void icp_opal_flush_interrupt(void) |
192 | +{ |
193 | + unsigned int xirr; |
194 | + unsigned int vec; |
195 | + |
196 | + do { |
197 | + xirr = icp_opal_get_xirr(); |
198 | + vec = xirr & 0x00ffffff; |
199 | + if (vec == XICS_IRQ_SPURIOUS) |
200 | + break; |
201 | + if (vec == XICS_IPI) { |
202 | + /* Clear pending IPI */ |
203 | + int cpu = smp_processor_id(); |
204 | + kvmppc_set_host_ipi(cpu, 0); |
205 | + opal_int_set_mfrr(get_hard_smp_processor_id(cpu), 0xff); |
206 | + } else { |
207 | + pr_err("XICS: hw interrupt 0x%x to offline cpu, " |
208 | + "disabling\n", vec); |
209 | + xics_mask_unknown_vec(vec); |
210 | + } |
211 | + |
212 | + /* EOI the interrupt */ |
213 | + } while (opal_int_eoi(xirr) > 0); |
214 | +} |
215 | + |
216 | #endif /* CONFIG_SMP */ |
217 | |
218 | static const struct icp_ops icp_opal_ops = { |
219 | diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h |
220 | index 984a7bf17f6a..83db0eae9979 100644 |
221 | --- a/arch/x86/include/asm/processor.h |
222 | +++ b/arch/x86/include/asm/processor.h |
223 | @@ -104,6 +104,7 @@ struct cpuinfo_x86 { |
224 | __u8 x86_phys_bits; |
225 | /* CPUID returned core id bits: */ |
226 | __u8 x86_coreid_bits; |
227 | + __u8 cu_id; |
228 | /* Max extended CPUID function supported: */ |
229 | __u32 extended_cpuid_level; |
230 | /* Maximum supported CPUID level, -1=no CPUID: */ |
231 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
232 | index 7249f1500bcb..d1e25564b3c1 100644 |
233 | --- a/arch/x86/kernel/apic/io_apic.c |
234 | +++ b/arch/x86/kernel/apic/io_apic.c |
235 | @@ -1876,7 +1876,6 @@ static struct irq_chip ioapic_chip __read_mostly = { |
236 | .irq_ack = irq_chip_ack_parent, |
237 | .irq_eoi = ioapic_ack_level, |
238 | .irq_set_affinity = ioapic_set_affinity, |
239 | - .irq_retrigger = irq_chip_retrigger_hierarchy, |
240 | .flags = IRQCHIP_SKIP_SET_WAKE, |
241 | }; |
242 | |
243 | @@ -1888,7 +1887,6 @@ static struct irq_chip ioapic_ir_chip __read_mostly = { |
244 | .irq_ack = irq_chip_ack_parent, |
245 | .irq_eoi = ioapic_ir_ack_level, |
246 | .irq_set_affinity = ioapic_set_affinity, |
247 | - .irq_retrigger = irq_chip_retrigger_hierarchy, |
248 | .flags = IRQCHIP_SKIP_SET_WAKE, |
249 | }; |
250 | |
251 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c |
252 | index 1d3167269a67..2b4cf04239b6 100644 |
253 | --- a/arch/x86/kernel/cpu/amd.c |
254 | +++ b/arch/x86/kernel/cpu/amd.c |
255 | @@ -309,8 +309,22 @@ static void amd_get_topology(struct cpuinfo_x86 *c) |
256 | |
257 | /* get information required for multi-node processors */ |
258 | if (boot_cpu_has(X86_FEATURE_TOPOEXT)) { |
259 | + u32 eax, ebx, ecx, edx; |
260 | |
261 | - node_id = cpuid_ecx(0x8000001e) & 7; |
262 | + cpuid(0x8000001e, &eax, &ebx, &ecx, &edx); |
263 | + |
264 | + node_id = ecx & 0xff; |
265 | + smp_num_siblings = ((ebx >> 8) & 0xff) + 1; |
266 | + |
267 | + if (c->x86 == 0x15) |
268 | + c->cu_id = ebx & 0xff; |
269 | + |
270 | + if (c->x86 >= 0x17) { |
271 | + c->cpu_core_id = ebx & 0xff; |
272 | + |
273 | + if (smp_num_siblings > 1) |
274 | + c->x86_max_cores /= smp_num_siblings; |
275 | + } |
276 | |
277 | /* |
278 | * We may have multiple LLCs if L3 caches exist, so check if we |
279 | diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c |
280 | index 023c7bfa24df..4eece91ada37 100644 |
281 | --- a/arch/x86/kernel/cpu/common.c |
282 | +++ b/arch/x86/kernel/cpu/common.c |
283 | @@ -1015,6 +1015,7 @@ static void identify_cpu(struct cpuinfo_x86 *c) |
284 | c->x86_model_id[0] = '\0'; /* Unset */ |
285 | c->x86_max_cores = 1; |
286 | c->x86_coreid_bits = 0; |
287 | + c->cu_id = 0xff; |
288 | #ifdef CONFIG_X86_64 |
289 | c->x86_clflush_size = 64; |
290 | c->x86_phys_bits = 36; |
291 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c |
292 | index e9bbe02950ad..36171bcd91f8 100644 |
293 | --- a/arch/x86/kernel/smpboot.c |
294 | +++ b/arch/x86/kernel/smpboot.c |
295 | @@ -423,9 +423,15 @@ static bool match_smt(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) |
296 | int cpu1 = c->cpu_index, cpu2 = o->cpu_index; |
297 | |
298 | if (c->phys_proc_id == o->phys_proc_id && |
299 | - per_cpu(cpu_llc_id, cpu1) == per_cpu(cpu_llc_id, cpu2) && |
300 | - c->cpu_core_id == o->cpu_core_id) |
301 | - return topology_sane(c, o, "smt"); |
302 | + per_cpu(cpu_llc_id, cpu1) == per_cpu(cpu_llc_id, cpu2)) { |
303 | + if (c->cpu_core_id == o->cpu_core_id) |
304 | + return topology_sane(c, o, "smt"); |
305 | + |
306 | + if ((c->cu_id != 0xff) && |
307 | + (o->cu_id != 0xff) && |
308 | + (c->cu_id == o->cu_id)) |
309 | + return topology_sane(c, o, "smt"); |
310 | + } |
311 | |
312 | } else if (c->phys_proc_id == o->phys_proc_id && |
313 | c->cpu_core_id == o->cpu_core_id) { |
314 | diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c |
315 | index ea9c49adaa1f..8aa6bea1cd6c 100644 |
316 | --- a/arch/x86/mm/dump_pagetables.c |
317 | +++ b/arch/x86/mm/dump_pagetables.c |
318 | @@ -15,6 +15,7 @@ |
319 | #include <linux/debugfs.h> |
320 | #include <linux/mm.h> |
321 | #include <linux/init.h> |
322 | +#include <linux/sched.h> |
323 | #include <linux/seq_file.h> |
324 | |
325 | #include <asm/pgtable.h> |
326 | @@ -406,6 +407,7 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, |
327 | } else |
328 | note_page(m, &st, __pgprot(0), 1); |
329 | |
330 | + cond_resched(); |
331 | start++; |
332 | } |
333 | |
334 | diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c |
335 | index e9c0993b131d..e8817e2f0597 100644 |
336 | --- a/crypto/algif_aead.c |
337 | +++ b/crypto/algif_aead.c |
338 | @@ -671,9 +671,9 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags) |
339 | unlock: |
340 | list_for_each_entry_safe(rsgl, tmp, &ctx->list, list) { |
341 | af_alg_free_sg(&rsgl->sgl); |
342 | + list_del(&rsgl->list); |
343 | if (rsgl != &ctx->first_rsgl) |
344 | sock_kfree_s(sk, rsgl, sizeof(*rsgl)); |
345 | - list_del(&rsgl->list); |
346 | } |
347 | INIT_LIST_HEAD(&ctx->list); |
348 | aead_wmem_wakeup(sk); |
349 | diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c |
350 | index 312c4b4dc363..6eb6733a7a5c 100644 |
351 | --- a/drivers/acpi/nfit/core.c |
352 | +++ b/drivers/acpi/nfit/core.c |
353 | @@ -2704,6 +2704,7 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc) |
354 | struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); |
355 | struct device *dev = acpi_desc->dev; |
356 | struct acpi_nfit_flush_work flush; |
357 | + int rc; |
358 | |
359 | /* bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */ |
360 | device_lock(dev); |
361 | @@ -2716,7 +2717,10 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc) |
362 | INIT_WORK_ONSTACK(&flush.work, flush_probe); |
363 | COMPLETION_INITIALIZER_ONSTACK(flush.cmp); |
364 | queue_work(nfit_wq, &flush.work); |
365 | - return wait_for_completion_interruptible(&flush.cmp); |
366 | + |
367 | + rc = wait_for_completion_interruptible(&flush.cmp); |
368 | + cancel_work_sync(&flush.work); |
369 | + return rc; |
370 | } |
371 | |
372 | static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc, |
373 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
374 | index 4737520ec823..80fa656da5ab 100644 |
375 | --- a/drivers/cpufreq/intel_pstate.c |
376 | +++ b/drivers/cpufreq/intel_pstate.c |
377 | @@ -820,6 +820,25 @@ static void intel_pstate_hwp_enable(struct cpudata *cpudata) |
378 | wrmsrl_on_cpu(cpudata->cpu, MSR_PM_ENABLE, 0x1); |
379 | } |
380 | |
381 | +#define MSR_IA32_POWER_CTL_BIT_EE 19 |
382 | + |
383 | +/* Disable energy efficiency optimization */ |
384 | +static void intel_pstate_disable_ee(int cpu) |
385 | +{ |
386 | + u64 power_ctl; |
387 | + int ret; |
388 | + |
389 | + ret = rdmsrl_on_cpu(cpu, MSR_IA32_POWER_CTL, &power_ctl); |
390 | + if (ret) |
391 | + return; |
392 | + |
393 | + if (!(power_ctl & BIT(MSR_IA32_POWER_CTL_BIT_EE))) { |
394 | + pr_info("Disabling energy efficiency optimization\n"); |
395 | + power_ctl |= BIT(MSR_IA32_POWER_CTL_BIT_EE); |
396 | + wrmsrl_on_cpu(cpu, MSR_IA32_POWER_CTL, power_ctl); |
397 | + } |
398 | +} |
399 | + |
400 | static int atom_get_min_pstate(void) |
401 | { |
402 | u64 value; |
403 | @@ -1420,6 +1439,11 @@ static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] __initconst = { |
404 | {} |
405 | }; |
406 | |
407 | +static const struct x86_cpu_id intel_pstate_cpu_ee_disable_ids[] = { |
408 | + ICPU(INTEL_FAM6_KABYLAKE_DESKTOP, core_params), |
409 | + {} |
410 | +}; |
411 | + |
412 | static int intel_pstate_init_cpu(unsigned int cpunum) |
413 | { |
414 | struct cpudata *cpu; |
415 | @@ -1435,6 +1459,12 @@ static int intel_pstate_init_cpu(unsigned int cpunum) |
416 | cpu->cpu = cpunum; |
417 | |
418 | if (hwp_active) { |
419 | + const struct x86_cpu_id *id; |
420 | + |
421 | + id = x86_match_cpu(intel_pstate_cpu_ee_disable_ids); |
422 | + if (id) |
423 | + intel_pstate_disable_ee(cpunum); |
424 | + |
425 | intel_pstate_hwp_enable(cpu); |
426 | pid_params.sample_rate_ms = 50; |
427 | pid_params.sample_rate_ns = 50 * NSEC_PER_MSEC; |
428 | diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c |
429 | index faf3cb3ddce2..a388bf2d67f4 100644 |
430 | --- a/drivers/crypto/ccp/ccp-dev-v5.c |
431 | +++ b/drivers/crypto/ccp/ccp-dev-v5.c |
432 | @@ -955,7 +955,7 @@ static irqreturn_t ccp5_irq_handler(int irq, void *data) |
433 | static void ccp5_config(struct ccp_device *ccp) |
434 | { |
435 | /* Public side */ |
436 | - iowrite32(0x00001249, ccp->io_regs + CMD5_REQID_CONFIG_OFFSET); |
437 | + iowrite32(0x0, ccp->io_regs + CMD5_REQID_CONFIG_OFFSET); |
438 | } |
439 | |
440 | static void ccp5other_config(struct ccp_device *ccp) |
441 | diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h |
442 | index da5f4a678083..340aef14d616 100644 |
443 | --- a/drivers/crypto/ccp/ccp-dev.h |
444 | +++ b/drivers/crypto/ccp/ccp-dev.h |
445 | @@ -238,6 +238,7 @@ struct ccp_dma_chan { |
446 | struct ccp_device *ccp; |
447 | |
448 | spinlock_t lock; |
449 | + struct list_head created; |
450 | struct list_head pending; |
451 | struct list_head active; |
452 | struct list_head complete; |
453 | diff --git a/drivers/crypto/ccp/ccp-dmaengine.c b/drivers/crypto/ccp/ccp-dmaengine.c |
454 | index 6553912804f7..e5d9278f4019 100644 |
455 | --- a/drivers/crypto/ccp/ccp-dmaengine.c |
456 | +++ b/drivers/crypto/ccp/ccp-dmaengine.c |
457 | @@ -63,6 +63,7 @@ static void ccp_free_chan_resources(struct dma_chan *dma_chan) |
458 | ccp_free_desc_resources(chan->ccp, &chan->complete); |
459 | ccp_free_desc_resources(chan->ccp, &chan->active); |
460 | ccp_free_desc_resources(chan->ccp, &chan->pending); |
461 | + ccp_free_desc_resources(chan->ccp, &chan->created); |
462 | |
463 | spin_unlock_irqrestore(&chan->lock, flags); |
464 | } |
465 | @@ -273,6 +274,7 @@ static dma_cookie_t ccp_tx_submit(struct dma_async_tx_descriptor *tx_desc) |
466 | spin_lock_irqsave(&chan->lock, flags); |
467 | |
468 | cookie = dma_cookie_assign(tx_desc); |
469 | + list_del(&desc->entry); |
470 | list_add_tail(&desc->entry, &chan->pending); |
471 | |
472 | spin_unlock_irqrestore(&chan->lock, flags); |
473 | @@ -426,7 +428,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan, |
474 | |
475 | spin_lock_irqsave(&chan->lock, sflags); |
476 | |
477 | - list_add_tail(&desc->entry, &chan->pending); |
478 | + list_add_tail(&desc->entry, &chan->created); |
479 | |
480 | spin_unlock_irqrestore(&chan->lock, sflags); |
481 | |
482 | @@ -610,6 +612,7 @@ static int ccp_terminate_all(struct dma_chan *dma_chan) |
483 | /*TODO: Purge the complete list? */ |
484 | ccp_free_desc_resources(chan->ccp, &chan->active); |
485 | ccp_free_desc_resources(chan->ccp, &chan->pending); |
486 | + ccp_free_desc_resources(chan->ccp, &chan->created); |
487 | |
488 | spin_unlock_irqrestore(&chan->lock, flags); |
489 | |
490 | @@ -679,6 +682,7 @@ int ccp_dmaengine_register(struct ccp_device *ccp) |
491 | chan->ccp = ccp; |
492 | |
493 | spin_lock_init(&chan->lock); |
494 | + INIT_LIST_HEAD(&chan->created); |
495 | INIT_LIST_HEAD(&chan->pending); |
496 | INIT_LIST_HEAD(&chan->active); |
497 | INIT_LIST_HEAD(&chan->complete); |
498 | diff --git a/drivers/crypto/chelsio/chcr_core.c b/drivers/crypto/chelsio/chcr_core.c |
499 | index fb5f9bbfa09c..6aece3f25b08 100644 |
500 | --- a/drivers/crypto/chelsio/chcr_core.c |
501 | +++ b/drivers/crypto/chelsio/chcr_core.c |
502 | @@ -51,6 +51,7 @@ static struct cxgb4_uld_info chcr_uld_info = { |
503 | int assign_chcr_device(struct chcr_dev **dev) |
504 | { |
505 | struct uld_ctx *u_ctx; |
506 | + int ret = -ENXIO; |
507 | |
508 | /* |
509 | * Which device to use if multiple devices are available TODO |
510 | @@ -58,15 +59,14 @@ int assign_chcr_device(struct chcr_dev **dev) |
511 | * must go to the same device to maintain the ordering. |
512 | */ |
513 | mutex_lock(&dev_mutex); /* TODO ? */ |
514 | - u_ctx = list_first_entry(&uld_ctx_list, struct uld_ctx, entry); |
515 | - if (!u_ctx) { |
516 | - mutex_unlock(&dev_mutex); |
517 | - return -ENXIO; |
518 | + list_for_each_entry(u_ctx, &uld_ctx_list, entry) |
519 | + if (u_ctx && u_ctx->dev) { |
520 | + *dev = u_ctx->dev; |
521 | + ret = 0; |
522 | + break; |
523 | } |
524 | - |
525 | - *dev = u_ctx->dev; |
526 | mutex_unlock(&dev_mutex); |
527 | - return 0; |
528 | + return ret; |
529 | } |
530 | |
531 | static int chcr_dev_add(struct uld_ctx *u_ctx) |
532 | @@ -203,10 +203,8 @@ static int chcr_uld_state_change(void *handle, enum cxgb4_state state) |
533 | |
534 | static int __init chcr_crypto_init(void) |
535 | { |
536 | - if (cxgb4_register_uld(CXGB4_ULD_CRYPTO, &chcr_uld_info)) { |
537 | + if (cxgb4_register_uld(CXGB4_ULD_CRYPTO, &chcr_uld_info)) |
538 | pr_err("ULD register fail: No chcr crypto support in cxgb4"); |
539 | - return -1; |
540 | - } |
541 | |
542 | return 0; |
543 | } |
544 | diff --git a/drivers/crypto/qat/qat_c62x/adf_drv.c b/drivers/crypto/qat/qat_c62x/adf_drv.c |
545 | index bc5cbc193aae..5b2d78a5b5aa 100644 |
546 | --- a/drivers/crypto/qat/qat_c62x/adf_drv.c |
547 | +++ b/drivers/crypto/qat/qat_c62x/adf_drv.c |
548 | @@ -233,7 +233,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
549 | &hw_data->accel_capabilities_mask); |
550 | |
551 | /* Find and map all the device's BARS */ |
552 | - i = 0; |
553 | + i = (hw_data->fuses & ADF_DEVICE_FUSECTL_MASK) ? 1 : 0; |
554 | bar_mask = pci_select_bars(pdev, IORESOURCE_MEM); |
555 | for_each_set_bit(bar_nr, (const unsigned long *)&bar_mask, |
556 | ADF_PCI_MAX_BARS * 2) { |
557 | diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h |
558 | index e8822536530b..33f0a6251e38 100644 |
559 | --- a/drivers/crypto/qat/qat_common/adf_accel_devices.h |
560 | +++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h |
561 | @@ -69,6 +69,7 @@ |
562 | #define ADF_ERRSOU5 (0x3A000 + 0xD8) |
563 | #define ADF_DEVICE_FUSECTL_OFFSET 0x40 |
564 | #define ADF_DEVICE_LEGFUSE_OFFSET 0x4C |
565 | +#define ADF_DEVICE_FUSECTL_MASK 0x80000000 |
566 | #define ADF_PCI_MAX_BARS 3 |
567 | #define ADF_DEVICE_NAME_LENGTH 32 |
568 | #define ADF_ETR_MAX_RINGS_PER_BANK 16 |
569 | diff --git a/drivers/crypto/qat/qat_common/qat_hal.c b/drivers/crypto/qat/qat_common/qat_hal.c |
570 | index 1e480f140663..8c4fd255a601 100644 |
571 | --- a/drivers/crypto/qat/qat_common/qat_hal.c |
572 | +++ b/drivers/crypto/qat/qat_common/qat_hal.c |
573 | @@ -456,7 +456,7 @@ static int qat_hal_init_esram(struct icp_qat_fw_loader_handle *handle) |
574 | unsigned int csr_val; |
575 | int times = 30; |
576 | |
577 | - if (handle->pci_dev->device == ADF_C3XXX_PCI_DEVICE_ID) |
578 | + if (handle->pci_dev->device != ADF_DH895XCC_PCI_DEVICE_ID) |
579 | return 0; |
580 | |
581 | csr_val = ADF_CSR_RD(csr_addr, 0); |
582 | @@ -716,7 +716,7 @@ int qat_hal_init(struct adf_accel_dev *accel_dev) |
583 | (void __iomem *)((uintptr_t)handle->hal_cap_ae_xfer_csr_addr_v + |
584 | LOCAL_TO_XFER_REG_OFFSET); |
585 | handle->pci_dev = pci_info->pci_dev; |
586 | - if (handle->pci_dev->device != ADF_C3XXX_PCI_DEVICE_ID) { |
587 | + if (handle->pci_dev->device == ADF_DH895XCC_PCI_DEVICE_ID) { |
588 | sram_bar = |
589 | &pci_info->pci_bars[hw_data->get_sram_bar_id(hw_data)]; |
590 | handle->hal_sram_addr_v = sram_bar->virt_addr; |
591 | diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c |
592 | index e6862a744210..4e19bde4bbff 100644 |
593 | --- a/drivers/gpu/drm/drm_atomic.c |
594 | +++ b/drivers/gpu/drm/drm_atomic.c |
595 | @@ -1759,16 +1759,16 @@ int drm_mode_atomic_ioctl(struct drm_device *dev, |
596 | |
597 | if (ret && arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { |
598 | /* |
599 | - * TEST_ONLY and PAGE_FLIP_EVENT are mutually exclusive, |
600 | - * if they weren't, this code should be called on success |
601 | - * for TEST_ONLY too. |
602 | + * Free the allocated event. drm_atomic_helper_setup_commit |
603 | + * can allocate an event too, so only free it if it's ours |
604 | + * to prevent a double free in drm_atomic_state_clear. |
605 | */ |
606 | - |
607 | for_each_crtc_in_state(state, crtc, crtc_state, i) { |
608 | - if (!crtc_state->event) |
609 | - continue; |
610 | - |
611 | - drm_event_cancel_free(dev, &crtc_state->event->base); |
612 | + struct drm_pending_vblank_event *event = crtc_state->event; |
613 | + if (event && (event->base.fence || event->base.file_priv)) { |
614 | + drm_event_cancel_free(dev, &event->base); |
615 | + crtc_state->event = NULL; |
616 | + } |
617 | } |
618 | } |
619 | |
620 | diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
621 | index a218c2e395e7..0c400f852a76 100644 |
622 | --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
623 | +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c |
624 | @@ -1215,14 +1215,14 @@ validate_exec_list(struct drm_device *dev, |
625 | if (exec[i].offset != |
626 | gen8_canonical_addr(exec[i].offset & PAGE_MASK)) |
627 | return -EINVAL; |
628 | - |
629 | - /* From drm_mm perspective address space is continuous, |
630 | - * so from this point we're always using non-canonical |
631 | - * form internally. |
632 | - */ |
633 | - exec[i].offset = gen8_noncanonical_addr(exec[i].offset); |
634 | } |
635 | |
636 | + /* From drm_mm perspective address space is continuous, |
637 | + * so from this point we're always using non-canonical |
638 | + * form internally. |
639 | + */ |
640 | + exec[i].offset = gen8_noncanonical_addr(exec[i].offset); |
641 | + |
642 | if (exec[i].alignment && !is_power_of_2(exec[i].alignment)) |
643 | return -EINVAL; |
644 | |
645 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
646 | index 8079e5b380cb..b9be8a6141d8 100644 |
647 | --- a/drivers/gpu/drm/i915/intel_display.c |
648 | +++ b/drivers/gpu/drm/i915/intel_display.c |
649 | @@ -4280,10 +4280,10 @@ static void page_flip_completed(struct intel_crtc *intel_crtc) |
650 | drm_crtc_vblank_put(&intel_crtc->base); |
651 | |
652 | wake_up_all(&dev_priv->pending_flip_queue); |
653 | - queue_work(dev_priv->wq, &work->unpin_work); |
654 | - |
655 | trace_i915_flip_complete(intel_crtc->plane, |
656 | work->pending_flip_obj); |
657 | + |
658 | + queue_work(dev_priv->wq, &work->unpin_work); |
659 | } |
660 | |
661 | static int intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) |
662 | diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c |
663 | index 1c59ca50c430..cae27c55dd99 100644 |
664 | --- a/drivers/gpu/drm/i915/intel_dpll_mgr.c |
665 | +++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c |
666 | @@ -1723,7 +1723,8 @@ bxt_get_dpll(struct intel_crtc *crtc, |
667 | return NULL; |
668 | |
669 | if ((encoder->type == INTEL_OUTPUT_DP || |
670 | - encoder->type == INTEL_OUTPUT_EDP) && |
671 | + encoder->type == INTEL_OUTPUT_EDP || |
672 | + encoder->type == INTEL_OUTPUT_DP_MST) && |
673 | !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state)) |
674 | return NULL; |
675 | |
676 | diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c |
677 | index 16f91c8490fe..5fb4c6d9209b 100644 |
678 | --- a/drivers/hv/channel.c |
679 | +++ b/drivers/hv/channel.c |
680 | @@ -39,7 +39,7 @@ |
681 | * vmbus_setevent- Trigger an event notification on the specified |
682 | * channel. |
683 | */ |
684 | -static void vmbus_setevent(struct vmbus_channel *channel) |
685 | +void vmbus_setevent(struct vmbus_channel *channel) |
686 | { |
687 | struct hv_monitor_page *monitorpage; |
688 | |
689 | @@ -65,6 +65,7 @@ static void vmbus_setevent(struct vmbus_channel *channel) |
690 | vmbus_set_event(channel); |
691 | } |
692 | } |
693 | +EXPORT_SYMBOL_GPL(vmbus_setevent); |
694 | |
695 | /* |
696 | * vmbus_open - Open the specified channel. |
697 | @@ -635,8 +636,6 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer, |
698 | u32 packetlen_aligned = ALIGN(packetlen, sizeof(u64)); |
699 | struct kvec bufferlist[3]; |
700 | u64 aligned_data = 0; |
701 | - int ret; |
702 | - bool signal = false; |
703 | bool lock = channel->acquire_ring_lock; |
704 | int num_vecs = ((bufferlen != 0) ? 3 : 1); |
705 | |
706 | @@ -656,33 +655,9 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer, |
707 | bufferlist[2].iov_base = &aligned_data; |
708 | bufferlist[2].iov_len = (packetlen_aligned - packetlen); |
709 | |
710 | - ret = hv_ringbuffer_write(&channel->outbound, bufferlist, num_vecs, |
711 | - &signal, lock, channel->signal_policy); |
712 | - |
713 | - /* |
714 | - * Signalling the host is conditional on many factors: |
715 | - * 1. The ring state changed from being empty to non-empty. |
716 | - * This is tracked by the variable "signal". |
717 | - * 2. The variable kick_q tracks if more data will be placed |
718 | - * on the ring. We will not signal if more data is |
719 | - * to be placed. |
720 | - * |
721 | - * Based on the channel signal state, we will decide |
722 | - * which signaling policy will be applied. |
723 | - * |
724 | - * If we cannot write to the ring-buffer; signal the host |
725 | - * even if we may not have written anything. This is a rare |
726 | - * enough condition that it should not matter. |
727 | - * NOTE: in this case, the hvsock channel is an exception, because |
728 | - * it looks the host side's hvsock implementation has a throttling |
729 | - * mechanism which can hurt the performance otherwise. |
730 | - */ |
731 | - |
732 | - if (((ret == 0) && kick_q && signal) || |
733 | - (ret && !is_hvsock_channel(channel))) |
734 | - vmbus_setevent(channel); |
735 | + return hv_ringbuffer_write(channel, bufferlist, num_vecs, |
736 | + lock, kick_q); |
737 | |
738 | - return ret; |
739 | } |
740 | EXPORT_SYMBOL(vmbus_sendpacket_ctl); |
741 | |
742 | @@ -723,7 +698,6 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, |
743 | u32 flags, |
744 | bool kick_q) |
745 | { |
746 | - int ret; |
747 | int i; |
748 | struct vmbus_channel_packet_page_buffer desc; |
749 | u32 descsize; |
750 | @@ -731,7 +705,6 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, |
751 | u32 packetlen_aligned; |
752 | struct kvec bufferlist[3]; |
753 | u64 aligned_data = 0; |
754 | - bool signal = false; |
755 | bool lock = channel->acquire_ring_lock; |
756 | |
757 | if (pagecount > MAX_PAGE_BUFFER_COUNT) |
758 | @@ -769,29 +742,8 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel, |
759 | bufferlist[2].iov_base = &aligned_data; |
760 | bufferlist[2].iov_len = (packetlen_aligned - packetlen); |
761 | |
762 | - ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, |
763 | - &signal, lock, channel->signal_policy); |
764 | - |
765 | - /* |
766 | - * Signalling the host is conditional on many factors: |
767 | - * 1. The ring state changed from being empty to non-empty. |
768 | - * This is tracked by the variable "signal". |
769 | - * 2. The variable kick_q tracks if more data will be placed |
770 | - * on the ring. We will not signal if more data is |
771 | - * to be placed. |
772 | - * |
773 | - * Based on the channel signal state, we will decide |
774 | - * which signaling policy will be applied. |
775 | - * |
776 | - * If we cannot write to the ring-buffer; signal the host |
777 | - * even if we may not have written anything. This is a rare |
778 | - * enough condition that it should not matter. |
779 | - */ |
780 | - |
781 | - if (((ret == 0) && kick_q && signal) || (ret)) |
782 | - vmbus_setevent(channel); |
783 | - |
784 | - return ret; |
785 | + return hv_ringbuffer_write(channel, bufferlist, 3, |
786 | + lock, kick_q); |
787 | } |
788 | EXPORT_SYMBOL_GPL(vmbus_sendpacket_pagebuffer_ctl); |
789 | |
790 | @@ -822,12 +774,10 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel, |
791 | u32 desc_size, |
792 | void *buffer, u32 bufferlen, u64 requestid) |
793 | { |
794 | - int ret; |
795 | u32 packetlen; |
796 | u32 packetlen_aligned; |
797 | struct kvec bufferlist[3]; |
798 | u64 aligned_data = 0; |
799 | - bool signal = false; |
800 | bool lock = channel->acquire_ring_lock; |
801 | |
802 | packetlen = desc_size + bufferlen; |
803 | @@ -848,13 +798,8 @@ int vmbus_sendpacket_mpb_desc(struct vmbus_channel *channel, |
804 | bufferlist[2].iov_base = &aligned_data; |
805 | bufferlist[2].iov_len = (packetlen_aligned - packetlen); |
806 | |
807 | - ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, |
808 | - &signal, lock, channel->signal_policy); |
809 | - |
810 | - if (ret == 0 && signal) |
811 | - vmbus_setevent(channel); |
812 | - |
813 | - return ret; |
814 | + return hv_ringbuffer_write(channel, bufferlist, 3, |
815 | + lock, true); |
816 | } |
817 | EXPORT_SYMBOL_GPL(vmbus_sendpacket_mpb_desc); |
818 | |
819 | @@ -866,14 +811,12 @@ int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel, |
820 | struct hv_multipage_buffer *multi_pagebuffer, |
821 | void *buffer, u32 bufferlen, u64 requestid) |
822 | { |
823 | - int ret; |
824 | struct vmbus_channel_packet_multipage_buffer desc; |
825 | u32 descsize; |
826 | u32 packetlen; |
827 | u32 packetlen_aligned; |
828 | struct kvec bufferlist[3]; |
829 | u64 aligned_data = 0; |
830 | - bool signal = false; |
831 | bool lock = channel->acquire_ring_lock; |
832 | u32 pfncount = NUM_PAGES_SPANNED(multi_pagebuffer->offset, |
833 | multi_pagebuffer->len); |
834 | @@ -913,13 +856,8 @@ int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel, |
835 | bufferlist[2].iov_base = &aligned_data; |
836 | bufferlist[2].iov_len = (packetlen_aligned - packetlen); |
837 | |
838 | - ret = hv_ringbuffer_write(&channel->outbound, bufferlist, 3, |
839 | - &signal, lock, channel->signal_policy); |
840 | - |
841 | - if (ret == 0 && signal) |
842 | - vmbus_setevent(channel); |
843 | - |
844 | - return ret; |
845 | + return hv_ringbuffer_write(channel, bufferlist, 3, |
846 | + lock, true); |
847 | } |
848 | EXPORT_SYMBOL_GPL(vmbus_sendpacket_multipagebuffer); |
849 | |
850 | @@ -941,16 +879,9 @@ __vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, |
851 | u32 bufferlen, u32 *buffer_actual_len, u64 *requestid, |
852 | bool raw) |
853 | { |
854 | - int ret; |
855 | - bool signal = false; |
856 | + return hv_ringbuffer_read(channel, buffer, bufferlen, |
857 | + buffer_actual_len, requestid, raw); |
858 | |
859 | - ret = hv_ringbuffer_read(&channel->inbound, buffer, bufferlen, |
860 | - buffer_actual_len, requestid, &signal, raw); |
861 | - |
862 | - if (signal) |
863 | - vmbus_setevent(channel); |
864 | - |
865 | - return ret; |
866 | } |
867 | |
868 | int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, |
869 | diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c |
870 | index 1bc1d4795243..caf341842464 100644 |
871 | --- a/drivers/hv/channel_mgmt.c |
872 | +++ b/drivers/hv/channel_mgmt.c |
873 | @@ -449,8 +449,6 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel) |
874 | } |
875 | |
876 | dev_type = hv_get_dev_type(newchannel); |
877 | - if (dev_type == HV_NIC) |
878 | - set_channel_signal_state(newchannel, HV_SIGNAL_POLICY_EXPLICIT); |
879 | |
880 | init_vp_index(newchannel, dev_type); |
881 | |
882 | diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h |
883 | index a5b4442433c8..2b13f2a0a71e 100644 |
884 | --- a/drivers/hv/hyperv_vmbus.h |
885 | +++ b/drivers/hv/hyperv_vmbus.h |
886 | @@ -527,14 +527,14 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, |
887 | |
888 | void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info); |
889 | |
890 | -int hv_ringbuffer_write(struct hv_ring_buffer_info *ring_info, |
891 | +int hv_ringbuffer_write(struct vmbus_channel *channel, |
892 | struct kvec *kv_list, |
893 | - u32 kv_count, bool *signal, bool lock, |
894 | - enum hv_signal_policy policy); |
895 | + u32 kv_count, bool lock, |
896 | + bool kick_q); |
897 | |
898 | -int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, |
899 | +int hv_ringbuffer_read(struct vmbus_channel *channel, |
900 | void *buffer, u32 buflen, u32 *buffer_actual_len, |
901 | - u64 *requestid, bool *signal, bool raw); |
902 | + u64 *requestid, bool raw); |
903 | |
904 | void hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info, |
905 | struct hv_ring_buffer_debug_info *debug_info); |
906 | diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c |
907 | index 08043da1a61c..308dbda700eb 100644 |
908 | --- a/drivers/hv/ring_buffer.c |
909 | +++ b/drivers/hv/ring_buffer.c |
910 | @@ -66,21 +66,25 @@ u32 hv_end_read(struct hv_ring_buffer_info *rbi) |
911 | * once the ring buffer is empty, it will clear the |
912 | * interrupt_mask and re-check to see if new data has |
913 | * arrived. |
914 | + * |
915 | + * KYS: Oct. 30, 2016: |
916 | + * It looks like Windows hosts have logic to deal with DOS attacks that |
917 | + * can be triggered if it receives interrupts when it is not expecting |
918 | + * the interrupt. The host expects interrupts only when the ring |
919 | + * transitions from empty to non-empty (or full to non full on the guest |
920 | + * to host ring). |
921 | + * So, base the signaling decision solely on the ring state until the |
922 | + * host logic is fixed. |
923 | */ |
924 | |
925 | -static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi, |
926 | - enum hv_signal_policy policy) |
927 | +static void hv_signal_on_write(u32 old_write, struct vmbus_channel *channel, |
928 | + bool kick_q) |
929 | { |
930 | + struct hv_ring_buffer_info *rbi = &channel->outbound; |
931 | + |
932 | virt_mb(); |
933 | if (READ_ONCE(rbi->ring_buffer->interrupt_mask)) |
934 | - return false; |
935 | - |
936 | - /* |
937 | - * When the client wants to control signaling, |
938 | - * we only honour the host interrupt mask. |
939 | - */ |
940 | - if (policy == HV_SIGNAL_POLICY_EXPLICIT) |
941 | - return true; |
942 | + return; |
943 | |
944 | /* check interrupt_mask before read_index */ |
945 | virt_rmb(); |
946 | @@ -89,9 +93,9 @@ static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi, |
947 | * ring transitions from being empty to non-empty. |
948 | */ |
949 | if (old_write == READ_ONCE(rbi->ring_buffer->read_index)) |
950 | - return true; |
951 | + vmbus_setevent(channel); |
952 | |
953 | - return false; |
954 | + return; |
955 | } |
956 | |
957 | /* Get the next write location for the specified ring buffer. */ |
958 | @@ -280,9 +284,9 @@ void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info) |
959 | } |
960 | |
961 | /* Write to the ring buffer. */ |
962 | -int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, |
963 | - struct kvec *kv_list, u32 kv_count, bool *signal, bool lock, |
964 | - enum hv_signal_policy policy) |
965 | +int hv_ringbuffer_write(struct vmbus_channel *channel, |
966 | + struct kvec *kv_list, u32 kv_count, bool lock, |
967 | + bool kick_q) |
968 | { |
969 | int i = 0; |
970 | u32 bytes_avail_towrite; |
971 | @@ -292,6 +296,7 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, |
972 | u32 old_write; |
973 | u64 prev_indices = 0; |
974 | unsigned long flags = 0; |
975 | + struct hv_ring_buffer_info *outring_info = &channel->outbound; |
976 | |
977 | for (i = 0; i < kv_count; i++) |
978 | totalbytes_towrite += kv_list[i].iov_len; |
979 | @@ -344,13 +349,13 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, |
980 | if (lock) |
981 | spin_unlock_irqrestore(&outring_info->ring_lock, flags); |
982 | |
983 | - *signal = hv_need_to_signal(old_write, outring_info, policy); |
984 | + hv_signal_on_write(old_write, channel, kick_q); |
985 | return 0; |
986 | } |
987 | |
988 | -int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, |
989 | +int hv_ringbuffer_read(struct vmbus_channel *channel, |
990 | void *buffer, u32 buflen, u32 *buffer_actual_len, |
991 | - u64 *requestid, bool *signal, bool raw) |
992 | + u64 *requestid, bool raw) |
993 | { |
994 | u32 bytes_avail_toread; |
995 | u32 next_read_location = 0; |
996 | @@ -359,6 +364,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, |
997 | u32 offset; |
998 | u32 packetlen; |
999 | int ret = 0; |
1000 | + struct hv_ring_buffer_info *inring_info = &channel->inbound; |
1001 | |
1002 | if (buflen <= 0) |
1003 | return -EINVAL; |
1004 | @@ -377,6 +383,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, |
1005 | return ret; |
1006 | } |
1007 | |
1008 | + init_cached_read_index(channel); |
1009 | next_read_location = hv_get_next_read_location(inring_info); |
1010 | next_read_location = hv_copyfrom_ringbuffer(inring_info, &desc, |
1011 | sizeof(desc), |
1012 | @@ -416,7 +423,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, |
1013 | /* Update the read index */ |
1014 | hv_set_next_read_location(inring_info, next_read_location); |
1015 | |
1016 | - *signal = hv_need_to_signal_on_read(inring_info); |
1017 | + hv_signal_on_read(channel); |
1018 | |
1019 | return ret; |
1020 | } |
1021 | diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c |
1022 | index 1869152f1d23..9b732c5f89e1 100644 |
1023 | --- a/drivers/infiniband/sw/rxe/rxe_mr.c |
1024 | +++ b/drivers/infiniband/sw/rxe/rxe_mr.c |
1025 | @@ -59,9 +59,11 @@ int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length) |
1026 | |
1027 | case RXE_MEM_TYPE_MR: |
1028 | case RXE_MEM_TYPE_FMR: |
1029 | - return ((iova < mem->iova) || |
1030 | - ((iova + length) > (mem->iova + mem->length))) ? |
1031 | - -EFAULT : 0; |
1032 | + if (iova < mem->iova || |
1033 | + length > mem->length || |
1034 | + iova > mem->iova + mem->length - length) |
1035 | + return -EFAULT; |
1036 | + return 0; |
1037 | |
1038 | default: |
1039 | return -EFAULT; |
1040 | diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c |
1041 | index dd3d88adc003..ccf624763565 100644 |
1042 | --- a/drivers/infiniband/sw/rxe/rxe_resp.c |
1043 | +++ b/drivers/infiniband/sw/rxe/rxe_resp.c |
1044 | @@ -472,7 +472,7 @@ static enum resp_states check_rkey(struct rxe_qp *qp, |
1045 | goto err2; |
1046 | } |
1047 | |
1048 | - resid = mtu; |
1049 | + qp->resp.resid = mtu; |
1050 | } else { |
1051 | if (pktlen != resid) { |
1052 | state = RESPST_ERR_LENGTH; |
1053 | diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c |
1054 | index 92595b98e7ed..022be0e22eba 100644 |
1055 | --- a/drivers/input/misc/uinput.c |
1056 | +++ b/drivers/input/misc/uinput.c |
1057 | @@ -263,13 +263,21 @@ static int uinput_create_device(struct uinput_device *udev) |
1058 | return -EINVAL; |
1059 | } |
1060 | |
1061 | - if (test_bit(ABS_MT_SLOT, dev->absbit)) { |
1062 | - nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; |
1063 | - error = input_mt_init_slots(dev, nslot, 0); |
1064 | - if (error) |
1065 | + if (test_bit(EV_ABS, dev->evbit)) { |
1066 | + input_alloc_absinfo(dev); |
1067 | + if (!dev->absinfo) { |
1068 | + error = -EINVAL; |
1069 | goto fail1; |
1070 | - } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { |
1071 | - input_set_events_per_packet(dev, 60); |
1072 | + } |
1073 | + |
1074 | + if (test_bit(ABS_MT_SLOT, dev->absbit)) { |
1075 | + nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; |
1076 | + error = input_mt_init_slots(dev, nslot, 0); |
1077 | + if (error) |
1078 | + goto fail1; |
1079 | + } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { |
1080 | + input_set_events_per_packet(dev, 60); |
1081 | + } |
1082 | } |
1083 | |
1084 | if (test_bit(EV_FF, dev->evbit) && !udev->ff_effects_max) { |
1085 | diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c |
1086 | index 31a89c8832c0..2c965424d383 100644 |
1087 | --- a/drivers/md/dm-rq.c |
1088 | +++ b/drivers/md/dm-rq.c |
1089 | @@ -804,6 +804,10 @@ static void dm_old_request_fn(struct request_queue *q) |
1090 | int srcu_idx; |
1091 | struct dm_table *map = dm_get_live_table(md, &srcu_idx); |
1092 | |
1093 | + if (unlikely(!map)) { |
1094 | + dm_put_live_table(md, srcu_idx); |
1095 | + return; |
1096 | + } |
1097 | ti = dm_table_find_target(map, pos); |
1098 | dm_put_live_table(md, srcu_idx); |
1099 | } |
1100 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
1101 | index 878950a42e6c..2cf8b1d82d6a 100644 |
1102 | --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
1103 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h |
1104 | @@ -1007,9 +1007,7 @@ |
1105 | |
1106 | static inline void dsaf_write_reg(void __iomem *base, u32 reg, u32 value) |
1107 | { |
1108 | - u8 __iomem *reg_addr = ACCESS_ONCE(base); |
1109 | - |
1110 | - writel(value, reg_addr + reg); |
1111 | + writel(value, base + reg); |
1112 | } |
1113 | |
1114 | #define dsaf_write_dev(a, reg, value) \ |
1115 | @@ -1017,9 +1015,7 @@ static inline void dsaf_write_reg(void __iomem *base, u32 reg, u32 value) |
1116 | |
1117 | static inline u32 dsaf_read_reg(u8 __iomem *base, u32 reg) |
1118 | { |
1119 | - u8 __iomem *reg_addr = ACCESS_ONCE(base); |
1120 | - |
1121 | - return readl(reg_addr + reg); |
1122 | + return readl(base + reg); |
1123 | } |
1124 | |
1125 | static inline void dsaf_write_syscon(struct regmap *base, u32 reg, u32 value) |
1126 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1127 | index 27ff401cec20..51c6a57ca873 100644 |
1128 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1129 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |
1130 | @@ -991,6 +991,7 @@ static int mlx5e_set_rxfh(struct net_device *dev, const u32 *indir, |
1131 | { |
1132 | struct mlx5e_priv *priv = netdev_priv(dev); |
1133 | int inlen = MLX5_ST_SZ_BYTES(modify_tir_in); |
1134 | + bool hash_changed = false; |
1135 | void *in; |
1136 | |
1137 | if ((hfunc != ETH_RSS_HASH_NO_CHANGE) && |
1138 | @@ -1012,14 +1013,21 @@ static int mlx5e_set_rxfh(struct net_device *dev, const u32 *indir, |
1139 | mlx5e_redirect_rqt(priv, rqtn, MLX5E_INDIR_RQT_SIZE, 0); |
1140 | } |
1141 | |
1142 | - if (key) |
1143 | + if (hfunc != ETH_RSS_HASH_NO_CHANGE && |
1144 | + hfunc != priv->params.rss_hfunc) { |
1145 | + priv->params.rss_hfunc = hfunc; |
1146 | + hash_changed = true; |
1147 | + } |
1148 | + |
1149 | + if (key) { |
1150 | memcpy(priv->params.toeplitz_hash_key, key, |
1151 | sizeof(priv->params.toeplitz_hash_key)); |
1152 | + hash_changed = hash_changed || |
1153 | + priv->params.rss_hfunc == ETH_RSS_HASH_TOP; |
1154 | + } |
1155 | |
1156 | - if (hfunc != ETH_RSS_HASH_NO_CHANGE) |
1157 | - priv->params.rss_hfunc = hfunc; |
1158 | - |
1159 | - mlx5e_modify_tirs_hash(priv, in, inlen); |
1160 | + if (hash_changed) |
1161 | + mlx5e_modify_tirs_hash(priv, in, inlen); |
1162 | |
1163 | mutex_unlock(&priv->state_lock); |
1164 | |
1165 | diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c |
1166 | index 720b5fa9e625..c2ac39a940f7 100644 |
1167 | --- a/drivers/net/hyperv/netvsc.c |
1168 | +++ b/drivers/net/hyperv/netvsc.c |
1169 | @@ -1288,6 +1288,9 @@ void netvsc_channel_cb(void *context) |
1170 | ndev = hv_get_drvdata(device); |
1171 | buffer = get_per_channel_state(channel); |
1172 | |
1173 | + /* commit_rd_index() -> hv_signal_on_read() needs this. */ |
1174 | + init_cached_read_index(channel); |
1175 | + |
1176 | do { |
1177 | desc = get_next_pkt_raw(channel); |
1178 | if (desc != NULL) { |
1179 | @@ -1340,6 +1343,9 @@ void netvsc_channel_cb(void *context) |
1180 | |
1181 | bufferlen = bytes_recvd; |
1182 | } |
1183 | + |
1184 | + init_cached_read_index(channel); |
1185 | + |
1186 | } while (1); |
1187 | |
1188 | if (bufferlen > NETVSC_PACKET_SIZE) |
1189 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c |
1190 | index 8b6e37ce3f66..20bfb373dcd6 100644 |
1191 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c |
1192 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/sw.c |
1193 | @@ -96,7 +96,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw) |
1194 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1195 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
1196 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
1197 | - char *fw_name = "rtlwifi/rtl8192cfwU.bin"; |
1198 | + char *fw_name; |
1199 | |
1200 | rtl8192ce_bt_reg_init(hw); |
1201 | |
1202 | @@ -168,8 +168,13 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw) |
1203 | } |
1204 | |
1205 | /* request fw */ |
1206 | - if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version)) |
1207 | + if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && |
1208 | + !IS_92C_SERIAL(rtlhal->version)) |
1209 | + fw_name = "rtlwifi/rtl8192cfwU.bin"; |
1210 | + else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version)) |
1211 | fw_name = "rtlwifi/rtl8192cfwU_B.bin"; |
1212 | + else |
1213 | + fw_name = "rtlwifi/rtl8192cfw.bin"; |
1214 | |
1215 | rtlpriv->max_fw_size = 0x4000; |
1216 | pr_info("Using firmware %s\n", fw_name); |
1217 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
1218 | index bf2744e1e3db..0cdcb2169083 100644 |
1219 | --- a/drivers/net/xen-netfront.c |
1220 | +++ b/drivers/net/xen-netfront.c |
1221 | @@ -1397,6 +1397,8 @@ static void xennet_disconnect_backend(struct netfront_info *info) |
1222 | for (i = 0; i < num_queues && info->queues; ++i) { |
1223 | struct netfront_queue *queue = &info->queues[i]; |
1224 | |
1225 | + del_timer_sync(&queue->rx_refill_timer); |
1226 | + |
1227 | if (queue->tx_irq && (queue->tx_irq == queue->rx_irq)) |
1228 | unbind_from_irqhandler(queue->tx_irq, queue); |
1229 | if (queue->tx_irq && (queue->tx_irq != queue->rx_irq)) { |
1230 | @@ -1751,7 +1753,6 @@ static void xennet_destroy_queues(struct netfront_info *info) |
1231 | |
1232 | if (netif_running(info->netdev)) |
1233 | napi_disable(&queue->napi); |
1234 | - del_timer_sync(&queue->rx_refill_timer); |
1235 | netif_napi_del(&queue->napi); |
1236 | } |
1237 | |
1238 | diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c |
1239 | index 1480734c2d6e..aefca644219b 100644 |
1240 | --- a/drivers/nvdimm/namespace_devs.c |
1241 | +++ b/drivers/nvdimm/namespace_devs.c |
1242 | @@ -962,8 +962,8 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) |
1243 | struct nvdimm_drvdata *ndd; |
1244 | struct nd_label_id label_id; |
1245 | u32 flags = 0, remainder; |
1246 | + int rc, i, id = -1; |
1247 | u8 *uuid = NULL; |
1248 | - int rc, i; |
1249 | |
1250 | if (dev->driver || ndns->claim) |
1251 | return -EBUSY; |
1252 | @@ -972,11 +972,13 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) |
1253 | struct nd_namespace_pmem *nspm = to_nd_namespace_pmem(dev); |
1254 | |
1255 | uuid = nspm->uuid; |
1256 | + id = nspm->id; |
1257 | } else if (is_namespace_blk(dev)) { |
1258 | struct nd_namespace_blk *nsblk = to_nd_namespace_blk(dev); |
1259 | |
1260 | uuid = nsblk->uuid; |
1261 | flags = NSLABEL_FLAG_LOCAL; |
1262 | + id = nsblk->id; |
1263 | } |
1264 | |
1265 | /* |
1266 | @@ -1039,10 +1041,11 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) |
1267 | |
1268 | /* |
1269 | * Try to delete the namespace if we deleted all of its |
1270 | - * allocation, this is not the seed device for the region, and |
1271 | - * it is not actively claimed by a btt instance. |
1272 | + * allocation, this is not the seed or 0th device for the |
1273 | + * region, and it is not actively claimed by a btt, pfn, or dax |
1274 | + * instance. |
1275 | */ |
1276 | - if (val == 0 && nd_region->ns_seed != dev && !ndns->claim) |
1277 | + if (val == 0 && id != 0 && nd_region->ns_seed != dev && !ndns->claim) |
1278 | nd_device_unregister(dev, ND_ASYNC); |
1279 | |
1280 | return rc; |
1281 | diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c |
1282 | index a2ac9e641aa9..6c033c9a2f06 100644 |
1283 | --- a/drivers/nvdimm/pfn_devs.c |
1284 | +++ b/drivers/nvdimm/pfn_devs.c |
1285 | @@ -627,15 +627,12 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) |
1286 | size = resource_size(&nsio->res); |
1287 | npfns = (size - start_pad - end_trunc - SZ_8K) / SZ_4K; |
1288 | if (nd_pfn->mode == PFN_MODE_PMEM) { |
1289 | - unsigned long memmap_size; |
1290 | - |
1291 | /* |
1292 | * vmemmap_populate_hugepages() allocates the memmap array in |
1293 | * HPAGE_SIZE chunks. |
1294 | */ |
1295 | - memmap_size = ALIGN(64 * npfns, HPAGE_SIZE); |
1296 | - offset = ALIGN(start + SZ_8K + memmap_size + dax_label_reserve, |
1297 | - nd_pfn->align) - start; |
1298 | + offset = ALIGN(start + SZ_8K + 64 * npfns + dax_label_reserve, |
1299 | + max(nd_pfn->align, HPAGE_SIZE)) - start; |
1300 | } else if (nd_pfn->mode == PFN_MODE_RAM) |
1301 | offset = ALIGN(start + SZ_8K + dax_label_reserve, |
1302 | nd_pfn->align) - start; |
1303 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c |
1304 | index 75f820ca17b7..27ff38f839fc 100644 |
1305 | --- a/drivers/s390/scsi/zfcp_fsf.c |
1306 | +++ b/drivers/s390/scsi/zfcp_fsf.c |
1307 | @@ -1583,7 +1583,7 @@ static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req) |
1308 | int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
1309 | { |
1310 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
1311 | - struct zfcp_fsf_req *req = NULL; |
1312 | + struct zfcp_fsf_req *req; |
1313 | int retval = -EIO; |
1314 | |
1315 | spin_lock_irq(&qdio->req_q_lock); |
1316 | @@ -1612,7 +1612,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
1317 | zfcp_fsf_req_free(req); |
1318 | out: |
1319 | spin_unlock_irq(&qdio->req_q_lock); |
1320 | - if (req && !IS_ERR(req)) |
1321 | + if (!retval) |
1322 | zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); |
1323 | return retval; |
1324 | } |
1325 | @@ -1638,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req) |
1326 | int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
1327 | { |
1328 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
1329 | - struct zfcp_fsf_req *req = NULL; |
1330 | + struct zfcp_fsf_req *req; |
1331 | int retval = -EIO; |
1332 | |
1333 | spin_lock_irq(&qdio->req_q_lock); |
1334 | @@ -1667,7 +1667,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
1335 | zfcp_fsf_req_free(req); |
1336 | out: |
1337 | spin_unlock_irq(&qdio->req_q_lock); |
1338 | - if (req && !IS_ERR(req)) |
1339 | + if (!retval) |
1340 | zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id); |
1341 | return retval; |
1342 | } |
1343 | diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c |
1344 | index 341ea327ae79..792d3e7e35e2 100644 |
1345 | --- a/drivers/scsi/aacraid/comminit.c |
1346 | +++ b/drivers/scsi/aacraid/comminit.c |
1347 | @@ -50,9 +50,13 @@ struct aac_common aac_config = { |
1348 | |
1349 | static inline int aac_is_msix_mode(struct aac_dev *dev) |
1350 | { |
1351 | - u32 status; |
1352 | + u32 status = 0; |
1353 | |
1354 | - status = src_readl(dev, MUnit.OMR); |
1355 | + if (dev->pdev->device == PMC_DEVICE_S6 || |
1356 | + dev->pdev->device == PMC_DEVICE_S7 || |
1357 | + dev->pdev->device == PMC_DEVICE_S8) { |
1358 | + status = src_readl(dev, MUnit.OMR); |
1359 | + } |
1360 | return (status & AAC_INT_MODE_MSIX); |
1361 | } |
1362 | |
1363 | diff --git a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c |
1364 | index e3b911c895b4..91dfd58b175d 100644 |
1365 | --- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c |
1366 | +++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c |
1367 | @@ -3929,6 +3929,7 @@ static struct configfs_attribute *ibmvscsis_tpg_attrs[] = { |
1368 | static const struct target_core_fabric_ops ibmvscsis_ops = { |
1369 | .module = THIS_MODULE, |
1370 | .name = "ibmvscsis", |
1371 | + .max_data_sg_nents = MAX_TXU / PAGE_SIZE, |
1372 | .get_fabric_name = ibmvscsis_get_fabric_name, |
1373 | .tpg_get_wwn = ibmvscsis_get_fabric_wwn, |
1374 | .tpg_get_tag = ibmvscsis_get_tag, |
1375 | diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
1376 | index f84a6087cebd..8a7941b8189f 100644 |
1377 | --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
1378 | +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c |
1379 | @@ -51,6 +51,7 @@ |
1380 | #include <linux/workqueue.h> |
1381 | #include <linux/delay.h> |
1382 | #include <linux/pci.h> |
1383 | +#include <linux/pci-aspm.h> |
1384 | #include <linux/interrupt.h> |
1385 | #include <linux/aer.h> |
1386 | #include <linux/raid_class.h> |
1387 | @@ -8706,6 +8707,8 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1388 | |
1389 | switch (hba_mpi_version) { |
1390 | case MPI2_VERSION: |
1391 | + pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | |
1392 | + PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM); |
1393 | /* Use mpt2sas driver host template for SAS 2.0 HBA's */ |
1394 | shost = scsi_host_alloc(&mpt2sas_driver_template, |
1395 | sizeof(struct MPT3SAS_ADAPTER)); |
1396 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
1397 | index 078d797cb492..bea819e5336d 100644 |
1398 | --- a/drivers/scsi/qla2xxx/qla_os.c |
1399 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
1400 | @@ -1459,7 +1459,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) |
1401 | /* Don't abort commands in adapter during EEH |
1402 | * recovery as it's not accessible/responding. |
1403 | */ |
1404 | - if (!ha->flags.eeh_busy) { |
1405 | + if (GET_CMD_SP(sp) && !ha->flags.eeh_busy) { |
1406 | /* Get a reference to the sp and drop the lock. |
1407 | * The reference ensures this sp->done() call |
1408 | * - and not the call in qla2xxx_eh_abort() - |
1409 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c |
1410 | index 6b423485c5d6..ea9617c7b403 100644 |
1411 | --- a/drivers/target/target_core_device.c |
1412 | +++ b/drivers/target/target_core_device.c |
1413 | @@ -351,7 +351,15 @@ int core_enable_device_list_for_node( |
1414 | kfree(new); |
1415 | return -EINVAL; |
1416 | } |
1417 | - BUG_ON(orig->se_lun_acl != NULL); |
1418 | + if (orig->se_lun_acl != NULL) { |
1419 | + pr_warn_ratelimited("Detected existing explicit" |
1420 | + " se_lun_acl->se_lun_group reference for %s" |
1421 | + " mapped_lun: %llu, failing\n", |
1422 | + nacl->initiatorname, mapped_lun); |
1423 | + mutex_unlock(&nacl->lun_entry_mutex); |
1424 | + kfree(new); |
1425 | + return -EINVAL; |
1426 | + } |
1427 | |
1428 | rcu_assign_pointer(new->se_lun, lun); |
1429 | rcu_assign_pointer(new->se_lun_acl, lun_acl); |
1430 | diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c |
1431 | index 04f616b3ba0a..aabd6602da6c 100644 |
1432 | --- a/drivers/target/target_core_sbc.c |
1433 | +++ b/drivers/target/target_core_sbc.c |
1434 | @@ -450,6 +450,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success, |
1435 | int *post_ret) |
1436 | { |
1437 | struct se_device *dev = cmd->se_dev; |
1438 | + sense_reason_t ret = TCM_NO_SENSE; |
1439 | |
1440 | /* |
1441 | * Only set SCF_COMPARE_AND_WRITE_POST to force a response fall-through |
1442 | @@ -457,9 +458,12 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success, |
1443 | * sent to the backend driver. |
1444 | */ |
1445 | spin_lock_irq(&cmd->t_state_lock); |
1446 | - if ((cmd->transport_state & CMD_T_SENT) && !cmd->scsi_status) { |
1447 | + if (cmd->transport_state & CMD_T_SENT) { |
1448 | cmd->se_cmd_flags |= SCF_COMPARE_AND_WRITE_POST; |
1449 | *post_ret = 1; |
1450 | + |
1451 | + if (cmd->scsi_status == SAM_STAT_CHECK_CONDITION) |
1452 | + ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
1453 | } |
1454 | spin_unlock_irq(&cmd->t_state_lock); |
1455 | |
1456 | @@ -469,7 +473,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success, |
1457 | */ |
1458 | up(&dev->caw_sem); |
1459 | |
1460 | - return TCM_NO_SENSE; |
1461 | + return ret; |
1462 | } |
1463 | |
1464 | static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool success, |
1465 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
1466 | index 7dfefd66df93..767d1eb6e035 100644 |
1467 | --- a/drivers/target/target_core_transport.c |
1468 | +++ b/drivers/target/target_core_transport.c |
1469 | @@ -457,8 +457,20 @@ static void target_complete_nacl(struct kref *kref) |
1470 | { |
1471 | struct se_node_acl *nacl = container_of(kref, |
1472 | struct se_node_acl, acl_kref); |
1473 | + struct se_portal_group *se_tpg = nacl->se_tpg; |
1474 | |
1475 | - complete(&nacl->acl_free_comp); |
1476 | + if (!nacl->dynamic_stop) { |
1477 | + complete(&nacl->acl_free_comp); |
1478 | + return; |
1479 | + } |
1480 | + |
1481 | + mutex_lock(&se_tpg->acl_node_mutex); |
1482 | + list_del(&nacl->acl_list); |
1483 | + mutex_unlock(&se_tpg->acl_node_mutex); |
1484 | + |
1485 | + core_tpg_wait_for_nacl_pr_ref(nacl); |
1486 | + core_free_device_list_for_node(nacl, se_tpg); |
1487 | + kfree(nacl); |
1488 | } |
1489 | |
1490 | void target_put_nacl(struct se_node_acl *nacl) |
1491 | @@ -499,12 +511,39 @@ EXPORT_SYMBOL(transport_deregister_session_configfs); |
1492 | void transport_free_session(struct se_session *se_sess) |
1493 | { |
1494 | struct se_node_acl *se_nacl = se_sess->se_node_acl; |
1495 | + |
1496 | /* |
1497 | * Drop the se_node_acl->nacl_kref obtained from within |
1498 | * core_tpg_get_initiator_node_acl(). |
1499 | */ |
1500 | if (se_nacl) { |
1501 | + struct se_portal_group *se_tpg = se_nacl->se_tpg; |
1502 | + const struct target_core_fabric_ops *se_tfo = se_tpg->se_tpg_tfo; |
1503 | + unsigned long flags; |
1504 | + |
1505 | se_sess->se_node_acl = NULL; |
1506 | + |
1507 | + /* |
1508 | + * Also determine if we need to drop the extra ->cmd_kref if |
1509 | + * it had been previously dynamically generated, and |
1510 | + * the endpoint is not caching dynamic ACLs. |
1511 | + */ |
1512 | + mutex_lock(&se_tpg->acl_node_mutex); |
1513 | + if (se_nacl->dynamic_node_acl && |
1514 | + !se_tfo->tpg_check_demo_mode_cache(se_tpg)) { |
1515 | + spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags); |
1516 | + if (list_empty(&se_nacl->acl_sess_list)) |
1517 | + se_nacl->dynamic_stop = true; |
1518 | + spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags); |
1519 | + |
1520 | + if (se_nacl->dynamic_stop) |
1521 | + list_del(&se_nacl->acl_list); |
1522 | + } |
1523 | + mutex_unlock(&se_tpg->acl_node_mutex); |
1524 | + |
1525 | + if (se_nacl->dynamic_stop) |
1526 | + target_put_nacl(se_nacl); |
1527 | + |
1528 | target_put_nacl(se_nacl); |
1529 | } |
1530 | if (se_sess->sess_cmd_map) { |
1531 | @@ -518,16 +557,12 @@ EXPORT_SYMBOL(transport_free_session); |
1532 | void transport_deregister_session(struct se_session *se_sess) |
1533 | { |
1534 | struct se_portal_group *se_tpg = se_sess->se_tpg; |
1535 | - const struct target_core_fabric_ops *se_tfo; |
1536 | - struct se_node_acl *se_nacl; |
1537 | unsigned long flags; |
1538 | - bool drop_nacl = false; |
1539 | |
1540 | if (!se_tpg) { |
1541 | transport_free_session(se_sess); |
1542 | return; |
1543 | } |
1544 | - se_tfo = se_tpg->se_tpg_tfo; |
1545 | |
1546 | spin_lock_irqsave(&se_tpg->session_lock, flags); |
1547 | list_del(&se_sess->sess_list); |
1548 | @@ -535,33 +570,15 @@ void transport_deregister_session(struct se_session *se_sess) |
1549 | se_sess->fabric_sess_ptr = NULL; |
1550 | spin_unlock_irqrestore(&se_tpg->session_lock, flags); |
1551 | |
1552 | - /* |
1553 | - * Determine if we need to do extra work for this initiator node's |
1554 | - * struct se_node_acl if it had been previously dynamically generated. |
1555 | - */ |
1556 | - se_nacl = se_sess->se_node_acl; |
1557 | - |
1558 | - mutex_lock(&se_tpg->acl_node_mutex); |
1559 | - if (se_nacl && se_nacl->dynamic_node_acl) { |
1560 | - if (!se_tfo->tpg_check_demo_mode_cache(se_tpg)) { |
1561 | - list_del(&se_nacl->acl_list); |
1562 | - drop_nacl = true; |
1563 | - } |
1564 | - } |
1565 | - mutex_unlock(&se_tpg->acl_node_mutex); |
1566 | - |
1567 | - if (drop_nacl) { |
1568 | - core_tpg_wait_for_nacl_pr_ref(se_nacl); |
1569 | - core_free_device_list_for_node(se_nacl, se_tpg); |
1570 | - se_sess->se_node_acl = NULL; |
1571 | - kfree(se_nacl); |
1572 | - } |
1573 | pr_debug("TARGET_CORE[%s]: Deregistered fabric_sess\n", |
1574 | se_tpg->se_tpg_tfo->get_fabric_name()); |
1575 | /* |
1576 | * If last kref is dropping now for an explicit NodeACL, awake sleeping |
1577 | * ->acl_free_comp caller to wakeup configfs se_node_acl->acl_group |
1578 | * removal context from within transport_free_session() code. |
1579 | + * |
1580 | + * For dynamic ACL, target_put_nacl() uses target_complete_nacl() |
1581 | + * to release all remaining generate_node_acl=1 created ACL resources. |
1582 | */ |
1583 | |
1584 | transport_free_session(se_sess); |
1585 | @@ -3086,7 +3103,6 @@ static void target_tmr_work(struct work_struct *work) |
1586 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
1587 | goto check_stop; |
1588 | } |
1589 | - cmd->t_state = TRANSPORT_ISTATE_PROCESSING; |
1590 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
1591 | |
1592 | cmd->se_tfo->queue_tm_rsp(cmd); |
1593 | @@ -3099,11 +3115,25 @@ int transport_generic_handle_tmr( |
1594 | struct se_cmd *cmd) |
1595 | { |
1596 | unsigned long flags; |
1597 | + bool aborted = false; |
1598 | |
1599 | spin_lock_irqsave(&cmd->t_state_lock, flags); |
1600 | - cmd->transport_state |= CMD_T_ACTIVE; |
1601 | + if (cmd->transport_state & CMD_T_ABORTED) { |
1602 | + aborted = true; |
1603 | + } else { |
1604 | + cmd->t_state = TRANSPORT_ISTATE_PROCESSING; |
1605 | + cmd->transport_state |= CMD_T_ACTIVE; |
1606 | + } |
1607 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
1608 | |
1609 | + if (aborted) { |
1610 | + pr_warn_ratelimited("handle_tmr caught CMD_T_ABORTED TMR %d" |
1611 | + "ref_tag: %llu tag: %llu\n", cmd->se_tmr_req->function, |
1612 | + cmd->se_tmr_req->ref_task_tag, cmd->tag); |
1613 | + transport_cmd_check_stop_to_fabric(cmd); |
1614 | + return 0; |
1615 | + } |
1616 | + |
1617 | INIT_WORK(&cmd->work, target_tmr_work); |
1618 | queue_work(cmd->se_dev->tmr_wq, &cmd->work); |
1619 | return 0; |
1620 | diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c |
1621 | index 094a1440eacb..18848ba8d2ba 100644 |
1622 | --- a/drivers/target/target_core_xcopy.c |
1623 | +++ b/drivers/target/target_core_xcopy.c |
1624 | @@ -836,7 +836,7 @@ static void target_xcopy_do_work(struct work_struct *work) |
1625 | " CHECK_CONDITION -> sending response\n", rc); |
1626 | ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION; |
1627 | } |
1628 | - target_complete_cmd(ec_cmd, SAM_STAT_CHECK_CONDITION); |
1629 | + target_complete_cmd(ec_cmd, ec_cmd->scsi_status); |
1630 | } |
1631 | |
1632 | sense_reason_t target_do_xcopy(struct se_cmd *se_cmd) |
1633 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
1634 | index 7acbd2cf6192..1782804f6c26 100644 |
1635 | --- a/fs/btrfs/ioctl.c |
1636 | +++ b/fs/btrfs/ioctl.c |
1637 | @@ -5648,6 +5648,10 @@ long btrfs_ioctl(struct file *file, unsigned int |
1638 | #ifdef CONFIG_COMPAT |
1639 | long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1640 | { |
1641 | + /* |
1642 | + * These all access 32-bit values anyway so no further |
1643 | + * handling is necessary. |
1644 | + */ |
1645 | switch (cmd) { |
1646 | case FS_IOC32_GETFLAGS: |
1647 | cmd = FS_IOC_GETFLAGS; |
1648 | @@ -5658,8 +5662,6 @@ long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1649 | case FS_IOC32_GETVERSION: |
1650 | cmd = FS_IOC_GETVERSION; |
1651 | break; |
1652 | - default: |
1653 | - return -ENOIOCTLCMD; |
1654 | } |
1655 | |
1656 | return btrfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg)); |
1657 | diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h |
1658 | index da7fbf1cdd56..fa3b155ce7e1 100644 |
1659 | --- a/include/linux/cpumask.h |
1660 | +++ b/include/linux/cpumask.h |
1661 | @@ -560,7 +560,7 @@ static inline void cpumask_copy(struct cpumask *dstp, |
1662 | static inline int cpumask_parse_user(const char __user *buf, int len, |
1663 | struct cpumask *dstp) |
1664 | { |
1665 | - return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpu_ids); |
1666 | + return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpumask_bits); |
1667 | } |
1668 | |
1669 | /** |
1670 | @@ -575,7 +575,7 @@ static inline int cpumask_parselist_user(const char __user *buf, int len, |
1671 | struct cpumask *dstp) |
1672 | { |
1673 | return bitmap_parselist_user(buf, len, cpumask_bits(dstp), |
1674 | - nr_cpu_ids); |
1675 | + nr_cpumask_bits); |
1676 | } |
1677 | |
1678 | /** |
1679 | @@ -590,7 +590,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp) |
1680 | char *nl = strchr(buf, '\n'); |
1681 | unsigned int len = nl ? (unsigned int)(nl - buf) : strlen(buf); |
1682 | |
1683 | - return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpu_ids); |
1684 | + return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpumask_bits); |
1685 | } |
1686 | |
1687 | /** |
1688 | @@ -602,7 +602,7 @@ static inline int cpumask_parse(const char *buf, struct cpumask *dstp) |
1689 | */ |
1690 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) |
1691 | { |
1692 | - return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpu_ids); |
1693 | + return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); |
1694 | } |
1695 | |
1696 | /** |
1697 | diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h |
1698 | index cd184bdca58f..c92a083bcf16 100644 |
1699 | --- a/include/linux/hyperv.h |
1700 | +++ b/include/linux/hyperv.h |
1701 | @@ -128,6 +128,7 @@ struct hv_ring_buffer_info { |
1702 | u32 ring_data_startoffset; |
1703 | u32 priv_write_index; |
1704 | u32 priv_read_index; |
1705 | + u32 cached_read_index; |
1706 | }; |
1707 | |
1708 | /* |
1709 | @@ -180,6 +181,19 @@ static inline u32 hv_get_bytes_to_write(struct hv_ring_buffer_info *rbi) |
1710 | return write; |
1711 | } |
1712 | |
1713 | +static inline u32 hv_get_cached_bytes_to_write( |
1714 | + const struct hv_ring_buffer_info *rbi) |
1715 | +{ |
1716 | + u32 read_loc, write_loc, dsize, write; |
1717 | + |
1718 | + dsize = rbi->ring_datasize; |
1719 | + read_loc = rbi->cached_read_index; |
1720 | + write_loc = rbi->ring_buffer->write_index; |
1721 | + |
1722 | + write = write_loc >= read_loc ? dsize - (write_loc - read_loc) : |
1723 | + read_loc - write_loc; |
1724 | + return write; |
1725 | +} |
1726 | /* |
1727 | * VMBUS version is 32 bit entity broken up into |
1728 | * two 16 bit quantities: major_number. minor_number. |
1729 | @@ -1447,6 +1461,7 @@ void hv_event_tasklet_enable(struct vmbus_channel *channel); |
1730 | |
1731 | void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid); |
1732 | |
1733 | +void vmbus_setevent(struct vmbus_channel *channel); |
1734 | /* |
1735 | * Negotiated version with the Host. |
1736 | */ |
1737 | @@ -1479,10 +1494,11 @@ hv_get_ring_buffer(struct hv_ring_buffer_info *ring_info) |
1738 | * there is room for the producer to send the pending packet. |
1739 | */ |
1740 | |
1741 | -static inline bool hv_need_to_signal_on_read(struct hv_ring_buffer_info *rbi) |
1742 | +static inline void hv_signal_on_read(struct vmbus_channel *channel) |
1743 | { |
1744 | - u32 cur_write_sz; |
1745 | + u32 cur_write_sz, cached_write_sz; |
1746 | u32 pending_sz; |
1747 | + struct hv_ring_buffer_info *rbi = &channel->inbound; |
1748 | |
1749 | /* |
1750 | * Issue a full memory barrier before making the signaling decision. |
1751 | @@ -1500,14 +1516,26 @@ static inline bool hv_need_to_signal_on_read(struct hv_ring_buffer_info *rbi) |
1752 | pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); |
1753 | /* If the other end is not blocked on write don't bother. */ |
1754 | if (pending_sz == 0) |
1755 | - return false; |
1756 | + return; |
1757 | |
1758 | cur_write_sz = hv_get_bytes_to_write(rbi); |
1759 | |
1760 | - if (cur_write_sz >= pending_sz) |
1761 | - return true; |
1762 | + if (cur_write_sz < pending_sz) |
1763 | + return; |
1764 | + |
1765 | + cached_write_sz = hv_get_cached_bytes_to_write(rbi); |
1766 | + if (cached_write_sz < pending_sz) |
1767 | + vmbus_setevent(channel); |
1768 | + |
1769 | + return; |
1770 | +} |
1771 | + |
1772 | +static inline void |
1773 | +init_cached_read_index(struct vmbus_channel *channel) |
1774 | +{ |
1775 | + struct hv_ring_buffer_info *rbi = &channel->inbound; |
1776 | |
1777 | - return false; |
1778 | + rbi->cached_read_index = rbi->ring_buffer->read_index; |
1779 | } |
1780 | |
1781 | /* |
1782 | @@ -1571,6 +1599,8 @@ static inline void put_pkt_raw(struct vmbus_channel *channel, |
1783 | * This call commits the read index and potentially signals the host. |
1784 | * Here is the pattern for using the "in-place" consumption APIs: |
1785 | * |
1786 | + * init_cached_read_index(); |
1787 | + * |
1788 | * while (get_next_pkt_raw() { |
1789 | * process the packet "in-place"; |
1790 | * put_pkt_raw(); |
1791 | @@ -1589,8 +1619,7 @@ static inline void commit_rd_index(struct vmbus_channel *channel) |
1792 | virt_rmb(); |
1793 | ring_info->ring_buffer->read_index = ring_info->priv_read_index; |
1794 | |
1795 | - if (hv_need_to_signal_on_read(ring_info)) |
1796 | - vmbus_set_event(channel); |
1797 | + hv_signal_on_read(channel); |
1798 | } |
1799 | |
1800 | |
1801 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h |
1802 | index c2119008990a..48bc1ac1da43 100644 |
1803 | --- a/include/target/target_core_base.h |
1804 | +++ b/include/target/target_core_base.h |
1805 | @@ -538,6 +538,7 @@ struct se_node_acl { |
1806 | char initiatorname[TRANSPORT_IQN_LEN]; |
1807 | /* Used to signal demo mode created ACL, disabled by default */ |
1808 | bool dynamic_node_acl; |
1809 | + bool dynamic_stop; |
1810 | u32 queue_depth; |
1811 | u32 acl_index; |
1812 | enum target_prot_type saved_prot_type; |
1813 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
1814 | index b1cfd7416db0..4b3323151a2f 100644 |
1815 | --- a/kernel/events/core.c |
1816 | +++ b/kernel/events/core.c |
1817 | @@ -3461,14 +3461,15 @@ struct perf_read_data { |
1818 | int ret; |
1819 | }; |
1820 | |
1821 | -static int find_cpu_to_read(struct perf_event *event, int local_cpu) |
1822 | +static int __perf_event_read_cpu(struct perf_event *event, int event_cpu) |
1823 | { |
1824 | - int event_cpu = event->oncpu; |
1825 | u16 local_pkg, event_pkg; |
1826 | |
1827 | if (event->group_caps & PERF_EV_CAP_READ_ACTIVE_PKG) { |
1828 | - event_pkg = topology_physical_package_id(event_cpu); |
1829 | - local_pkg = topology_physical_package_id(local_cpu); |
1830 | + int local_cpu = smp_processor_id(); |
1831 | + |
1832 | + event_pkg = topology_physical_package_id(event_cpu); |
1833 | + local_pkg = topology_physical_package_id(local_cpu); |
1834 | |
1835 | if (event_pkg == local_pkg) |
1836 | return local_cpu; |
1837 | @@ -3598,7 +3599,7 @@ u64 perf_event_read_local(struct perf_event *event) |
1838 | |
1839 | static int perf_event_read(struct perf_event *event, bool group) |
1840 | { |
1841 | - int ret = 0, cpu_to_read, local_cpu; |
1842 | + int event_cpu, ret = 0; |
1843 | |
1844 | /* |
1845 | * If event is enabled and currently active on a CPU, update the |
1846 | @@ -3611,21 +3612,25 @@ static int perf_event_read(struct perf_event *event, bool group) |
1847 | .ret = 0, |
1848 | }; |
1849 | |
1850 | - local_cpu = get_cpu(); |
1851 | - cpu_to_read = find_cpu_to_read(event, local_cpu); |
1852 | - put_cpu(); |
1853 | + event_cpu = READ_ONCE(event->oncpu); |
1854 | + if ((unsigned)event_cpu >= nr_cpu_ids) |
1855 | + return 0; |
1856 | + |
1857 | + preempt_disable(); |
1858 | + event_cpu = __perf_event_read_cpu(event, event_cpu); |
1859 | |
1860 | /* |
1861 | * Purposely ignore the smp_call_function_single() return |
1862 | * value. |
1863 | * |
1864 | - * If event->oncpu isn't a valid CPU it means the event got |
1865 | + * If event_cpu isn't a valid CPU it means the event got |
1866 | * scheduled out and that will have updated the event count. |
1867 | * |
1868 | * Therefore, either way, we'll have an up-to-date event count |
1869 | * after this. |
1870 | */ |
1871 | - (void)smp_call_function_single(cpu_to_read, __perf_event_read, &data, 1); |
1872 | + (void)smp_call_function_single(event_cpu, __perf_event_read, &data, 1); |
1873 | + preempt_enable(); |
1874 | ret = data.ret; |
1875 | } else if (event->state == PERF_EVENT_STATE_INACTIVE) { |
1876 | struct perf_event_context *ctx = event->ctx; |
1877 | diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c |
1878 | index b6e4c16377c7..9c15a9124e83 100644 |
1879 | --- a/kernel/stacktrace.c |
1880 | +++ b/kernel/stacktrace.c |
1881 | @@ -18,10 +18,8 @@ void print_stack_trace(struct stack_trace *trace, int spaces) |
1882 | if (WARN_ON(!trace->entries)) |
1883 | return; |
1884 | |
1885 | - for (i = 0; i < trace->nr_entries; i++) { |
1886 | - printk("%*c", 1 + spaces, ' '); |
1887 | - print_ip_sym(trace->entries[i]); |
1888 | - } |
1889 | + for (i = 0; i < trace->nr_entries; i++) |
1890 | + printk("%*c%pS\n", 1 + spaces, ' ', (void *)trace->entries[i]); |
1891 | } |
1892 | EXPORT_SYMBOL_GPL(print_stack_trace); |
1893 | |
1894 | @@ -29,7 +27,6 @@ int snprint_stack_trace(char *buf, size_t size, |
1895 | struct stack_trace *trace, int spaces) |
1896 | { |
1897 | int i; |
1898 | - unsigned long ip; |
1899 | int generated; |
1900 | int total = 0; |
1901 | |
1902 | @@ -37,9 +34,8 @@ int snprint_stack_trace(char *buf, size_t size, |
1903 | return 0; |
1904 | |
1905 | for (i = 0; i < trace->nr_entries; i++) { |
1906 | - ip = trace->entries[i]; |
1907 | - generated = snprintf(buf, size, "%*c[<%p>] %pS\n", |
1908 | - 1 + spaces, ' ', (void *) ip, (void *) ip); |
1909 | + generated = snprintf(buf, size, "%*c%pS\n", 1 + spaces, ' ', |
1910 | + (void *)trace->entries[i]); |
1911 | |
1912 | total += generated; |
1913 | |
1914 | diff --git a/mm/slub.c b/mm/slub.c |
1915 | index 2b3e740609e9..7aa0e97af928 100644 |
1916 | --- a/mm/slub.c |
1917 | +++ b/mm/slub.c |
1918 | @@ -1419,6 +1419,10 @@ static int init_cache_random_seq(struct kmem_cache *s) |
1919 | int err; |
1920 | unsigned long i, count = oo_objects(s->oo); |
1921 | |
1922 | + /* Bailout if already initialised */ |
1923 | + if (s->random_seq) |
1924 | + return 0; |
1925 | + |
1926 | err = cache_random_seq_create(s, count, GFP_KERNEL); |
1927 | if (err) { |
1928 | pr_err("SLUB: Unable to initialize free list for %s\n", |
1929 | diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c |
1930 | index 42120d965263..50e1b7f78bd4 100644 |
1931 | --- a/net/mac80211/mesh.c |
1932 | +++ b/net/mac80211/mesh.c |
1933 | @@ -339,7 +339,7 @@ int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata, |
1934 | /* fast-forward to vendor IEs */ |
1935 | offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0); |
1936 | |
1937 | - if (offset) { |
1938 | + if (offset < ifmsh->ie_len) { |
1939 | len = ifmsh->ie_len - offset; |
1940 | data = ifmsh->ie + offset; |
1941 | if (skb_tailroom(skb) < len) |
1942 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
1943 | index 1b3c18c2c1ec..cd7a419faa21 100644 |
1944 | --- a/net/wireless/nl80211.c |
1945 | +++ b/net/wireless/nl80211.c |
1946 | @@ -5874,6 +5874,7 @@ do { \ |
1947 | break; |
1948 | } |
1949 | cfg->ht_opmode = ht_opmode; |
1950 | + mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); |
1951 | } |
1952 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout, |
1953 | 1, 65535, mask, |
1954 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
1955 | index 09fd6108e421..c2da45ae5b2a 100644 |
1956 | --- a/security/selinux/hooks.c |
1957 | +++ b/security/selinux/hooks.c |
1958 | @@ -5858,7 +5858,7 @@ static int selinux_setprocattr(struct task_struct *p, |
1959 | return error; |
1960 | |
1961 | /* Obtain a SID for the context, if one was specified. */ |
1962 | - if (size && str[1] && str[1] != '\n') { |
1963 | + if (size && str[0] && str[0] != '\n') { |
1964 | if (str[size-1] == '\n') { |
1965 | str[size-1] = 0; |
1966 | size--; |
1967 | diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c |
1968 | index c850345c43b5..dfa5156f3585 100644 |
1969 | --- a/sound/core/seq/seq_memory.c |
1970 | +++ b/sound/core/seq/seq_memory.c |
1971 | @@ -419,7 +419,6 @@ int snd_seq_pool_done(struct snd_seq_pool *pool) |
1972 | { |
1973 | unsigned long flags; |
1974 | struct snd_seq_event_cell *ptr; |
1975 | - int max_count = 5 * HZ; |
1976 | |
1977 | if (snd_BUG_ON(!pool)) |
1978 | return -EINVAL; |
1979 | @@ -432,14 +431,8 @@ int snd_seq_pool_done(struct snd_seq_pool *pool) |
1980 | if (waitqueue_active(&pool->output_sleep)) |
1981 | wake_up(&pool->output_sleep); |
1982 | |
1983 | - while (atomic_read(&pool->counter) > 0) { |
1984 | - if (max_count == 0) { |
1985 | - pr_warn("ALSA: snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter)); |
1986 | - break; |
1987 | - } |
1988 | + while (atomic_read(&pool->counter) > 0) |
1989 | schedule_timeout_uninterruptible(1); |
1990 | - max_count--; |
1991 | - } |
1992 | |
1993 | /* release all resources */ |
1994 | spin_lock_irqsave(&pool->lock, flags); |
1995 | diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c |
1996 | index 0bec02e89d51..450c5187eecb 100644 |
1997 | --- a/sound/core/seq/seq_queue.c |
1998 | +++ b/sound/core/seq/seq_queue.c |
1999 | @@ -181,6 +181,8 @@ void __exit snd_seq_queues_delete(void) |
2000 | } |
2001 | } |
2002 | |
2003 | +static void queue_use(struct snd_seq_queue *queue, int client, int use); |
2004 | + |
2005 | /* allocate a new queue - |
2006 | * return queue index value or negative value for error |
2007 | */ |
2008 | @@ -192,11 +194,11 @@ int snd_seq_queue_alloc(int client, int locked, unsigned int info_flags) |
2009 | if (q == NULL) |
2010 | return -ENOMEM; |
2011 | q->info_flags = info_flags; |
2012 | + queue_use(q, client, 1); |
2013 | if (queue_list_add(q) < 0) { |
2014 | queue_delete(q); |
2015 | return -ENOMEM; |
2016 | } |
2017 | - snd_seq_queue_use(q->queue, client, 1); /* use this queue */ |
2018 | return q->queue; |
2019 | } |
2020 | |
2021 | @@ -502,19 +504,9 @@ int snd_seq_queue_timer_set_tempo(int queueid, int client, |
2022 | return result; |
2023 | } |
2024 | |
2025 | - |
2026 | -/* use or unuse this queue - |
2027 | - * if it is the first client, starts the timer. |
2028 | - * if it is not longer used by any clients, stop the timer. |
2029 | - */ |
2030 | -int snd_seq_queue_use(int queueid, int client, int use) |
2031 | +/* use or unuse this queue */ |
2032 | +static void queue_use(struct snd_seq_queue *queue, int client, int use) |
2033 | { |
2034 | - struct snd_seq_queue *queue; |
2035 | - |
2036 | - queue = queueptr(queueid); |
2037 | - if (queue == NULL) |
2038 | - return -EINVAL; |
2039 | - mutex_lock(&queue->timer_mutex); |
2040 | if (use) { |
2041 | if (!test_and_set_bit(client, queue->clients_bitmap)) |
2042 | queue->clients++; |
2043 | @@ -529,6 +521,21 @@ int snd_seq_queue_use(int queueid, int client, int use) |
2044 | } else { |
2045 | snd_seq_timer_close(queue); |
2046 | } |
2047 | +} |
2048 | + |
2049 | +/* use or unuse this queue - |
2050 | + * if it is the first client, starts the timer. |
2051 | + * if it is not longer used by any clients, stop the timer. |
2052 | + */ |
2053 | +int snd_seq_queue_use(int queueid, int client, int use) |
2054 | +{ |
2055 | + struct snd_seq_queue *queue; |
2056 | + |
2057 | + queue = queueptr(queueid); |
2058 | + if (queue == NULL) |
2059 | + return -EINVAL; |
2060 | + mutex_lock(&queue->timer_mutex); |
2061 | + queue_use(queue, client, use); |
2062 | mutex_unlock(&queue->timer_mutex); |
2063 | queuefree(queue); |
2064 | return 0; |
2065 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
2066 | index 56e5204ac9c1..4bf48336b0fc 100644 |
2067 | --- a/sound/pci/hda/patch_hdmi.c |
2068 | +++ b/sound/pci/hda/patch_hdmi.c |
2069 | @@ -3638,6 +3638,7 @@ HDA_CODEC_ENTRY(0x10de0070, "GPU 70 HDMI/DP", patch_nvhdmi), |
2070 | HDA_CODEC_ENTRY(0x10de0071, "GPU 71 HDMI/DP", patch_nvhdmi), |
2071 | HDA_CODEC_ENTRY(0x10de0072, "GPU 72 HDMI/DP", patch_nvhdmi), |
2072 | HDA_CODEC_ENTRY(0x10de007d, "GPU 7d HDMI/DP", patch_nvhdmi), |
2073 | +HDA_CODEC_ENTRY(0x10de0080, "GPU 80 HDMI/DP", patch_nvhdmi), |
2074 | HDA_CODEC_ENTRY(0x10de0082, "GPU 82 HDMI/DP", patch_nvhdmi), |
2075 | HDA_CODEC_ENTRY(0x10de0083, "GPU 83 HDMI/DP", patch_nvhdmi), |
2076 | HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI", patch_nvhdmi_2ch), |
2077 | diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c |
2078 | index 90009c0b3a92..ab3c280a23d1 100644 |
2079 | --- a/sound/usb/line6/driver.c |
2080 | +++ b/sound/usb/line6/driver.c |
2081 | @@ -754,8 +754,9 @@ int line6_probe(struct usb_interface *interface, |
2082 | goto error; |
2083 | } |
2084 | |
2085 | + line6_get_interval(line6); |
2086 | + |
2087 | if (properties->capabilities & LINE6_CAP_CONTROL) { |
2088 | - line6_get_interval(line6); |
2089 | ret = line6_init_cap_control(line6); |
2090 | if (ret < 0) |
2091 | goto error; |
2092 | diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c |
2093 | index 9ff0db4e2d0c..933aeec46f4a 100644 |
2094 | --- a/tools/perf/builtin-diff.c |
2095 | +++ b/tools/perf/builtin-diff.c |
2096 | @@ -1199,7 +1199,7 @@ static int ui_init(void) |
2097 | BUG_ON(1); |
2098 | } |
2099 | |
2100 | - perf_hpp__register_sort_field(fmt); |
2101 | + perf_hpp__prepend_sort_field(fmt); |
2102 | return 0; |
2103 | } |
2104 | |
2105 | diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c |
2106 | index 37388397b5bc..18cfcdc90356 100644 |
2107 | --- a/tools/perf/ui/hist.c |
2108 | +++ b/tools/perf/ui/hist.c |
2109 | @@ -521,6 +521,12 @@ void perf_hpp_list__register_sort_field(struct perf_hpp_list *list, |
2110 | list_add_tail(&format->sort_list, &list->sorts); |
2111 | } |
2112 | |
2113 | +void perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list, |
2114 | + struct perf_hpp_fmt *format) |
2115 | +{ |
2116 | + list_add(&format->sort_list, &list->sorts); |
2117 | +} |
2118 | + |
2119 | void perf_hpp__column_unregister(struct perf_hpp_fmt *format) |
2120 | { |
2121 | list_del(&format->list); |
2122 | @@ -560,6 +566,10 @@ void perf_hpp__setup_output_field(struct perf_hpp_list *list) |
2123 | perf_hpp_list__for_each_sort_list(list, fmt) { |
2124 | struct perf_hpp_fmt *pos; |
2125 | |
2126 | + /* skip sort-only fields ("sort_compute" in perf diff) */ |
2127 | + if (!fmt->entry && !fmt->color) |
2128 | + continue; |
2129 | + |
2130 | perf_hpp_list__for_each_format(list, pos) { |
2131 | if (fmt_equal(fmt, pos)) |
2132 | goto next; |
2133 | diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h |
2134 | index 9928fed8bc59..a440a04a29ff 100644 |
2135 | --- a/tools/perf/util/hist.h |
2136 | +++ b/tools/perf/util/hist.h |
2137 | @@ -282,6 +282,8 @@ void perf_hpp_list__column_register(struct perf_hpp_list *list, |
2138 | struct perf_hpp_fmt *format); |
2139 | void perf_hpp_list__register_sort_field(struct perf_hpp_list *list, |
2140 | struct perf_hpp_fmt *format); |
2141 | +void perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list, |
2142 | + struct perf_hpp_fmt *format); |
2143 | |
2144 | static inline void perf_hpp__column_register(struct perf_hpp_fmt *format) |
2145 | { |
2146 | @@ -293,6 +295,11 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format) |
2147 | perf_hpp_list__register_sort_field(&perf_hpp_list, format); |
2148 | } |
2149 | |
2150 | +static inline void perf_hpp__prepend_sort_field(struct perf_hpp_fmt *format) |
2151 | +{ |
2152 | + perf_hpp_list__prepend_sort_field(&perf_hpp_list, format); |
2153 | +} |
2154 | + |
2155 | #define perf_hpp_list__for_each_format(_list, format) \ |
2156 | list_for_each_entry(format, &(_list)->fields, list) |
2157 |