Contents of /trunk/kernel-magellan/patches-4.8/0112-4.8.13-all-fixes.patch
Parent Directory | Revision Log
Revision 2852 -
(show annotations)
(download)
Fri Jan 6 09:45:18 2017 UTC (7 years, 8 months ago) by niro
File size: 34958 byte(s)
Fri Jan 6 09:45:18 2017 UTC (7 years, 8 months ago) by niro
File size: 34958 byte(s)
-linux-4.8.13
1 | diff --git a/Makefile b/Makefile |
2 | index 7b0c92f53169..b38abe9adef8 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 8 |
8 | -SUBLEVEL = 12 |
9 | +SUBLEVEL = 13 |
10 | EXTRAVERSION = |
11 | NAME = Psychotic Stoned Sheep |
12 | |
13 | diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h |
14 | index 08e7e2a16ac1..a36e8601114d 100644 |
15 | --- a/arch/arc/include/asm/delay.h |
16 | +++ b/arch/arc/include/asm/delay.h |
17 | @@ -22,10 +22,11 @@ |
18 | static inline void __delay(unsigned long loops) |
19 | { |
20 | __asm__ __volatile__( |
21 | - " lp 1f \n" |
22 | - " nop \n" |
23 | - "1: \n" |
24 | - : "+l"(loops)); |
25 | + " mov lp_count, %0 \n" |
26 | + " lp 1f \n" |
27 | + " nop \n" |
28 | + "1: \n" |
29 | + : : "r"(loops)); |
30 | } |
31 | |
32 | extern void __bad_udelay(void); |
33 | diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h |
34 | index 89eeb3720051..e94ca72b974e 100644 |
35 | --- a/arch/arc/include/asm/pgtable.h |
36 | +++ b/arch/arc/include/asm/pgtable.h |
37 | @@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep) |
38 | |
39 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) |
40 | #define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) |
41 | -#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
42 | +#define pfn_pte(pfn, prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot)) |
43 | |
44 | /* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/ |
45 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) |
46 | diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts |
47 | index 123a58b29cbd..f0b857d6d73c 100644 |
48 | --- a/arch/arm64/boot/dts/arm/juno-r1.dts |
49 | +++ b/arch/arm64/boot/dts/arm/juno-r1.dts |
50 | @@ -76,7 +76,7 @@ |
51 | compatible = "arm,idle-state"; |
52 | arm,psci-suspend-param = <0x1010000>; |
53 | local-timer-stop; |
54 | - entry-latency-us = <300>; |
55 | + entry-latency-us = <400>; |
56 | exit-latency-us = <1200>; |
57 | min-residency-us = <2500>; |
58 | }; |
59 | diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts |
60 | index 007be826efce..26aaa6a7670f 100644 |
61 | --- a/arch/arm64/boot/dts/arm/juno-r2.dts |
62 | +++ b/arch/arm64/boot/dts/arm/juno-r2.dts |
63 | @@ -76,7 +76,7 @@ |
64 | compatible = "arm,idle-state"; |
65 | arm,psci-suspend-param = <0x1010000>; |
66 | local-timer-stop; |
67 | - entry-latency-us = <300>; |
68 | + entry-latency-us = <400>; |
69 | exit-latency-us = <1200>; |
70 | min-residency-us = <2500>; |
71 | }; |
72 | diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts |
73 | index a7270eff6939..6e154d948a80 100644 |
74 | --- a/arch/arm64/boot/dts/arm/juno.dts |
75 | +++ b/arch/arm64/boot/dts/arm/juno.dts |
76 | @@ -76,7 +76,7 @@ |
77 | compatible = "arm,idle-state"; |
78 | arm,psci-suspend-param = <0x1010000>; |
79 | local-timer-stop; |
80 | - entry-latency-us = <300>; |
81 | + entry-latency-us = <400>; |
82 | exit-latency-us = <1200>; |
83 | min-residency-us = <2500>; |
84 | }; |
85 | diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h |
86 | index 7099f26e3702..b96346b943b7 100644 |
87 | --- a/arch/arm64/include/asm/cpufeature.h |
88 | +++ b/arch/arm64/include/asm/cpufeature.h |
89 | @@ -90,7 +90,7 @@ struct arm64_cpu_capabilities { |
90 | u16 capability; |
91 | int def_scope; /* default scope */ |
92 | bool (*matches)(const struct arm64_cpu_capabilities *caps, int scope); |
93 | - void (*enable)(void *); /* Called on all active CPUs */ |
94 | + int (*enable)(void *); /* Called on all active CPUs */ |
95 | union { |
96 | struct { /* To be used for erratum handling only */ |
97 | u32 midr_model; |
98 | diff --git a/arch/arm64/include/asm/exec.h b/arch/arm64/include/asm/exec.h |
99 | index db0563c23482..f7865dd9d868 100644 |
100 | --- a/arch/arm64/include/asm/exec.h |
101 | +++ b/arch/arm64/include/asm/exec.h |
102 | @@ -18,6 +18,9 @@ |
103 | #ifndef __ASM_EXEC_H |
104 | #define __ASM_EXEC_H |
105 | |
106 | +#include <linux/sched.h> |
107 | + |
108 | extern unsigned long arch_align_stack(unsigned long sp); |
109 | +void uao_thread_switch(struct task_struct *next); |
110 | |
111 | #endif /* __ASM_EXEC_H */ |
112 | diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h |
113 | index ace0a96e7d6e..3be0ab013e35 100644 |
114 | --- a/arch/arm64/include/asm/processor.h |
115 | +++ b/arch/arm64/include/asm/processor.h |
116 | @@ -190,8 +190,8 @@ static inline void spin_lock_prefetch(const void *ptr) |
117 | |
118 | #endif |
119 | |
120 | -void cpu_enable_pan(void *__unused); |
121 | -void cpu_enable_uao(void *__unused); |
122 | -void cpu_enable_cache_maint_trap(void *__unused); |
123 | +int cpu_enable_pan(void *__unused); |
124 | +int cpu_enable_uao(void *__unused); |
125 | +int cpu_enable_cache_maint_trap(void *__unused); |
126 | |
127 | #endif /* __ASM_PROCESSOR_H */ |
128 | diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c |
129 | index 62272eac1352..94a0330f7ec9 100644 |
130 | --- a/arch/arm64/kernel/cpufeature.c |
131 | +++ b/arch/arm64/kernel/cpufeature.c |
132 | @@ -19,7 +19,9 @@ |
133 | #define pr_fmt(fmt) "CPU features: " fmt |
134 | |
135 | #include <linux/bsearch.h> |
136 | +#include <linux/cpumask.h> |
137 | #include <linux/sort.h> |
138 | +#include <linux/stop_machine.h> |
139 | #include <linux/types.h> |
140 | #include <asm/cpu.h> |
141 | #include <asm/cpufeature.h> |
142 | @@ -936,7 +938,13 @@ void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps) |
143 | { |
144 | for (; caps->matches; caps++) |
145 | if (caps->enable && cpus_have_cap(caps->capability)) |
146 | - on_each_cpu(caps->enable, NULL, true); |
147 | + /* |
148 | + * Use stop_machine() as it schedules the work allowing |
149 | + * us to modify PSTATE, instead of on_each_cpu() which |
150 | + * uses an IPI, giving us a PSTATE that disappears when |
151 | + * we return. |
152 | + */ |
153 | + stop_machine(caps->enable, NULL, cpu_online_mask); |
154 | } |
155 | |
156 | /* |
157 | diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c |
158 | index 6cd2612236dc..9cc8667212a6 100644 |
159 | --- a/arch/arm64/kernel/process.c |
160 | +++ b/arch/arm64/kernel/process.c |
161 | @@ -49,6 +49,7 @@ |
162 | #include <asm/alternative.h> |
163 | #include <asm/compat.h> |
164 | #include <asm/cacheflush.h> |
165 | +#include <asm/exec.h> |
166 | #include <asm/fpsimd.h> |
167 | #include <asm/mmu_context.h> |
168 | #include <asm/processor.h> |
169 | @@ -303,7 +304,7 @@ static void tls_thread_switch(struct task_struct *next) |
170 | } |
171 | |
172 | /* Restore the UAO state depending on next's addr_limit */ |
173 | -static void uao_thread_switch(struct task_struct *next) |
174 | +void uao_thread_switch(struct task_struct *next) |
175 | { |
176 | if (IS_ENABLED(CONFIG_ARM64_UAO)) { |
177 | if (task_thread_info(next)->addr_limit == KERNEL_DS) |
178 | diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c |
179 | index b616e365cee3..23ddf5500b09 100644 |
180 | --- a/arch/arm64/kernel/suspend.c |
181 | +++ b/arch/arm64/kernel/suspend.c |
182 | @@ -1,8 +1,11 @@ |
183 | #include <linux/ftrace.h> |
184 | #include <linux/percpu.h> |
185 | #include <linux/slab.h> |
186 | +#include <asm/alternative.h> |
187 | #include <asm/cacheflush.h> |
188 | +#include <asm/cpufeature.h> |
189 | #include <asm/debug-monitors.h> |
190 | +#include <asm/exec.h> |
191 | #include <asm/pgtable.h> |
192 | #include <asm/memory.h> |
193 | #include <asm/mmu_context.h> |
194 | @@ -48,6 +51,14 @@ void notrace __cpu_suspend_exit(void) |
195 | set_my_cpu_offset(per_cpu_offset(smp_processor_id())); |
196 | |
197 | /* |
198 | + * PSTATE was not saved over suspend/resume, re-enable any detected |
199 | + * features that might not have been set correctly. |
200 | + */ |
201 | + asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, |
202 | + CONFIG_ARM64_PAN)); |
203 | + uao_thread_switch(current); |
204 | + |
205 | + /* |
206 | * Restore HW breakpoint registers to sane values |
207 | * before debug exceptions are possibly reenabled |
208 | * through local_dbg_restore. |
209 | diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c |
210 | index 771a01a7fbce..9595d3d9c3db 100644 |
211 | --- a/arch/arm64/kernel/traps.c |
212 | +++ b/arch/arm64/kernel/traps.c |
213 | @@ -428,9 +428,10 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |
214 | force_signal_inject(SIGILL, ILL_ILLOPC, regs, 0); |
215 | } |
216 | |
217 | -void cpu_enable_cache_maint_trap(void *__unused) |
218 | +int cpu_enable_cache_maint_trap(void *__unused) |
219 | { |
220 | config_sctlr_el1(SCTLR_EL1_UCI, 0); |
221 | + return 0; |
222 | } |
223 | |
224 | #define __user_cache_maint(insn, address, res) \ |
225 | diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c |
226 | index 05d2bd776c69..67506c3c5476 100644 |
227 | --- a/arch/arm64/mm/fault.c |
228 | +++ b/arch/arm64/mm/fault.c |
229 | @@ -29,7 +29,9 @@ |
230 | #include <linux/sched.h> |
231 | #include <linux/highmem.h> |
232 | #include <linux/perf_event.h> |
233 | +#include <linux/preempt.h> |
234 | |
235 | +#include <asm/bug.h> |
236 | #include <asm/cpufeature.h> |
237 | #include <asm/exception.h> |
238 | #include <asm/debug-monitors.h> |
239 | @@ -671,9 +673,17 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, |
240 | NOKPROBE_SYMBOL(do_debug_exception); |
241 | |
242 | #ifdef CONFIG_ARM64_PAN |
243 | -void cpu_enable_pan(void *__unused) |
244 | +int cpu_enable_pan(void *__unused) |
245 | { |
246 | + /* |
247 | + * We modify PSTATE. This won't work from irq context as the PSTATE |
248 | + * is discarded once we return from the exception. |
249 | + */ |
250 | + WARN_ON_ONCE(in_interrupt()); |
251 | + |
252 | config_sctlr_el1(SCTLR_EL1_SPAN, 0); |
253 | + asm(SET_PSTATE_PAN(1)); |
254 | + return 0; |
255 | } |
256 | #endif /* CONFIG_ARM64_PAN */ |
257 | |
258 | @@ -684,8 +694,9 @@ void cpu_enable_pan(void *__unused) |
259 | * We need to enable the feature at runtime (instead of adding it to |
260 | * PSR_MODE_EL1h) as the feature may not be implemented by the cpu. |
261 | */ |
262 | -void cpu_enable_uao(void *__unused) |
263 | +int cpu_enable_uao(void *__unused) |
264 | { |
265 | asm(SET_PSTATE_UAO(1)); |
266 | + return 0; |
267 | } |
268 | #endif /* CONFIG_ARM64_UAO */ |
269 | diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c |
270 | index d0efb5cb1b00..a4e070a51584 100644 |
271 | --- a/arch/x86/events/core.c |
272 | +++ b/arch/x86/events/core.c |
273 | @@ -2344,7 +2344,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent |
274 | frame.next_frame = 0; |
275 | frame.return_address = 0; |
276 | |
277 | - if (!access_ok(VERIFY_READ, fp, 8)) |
278 | + if (!valid_user_frame(fp, sizeof(frame))) |
279 | break; |
280 | |
281 | bytes = __copy_from_user_nmi(&frame.next_frame, fp, 4); |
282 | @@ -2354,9 +2354,6 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent |
283 | if (bytes != 0) |
284 | break; |
285 | |
286 | - if (!valid_user_frame(fp, sizeof(frame))) |
287 | - break; |
288 | - |
289 | perf_callchain_store(entry, cs_base + frame.return_address); |
290 | fp = compat_ptr(ss_base + frame.next_frame); |
291 | } |
292 | @@ -2405,7 +2402,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs |
293 | frame.next_frame = NULL; |
294 | frame.return_address = 0; |
295 | |
296 | - if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2)) |
297 | + if (!valid_user_frame(fp, sizeof(frame))) |
298 | break; |
299 | |
300 | bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp)); |
301 | @@ -2415,9 +2412,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs |
302 | if (bytes != 0) |
303 | break; |
304 | |
305 | - if (!valid_user_frame(fp, sizeof(frame))) |
306 | - break; |
307 | - |
308 | perf_callchain_store(entry, frame.return_address); |
309 | fp = (void __user *)frame.next_frame; |
310 | } |
311 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c |
312 | index e207b33e4ce9..1e007a93bdcc 100644 |
313 | --- a/drivers/ata/libata-scsi.c |
314 | +++ b/drivers/ata/libata-scsi.c |
315 | @@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) |
316 | desc[1] = tf->command; /* status */ |
317 | desc[2] = tf->device; |
318 | desc[3] = tf->nsect; |
319 | - desc[0] = 0; |
320 | + desc[7] = 0; |
321 | if (tf->flags & ATA_TFLAG_LBA48) { |
322 | desc[8] |= 0x80; |
323 | if (tf->hob_nsect) |
324 | diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c |
325 | index 04365b17ee67..5163c8f918cb 100644 |
326 | --- a/drivers/block/zram/zram_drv.c |
327 | +++ b/drivers/block/zram/zram_drv.c |
328 | @@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class, |
329 | zram = idr_find(&zram_index_idr, dev_id); |
330 | if (zram) { |
331 | ret = zram_remove(zram); |
332 | - idr_remove(&zram_index_idr, dev_id); |
333 | + if (!ret) |
334 | + idr_remove(&zram_index_idr, dev_id); |
335 | } else { |
336 | ret = -ENODEV; |
337 | } |
338 | diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c |
339 | index 838b22aa8b67..f2c9274b8bd5 100644 |
340 | --- a/drivers/clk/sunxi/clk-sunxi.c |
341 | +++ b/drivers/clk/sunxi/clk-sunxi.c |
342 | @@ -373,7 +373,7 @@ static void sun4i_get_apb1_factors(struct factors_request *req) |
343 | else |
344 | calcp = 3; |
345 | |
346 | - calcm = (req->parent_rate >> calcp) - 1; |
347 | + calcm = (div >> calcp) - 1; |
348 | |
349 | req->rate = (req->parent_rate >> calcp) / (calcm + 1); |
350 | req->m = calcm; |
351 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
352 | index 10b5ddf2c588..1ed085f01a49 100644 |
353 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
354 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c |
355 | @@ -33,6 +33,7 @@ struct amdgpu_atpx { |
356 | |
357 | static struct amdgpu_atpx_priv { |
358 | bool atpx_detected; |
359 | + bool bridge_pm_usable; |
360 | /* handle for device - and atpx */ |
361 | acpi_handle dhandle; |
362 | acpi_handle other_handle; |
363 | @@ -200,7 +201,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx) |
364 | atpx->is_hybrid = false; |
365 | if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { |
366 | printk("ATPX Hybrid Graphics\n"); |
367 | - atpx->functions.power_cntl = false; |
368 | + /* |
369 | + * Disable legacy PM methods only when pcie port PM is usable, |
370 | + * otherwise the device might fail to power off or power on. |
371 | + */ |
372 | + atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable; |
373 | atpx->is_hybrid = true; |
374 | } |
375 | |
376 | @@ -546,17 +551,25 @@ static bool amdgpu_atpx_detect(void) |
377 | struct pci_dev *pdev = NULL; |
378 | bool has_atpx = false; |
379 | int vga_count = 0; |
380 | + bool d3_supported = false; |
381 | + struct pci_dev *parent_pdev; |
382 | |
383 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { |
384 | vga_count++; |
385 | |
386 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); |
387 | + |
388 | + parent_pdev = pci_upstream_bridge(pdev); |
389 | + d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
390 | } |
391 | |
392 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { |
393 | vga_count++; |
394 | |
395 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); |
396 | + |
397 | + parent_pdev = pci_upstream_bridge(pdev); |
398 | + d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
399 | } |
400 | |
401 | if (has_atpx && vga_count == 2) { |
402 | @@ -564,6 +577,7 @@ static bool amdgpu_atpx_detect(void) |
403 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", |
404 | acpi_method_name); |
405 | amdgpu_atpx_priv.atpx_detected = true; |
406 | + amdgpu_atpx_priv.bridge_pm_usable = d3_supported; |
407 | amdgpu_atpx_init(); |
408 | return true; |
409 | } |
410 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
411 | index a77ce9983f69..b8e3854a1f20 100644 |
412 | --- a/drivers/gpu/drm/i915/i915_gem.c |
413 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
414 | @@ -2540,7 +2540,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) |
415 | page = shmem_read_mapping_page(mapping, i); |
416 | if (IS_ERR(page)) { |
417 | ret = PTR_ERR(page); |
418 | - goto err_pages; |
419 | + goto err_sg; |
420 | } |
421 | } |
422 | #ifdef CONFIG_SWIOTLB |
423 | @@ -2583,8 +2583,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) |
424 | |
425 | return 0; |
426 | |
427 | -err_pages: |
428 | +err_sg: |
429 | sg_mark_end(sg); |
430 | +err_pages: |
431 | for_each_sgt_page(page, sgt_iter, st) |
432 | put_page(page); |
433 | sg_free_table(st); |
434 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
435 | index e26f88965c58..35d385d70d8e 100644 |
436 | --- a/drivers/gpu/drm/i915/intel_display.c |
437 | +++ b/drivers/gpu/drm/i915/intel_display.c |
438 | @@ -11791,7 +11791,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, |
439 | intel_crtc->reset_counter = i915_reset_counter(&dev_priv->gpu_error); |
440 | if (__i915_reset_in_progress_or_wedged(intel_crtc->reset_counter)) { |
441 | ret = -EIO; |
442 | - goto cleanup; |
443 | + goto unlock; |
444 | } |
445 | |
446 | atomic_inc(&intel_crtc->unpin_work_count); |
447 | @@ -11877,6 +11877,7 @@ cleanup_pending: |
448 | if (!IS_ERR_OR_NULL(request)) |
449 | i915_add_request_no_flush(request); |
450 | atomic_dec(&intel_crtc->unpin_work_count); |
451 | +unlock: |
452 | mutex_unlock(&dev->struct_mutex); |
453 | cleanup: |
454 | crtc->primary->fb = old_fb; |
455 | diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c |
456 | index 8f62671fcfbf..54acfccee7eb 100644 |
457 | --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c |
458 | +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c |
459 | @@ -249,13 +249,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) |
460 | if (irq < 0) |
461 | return irq; |
462 | |
463 | - ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, |
464 | - IRQF_TRIGGER_NONE, dev_name(dev), priv); |
465 | - if (ret < 0) { |
466 | - dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); |
467 | - return ret; |
468 | - } |
469 | - |
470 | comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL); |
471 | if (comp_id < 0) { |
472 | dev_err(dev, "Failed to identify by alias: %d\n", comp_id); |
473 | @@ -271,6 +264,13 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) |
474 | |
475 | platform_set_drvdata(pdev, priv); |
476 | |
477 | + ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, |
478 | + IRQF_TRIGGER_NONE, dev_name(dev), priv); |
479 | + if (ret < 0) { |
480 | + dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); |
481 | + return ret; |
482 | + } |
483 | + |
484 | ret = component_add(dev, &mtk_disp_ovl_component_ops); |
485 | if (ret) |
486 | dev_err(dev, "Failed to add component: %d\n", ret); |
487 | diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
488 | index ddef0d494084..34b4ace5d75f 100644 |
489 | --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
490 | +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
491 | @@ -33,6 +33,7 @@ struct radeon_atpx { |
492 | |
493 | static struct radeon_atpx_priv { |
494 | bool atpx_detected; |
495 | + bool bridge_pm_usable; |
496 | /* handle for device - and atpx */ |
497 | acpi_handle dhandle; |
498 | struct radeon_atpx atpx; |
499 | @@ -198,7 +199,11 @@ static int radeon_atpx_validate(struct radeon_atpx *atpx) |
500 | atpx->is_hybrid = false; |
501 | if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { |
502 | printk("ATPX Hybrid Graphics\n"); |
503 | - atpx->functions.power_cntl = false; |
504 | + /* |
505 | + * Disable legacy PM methods only when pcie port PM is usable, |
506 | + * otherwise the device might fail to power off or power on. |
507 | + */ |
508 | + atpx->functions.power_cntl = !radeon_atpx_priv.bridge_pm_usable; |
509 | atpx->is_hybrid = true; |
510 | } |
511 | |
512 | @@ -543,11 +548,16 @@ static bool radeon_atpx_detect(void) |
513 | struct pci_dev *pdev = NULL; |
514 | bool has_atpx = false; |
515 | int vga_count = 0; |
516 | + bool d3_supported = false; |
517 | + struct pci_dev *parent_pdev; |
518 | |
519 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { |
520 | vga_count++; |
521 | |
522 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
523 | + |
524 | + parent_pdev = pci_upstream_bridge(pdev); |
525 | + d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
526 | } |
527 | |
528 | /* some newer PX laptops mark the dGPU as a non-VGA display device */ |
529 | @@ -555,6 +565,9 @@ static bool radeon_atpx_detect(void) |
530 | vga_count++; |
531 | |
532 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
533 | + |
534 | + parent_pdev = pci_upstream_bridge(pdev); |
535 | + d3_supported |= parent_pdev && parent_pdev->bridge_d3; |
536 | } |
537 | |
538 | if (has_atpx && vga_count == 2) { |
539 | @@ -562,6 +575,7 @@ static bool radeon_atpx_detect(void) |
540 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", |
541 | acpi_method_name); |
542 | radeon_atpx_priv.atpx_detected = true; |
543 | + radeon_atpx_priv.bridge_pm_usable = d3_supported; |
544 | radeon_atpx_init(); |
545 | return true; |
546 | } |
547 | diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c |
548 | index 5784e20542a4..9f6203c8577c 100644 |
549 | --- a/drivers/input/mouse/psmouse-base.c |
550 | +++ b/drivers/input/mouse/psmouse-base.c |
551 | @@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse, |
552 | if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2, |
553 | &max_proto, set_properties, true)) |
554 | return PSMOUSE_TOUCHKIT_PS2; |
555 | - |
556 | - if (psmouse_try_protocol(psmouse, PSMOUSE_BYD, |
557 | - &max_proto, set_properties, true)) |
558 | - return PSMOUSE_BYD; |
559 | } |
560 | |
561 | /* |
562 | diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
563 | index a8ff969c95c2..cbc7dfae0a0e 100644 |
564 | --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
565 | +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c |
566 | @@ -2203,8 +2203,9 @@ done: |
567 | is_scanning_required = 1; |
568 | } else { |
569 | mwifiex_dbg(priv->adapter, MSG, |
570 | - "info: trying to associate to '%s' bssid %pM\n", |
571 | - (char *)req_ssid.ssid, bss->bssid); |
572 | + "info: trying to associate to '%.*s' bssid %pM\n", |
573 | + req_ssid.ssid_len, (char *)req_ssid.ssid, |
574 | + bss->bssid); |
575 | memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN); |
576 | break; |
577 | } |
578 | @@ -2264,8 +2265,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, |
579 | } |
580 | |
581 | mwifiex_dbg(adapter, INFO, |
582 | - "info: Trying to associate to %s and bssid %pM\n", |
583 | - (char *)sme->ssid, sme->bssid); |
584 | + "info: Trying to associate to %.*s and bssid %pM\n", |
585 | + (int)sme->ssid_len, (char *)sme->ssid, sme->bssid); |
586 | |
587 | if (!mwifiex_stop_bg_scan(priv)) |
588 | cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy); |
589 | @@ -2398,8 +2399,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, |
590 | } |
591 | |
592 | mwifiex_dbg(priv->adapter, MSG, |
593 | - "info: trying to join to %s and bssid %pM\n", |
594 | - (char *)params->ssid, params->bssid); |
595 | + "info: trying to join to %.*s and bssid %pM\n", |
596 | + params->ssid_len, (char *)params->ssid, params->bssid); |
597 | |
598 | mwifiex_set_ibss_params(priv, params); |
599 | |
600 | diff --git a/drivers/pci/pcie/aer/aer_inject.c b/drivers/pci/pcie/aer/aer_inject.c |
601 | index db553dc22c8e..2b6a59266689 100644 |
602 | --- a/drivers/pci/pcie/aer/aer_inject.c |
603 | +++ b/drivers/pci/pcie/aer/aer_inject.c |
604 | @@ -307,20 +307,6 @@ out: |
605 | return 0; |
606 | } |
607 | |
608 | -static struct pci_dev *pcie_find_root_port(struct pci_dev *dev) |
609 | -{ |
610 | - while (1) { |
611 | - if (!pci_is_pcie(dev)) |
612 | - break; |
613 | - if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) |
614 | - return dev; |
615 | - if (!dev->bus->self) |
616 | - break; |
617 | - dev = dev->bus->self; |
618 | - } |
619 | - return NULL; |
620 | -} |
621 | - |
622 | static int find_aer_device_iter(struct device *device, void *data) |
623 | { |
624 | struct pcie_device **result = data; |
625 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c |
626 | index 93f280df3428..f6eff4aaffd7 100644 |
627 | --- a/drivers/pci/probe.c |
628 | +++ b/drivers/pci/probe.c |
629 | @@ -1439,6 +1439,21 @@ static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp) |
630 | dev_warn(&dev->dev, "PCI-X settings not supported\n"); |
631 | } |
632 | |
633 | +static bool pcie_root_rcb_set(struct pci_dev *dev) |
634 | +{ |
635 | + struct pci_dev *rp = pcie_find_root_port(dev); |
636 | + u16 lnkctl; |
637 | + |
638 | + if (!rp) |
639 | + return false; |
640 | + |
641 | + pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl); |
642 | + if (lnkctl & PCI_EXP_LNKCTL_RCB) |
643 | + return true; |
644 | + |
645 | + return false; |
646 | +} |
647 | + |
648 | static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) |
649 | { |
650 | int pos; |
651 | @@ -1468,9 +1483,20 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) |
652 | ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); |
653 | |
654 | /* Initialize Link Control Register */ |
655 | - if (pcie_cap_has_lnkctl(dev)) |
656 | + if (pcie_cap_has_lnkctl(dev)) { |
657 | + |
658 | + /* |
659 | + * If the Root Port supports Read Completion Boundary of |
660 | + * 128, set RCB to 128. Otherwise, clear it. |
661 | + */ |
662 | + hpp->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB; |
663 | + hpp->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB; |
664 | + if (pcie_root_rcb_set(dev)) |
665 | + hpp->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB; |
666 | + |
667 | pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, |
668 | ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); |
669 | + } |
670 | |
671 | /* Find Advanced Error Reporting Enhanced Capability */ |
672 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); |
673 | diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c |
674 | index 0296d8178ae2..a813239300c3 100644 |
675 | --- a/drivers/pwm/sysfs.c |
676 | +++ b/drivers/pwm/sysfs.c |
677 | @@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) |
678 | if (test_bit(PWMF_EXPORTED, &pwm->flags)) |
679 | pwm_unexport_child(parent, pwm); |
680 | } |
681 | + |
682 | + put_device(parent); |
683 | } |
684 | |
685 | static int __init pwm_sysfs_init(void) |
686 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c |
687 | index 030d0023e1d2..5138a841ff4f 100644 |
688 | --- a/drivers/scsi/hpsa.c |
689 | +++ b/drivers/scsi/hpsa.c |
690 | @@ -2007,7 +2007,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h, |
691 | |
692 | static int hpsa_slave_alloc(struct scsi_device *sdev) |
693 | { |
694 | - struct hpsa_scsi_dev_t *sd; |
695 | + struct hpsa_scsi_dev_t *sd = NULL; |
696 | unsigned long flags; |
697 | struct ctlr_info *h; |
698 | |
699 | @@ -2024,7 +2024,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev) |
700 | sd->target = sdev_id(sdev); |
701 | sd->lun = sdev->lun; |
702 | } |
703 | - } else |
704 | + } |
705 | + if (!sd) |
706 | sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev), |
707 | sdev_id(sdev), sdev->lun); |
708 | |
709 | @@ -3805,6 +3806,7 @@ static int hpsa_update_device_info(struct ctlr_info *h, |
710 | sizeof(this_device->vendor)); |
711 | memcpy(this_device->model, &inq_buff[16], |
712 | sizeof(this_device->model)); |
713 | + this_device->rev = inq_buff[2]; |
714 | memset(this_device->device_id, 0, |
715 | sizeof(this_device->device_id)); |
716 | hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8, |
717 | @@ -3887,10 +3889,14 @@ static void figure_bus_target_lun(struct ctlr_info *h, |
718 | |
719 | if (!is_logical_dev_addr_mode(lunaddrbytes)) { |
720 | /* physical device, target and lun filled in later */ |
721 | - if (is_hba_lunid(lunaddrbytes)) |
722 | + if (is_hba_lunid(lunaddrbytes)) { |
723 | + int bus = HPSA_HBA_BUS; |
724 | + |
725 | + if (!device->rev) |
726 | + bus = HPSA_LEGACY_HBA_BUS; |
727 | hpsa_set_bus_target_lun(device, |
728 | - HPSA_HBA_BUS, 0, lunid & 0x3fff); |
729 | - else |
730 | + bus, 0, lunid & 0x3fff); |
731 | + } else |
732 | /* defer target, lun assignment for physical devices */ |
733 | hpsa_set_bus_target_lun(device, |
734 | HPSA_PHYSICAL_DEVICE_BUS, -1, -1); |
735 | diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h |
736 | index a1487e67f7a1..9d45dde5747f 100644 |
737 | --- a/drivers/scsi/hpsa.h |
738 | +++ b/drivers/scsi/hpsa.h |
739 | @@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t { |
740 | u64 sas_address; |
741 | unsigned char vendor[8]; /* bytes 8-15 of inquiry data */ |
742 | unsigned char model[16]; /* bytes 16-31 of inquiry data */ |
743 | + unsigned char rev; /* byte 2 of inquiry data */ |
744 | unsigned char raid_level; /* from inquiry page 0xC1 */ |
745 | unsigned char volume_offline; /* discovered via TUR or VPD */ |
746 | u16 queue_depth; /* max queue_depth for this device */ |
747 | @@ -403,6 +404,7 @@ struct offline_device_entry { |
748 | #define HPSA_RAID_VOLUME_BUS 1 |
749 | #define HPSA_EXTERNAL_RAID_VOLUME_BUS 2 |
750 | #define HPSA_HBA_BUS 0 |
751 | +#define HPSA_LEGACY_HBA_BUS 3 |
752 | |
753 | /* |
754 | Send the command to the hardware |
755 | diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c |
756 | index 04ce7cfb6d1b..50c71678a156 100644 |
757 | --- a/drivers/scsi/libfc/fc_lport.c |
758 | +++ b/drivers/scsi/libfc/fc_lport.c |
759 | @@ -308,7 +308,7 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost) |
760 | fc_stats = &lport->host_stats; |
761 | memset(fc_stats, 0, sizeof(struct fc_host_statistics)); |
762 | |
763 | - fc_stats->seconds_since_last_reset = (lport->boot_time - jiffies) / HZ; |
764 | + fc_stats->seconds_since_last_reset = (jiffies - lport->boot_time) / HZ; |
765 | |
766 | for_each_possible_cpu(cpu) { |
767 | struct fc_stats *stats; |
768 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c |
769 | index a78415d77434..78be4aee7064 100644 |
770 | --- a/fs/overlayfs/super.c |
771 | +++ b/fs/overlayfs/super.c |
772 | @@ -329,11 +329,11 @@ static struct dentry *ovl_d_real(struct dentry *dentry, |
773 | if (!real) |
774 | goto bug; |
775 | |
776 | + /* Handle recursion */ |
777 | + real = d_real(real, inode, open_flags); |
778 | + |
779 | if (!inode || inode == d_inode(real)) |
780 | return real; |
781 | - |
782 | - /* Handle recursion */ |
783 | - return d_real(real, inode, open_flags); |
784 | bug: |
785 | WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry, |
786 | inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0); |
787 | diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h |
788 | index 573c5a18908f..0a0b2d5148e1 100644 |
789 | --- a/include/linux/compiler-gcc.h |
790 | +++ b/include/linux/compiler-gcc.h |
791 | @@ -256,7 +256,9 @@ |
792 | #endif |
793 | #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */ |
794 | |
795 | -#if GCC_VERSION >= 50000 |
796 | +#if GCC_VERSION >= 70000 |
797 | +#define KASAN_ABI_VERSION 5 |
798 | +#elif GCC_VERSION >= 50000 |
799 | #define KASAN_ABI_VERSION 4 |
800 | #elif GCC_VERSION >= 40902 |
801 | #define KASAN_ABI_VERSION 3 |
802 | diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h |
803 | index 01e84436cddf..d47cc4ab74ee 100644 |
804 | --- a/include/linux/pagemap.h |
805 | +++ b/include/linux/pagemap.h |
806 | @@ -364,16 +364,13 @@ static inline struct page *read_mapping_page(struct address_space *mapping, |
807 | } |
808 | |
809 | /* |
810 | - * Get the offset in PAGE_SIZE. |
811 | - * (TODO: hugepage should have ->index in PAGE_SIZE) |
812 | + * Get index of the page with in radix-tree |
813 | + * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE) |
814 | */ |
815 | -static inline pgoff_t page_to_pgoff(struct page *page) |
816 | +static inline pgoff_t page_to_index(struct page *page) |
817 | { |
818 | pgoff_t pgoff; |
819 | |
820 | - if (unlikely(PageHeadHuge(page))) |
821 | - return page->index << compound_order(page); |
822 | - |
823 | if (likely(!PageTransTail(page))) |
824 | return page->index; |
825 | |
826 | @@ -387,6 +384,18 @@ static inline pgoff_t page_to_pgoff(struct page *page) |
827 | } |
828 | |
829 | /* |
830 | + * Get the offset in PAGE_SIZE. |
831 | + * (TODO: hugepage should have ->index in PAGE_SIZE) |
832 | + */ |
833 | +static inline pgoff_t page_to_pgoff(struct page *page) |
834 | +{ |
835 | + if (unlikely(PageHeadHuge(page))) |
836 | + return page->index << compound_order(page); |
837 | + |
838 | + return page_to_index(page); |
839 | +} |
840 | + |
841 | +/* |
842 | * Return byte-offset into filesystem object for page. |
843 | */ |
844 | static inline loff_t page_offset(struct page *page) |
845 | diff --git a/include/linux/pci.h b/include/linux/pci.h |
846 | index 0ab835965669..03f3df0888fe 100644 |
847 | --- a/include/linux/pci.h |
848 | +++ b/include/linux/pci.h |
849 | @@ -1896,6 +1896,20 @@ static inline int pci_pcie_type(const struct pci_dev *dev) |
850 | return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4; |
851 | } |
852 | |
853 | +static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev) |
854 | +{ |
855 | + while (1) { |
856 | + if (!pci_is_pcie(dev)) |
857 | + break; |
858 | + if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) |
859 | + return dev; |
860 | + if (!dev->bus->self) |
861 | + break; |
862 | + dev = dev->bus->self; |
863 | + } |
864 | + return NULL; |
865 | +} |
866 | + |
867 | void pci_request_acs(void); |
868 | bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags); |
869 | bool pci_acs_path_enabled(struct pci_dev *start, |
870 | diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h |
871 | index d6d071fc3c56..3af60ee69053 100644 |
872 | --- a/include/uapi/linux/input-event-codes.h |
873 | +++ b/include/uapi/linux/input-event-codes.h |
874 | @@ -640,7 +640,7 @@ |
875 | * Control a data application associated with the currently viewed channel, |
876 | * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.) |
877 | */ |
878 | -#define KEY_DATA 0x275 |
879 | +#define KEY_DATA 0x277 |
880 | |
881 | #define BTN_TRIGGER_HAPPY 0x2c0 |
882 | #define BTN_TRIGGER_HAPPY1 0x2c0 |
883 | diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h |
884 | index 0082fce402a0..85c5a883c6e3 100644 |
885 | --- a/kernel/rcu/tree_plugin.h |
886 | +++ b/kernel/rcu/tree_plugin.h |
887 | @@ -2173,6 +2173,7 @@ static int rcu_nocb_kthread(void *arg) |
888 | cl++; |
889 | c++; |
890 | local_bh_enable(); |
891 | + cond_resched_rcu_qs(); |
892 | list = next; |
893 | } |
894 | trace_rcu_batch_end(rdp->rsp->name, c, !!list, 0, 0, 1); |
895 | diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h |
896 | index e5c2181fee6f..03f4545b103d 100644 |
897 | --- a/mm/kasan/kasan.h |
898 | +++ b/mm/kasan/kasan.h |
899 | @@ -53,6 +53,9 @@ struct kasan_global { |
900 | #if KASAN_ABI_VERSION >= 4 |
901 | struct kasan_source_location *location; |
902 | #endif |
903 | +#if KASAN_ABI_VERSION >= 5 |
904 | + char *odr_indicator; |
905 | +#endif |
906 | }; |
907 | |
908 | /** |
909 | diff --git a/mm/khugepaged.c b/mm/khugepaged.c |
910 | index 728d7790dc2d..87e1a7ca3846 100644 |
911 | --- a/mm/khugepaged.c |
912 | +++ b/mm/khugepaged.c |
913 | @@ -103,6 +103,7 @@ static struct khugepaged_scan khugepaged_scan = { |
914 | .mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head), |
915 | }; |
916 | |
917 | +#ifdef CONFIG_SYSFS |
918 | static ssize_t scan_sleep_millisecs_show(struct kobject *kobj, |
919 | struct kobj_attribute *attr, |
920 | char *buf) |
921 | @@ -295,6 +296,7 @@ struct attribute_group khugepaged_attr_group = { |
922 | .attrs = khugepaged_attr, |
923 | .name = "khugepaged", |
924 | }; |
925 | +#endif /* CONFIG_SYSFS */ |
926 | |
927 | #define VM_NO_KHUGEPAGED (VM_SPECIAL | VM_HUGETLB) |
928 | |
929 | diff --git a/mm/mlock.c b/mm/mlock.c |
930 | index 14645be06e30..9c91acc0e328 100644 |
931 | --- a/mm/mlock.c |
932 | +++ b/mm/mlock.c |
933 | @@ -190,10 +190,13 @@ unsigned int munlock_vma_page(struct page *page) |
934 | */ |
935 | spin_lock_irq(zone_lru_lock(zone)); |
936 | |
937 | - nr_pages = hpage_nr_pages(page); |
938 | - if (!TestClearPageMlocked(page)) |
939 | + if (!TestClearPageMlocked(page)) { |
940 | + /* Potentially, PTE-mapped THP: do not skip the rest PTEs */ |
941 | + nr_pages = 1; |
942 | goto unlock_out; |
943 | + } |
944 | |
945 | + nr_pages = hpage_nr_pages(page); |
946 | __mod_zone_page_state(zone, NR_MLOCK, -nr_pages); |
947 | |
948 | if (__munlock_isolate_lru_page(page, true)) { |
949 | diff --git a/mm/truncate.c b/mm/truncate.c |
950 | index a01cce450a26..8d8c62d89e6d 100644 |
951 | --- a/mm/truncate.c |
952 | +++ b/mm/truncate.c |
953 | @@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct address_space *mapping, |
954 | |
955 | if (!trylock_page(page)) |
956 | continue; |
957 | - WARN_ON(page_to_pgoff(page) != index); |
958 | + WARN_ON(page_to_index(page) != index); |
959 | if (PageWriteback(page)) { |
960 | unlock_page(page); |
961 | continue; |
962 | @@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct address_space *mapping, |
963 | } |
964 | |
965 | lock_page(page); |
966 | - WARN_ON(page_to_pgoff(page) != index); |
967 | + WARN_ON(page_to_index(page) != index); |
968 | wait_on_page_writeback(page); |
969 | truncate_inode_page(mapping, page); |
970 | unlock_page(page); |
971 | @@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, |
972 | if (!trylock_page(page)) |
973 | continue; |
974 | |
975 | - WARN_ON(page_to_pgoff(page) != index); |
976 | + WARN_ON(page_to_index(page) != index); |
977 | |
978 | /* Middle of THP: skip */ |
979 | if (PageTransTail(page)) { |
980 | @@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, |
981 | } |
982 | |
983 | lock_page(page); |
984 | - WARN_ON(page_to_pgoff(page) != index); |
985 | + WARN_ON(page_to_index(page) != index); |
986 | if (page->mapping != mapping) { |
987 | unlock_page(page); |
988 | continue; |
989 | diff --git a/mm/workingset.c b/mm/workingset.c |
990 | index 617475f529f4..fb1f9183d89a 100644 |
991 | --- a/mm/workingset.c |
992 | +++ b/mm/workingset.c |
993 | @@ -348,7 +348,7 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker, |
994 | shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc); |
995 | local_irq_enable(); |
996 | |
997 | - if (memcg_kmem_enabled()) { |
998 | + if (sc->memcg) { |
999 | pages = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid, |
1000 | LRU_ALL_FILE); |
1001 | } else { |
1002 | diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c |
1003 | index 2333777f919d..8af1611b8ab2 100644 |
1004 | --- a/net/batman-adv/tp_meter.c |
1005 | +++ b/net/batman-adv/tp_meter.c |
1006 | @@ -837,6 +837,7 @@ static int batadv_tp_send(void *arg) |
1007 | primary_if = batadv_primary_if_get_selected(bat_priv); |
1008 | if (unlikely(!primary_if)) { |
1009 | err = BATADV_TP_REASON_DST_UNREACHABLE; |
1010 | + tp_vars->reason = err; |
1011 | goto out; |
1012 | } |
1013 | |
1014 | diff --git a/virt/kvm/arm/vgic/vgic-v2.c b/virt/kvm/arm/vgic/vgic-v2.c |
1015 | index 0bf6709d1006..6fb4314cec49 100644 |
1016 | --- a/virt/kvm/arm/vgic/vgic-v2.c |
1017 | +++ b/virt/kvm/arm/vgic/vgic-v2.c |
1018 | @@ -50,8 +50,10 @@ void vgic_v2_process_maintenance(struct kvm_vcpu *vcpu) |
1019 | |
1020 | WARN_ON(cpuif->vgic_lr[lr] & GICH_LR_STATE); |
1021 | |
1022 | - kvm_notify_acked_irq(vcpu->kvm, 0, |
1023 | - intid - VGIC_NR_PRIVATE_IRQS); |
1024 | + /* Only SPIs require notification */ |
1025 | + if (vgic_valid_spi(vcpu->kvm, intid)) |
1026 | + kvm_notify_acked_irq(vcpu->kvm, 0, |
1027 | + intid - VGIC_NR_PRIVATE_IRQS); |
1028 | } |
1029 | } |
1030 | |
1031 | diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c |
1032 | index 9f0dae397d9c..5c9f9745e6ca 100644 |
1033 | --- a/virt/kvm/arm/vgic/vgic-v3.c |
1034 | +++ b/virt/kvm/arm/vgic/vgic-v3.c |
1035 | @@ -41,8 +41,10 @@ void vgic_v3_process_maintenance(struct kvm_vcpu *vcpu) |
1036 | |
1037 | WARN_ON(cpuif->vgic_lr[lr] & ICH_LR_STATE); |
1038 | |
1039 | - kvm_notify_acked_irq(vcpu->kvm, 0, |
1040 | - intid - VGIC_NR_PRIVATE_IRQS); |
1041 | + /* Only SPIs require notification */ |
1042 | + if (vgic_valid_spi(vcpu->kvm, intid)) |
1043 | + kvm_notify_acked_irq(vcpu->kvm, 0, |
1044 | + intid - VGIC_NR_PRIVATE_IRQS); |
1045 | } |
1046 | |
1047 | /* |
1048 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
1049 | index 195078225aa5..690d15eaee05 100644 |
1050 | --- a/virt/kvm/kvm_main.c |
1051 | +++ b/virt/kvm/kvm_main.c |
1052 | @@ -2852,10 +2852,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm, |
1053 | |
1054 | ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); |
1055 | if (ret < 0) { |
1056 | - ops->destroy(dev); |
1057 | mutex_lock(&kvm->lock); |
1058 | list_del(&dev->vm_node); |
1059 | mutex_unlock(&kvm->lock); |
1060 | + ops->destroy(dev); |
1061 | return ret; |
1062 | } |
1063 |