diff options
Diffstat (limited to '4.8.15/1012_linux-4.8.13.patch')
-rw-r--r-- | 4.8.15/1012_linux-4.8.13.patch | 1063 |
1 files changed, 0 insertions, 1063 deletions
diff --git a/4.8.15/1012_linux-4.8.13.patch b/4.8.15/1012_linux-4.8.13.patch deleted file mode 100644 index c742393..0000000 --- a/4.8.15/1012_linux-4.8.13.patch +++ /dev/null @@ -1,1063 +0,0 @@ -diff --git a/Makefile b/Makefile -index 7b0c92f..b38abe9 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 4 - PATCHLEVEL = 8 --SUBLEVEL = 12 -+SUBLEVEL = 13 - EXTRAVERSION = - NAME = Psychotic Stoned Sheep - -diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h -index 08e7e2a..a36e860 100644 ---- a/arch/arc/include/asm/delay.h -+++ b/arch/arc/include/asm/delay.h -@@ -22,10 +22,11 @@ - static inline void __delay(unsigned long loops) - { - __asm__ __volatile__( -- " lp 1f \n" -- " nop \n" -- "1: \n" -- : "+l"(loops)); -+ " mov lp_count, %0 \n" -+ " lp 1f \n" -+ " nop \n" -+ "1: \n" -+ : : "r"(loops)); - } - - extern void __bad_udelay(void); -diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h -index 89eeb37..e94ca72 100644 ---- a/arch/arc/include/asm/pgtable.h -+++ b/arch/arc/include/asm/pgtable.h -@@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep) - - #define pte_page(pte) pfn_to_page(pte_pfn(pte)) - #define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) --#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -+#define pfn_pte(pfn, prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot)) - - /* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/ - #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) -diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts -index 123a58b..f0b857d 100644 ---- a/arch/arm64/boot/dts/arm/juno-r1.dts -+++ b/arch/arm64/boot/dts/arm/juno-r1.dts -@@ -76,7 +76,7 @@ - compatible = "arm,idle-state"; - arm,psci-suspend-param = <0x1010000>; - local-timer-stop; -- entry-latency-us = <300>; -+ entry-latency-us = <400>; - exit-latency-us = <1200>; - min-residency-us = <2500>; - }; -diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts -index 007be82..26aaa6a 100644 ---- a/arch/arm64/boot/dts/arm/juno-r2.dts -+++ b/arch/arm64/boot/dts/arm/juno-r2.dts -@@ -76,7 +76,7 @@ - compatible = "arm,idle-state"; - arm,psci-suspend-param = <0x1010000>; - local-timer-stop; -- entry-latency-us = <300>; -+ entry-latency-us = <400>; - exit-latency-us = <1200>; - min-residency-us = <2500>; - }; -diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts -index a7270ef..6e154d9 100644 ---- a/arch/arm64/boot/dts/arm/juno.dts -+++ b/arch/arm64/boot/dts/arm/juno.dts -@@ -76,7 +76,7 @@ - compatible = "arm,idle-state"; - arm,psci-suspend-param = <0x1010000>; - local-timer-stop; -- entry-latency-us = <300>; -+ entry-latency-us = <400>; - exit-latency-us = <1200>; - min-residency-us = <2500>; - }; -diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h -index 7099f26..b96346b 100644 ---- a/arch/arm64/include/asm/cpufeature.h -+++ b/arch/arm64/include/asm/cpufeature.h -@@ -90,7 +90,7 @@ struct arm64_cpu_capabilities { - u16 capability; - int def_scope; /* default scope */ - bool (*matches)(const struct arm64_cpu_capabilities *caps, int scope); -- void (*enable)(void *); /* Called on all active CPUs */ -+ int (*enable)(void *); /* Called on all active CPUs */ - union { - struct { /* To be used for erratum handling only */ - u32 midr_model; -diff --git a/arch/arm64/include/asm/exec.h b/arch/arm64/include/asm/exec.h -index db0563c..f7865dd 100644 ---- a/arch/arm64/include/asm/exec.h -+++ b/arch/arm64/include/asm/exec.h -@@ -18,6 +18,9 @@ - #ifndef __ASM_EXEC_H - #define __ASM_EXEC_H - -+#include <linux/sched.h> -+ - extern unsigned long arch_align_stack(unsigned long sp); -+void uao_thread_switch(struct task_struct *next); - - #endif /* __ASM_EXEC_H */ -diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h -index ace0a96..3be0ab0 100644 ---- a/arch/arm64/include/asm/processor.h -+++ b/arch/arm64/include/asm/processor.h -@@ -190,8 +190,8 @@ static inline void spin_lock_prefetch(const void *ptr) - - #endif - --void cpu_enable_pan(void *__unused); --void cpu_enable_uao(void *__unused); --void cpu_enable_cache_maint_trap(void *__unused); -+int cpu_enable_pan(void *__unused); -+int cpu_enable_uao(void *__unused); -+int cpu_enable_cache_maint_trap(void *__unused); - - #endif /* __ASM_PROCESSOR_H */ -diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c -index 62272ea..94a0330 100644 ---- a/arch/arm64/kernel/cpufeature.c -+++ b/arch/arm64/kernel/cpufeature.c -@@ -19,7 +19,9 @@ - #define pr_fmt(fmt) "CPU features: " fmt - - #include <linux/bsearch.h> -+#include <linux/cpumask.h> - #include <linux/sort.h> -+#include <linux/stop_machine.h> - #include <linux/types.h> - #include <asm/cpu.h> - #include <asm/cpufeature.h> -@@ -936,7 +938,13 @@ void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps) - { - for (; caps->matches; caps++) - if (caps->enable && cpus_have_cap(caps->capability)) -- on_each_cpu(caps->enable, NULL, true); -+ /* -+ * Use stop_machine() as it schedules the work allowing -+ * us to modify PSTATE, instead of on_each_cpu() which -+ * uses an IPI, giving us a PSTATE that disappears when -+ * we return. -+ */ -+ stop_machine(caps->enable, NULL, cpu_online_mask); - } - - /* -diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c -index 6cd2612..9cc8667 100644 ---- a/arch/arm64/kernel/process.c -+++ b/arch/arm64/kernel/process.c -@@ -49,6 +49,7 @@ - #include <asm/alternative.h> - #include <asm/compat.h> - #include <asm/cacheflush.h> -+#include <asm/exec.h> - #include <asm/fpsimd.h> - #include <asm/mmu_context.h> - #include <asm/processor.h> -@@ -303,7 +304,7 @@ static void tls_thread_switch(struct task_struct *next) - } - - /* Restore the UAO state depending on next's addr_limit */ --static void uao_thread_switch(struct task_struct *next) -+void uao_thread_switch(struct task_struct *next) - { - if (IS_ENABLED(CONFIG_ARM64_UAO)) { - if (task_thread_info(next)->addr_limit == KERNEL_DS) -diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c -index b616e365..23ddf55 100644 ---- a/arch/arm64/kernel/suspend.c -+++ b/arch/arm64/kernel/suspend.c -@@ -1,8 +1,11 @@ - #include <linux/ftrace.h> - #include <linux/percpu.h> - #include <linux/slab.h> -+#include <asm/alternative.h> - #include <asm/cacheflush.h> -+#include <asm/cpufeature.h> - #include <asm/debug-monitors.h> -+#include <asm/exec.h> - #include <asm/pgtable.h> - #include <asm/memory.h> - #include <asm/mmu_context.h> -@@ -48,6 +51,14 @@ void notrace __cpu_suspend_exit(void) - set_my_cpu_offset(per_cpu_offset(smp_processor_id())); - - /* -+ * PSTATE was not saved over suspend/resume, re-enable any detected -+ * features that might not have been set correctly. -+ */ -+ asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, -+ CONFIG_ARM64_PAN)); -+ uao_thread_switch(current); -+ -+ /* - * Restore HW breakpoint registers to sane values - * before debug exceptions are possibly reenabled - * through local_dbg_restore. -diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c -index 771a01a7f..9595d3d 100644 ---- a/arch/arm64/kernel/traps.c -+++ b/arch/arm64/kernel/traps.c -@@ -428,9 +428,10 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) - force_signal_inject(SIGILL, ILL_ILLOPC, regs, 0); - } - --void cpu_enable_cache_maint_trap(void *__unused) -+int cpu_enable_cache_maint_trap(void *__unused) - { - config_sctlr_el1(SCTLR_EL1_UCI, 0); -+ return 0; - } - - #define __user_cache_maint(insn, address, res) \ -diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c -index 05d2bd7..67506c3 100644 ---- a/arch/arm64/mm/fault.c -+++ b/arch/arm64/mm/fault.c -@@ -29,7 +29,9 @@ - #include <linux/sched.h> - #include <linux/highmem.h> - #include <linux/perf_event.h> -+#include <linux/preempt.h> - -+#include <asm/bug.h> - #include <asm/cpufeature.h> - #include <asm/exception.h> - #include <asm/debug-monitors.h> -@@ -671,9 +673,17 @@ asmlinkage int __exception do_debug_exception(unsigned long addr, - NOKPROBE_SYMBOL(do_debug_exception); - - #ifdef CONFIG_ARM64_PAN --void cpu_enable_pan(void *__unused) -+int cpu_enable_pan(void *__unused) - { -+ /* -+ * We modify PSTATE. This won't work from irq context as the PSTATE -+ * is discarded once we return from the exception. -+ */ -+ WARN_ON_ONCE(in_interrupt()); -+ - config_sctlr_el1(SCTLR_EL1_SPAN, 0); -+ asm(SET_PSTATE_PAN(1)); -+ return 0; - } - #endif /* CONFIG_ARM64_PAN */ - -@@ -684,8 +694,9 @@ void cpu_enable_pan(void *__unused) - * We need to enable the feature at runtime (instead of adding it to - * PSR_MODE_EL1h) as the feature may not be implemented by the cpu. - */ --void cpu_enable_uao(void *__unused) -+int cpu_enable_uao(void *__unused) - { - asm(SET_PSTATE_UAO(1)); -+ return 0; - } - #endif /* CONFIG_ARM64_UAO */ -diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c -index d0efb5c..a4e070a 100644 ---- a/arch/x86/events/core.c -+++ b/arch/x86/events/core.c -@@ -2344,7 +2344,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent - frame.next_frame = 0; - frame.return_address = 0; - -- if (!access_ok(VERIFY_READ, fp, 8)) -+ if (!valid_user_frame(fp, sizeof(frame))) - break; - - bytes = __copy_from_user_nmi(&frame.next_frame, fp, 4); -@@ -2354,9 +2354,6 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent - if (bytes != 0) - break; - -- if (!valid_user_frame(fp, sizeof(frame))) -- break; -- - perf_callchain_store(entry, cs_base + frame.return_address); - fp = compat_ptr(ss_base + frame.next_frame); - } -@@ -2405,7 +2402,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs - frame.next_frame = NULL; - frame.return_address = 0; - -- if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2)) -+ if (!valid_user_frame(fp, sizeof(frame))) - break; - - bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp)); -@@ -2415,9 +2412,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs - if (bytes != 0) - break; - -- if (!valid_user_frame(fp, sizeof(frame))) -- break; -- - perf_callchain_store(entry, frame.return_address); - fp = (void __user *)frame.next_frame; - } -diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c -index e207b33..1e007a9 100644 ---- a/drivers/ata/libata-scsi.c -+++ b/drivers/ata/libata-scsi.c -@@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc) - desc[1] = tf->command; /* status */ - desc[2] = tf->device; - desc[3] = tf->nsect; -- desc[0] = 0; -+ desc[7] = 0; - if (tf->flags & ATA_TFLAG_LBA48) { - desc[8] |= 0x80; - if (tf->hob_nsect) -diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c -index 04365b1..5163c8f 100644 ---- a/drivers/block/zram/zram_drv.c -+++ b/drivers/block/zram/zram_drv.c -@@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class, - zram = idr_find(&zram_index_idr, dev_id); - if (zram) { - ret = zram_remove(zram); -- idr_remove(&zram_index_idr, dev_id); -+ if (!ret) -+ idr_remove(&zram_index_idr, dev_id); - } else { - ret = -ENODEV; - } -diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c -index 838b22a..f2c9274 100644 ---- a/drivers/clk/sunxi/clk-sunxi.c -+++ b/drivers/clk/sunxi/clk-sunxi.c -@@ -373,7 +373,7 @@ static void sun4i_get_apb1_factors(struct factors_request *req) - else - calcp = 3; - -- calcm = (req->parent_rate >> calcp) - 1; -+ calcm = (div >> calcp) - 1; - - req->rate = (req->parent_rate >> calcp) / (calcm + 1); - req->m = calcm; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -index 10b5ddf..1ed085f 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -@@ -33,6 +33,7 @@ struct amdgpu_atpx { - - static struct amdgpu_atpx_priv { - bool atpx_detected; -+ bool bridge_pm_usable; - /* handle for device - and atpx */ - acpi_handle dhandle; - acpi_handle other_handle; -@@ -200,7 +201,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx) - atpx->is_hybrid = false; - if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { - printk("ATPX Hybrid Graphics\n"); -- atpx->functions.power_cntl = false; -+ /* -+ * Disable legacy PM methods only when pcie port PM is usable, -+ * otherwise the device might fail to power off or power on. -+ */ -+ atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable; - atpx->is_hybrid = true; - } - -@@ -546,17 +551,25 @@ static bool amdgpu_atpx_detect(void) - struct pci_dev *pdev = NULL; - bool has_atpx = false; - int vga_count = 0; -+ bool d3_supported = false; -+ struct pci_dev *parent_pdev; - - while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { - vga_count++; - - has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); -+ -+ parent_pdev = pci_upstream_bridge(pdev); -+ d3_supported |= parent_pdev && parent_pdev->bridge_d3; - } - - while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { - vga_count++; - - has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); -+ -+ parent_pdev = pci_upstream_bridge(pdev); -+ d3_supported |= parent_pdev && parent_pdev->bridge_d3; - } - - if (has_atpx && vga_count == 2) { -@@ -564,6 +577,7 @@ static bool amdgpu_atpx_detect(void) - printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", - acpi_method_name); - amdgpu_atpx_priv.atpx_detected = true; -+ amdgpu_atpx_priv.bridge_pm_usable = d3_supported; - amdgpu_atpx_init(); - return true; - } -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index a77ce99..b8e3854 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -2540,7 +2540,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) - page = shmem_read_mapping_page(mapping, i); - if (IS_ERR(page)) { - ret = PTR_ERR(page); -- goto err_pages; -+ goto err_sg; - } - } - #ifdef CONFIG_SWIOTLB -@@ -2583,8 +2583,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) - - return 0; - --err_pages: -+err_sg: - sg_mark_end(sg); -+err_pages: - for_each_sgt_page(page, sgt_iter, st) - put_page(page); - sg_free_table(st); -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index e26f889..35d385d 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -11791,7 +11791,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, - intel_crtc->reset_counter = i915_reset_counter(&dev_priv->gpu_error); - if (__i915_reset_in_progress_or_wedged(intel_crtc->reset_counter)) { - ret = -EIO; -- goto cleanup; -+ goto unlock; - } - - atomic_inc(&intel_crtc->unpin_work_count); -@@ -11877,6 +11877,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, - if (!IS_ERR_OR_NULL(request)) - i915_add_request_no_flush(request); - atomic_dec(&intel_crtc->unpin_work_count); -+unlock: - mutex_unlock(&dev->struct_mutex); - cleanup: - crtc->primary->fb = old_fb; -diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c -index 8f62671f..54acfcc 100644 ---- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c -+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c -@@ -249,13 +249,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) - if (irq < 0) - return irq; - -- ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, -- IRQF_TRIGGER_NONE, dev_name(dev), priv); -- if (ret < 0) { -- dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); -- return ret; -- } -- - comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL); - if (comp_id < 0) { - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); -@@ -271,6 +264,13 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev) - - platform_set_drvdata(pdev, priv); - -+ ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, -+ IRQF_TRIGGER_NONE, dev_name(dev), priv); -+ if (ret < 0) { -+ dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); -+ return ret; -+ } -+ - ret = component_add(dev, &mtk_disp_ovl_component_ops); - if (ret) - dev_err(dev, "Failed to add component: %d\n", ret); -diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -index ddef0d4..34b4ace 100644 ---- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c -+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -@@ -33,6 +33,7 @@ struct radeon_atpx { - - static struct radeon_atpx_priv { - bool atpx_detected; -+ bool bridge_pm_usable; - /* handle for device - and atpx */ - acpi_handle dhandle; - struct radeon_atpx atpx; -@@ -198,7 +199,11 @@ static int radeon_atpx_validate(struct radeon_atpx *atpx) - atpx->is_hybrid = false; - if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { - printk("ATPX Hybrid Graphics\n"); -- atpx->functions.power_cntl = false; -+ /* -+ * Disable legacy PM methods only when pcie port PM is usable, -+ * otherwise the device might fail to power off or power on. -+ */ -+ atpx->functions.power_cntl = !radeon_atpx_priv.bridge_pm_usable; - atpx->is_hybrid = true; - } - -@@ -543,11 +548,16 @@ static bool radeon_atpx_detect(void) - struct pci_dev *pdev = NULL; - bool has_atpx = false; - int vga_count = 0; -+ bool d3_supported = false; -+ struct pci_dev *parent_pdev; - - while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { - vga_count++; - - has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); -+ -+ parent_pdev = pci_upstream_bridge(pdev); -+ d3_supported |= parent_pdev && parent_pdev->bridge_d3; - } - - /* some newer PX laptops mark the dGPU as a non-VGA display device */ -@@ -555,6 +565,9 @@ static bool radeon_atpx_detect(void) - vga_count++; - - has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); -+ -+ parent_pdev = pci_upstream_bridge(pdev); -+ d3_supported |= parent_pdev && parent_pdev->bridge_d3; - } - - if (has_atpx && vga_count == 2) { -@@ -562,6 +575,7 @@ static bool radeon_atpx_detect(void) - printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", - acpi_method_name); - radeon_atpx_priv.atpx_detected = true; -+ radeon_atpx_priv.bridge_pm_usable = d3_supported; - radeon_atpx_init(); - return true; - } -diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c -index 5784e20..9f6203c 100644 ---- a/drivers/input/mouse/psmouse-base.c -+++ b/drivers/input/mouse/psmouse-base.c -@@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse, - if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2, - &max_proto, set_properties, true)) - return PSMOUSE_TOUCHKIT_PS2; -- -- if (psmouse_try_protocol(psmouse, PSMOUSE_BYD, -- &max_proto, set_properties, true)) -- return PSMOUSE_BYD; - } - - /* -diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c -index a8ff969..cbc7dfa 100644 ---- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c -+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c -@@ -2203,8 +2203,9 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, - is_scanning_required = 1; - } else { - mwifiex_dbg(priv->adapter, MSG, -- "info: trying to associate to '%s' bssid %pM\n", -- (char *)req_ssid.ssid, bss->bssid); -+ "info: trying to associate to '%.*s' bssid %pM\n", -+ req_ssid.ssid_len, (char *)req_ssid.ssid, -+ bss->bssid); - memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN); - break; - } -@@ -2264,8 +2265,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, - } - - mwifiex_dbg(adapter, INFO, -- "info: Trying to associate to %s and bssid %pM\n", -- (char *)sme->ssid, sme->bssid); -+ "info: Trying to associate to %.*s and bssid %pM\n", -+ (int)sme->ssid_len, (char *)sme->ssid, sme->bssid); - - if (!mwifiex_stop_bg_scan(priv)) - cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy); -@@ -2398,8 +2399,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, - } - - mwifiex_dbg(priv->adapter, MSG, -- "info: trying to join to %s and bssid %pM\n", -- (char *)params->ssid, params->bssid); -+ "info: trying to join to %.*s and bssid %pM\n", -+ params->ssid_len, (char *)params->ssid, params->bssid); - - mwifiex_set_ibss_params(priv, params); - -diff --git a/drivers/pci/pcie/aer/aer_inject.c b/drivers/pci/pcie/aer/aer_inject.c -index db553dc..2b6a592 100644 ---- a/drivers/pci/pcie/aer/aer_inject.c -+++ b/drivers/pci/pcie/aer/aer_inject.c -@@ -307,20 +307,6 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus) - return 0; - } - --static struct pci_dev *pcie_find_root_port(struct pci_dev *dev) --{ -- while (1) { -- if (!pci_is_pcie(dev)) -- break; -- if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) -- return dev; -- if (!dev->bus->self) -- break; -- dev = dev->bus->self; -- } -- return NULL; --} -- - static int find_aer_device_iter(struct device *device, void *data) - { - struct pcie_device **result = data; -diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c -index 93f280d..f6eff4a 100644 ---- a/drivers/pci/probe.c -+++ b/drivers/pci/probe.c -@@ -1439,6 +1439,21 @@ static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp) - dev_warn(&dev->dev, "PCI-X settings not supported\n"); - } - -+static bool pcie_root_rcb_set(struct pci_dev *dev) -+{ -+ struct pci_dev *rp = pcie_find_root_port(dev); -+ u16 lnkctl; -+ -+ if (!rp) -+ return false; -+ -+ pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl); -+ if (lnkctl & PCI_EXP_LNKCTL_RCB) -+ return true; -+ -+ return false; -+} -+ - static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) - { - int pos; -@@ -1468,9 +1483,20 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) - ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); - - /* Initialize Link Control Register */ -- if (pcie_cap_has_lnkctl(dev)) -+ if (pcie_cap_has_lnkctl(dev)) { -+ -+ /* -+ * If the Root Port supports Read Completion Boundary of -+ * 128, set RCB to 128. Otherwise, clear it. -+ */ -+ hpp->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB; -+ hpp->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB; -+ if (pcie_root_rcb_set(dev)) -+ hpp->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB; -+ - pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, - ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); -+ } - - /* Find Advanced Error Reporting Enhanced Capability */ - pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); -diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c -index 0296d81..a813239 100644 ---- a/drivers/pwm/sysfs.c -+++ b/drivers/pwm/sysfs.c -@@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip) - if (test_bit(PWMF_EXPORTED, &pwm->flags)) - pwm_unexport_child(parent, pwm); - } -+ -+ put_device(parent); - } - - static int __init pwm_sysfs_init(void) -diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c -index 030d002..5138a84 100644 ---- a/drivers/scsi/hpsa.c -+++ b/drivers/scsi/hpsa.c -@@ -2007,7 +2007,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h, - - static int hpsa_slave_alloc(struct scsi_device *sdev) - { -- struct hpsa_scsi_dev_t *sd; -+ struct hpsa_scsi_dev_t *sd = NULL; - unsigned long flags; - struct ctlr_info *h; - -@@ -2024,7 +2024,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev) - sd->target = sdev_id(sdev); - sd->lun = sdev->lun; - } -- } else -+ } -+ if (!sd) - sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev), - sdev_id(sdev), sdev->lun); - -@@ -3805,6 +3806,7 @@ static int hpsa_update_device_info(struct ctlr_info *h, - sizeof(this_device->vendor)); - memcpy(this_device->model, &inq_buff[16], - sizeof(this_device->model)); -+ this_device->rev = inq_buff[2]; - memset(this_device->device_id, 0, - sizeof(this_device->device_id)); - hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8, -@@ -3887,10 +3889,14 @@ static void figure_bus_target_lun(struct ctlr_info *h, - - if (!is_logical_dev_addr_mode(lunaddrbytes)) { - /* physical device, target and lun filled in later */ -- if (is_hba_lunid(lunaddrbytes)) -+ if (is_hba_lunid(lunaddrbytes)) { -+ int bus = HPSA_HBA_BUS; -+ -+ if (!device->rev) -+ bus = HPSA_LEGACY_HBA_BUS; - hpsa_set_bus_target_lun(device, -- HPSA_HBA_BUS, 0, lunid & 0x3fff); -- else -+ bus, 0, lunid & 0x3fff); -+ } else - /* defer target, lun assignment for physical devices */ - hpsa_set_bus_target_lun(device, - HPSA_PHYSICAL_DEVICE_BUS, -1, -1); -diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h -index a1487e6..9d45dde 100644 ---- a/drivers/scsi/hpsa.h -+++ b/drivers/scsi/hpsa.h -@@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t { - u64 sas_address; - unsigned char vendor[8]; /* bytes 8-15 of inquiry data */ - unsigned char model[16]; /* bytes 16-31 of inquiry data */ -+ unsigned char rev; /* byte 2 of inquiry data */ - unsigned char raid_level; /* from inquiry page 0xC1 */ - unsigned char volume_offline; /* discovered via TUR or VPD */ - u16 queue_depth; /* max queue_depth for this device */ -@@ -403,6 +404,7 @@ struct offline_device_entry { - #define HPSA_RAID_VOLUME_BUS 1 - #define HPSA_EXTERNAL_RAID_VOLUME_BUS 2 - #define HPSA_HBA_BUS 0 -+#define HPSA_LEGACY_HBA_BUS 3 - - /* - Send the command to the hardware -diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c -index 04ce7cf..50c7167 100644 ---- a/drivers/scsi/libfc/fc_lport.c -+++ b/drivers/scsi/libfc/fc_lport.c -@@ -308,7 +308,7 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost) - fc_stats = &lport->host_stats; - memset(fc_stats, 0, sizeof(struct fc_host_statistics)); - -- fc_stats->seconds_since_last_reset = (lport->boot_time - jiffies) / HZ; -+ fc_stats->seconds_since_last_reset = (jiffies - lport->boot_time) / HZ; - - for_each_possible_cpu(cpu) { - struct fc_stats *stats; -diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c -index a78415d..78be4ae 100644 ---- a/fs/overlayfs/super.c -+++ b/fs/overlayfs/super.c -@@ -329,11 +329,11 @@ static struct dentry *ovl_d_real(struct dentry *dentry, - if (!real) - goto bug; - -+ /* Handle recursion */ -+ real = d_real(real, inode, open_flags); -+ - if (!inode || inode == d_inode(real)) - return real; -- -- /* Handle recursion */ -- return d_real(real, inode, open_flags); - bug: - WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry, - inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0); -diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h -index 573c5a1..0a0b2d5 100644 ---- a/include/linux/compiler-gcc.h -+++ b/include/linux/compiler-gcc.h -@@ -256,7 +256,9 @@ - #endif - #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */ - --#if GCC_VERSION >= 50000 -+#if GCC_VERSION >= 70000 -+#define KASAN_ABI_VERSION 5 -+#elif GCC_VERSION >= 50000 - #define KASAN_ABI_VERSION 4 - #elif GCC_VERSION >= 40902 - #define KASAN_ABI_VERSION 3 -diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h -index 01e8443..d47cc4a 100644 ---- a/include/linux/pagemap.h -+++ b/include/linux/pagemap.h -@@ -364,16 +364,13 @@ static inline struct page *read_mapping_page(struct address_space *mapping, - } - - /* -- * Get the offset in PAGE_SIZE. -- * (TODO: hugepage should have ->index in PAGE_SIZE) -+ * Get index of the page with in radix-tree -+ * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE) - */ --static inline pgoff_t page_to_pgoff(struct page *page) -+static inline pgoff_t page_to_index(struct page *page) - { - pgoff_t pgoff; - -- if (unlikely(PageHeadHuge(page))) -- return page->index << compound_order(page); -- - if (likely(!PageTransTail(page))) - return page->index; - -@@ -387,6 +384,18 @@ static inline pgoff_t page_to_pgoff(struct page *page) - } - - /* -+ * Get the offset in PAGE_SIZE. -+ * (TODO: hugepage should have ->index in PAGE_SIZE) -+ */ -+static inline pgoff_t page_to_pgoff(struct page *page) -+{ -+ if (unlikely(PageHeadHuge(page))) -+ return page->index << compound_order(page); -+ -+ return page_to_index(page); -+} -+ -+/* - * Return byte-offset into filesystem object for page. - */ - static inline loff_t page_offset(struct page *page) -diff --git a/include/linux/pci.h b/include/linux/pci.h -index 0ab8359..03f3df0 100644 ---- a/include/linux/pci.h -+++ b/include/linux/pci.h -@@ -1896,6 +1896,20 @@ static inline int pci_pcie_type(const struct pci_dev *dev) - return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4; - } - -+static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev) -+{ -+ while (1) { -+ if (!pci_is_pcie(dev)) -+ break; -+ if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) -+ return dev; -+ if (!dev->bus->self) -+ break; -+ dev = dev->bus->self; -+ } -+ return NULL; -+} -+ - void pci_request_acs(void); - bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags); - bool pci_acs_path_enabled(struct pci_dev *start, -diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h -index d6d071f..3af60ee 100644 ---- a/include/uapi/linux/input-event-codes.h -+++ b/include/uapi/linux/input-event-codes.h -@@ -640,7 +640,7 @@ - * Control a data application associated with the currently viewed channel, - * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.) - */ --#define KEY_DATA 0x275 -+#define KEY_DATA 0x277 - - #define BTN_TRIGGER_HAPPY 0x2c0 - #define BTN_TRIGGER_HAPPY1 0x2c0 -diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h -index 0082fce..85c5a88 100644 ---- a/kernel/rcu/tree_plugin.h -+++ b/kernel/rcu/tree_plugin.h -@@ -2173,6 +2173,7 @@ static int rcu_nocb_kthread(void *arg) - cl++; - c++; - local_bh_enable(); -+ cond_resched_rcu_qs(); - list = next; - } - trace_rcu_batch_end(rdp->rsp->name, c, !!list, 0, 0, 1); -diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h -index e5c2181f..03f4545 100644 ---- a/mm/kasan/kasan.h -+++ b/mm/kasan/kasan.h -@@ -53,6 +53,9 @@ struct kasan_global { - #if KASAN_ABI_VERSION >= 4 - struct kasan_source_location *location; - #endif -+#if KASAN_ABI_VERSION >= 5 -+ char *odr_indicator; -+#endif - }; - - /** -diff --git a/mm/khugepaged.c b/mm/khugepaged.c -index 728d779..87e1a7ca 100644 ---- a/mm/khugepaged.c -+++ b/mm/khugepaged.c -@@ -103,6 +103,7 @@ static struct khugepaged_scan khugepaged_scan = { - .mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head), - }; - -+#ifdef CONFIG_SYSFS - static ssize_t scan_sleep_millisecs_show(struct kobject *kobj, - struct kobj_attribute *attr, - char *buf) -@@ -295,6 +296,7 @@ struct attribute_group khugepaged_attr_group = { - .attrs = khugepaged_attr, - .name = "khugepaged", - }; -+#endif /* CONFIG_SYSFS */ - - #define VM_NO_KHUGEPAGED (VM_SPECIAL | VM_HUGETLB) - -diff --git a/mm/mlock.c b/mm/mlock.c -index 14645be..9c91acc 100644 ---- a/mm/mlock.c -+++ b/mm/mlock.c -@@ -190,10 +190,13 @@ unsigned int munlock_vma_page(struct page *page) - */ - spin_lock_irq(zone_lru_lock(zone)); - -- nr_pages = hpage_nr_pages(page); -- if (!TestClearPageMlocked(page)) -+ if (!TestClearPageMlocked(page)) { -+ /* Potentially, PTE-mapped THP: do not skip the rest PTEs */ -+ nr_pages = 1; - goto unlock_out; -+ } - -+ nr_pages = hpage_nr_pages(page); - __mod_zone_page_state(zone, NR_MLOCK, -nr_pages); - - if (__munlock_isolate_lru_page(page, true)) { -diff --git a/mm/truncate.c b/mm/truncate.c -index a01cce4..8d8c62d 100644 ---- a/mm/truncate.c -+++ b/mm/truncate.c -@@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct address_space *mapping, - - if (!trylock_page(page)) - continue; -- WARN_ON(page_to_pgoff(page) != index); -+ WARN_ON(page_to_index(page) != index); - if (PageWriteback(page)) { - unlock_page(page); - continue; -@@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct address_space *mapping, - } - - lock_page(page); -- WARN_ON(page_to_pgoff(page) != index); -+ WARN_ON(page_to_index(page) != index); - wait_on_page_writeback(page); - truncate_inode_page(mapping, page); - unlock_page(page); -@@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, - if (!trylock_page(page)) - continue; - -- WARN_ON(page_to_pgoff(page) != index); -+ WARN_ON(page_to_index(page) != index); - - /* Middle of THP: skip */ - if (PageTransTail(page)) { -@@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, - } - - lock_page(page); -- WARN_ON(page_to_pgoff(page) != index); -+ WARN_ON(page_to_index(page) != index); - if (page->mapping != mapping) { - unlock_page(page); - continue; -diff --git a/mm/workingset.c b/mm/workingset.c -index 617475f..fb1f918 100644 ---- a/mm/workingset.c -+++ b/mm/workingset.c -@@ -348,7 +348,7 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker, - shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc); - local_irq_enable(); - -- if (memcg_kmem_enabled()) { -+ if (sc->memcg) { - pages = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid, - LRU_ALL_FILE); - } else { -diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c -index 2333777..8af1611 100644 ---- a/net/batman-adv/tp_meter.c -+++ b/net/batman-adv/tp_meter.c -@@ -837,6 +837,7 @@ static int batadv_tp_send(void *arg) - primary_if = batadv_primary_if_get_selected(bat_priv); - if (unlikely(!primary_if)) { - err = BATADV_TP_REASON_DST_UNREACHABLE; -+ tp_vars->reason = err; - goto out; - } - -diff --git a/virt/kvm/arm/vgic/vgic-v2.c b/virt/kvm/arm/vgic/vgic-v2.c -index 0bf6709..6fb4314 100644 ---- a/virt/kvm/arm/vgic/vgic-v2.c -+++ b/virt/kvm/arm/vgic/vgic-v2.c -@@ -50,8 +50,10 @@ void vgic_v2_process_maintenance(struct kvm_vcpu *vcpu) - - WARN_ON(cpuif->vgic_lr[lr] & GICH_LR_STATE); - -- kvm_notify_acked_irq(vcpu->kvm, 0, -- intid - VGIC_NR_PRIVATE_IRQS); -+ /* Only SPIs require notification */ -+ if (vgic_valid_spi(vcpu->kvm, intid)) -+ kvm_notify_acked_irq(vcpu->kvm, 0, -+ intid - VGIC_NR_PRIVATE_IRQS); - } - } - -diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c -index 9f0dae3..5c9f974 100644 ---- a/virt/kvm/arm/vgic/vgic-v3.c -+++ b/virt/kvm/arm/vgic/vgic-v3.c -@@ -41,8 +41,10 @@ void vgic_v3_process_maintenance(struct kvm_vcpu *vcpu) - - WARN_ON(cpuif->vgic_lr[lr] & ICH_LR_STATE); - -- kvm_notify_acked_irq(vcpu->kvm, 0, -- intid - VGIC_NR_PRIVATE_IRQS); -+ /* Only SPIs require notification */ -+ if (vgic_valid_spi(vcpu->kvm, intid)) -+ kvm_notify_acked_irq(vcpu->kvm, 0, -+ intid - VGIC_NR_PRIVATE_IRQS); - } - - /* -diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c -index 1950782..690d15e 100644 ---- a/virt/kvm/kvm_main.c -+++ b/virt/kvm/kvm_main.c -@@ -2852,10 +2852,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm, - - ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); - if (ret < 0) { -- ops->destroy(dev); - mutex_lock(&kvm->lock); - list_del(&dev->vm_node); - mutex_unlock(&kvm->lock); -+ ops->destroy(dev); - return ret; - } - |