diff options
Diffstat (limited to '4.9.9/1008_linux-4.9.9.patch')
-rw-r--r-- | 4.9.9/1008_linux-4.9.9.patch | 2333 |
1 files changed, 0 insertions, 2333 deletions
diff --git a/4.9.9/1008_linux-4.9.9.patch b/4.9.9/1008_linux-4.9.9.patch deleted file mode 100644 index 411ce9b..0000000 --- a/4.9.9/1008_linux-4.9.9.patch +++ /dev/null @@ -1,2333 +0,0 @@ -diff --git a/Makefile b/Makefile -index 1130803..c0c41c9 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 4 - PATCHLEVEL = 9 --SUBLEVEL = 8 -+SUBLEVEL = 9 - EXTRAVERSION = - NAME = Roaring Lionus - -diff --git a/arch/arm64/crypto/aes-modes.S b/arch/arm64/crypto/aes-modes.S -index c53dbea..838dad5 100644 ---- a/arch/arm64/crypto/aes-modes.S -+++ b/arch/arm64/crypto/aes-modes.S -@@ -193,15 +193,16 @@ AES_ENTRY(aes_cbc_encrypt) - cbz w6, .Lcbcencloop - - ld1 {v0.16b}, [x5] /* get iv */ -- enc_prepare w3, x2, x5 -+ enc_prepare w3, x2, x6 - - .Lcbcencloop: - ld1 {v1.16b}, [x1], #16 /* get next pt block */ - eor v0.16b, v0.16b, v1.16b /* ..and xor with iv */ -- encrypt_block v0, w3, x2, x5, w6 -+ encrypt_block v0, w3, x2, x6, w7 - st1 {v0.16b}, [x0], #16 - subs w4, w4, #1 - bne .Lcbcencloop -+ st1 {v0.16b}, [x5] /* return iv */ - ret - AES_ENDPROC(aes_cbc_encrypt) - -@@ -211,7 +212,7 @@ AES_ENTRY(aes_cbc_decrypt) - cbz w6, .LcbcdecloopNx - - ld1 {v7.16b}, [x5] /* get iv */ -- dec_prepare w3, x2, x5 -+ dec_prepare w3, x2, x6 - - .LcbcdecloopNx: - #if INTERLEAVE >= 2 -@@ -248,7 +249,7 @@ AES_ENTRY(aes_cbc_decrypt) - .Lcbcdecloop: - ld1 {v1.16b}, [x1], #16 /* get next ct block */ - mov v0.16b, v1.16b /* ...and copy to v0 */ -- decrypt_block v0, w3, x2, x5, w6 -+ decrypt_block v0, w3, x2, x6, w7 - eor v0.16b, v0.16b, v7.16b /* xor with iv => pt */ - mov v7.16b, v1.16b /* ct is next iv */ - st1 {v0.16b}, [x0], #16 -@@ -256,6 +257,7 @@ AES_ENTRY(aes_cbc_decrypt) - bne .Lcbcdecloop - .Lcbcdecout: - FRAME_POP -+ st1 {v7.16b}, [x5] /* return iv */ - ret - AES_ENDPROC(aes_cbc_decrypt) - -@@ -267,24 +269,15 @@ AES_ENDPROC(aes_cbc_decrypt) - - AES_ENTRY(aes_ctr_encrypt) - FRAME_PUSH -- cbnz w6, .Lctrfirst /* 1st time around? */ -- umov x5, v4.d[1] /* keep swabbed ctr in reg */ -- rev x5, x5 --#if INTERLEAVE >= 2 -- cmn w5, w4 /* 32 bit overflow? */ -- bcs .Lctrinc -- add x5, x5, #1 /* increment BE ctr */ -- b .LctrincNx --#else -- b .Lctrinc --#endif --.Lctrfirst: -+ cbz w6, .Lctrnotfirst /* 1st time around? */ - enc_prepare w3, x2, x6 - ld1 {v4.16b}, [x5] -- umov x5, v4.d[1] /* keep swabbed ctr in reg */ -- rev x5, x5 -+ -+.Lctrnotfirst: -+ umov x8, v4.d[1] /* keep swabbed ctr in reg */ -+ rev x8, x8 - #if INTERLEAVE >= 2 -- cmn w5, w4 /* 32 bit overflow? */ -+ cmn w8, w4 /* 32 bit overflow? */ - bcs .Lctrloop - .LctrloopNx: - subs w4, w4, #INTERLEAVE -@@ -292,11 +285,11 @@ AES_ENTRY(aes_ctr_encrypt) - #if INTERLEAVE == 2 - mov v0.8b, v4.8b - mov v1.8b, v4.8b -- rev x7, x5 -- add x5, x5, #1 -+ rev x7, x8 -+ add x8, x8, #1 - ins v0.d[1], x7 -- rev x7, x5 -- add x5, x5, #1 -+ rev x7, x8 -+ add x8, x8, #1 - ins v1.d[1], x7 - ld1 {v2.16b-v3.16b}, [x1], #32 /* get 2 input blocks */ - do_encrypt_block2x -@@ -305,7 +298,7 @@ AES_ENTRY(aes_ctr_encrypt) - st1 {v0.16b-v1.16b}, [x0], #32 - #else - ldr q8, =0x30000000200000001 /* addends 1,2,3[,0] */ -- dup v7.4s, w5 -+ dup v7.4s, w8 - mov v0.16b, v4.16b - add v7.4s, v7.4s, v8.4s - mov v1.16b, v4.16b -@@ -323,18 +316,12 @@ AES_ENTRY(aes_ctr_encrypt) - eor v2.16b, v7.16b, v2.16b - eor v3.16b, v5.16b, v3.16b - st1 {v0.16b-v3.16b}, [x0], #64 -- add x5, x5, #INTERLEAVE -+ add x8, x8, #INTERLEAVE - #endif -- cbz w4, .LctroutNx --.LctrincNx: -- rev x7, x5 -+ rev x7, x8 - ins v4.d[1], x7 -+ cbz w4, .Lctrout - b .LctrloopNx --.LctroutNx: -- sub x5, x5, #1 -- rev x7, x5 -- ins v4.d[1], x7 -- b .Lctrout - .Lctr1x: - adds w4, w4, #INTERLEAVE - beq .Lctrout -@@ -342,30 +329,39 @@ AES_ENTRY(aes_ctr_encrypt) - .Lctrloop: - mov v0.16b, v4.16b - encrypt_block v0, w3, x2, x6, w7 -+ -+ adds x8, x8, #1 /* increment BE ctr */ -+ rev x7, x8 -+ ins v4.d[1], x7 -+ bcs .Lctrcarry /* overflow? */ -+ -+.Lctrcarrydone: - subs w4, w4, #1 - bmi .Lctrhalfblock /* blocks < 0 means 1/2 block */ - ld1 {v3.16b}, [x1], #16 - eor v3.16b, v0.16b, v3.16b - st1 {v3.16b}, [x0], #16 -- beq .Lctrout --.Lctrinc: -- adds x5, x5, #1 /* increment BE ctr */ -- rev x7, x5 -- ins v4.d[1], x7 -- bcc .Lctrloop /* no overflow? */ -- umov x7, v4.d[0] /* load upper word of ctr */ -- rev x7, x7 /* ... to handle the carry */ -- add x7, x7, #1 -- rev x7, x7 -- ins v4.d[0], x7 -- b .Lctrloop -+ bne .Lctrloop -+ -+.Lctrout: -+ st1 {v4.16b}, [x5] /* return next CTR value */ -+ FRAME_POP -+ ret -+ - .Lctrhalfblock: - ld1 {v3.8b}, [x1] - eor v3.8b, v0.8b, v3.8b - st1 {v3.8b}, [x0] --.Lctrout: - FRAME_POP - ret -+ -+.Lctrcarry: -+ umov x7, v4.d[0] /* load upper word of ctr */ -+ rev x7, x7 /* ... to handle the carry */ -+ add x7, x7, #1 -+ rev x7, x7 -+ ins v4.d[0], x7 -+ b .Lctrcarrydone - AES_ENDPROC(aes_ctr_encrypt) - .ltorg - -diff --git a/arch/powerpc/include/asm/cpu_has_feature.h b/arch/powerpc/include/asm/cpu_has_feature.h -index b312b15..6e834ca 100644 ---- a/arch/powerpc/include/asm/cpu_has_feature.h -+++ b/arch/powerpc/include/asm/cpu_has_feature.h -@@ -23,7 +23,9 @@ static __always_inline bool cpu_has_feature(unsigned long feature) - { - int i; - -+#ifndef __clang__ /* clang can't cope with this */ - BUILD_BUG_ON(!__builtin_constant_p(feature)); -+#endif - - #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG - if (!static_key_initialized) { -diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h -index e311c25..a244e09 100644 ---- a/arch/powerpc/include/asm/mmu.h -+++ b/arch/powerpc/include/asm/mmu.h -@@ -160,7 +160,9 @@ static __always_inline bool mmu_has_feature(unsigned long feature) - { - int i; - -+#ifndef __clang__ /* clang can't cope with this */ - BUILD_BUG_ON(!__builtin_constant_p(feature)); -+#endif - - #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG - if (!static_key_initialized) { -diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c -index 5c31369..a5dd493 100644 ---- a/arch/powerpc/kernel/eeh_driver.c -+++ b/arch/powerpc/kernel/eeh_driver.c -@@ -545,7 +545,7 @@ static void *eeh_pe_detach_dev(void *data, void *userdata) - static void *__eeh_clear_pe_frozen_state(void *data, void *flag) - { - struct eeh_pe *pe = (struct eeh_pe *)data; -- bool *clear_sw_state = flag; -+ bool clear_sw_state = *(bool *)flag; - int i, rc = 1; - - for (i = 0; rc && i < 3; i++) -diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c -index 88ac964..1e8c572 100644 ---- a/arch/powerpc/kernel/prom_init.c -+++ b/arch/powerpc/kernel/prom_init.c -@@ -2747,6 +2747,9 @@ static void __init prom_find_boot_cpu(void) - - cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); - -+ if (!PHANDLE_VALID(cpu_pkg)) -+ return; -+ - prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval)); - prom.cpu = be32_to_cpu(rval); - -diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c -index ebb7f46..9a25dce 100644 ---- a/arch/powerpc/mm/pgtable-radix.c -+++ b/arch/powerpc/mm/pgtable-radix.c -@@ -65,7 +65,7 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa, - if (!pmdp) - return -ENOMEM; - if (map_page_size == PMD_SIZE) { -- ptep = (pte_t *)pudp; -+ ptep = pmdp_ptep(pmdp); - goto set_the_pte; - } - ptep = pte_alloc_kernel(pmdp, ea); -@@ -90,7 +90,7 @@ int radix__map_kernel_page(unsigned long ea, unsigned long pa, - } - pmdp = pmd_offset(pudp, ea); - if (map_page_size == PMD_SIZE) { -- ptep = (pte_t *)pudp; -+ ptep = pmdp_ptep(pmdp); - goto set_the_pte; - } - if (!pmd_present(*pmdp)) { -diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c -index dbaaf7dc..19d646a 100644 ---- a/arch/x86/events/intel/uncore.c -+++ b/arch/x86/events/intel/uncore.c -@@ -763,30 +763,6 @@ static void uncore_pmu_unregister(struct intel_uncore_pmu *pmu) - pmu->registered = false; - } - --static void __uncore_exit_boxes(struct intel_uncore_type *type, int cpu) --{ -- struct intel_uncore_pmu *pmu = type->pmus; -- struct intel_uncore_box *box; -- int i, pkg; -- -- if (pmu) { -- pkg = topology_physical_package_id(cpu); -- for (i = 0; i < type->num_boxes; i++, pmu++) { -- box = pmu->boxes[pkg]; -- if (box) -- uncore_box_exit(box); -- } -- } --} -- --static void uncore_exit_boxes(void *dummy) --{ -- struct intel_uncore_type **types; -- -- for (types = uncore_msr_uncores; *types; types++) -- __uncore_exit_boxes(*types++, smp_processor_id()); --} -- - static void uncore_free_boxes(struct intel_uncore_pmu *pmu) - { - int pkg; -@@ -1077,22 +1053,12 @@ static int uncore_cpu_dying(unsigned int cpu) - return 0; - } - --static int first_init; -- - static int uncore_cpu_starting(unsigned int cpu) - { - struct intel_uncore_type *type, **types = uncore_msr_uncores; - struct intel_uncore_pmu *pmu; - struct intel_uncore_box *box; -- int i, pkg, ncpus = 1; -- -- if (first_init) { -- /* -- * On init we get the number of online cpus in the package -- * and set refcount for all of them. -- */ -- ncpus = cpumask_weight(topology_core_cpumask(cpu)); -- } -+ int i, pkg; - - pkg = topology_logical_package_id(cpu); - for (; *types; types++) { -@@ -1103,7 +1069,7 @@ static int uncore_cpu_starting(unsigned int cpu) - if (!box) - continue; - /* The first cpu on a package activates the box */ -- if (atomic_add_return(ncpus, &box->refcnt) == ncpus) -+ if (atomic_inc_return(&box->refcnt) == 1) - uncore_box_init(box); - } - } -@@ -1407,19 +1373,17 @@ static int __init intel_uncore_init(void) - "PERF_X86_UNCORE_PREP", - uncore_cpu_prepare, NULL); - } -- first_init = 1; -+ - cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_STARTING, - "AP_PERF_X86_UNCORE_STARTING", - uncore_cpu_starting, uncore_cpu_dying); -- first_init = 0; -+ - cpuhp_setup_state(CPUHP_AP_PERF_X86_UNCORE_ONLINE, - "AP_PERF_X86_UNCORE_ONLINE", - uncore_event_cpu_online, uncore_event_cpu_offline); - return 0; - - err: -- /* Undo box->init_box() */ -- on_each_cpu_mask(&uncore_cpu_mask, uncore_exit_boxes, NULL, 1); - uncore_types_exit(uncore_msr_uncores); - uncore_pci_exit(); - return ret; -diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c -index 3d8ff40..7249f15 100644 ---- a/arch/x86/kernel/apic/io_apic.c -+++ b/arch/x86/kernel/apic/io_apic.c -@@ -2118,6 +2118,7 @@ static inline void __init check_timer(void) - if (idx != -1 && irq_trigger(idx)) - unmask_ioapic_irq(irq_get_chip_data(0)); - } -+ irq_domain_deactivate_irq(irq_data); - irq_domain_activate_irq(irq_data); - if (timer_irq_works()) { - if (disable_timer_pin_1 > 0) -@@ -2139,6 +2140,7 @@ static inline void __init check_timer(void) - * legacy devices should be connected to IO APIC #0 - */ - replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2); -+ irq_domain_deactivate_irq(irq_data); - irq_domain_activate_irq(irq_data); - legacy_pic->unmask(0); - if (timer_irq_works()) { -diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c -index 274fab9..932348fb 100644 ---- a/arch/x86/kernel/hpet.c -+++ b/arch/x86/kernel/hpet.c -@@ -352,6 +352,7 @@ static int hpet_resume(struct clock_event_device *evt, int timer) - } else { - struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt); - -+ irq_domain_deactivate_irq(irq_get_irq_data(hdev->irq)); - irq_domain_activate_irq(irq_get_irq_data(hdev->irq)); - disable_irq(hdev->irq); - irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); -diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index 487b957..731044e 100644 ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -3148,6 +3148,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu) - memcpy(dest, xsave, XSAVE_HDR_OFFSET); - - /* Set XSTATE_BV */ -+ xstate_bv &= vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FPSSE; - *(u64 *)(dest + XSAVE_HDR_OFFSET) = xstate_bv; - - /* -diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c -index 319148b..2f25a36 100644 ---- a/arch/x86/platform/efi/efi_64.c -+++ b/arch/x86/platform/efi/efi_64.c -@@ -269,6 +269,22 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) - efi_scratch.use_pgd = true; - - /* -+ * Certain firmware versions are way too sentimential and still believe -+ * they are exclusive and unquestionable owners of the first physical page, -+ * even though they explicitly mark it as EFI_CONVENTIONAL_MEMORY -+ * (but then write-access it later during SetVirtualAddressMap()). -+ * -+ * Create a 1:1 mapping for this page, to avoid triple faults during early -+ * boot with such firmware. We are free to hand this page to the BIOS, -+ * as trim_bios_range() will reserve the first page and isolate it away -+ * from memory allocators anyway. -+ */ -+ if (kernel_map_pages_in_pgd(pgd, 0x0, 0x0, 1, _PAGE_RW)) { -+ pr_err("Failed to create 1:1 mapping for the first page!\n"); -+ return 1; -+ } -+ -+ /* - * When making calls to the firmware everything needs to be 1:1 - * mapped and addressable with 32-bit pointers. Map the kernel - * text and allocate a new stack because we can't rely on the -diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c -index 88a044a..32cdc2c 100644 ---- a/arch/xtensa/kernel/setup.c -+++ b/arch/xtensa/kernel/setup.c -@@ -540,7 +540,7 @@ subsys_initcall(topology_init); - - void cpu_reset(void) - { --#if XCHAL_HAVE_PTP_MMU -+#if XCHAL_HAVE_PTP_MMU && IS_ENABLED(CONFIG_MMU) - local_irq_disable(); - /* - * We have full MMU: all autoload ways, ways 7, 8 and 9 of DTLB must -diff --git a/crypto/algapi.c b/crypto/algapi.c -index df939b5..1fad2a6 100644 ---- a/crypto/algapi.c -+++ b/crypto/algapi.c -@@ -356,6 +356,7 @@ int crypto_register_alg(struct crypto_alg *alg) - struct crypto_larval *larval; - int err; - -+ alg->cra_flags &= ~CRYPTO_ALG_DEAD; - err = crypto_check_alg(alg); - if (err) - return err; -diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c -index 223a770..33e363d 100644 ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -1695,6 +1695,8 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, - - if (qc->err_mask & ~AC_ERR_OTHER) - qc->err_mask &= ~AC_ERR_OTHER; -+ } else if (qc->tf.command == ATA_CMD_REQ_SENSE_DATA) { -+ qc->result_tf.command |= ATA_SENSE; - } - - /* finish up */ -@@ -4316,10 +4318,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { - { "ST380013AS", "3.20", ATA_HORKAGE_MAX_SEC_1024 }, - - /* -- * Device times out with higher max sects. -+ * These devices time out with higher max sects. - * https://bugzilla.kernel.org/show_bug.cgi?id=121671 - */ -- { "LITEON CX1-JB256-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, -+ { "LITEON CX1-JB*-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, - - /* Devices we expect to fail diagnostics */ - -diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c -index 823e938..2f32782 100644 ---- a/drivers/ata/sata_mv.c -+++ b/drivers/ata/sata_mv.c -@@ -4132,6 +4132,9 @@ static int mv_platform_probe(struct platform_device *pdev) - host->iomap = NULL; - hpriv->base = devm_ioremap(&pdev->dev, res->start, - resource_size(res)); -+ if (!hpriv->base) -+ return -ENOMEM; -+ - hpriv->base -= SATAHC0_REG_BASE; - - hpriv->clk = clk_get(&pdev->dev, NULL); -diff --git a/drivers/base/memory.c b/drivers/base/memory.c -index e7f86a8..c5cdd19 100644 ---- a/drivers/base/memory.c -+++ b/drivers/base/memory.c -@@ -391,33 +391,33 @@ static ssize_t show_valid_zones(struct device *dev, - { - struct memory_block *mem = to_memory_block(dev); - unsigned long start_pfn, end_pfn; -+ unsigned long valid_start, valid_end, valid_pages; - unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; -- struct page *first_page; - struct zone *zone; - int zone_shift = 0; - - start_pfn = section_nr_to_pfn(mem->start_section_nr); - end_pfn = start_pfn + nr_pages; -- first_page = pfn_to_page(start_pfn); - - /* The block contains more than one zone can not be offlined. */ -- if (!test_pages_in_a_zone(start_pfn, end_pfn)) -+ if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) - return sprintf(buf, "none\n"); - -- zone = page_zone(first_page); -+ zone = page_zone(pfn_to_page(valid_start)); -+ valid_pages = valid_end - valid_start; - - /* MMOP_ONLINE_KEEP */ - sprintf(buf, "%s", zone->name); - - /* MMOP_ONLINE_KERNEL */ -- zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL, &zone_shift); -+ zone_can_shift(valid_start, valid_pages, ZONE_NORMAL, &zone_shift); - if (zone_shift) { - strcat(buf, " "); - strcat(buf, (zone + zone_shift)->name); - } - - /* MMOP_ONLINE_MOVABLE */ -- zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE, &zone_shift); -+ zone_can_shift(valid_start, valid_pages, ZONE_MOVABLE, &zone_shift); - if (zone_shift) { - strcat(buf, " "); - strcat(buf, (zone + zone_shift)->name); -diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h -index f642c42..168fa17 100644 ---- a/drivers/bcma/bcma_private.h -+++ b/drivers/bcma/bcma_private.h -@@ -45,6 +45,9 @@ int bcma_sprom_get(struct bcma_bus *bus); - void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc); - void bcma_core_chipcommon_init(struct bcma_drv_cc *cc); - void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); -+#ifdef CONFIG_BCMA_DRIVER_MIPS -+void bcma_chipco_serial_init(struct bcma_drv_cc *cc); -+#endif /* CONFIG_BCMA_DRIVER_MIPS */ - - /* driver_chipcommon_b.c */ - int bcma_core_chipcommon_b_init(struct bcma_drv_cc_b *ccb); -diff --git a/drivers/bcma/driver_chipcommon.c b/drivers/bcma/driver_chipcommon.c -index b4f6520..62f5bfa 100644 ---- a/drivers/bcma/driver_chipcommon.c -+++ b/drivers/bcma/driver_chipcommon.c -@@ -15,8 +15,6 @@ - #include <linux/platform_device.h> - #include <linux/bcma/bcma.h> - --static void bcma_chipco_serial_init(struct bcma_drv_cc *cc); -- - static inline u32 bcma_cc_write32_masked(struct bcma_drv_cc *cc, u16 offset, - u32 mask, u32 value) - { -@@ -186,9 +184,6 @@ void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc) - if (cc->capabilities & BCMA_CC_CAP_PMU) - bcma_pmu_early_init(cc); - -- if (IS_BUILTIN(CONFIG_BCM47XX) && bus->hosttype == BCMA_HOSTTYPE_SOC) -- bcma_chipco_serial_init(cc); -- - if (bus->hosttype == BCMA_HOSTTYPE_SOC) - bcma_core_chipcommon_flash_detect(cc); - -@@ -378,9 +373,9 @@ u32 bcma_chipco_gpio_pulldown(struct bcma_drv_cc *cc, u32 mask, u32 value) - return res; - } - --static void bcma_chipco_serial_init(struct bcma_drv_cc *cc) -+#ifdef CONFIG_BCMA_DRIVER_MIPS -+void bcma_chipco_serial_init(struct bcma_drv_cc *cc) - { --#if IS_BUILTIN(CONFIG_BCM47XX) - unsigned int irq; - u32 baud_base; - u32 i; -@@ -422,5 +417,5 @@ static void bcma_chipco_serial_init(struct bcma_drv_cc *cc) - ports[i].baud_base = baud_base; - ports[i].reg_shift = 0; - } --#endif /* CONFIG_BCM47XX */ - } -+#endif /* CONFIG_BCMA_DRIVER_MIPS */ -diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c -index 96f1713..89af807 100644 ---- a/drivers/bcma/driver_mips.c -+++ b/drivers/bcma/driver_mips.c -@@ -278,9 +278,12 @@ static void bcma_core_mips_nvram_init(struct bcma_drv_mips *mcore) - - void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) - { -+ struct bcma_bus *bus = mcore->core->bus; -+ - if (mcore->early_setup_done) - return; - -+ bcma_chipco_serial_init(&bus->drv_cc); - bcma_core_mips_nvram_init(mcore); - - mcore->early_setup_done = true; -diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c -index d5ba43a..55c1782 100644 ---- a/drivers/dma/cppi41.c -+++ b/drivers/dma/cppi41.c -@@ -153,6 +153,8 @@ struct cppi41_dd { - - /* context for suspend/resume */ - unsigned int dma_tdfdq; -+ -+ bool is_suspended; - }; - - #define FIST_COMPLETION_QUEUE 93 -@@ -257,6 +259,10 @@ static struct cppi41_channel *desc_to_chan(struct cppi41_dd *cdd, u32 desc) - BUG_ON(desc_num >= ALLOC_DECS_NUM); - c = cdd->chan_busy[desc_num]; - cdd->chan_busy[desc_num] = NULL; -+ -+ /* Usecount for chan_busy[], paired with push_desc_queue() */ -+ pm_runtime_put(cdd->ddev.dev); -+ - return c; - } - -@@ -447,6 +453,15 @@ static void push_desc_queue(struct cppi41_channel *c) - */ - __iowmb(); - -+ /* -+ * DMA transfers can take at least 200ms to complete with USB mass -+ * storage connected. To prevent autosuspend timeouts, we must use -+ * pm_runtime_get/put() when chan_busy[] is modified. This will get -+ * cleared in desc_to_chan() or cppi41_stop_chan() depending on the -+ * outcome of the transfer. -+ */ -+ pm_runtime_get(cdd->ddev.dev); -+ - desc_phys = lower_32_bits(c->desc_phys); - desc_num = (desc_phys - cdd->descs_phys) / sizeof(struct cppi41_desc); - WARN_ON(cdd->chan_busy[desc_num]); -@@ -457,20 +472,26 @@ static void push_desc_queue(struct cppi41_channel *c) - cppi_writel(reg, cdd->qmgr_mem + QMGR_QUEUE_D(c->q_num)); - } - --static void pending_desc(struct cppi41_channel *c) -+/* -+ * Caller must hold cdd->lock to prevent push_desc_queue() -+ * getting called out of order. We have both cppi41_dma_issue_pending() -+ * and cppi41_runtime_resume() call this function. -+ */ -+static void cppi41_run_queue(struct cppi41_dd *cdd) - { -- struct cppi41_dd *cdd = c->cdd; -- unsigned long flags; -+ struct cppi41_channel *c, *_c; - -- spin_lock_irqsave(&cdd->lock, flags); -- list_add_tail(&c->node, &cdd->pending); -- spin_unlock_irqrestore(&cdd->lock, flags); -+ list_for_each_entry_safe(c, _c, &cdd->pending, node) { -+ push_desc_queue(c); -+ list_del(&c->node); -+ } - } - - static void cppi41_dma_issue_pending(struct dma_chan *chan) - { - struct cppi41_channel *c = to_cpp41_chan(chan); - struct cppi41_dd *cdd = c->cdd; -+ unsigned long flags; - int error; - - error = pm_runtime_get(cdd->ddev.dev); -@@ -482,10 +503,11 @@ static void cppi41_dma_issue_pending(struct dma_chan *chan) - return; - } - -- if (likely(pm_runtime_active(cdd->ddev.dev))) -- push_desc_queue(c); -- else -- pending_desc(c); -+ spin_lock_irqsave(&cdd->lock, flags); -+ list_add_tail(&c->node, &cdd->pending); -+ if (!cdd->is_suspended) -+ cppi41_run_queue(cdd); -+ spin_unlock_irqrestore(&cdd->lock, flags); - - pm_runtime_mark_last_busy(cdd->ddev.dev); - pm_runtime_put_autosuspend(cdd->ddev.dev); -@@ -705,6 +727,9 @@ static int cppi41_stop_chan(struct dma_chan *chan) - WARN_ON(!cdd->chan_busy[desc_num]); - cdd->chan_busy[desc_num] = NULL; - -+ /* Usecount for chan_busy[], paired with push_desc_queue() */ -+ pm_runtime_put(cdd->ddev.dev); -+ - return 0; - } - -@@ -1150,8 +1175,12 @@ static int __maybe_unused cppi41_resume(struct device *dev) - static int __maybe_unused cppi41_runtime_suspend(struct device *dev) - { - struct cppi41_dd *cdd = dev_get_drvdata(dev); -+ unsigned long flags; - -+ spin_lock_irqsave(&cdd->lock, flags); -+ cdd->is_suspended = true; - WARN_ON(!list_empty(&cdd->pending)); -+ spin_unlock_irqrestore(&cdd->lock, flags); - - return 0; - } -@@ -1159,14 +1188,11 @@ static int __maybe_unused cppi41_runtime_suspend(struct device *dev) - static int __maybe_unused cppi41_runtime_resume(struct device *dev) - { - struct cppi41_dd *cdd = dev_get_drvdata(dev); -- struct cppi41_channel *c, *_c; - unsigned long flags; - - spin_lock_irqsave(&cdd->lock, flags); -- list_for_each_entry_safe(c, _c, &cdd->pending, node) { -- push_desc_queue(c); -- list_del(&c->node); -- } -+ cdd->is_suspended = false; -+ cppi41_run_queue(cdd); - spin_unlock_irqrestore(&cdd->lock, flags); - - return 0; -diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c -index 921dfa0..260c4b4 100644 ---- a/drivers/firmware/efi/libstub/fdt.c -+++ b/drivers/firmware/efi/libstub/fdt.c -@@ -187,6 +187,7 @@ static efi_status_t update_fdt_memmap(void *fdt, struct efi_boot_memmap *map) - struct exit_boot_struct { - efi_memory_desc_t *runtime_map; - int *runtime_entry_count; -+ void *new_fdt_addr; - }; - - static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg, -@@ -202,7 +203,7 @@ static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg, - efi_get_virtmap(*map->map, *map->map_size, *map->desc_size, - p->runtime_map, p->runtime_entry_count); - -- return EFI_SUCCESS; -+ return update_fdt_memmap(p->new_fdt_addr, map); - } - - /* -@@ -300,22 +301,13 @@ efi_status_t allocate_new_fdt_and_exit_boot(efi_system_table_t *sys_table, - - priv.runtime_map = runtime_map; - priv.runtime_entry_count = &runtime_entry_count; -+ priv.new_fdt_addr = (void *)*new_fdt_addr; - status = efi_exit_boot_services(sys_table, handle, &map, &priv, - exit_boot_func); - - if (status == EFI_SUCCESS) { - efi_set_virtual_address_map_t *svam; - -- status = update_fdt_memmap((void *)*new_fdt_addr, &map); -- if (status != EFI_SUCCESS) { -- /* -- * The kernel won't get far without the memory map, but -- * may still be able to print something meaningful so -- * return success here. -- */ -- return EFI_SUCCESS; -- } -- - /* Install the new virtual address map */ - svam = sys_table->runtime->set_virtual_address_map; - status = svam(runtime_entry_count * desc_size, desc_size, -diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c -index b13c8aa..6df924f 100644 ---- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c -@@ -227,6 +227,9 @@ static void gmc_v6_0_mc_program(struct amdgpu_device *adev) - } - WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); - -+ if (adev->mode_info.num_crtc) -+ amdgpu_display_set_vga_render_state(adev, false); -+ - gmc_v6_0_mc_stop(adev, &save); - - if (gmc_v6_0_wait_for_idle((void *)adev)) { -@@ -256,7 +259,6 @@ static void gmc_v6_0_mc_program(struct amdgpu_device *adev) - dev_warn(adev->dev, "Wait for MC idle timedout !\n"); - } - gmc_v6_0_mc_resume(adev, &save); -- amdgpu_display_set_vga_render_state(adev, false); - } - - static int gmc_v6_0_mc_init(struct amdgpu_device *adev) -diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c -index 67db157..4147e51 100644 ---- a/drivers/gpu/drm/i915/intel_lrc.c -+++ b/drivers/gpu/drm/i915/intel_lrc.c -@@ -2152,30 +2152,42 @@ static int execlists_context_deferred_alloc(struct i915_gem_context *ctx, - - void intel_lr_context_resume(struct drm_i915_private *dev_priv) - { -- struct i915_gem_context *ctx = dev_priv->kernel_context; - struct intel_engine_cs *engine; -+ struct i915_gem_context *ctx; -+ -+ /* Because we emit WA_TAIL_DWORDS there may be a disparity -+ * between our bookkeeping in ce->ring->head and ce->ring->tail and -+ * that stored in context. As we only write new commands from -+ * ce->ring->tail onwards, everything before that is junk. If the GPU -+ * starts reading from its RING_HEAD from the context, it may try to -+ * execute that junk and die. -+ * -+ * So to avoid that we reset the context images upon resume. For -+ * simplicity, we just zero everything out. -+ */ -+ list_for_each_entry(ctx, &dev_priv->context_list, link) { -+ for_each_engine(engine, dev_priv) { -+ struct intel_context *ce = &ctx->engine[engine->id]; -+ u32 *reg; - -- for_each_engine(engine, dev_priv) { -- struct intel_context *ce = &ctx->engine[engine->id]; -- void *vaddr; -- uint32_t *reg_state; -- -- if (!ce->state) -- continue; -- -- vaddr = i915_gem_object_pin_map(ce->state->obj, I915_MAP_WB); -- if (WARN_ON(IS_ERR(vaddr))) -- continue; -+ if (!ce->state) -+ continue; - -- reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE; -+ reg = i915_gem_object_pin_map(ce->state->obj, -+ I915_MAP_WB); -+ if (WARN_ON(IS_ERR(reg))) -+ continue; - -- reg_state[CTX_RING_HEAD+1] = 0; -- reg_state[CTX_RING_TAIL+1] = 0; -+ reg += LRC_STATE_PN * PAGE_SIZE / sizeof(*reg); -+ reg[CTX_RING_HEAD+1] = 0; -+ reg[CTX_RING_TAIL+1] = 0; - -- ce->state->obj->dirty = true; -- i915_gem_object_unpin_map(ce->state->obj); -+ ce->state->obj->dirty = true; -+ i915_gem_object_unpin_map(ce->state->obj); - -- ce->ring->head = 0; -- ce->ring->tail = 0; -+ ce->ring->head = ce->ring->tail = 0; -+ ce->ring->last_retired_head = -1; -+ intel_ring_update_space(ce->ring); -+ } - } - } -diff --git a/drivers/gpu/drm/nouveau/dispnv04/hw.c b/drivers/gpu/drm/nouveau/dispnv04/hw.c -index 74856a8..e64f524 100644 ---- a/drivers/gpu/drm/nouveau/dispnv04/hw.c -+++ b/drivers/gpu/drm/nouveau/dispnv04/hw.c -@@ -222,6 +222,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) - uint32_t mpllP; - - pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); -+ mpllP = (mpllP >> 8) & 0xf; - if (!mpllP) - mpllP = 4; - -@@ -232,7 +233,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) - uint32_t clock; - - pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); -- return clock; -+ return clock / 1000; - } - - ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals); -diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c -index 6f0436d..f8f2f16 100644 ---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c -+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c -@@ -59,7 +59,7 @@ gt215_hda_eld(NV50_DISP_MTHD_V1) - ); - } - for (i = 0; i < size; i++) -- nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[0]); -+ nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[i]); - for (; i < 0x60; i++) - nvkm_wr32(device, 0x61c440 + soff, (i << 8)); - nvkm_mask(device, 0x61c448 + soff, 0x80000003, 0x80000003); -diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c -index 60d3020..e06c134 100644 ---- a/drivers/hid/hid-cp2112.c -+++ b/drivers/hid/hid-cp2112.c -@@ -167,7 +167,7 @@ struct cp2112_device { - atomic_t xfer_avail; - struct gpio_chip gc; - u8 *in_out_buffer; -- spinlock_t lock; -+ struct mutex lock; - }; - - static int gpio_push_pull = 0xFF; -@@ -179,10 +179,9 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) - struct cp2112_device *dev = gpiochip_get_data(chip); - struct hid_device *hdev = dev->hdev; - u8 *buf = dev->in_out_buffer; -- unsigned long flags; - int ret; - -- spin_lock_irqsave(&dev->lock, flags); -+ mutex_lock(&dev->lock); - - ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, - CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, -@@ -206,8 +205,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) - ret = 0; - - exit: -- spin_unlock_irqrestore(&dev->lock, flags); -- return ret <= 0 ? ret : -EIO; -+ mutex_unlock(&dev->lock); -+ return ret < 0 ? ret : -EIO; - } - - static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) -@@ -215,10 +214,9 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) - struct cp2112_device *dev = gpiochip_get_data(chip); - struct hid_device *hdev = dev->hdev; - u8 *buf = dev->in_out_buffer; -- unsigned long flags; - int ret; - -- spin_lock_irqsave(&dev->lock, flags); -+ mutex_lock(&dev->lock); - - buf[0] = CP2112_GPIO_SET; - buf[1] = value ? 0xff : 0; -@@ -230,7 +228,7 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) - if (ret < 0) - hid_err(hdev, "error setting GPIO values: %d\n", ret); - -- spin_unlock_irqrestore(&dev->lock, flags); -+ mutex_unlock(&dev->lock); - } - - static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset) -@@ -238,10 +236,9 @@ static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset) - struct cp2112_device *dev = gpiochip_get_data(chip); - struct hid_device *hdev = dev->hdev; - u8 *buf = dev->in_out_buffer; -- unsigned long flags; - int ret; - -- spin_lock_irqsave(&dev->lock, flags); -+ mutex_lock(&dev->lock); - - ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf, - CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT, -@@ -255,7 +252,7 @@ static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset) - ret = (buf[1] >> offset) & 1; - - exit: -- spin_unlock_irqrestore(&dev->lock, flags); -+ mutex_unlock(&dev->lock); - - return ret; - } -@@ -266,10 +263,9 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, - struct cp2112_device *dev = gpiochip_get_data(chip); - struct hid_device *hdev = dev->hdev; - u8 *buf = dev->in_out_buffer; -- unsigned long flags; - int ret; - -- spin_lock_irqsave(&dev->lock, flags); -+ mutex_lock(&dev->lock); - - ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, - CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, -@@ -290,7 +286,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, - goto fail; - } - -- spin_unlock_irqrestore(&dev->lock, flags); -+ mutex_unlock(&dev->lock); - - /* - * Set gpio value when output direction is already set, -@@ -301,7 +297,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, - return 0; - - fail: -- spin_unlock_irqrestore(&dev->lock, flags); -+ mutex_unlock(&dev->lock); - return ret < 0 ? ret : -EIO; - } - -@@ -1057,7 +1053,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) - if (!dev->in_out_buffer) - return -ENOMEM; - -- spin_lock_init(&dev->lock); -+ mutex_init(&dev->lock); - - ret = hid_parse(hdev); - if (ret) { -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index 575aa65..9845189 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -76,6 +76,9 @@ - #define USB_VENDOR_ID_ALPS_JP 0x044E - #define HID_DEVICE_ID_ALPS_U1_DUAL 0x120B - -+#define USB_VENDOR_ID_AMI 0x046b -+#define USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE 0xff10 -+ - #define USB_VENDOR_ID_ANTON 0x1130 - #define USB_DEVICE_ID_ANTON_TOUCH_PAD 0x3101 - -diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c -index c5c5fbe..52026dc 100644 ---- a/drivers/hid/hid-lg.c -+++ b/drivers/hid/hid-lg.c -@@ -872,7 +872,7 @@ static const struct hid_device_id lg_devices[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG), - .driver_data = LG_NOGET | LG_FF4 }, - { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), -- .driver_data = LG_FF2 }, -+ .driver_data = LG_NOGET | LG_FF2 }, - { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940), - .driver_data = LG_FF3 }, - { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR), -diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c -index e6cfd32..cde060f 100644 ---- a/drivers/hid/usbhid/hid-quirks.c -+++ b/drivers/hid/usbhid/hid-quirks.c -@@ -57,6 +57,7 @@ static const struct hid_blacklist { - { USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_AKAI, USB_DEVICE_ID_AKAI_MPKMINI2, HID_QUIRK_NO_INIT_REPORTS }, - { USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX, HID_QUIRK_NO_INIT_REPORTS }, -+ { USB_VENDOR_ID_AMI, USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE, HID_QUIRK_ALWAYS_POLL }, - { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, -diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c -index 1cb7992..623be90 100644 ---- a/drivers/hid/wacom_wac.c -+++ b/drivers/hid/wacom_wac.c -@@ -164,19 +164,21 @@ static int wacom_pl_irq(struct wacom_wac *wacom) - wacom->id[0] = STYLUS_DEVICE_ID; - } - -- pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); -- if (features->pressure_max > 255) -- pressure = (pressure << 1) | ((data[4] >> 6) & 1); -- pressure += (features->pressure_max + 1) / 2; -- -- input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); -- input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); -- input_report_abs(input, ABS_PRESSURE, pressure); -- -- input_report_key(input, BTN_TOUCH, data[4] & 0x08); -- input_report_key(input, BTN_STYLUS, data[4] & 0x10); -- /* Only allow the stylus2 button to be reported for the pen tool. */ -- input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); -+ if (prox) { -+ pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); -+ if (features->pressure_max > 255) -+ pressure = (pressure << 1) | ((data[4] >> 6) & 1); -+ pressure += (features->pressure_max + 1) / 2; -+ -+ input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); -+ input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); -+ input_report_abs(input, ABS_PRESSURE, pressure); -+ -+ input_report_key(input, BTN_TOUCH, data[4] & 0x08); -+ input_report_key(input, BTN_STYLUS, data[4] & 0x10); -+ /* Only allow the stylus2 button to be reported for the pen tool. */ -+ input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); -+ } - - if (!prox) - wacom->id[0] = 0; -diff --git a/drivers/iio/adc/palmas_gpadc.c b/drivers/iio/adc/palmas_gpadc.c -index 2bbf0c5..7d61b56 100644 ---- a/drivers/iio/adc/palmas_gpadc.c -+++ b/drivers/iio/adc/palmas_gpadc.c -@@ -775,7 +775,7 @@ static int palmas_adc_wakeup_reset(struct palmas_gpadc *adc) - - static int palmas_gpadc_suspend(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct palmas_gpadc *adc = iio_priv(indio_dev); - int wakeup = adc->wakeup1_enable || adc->wakeup2_enable; - int ret; -@@ -798,7 +798,7 @@ static int palmas_gpadc_suspend(struct device *dev) - - static int palmas_gpadc_resume(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct palmas_gpadc *adc = iio_priv(indio_dev); - int wakeup = adc->wakeup1_enable || adc->wakeup2_enable; - int ret; -diff --git a/drivers/iio/health/afe4403.c b/drivers/iio/health/afe4403.c -index 9a08146..6bb23a4 100644 ---- a/drivers/iio/health/afe4403.c -+++ b/drivers/iio/health/afe4403.c -@@ -422,7 +422,7 @@ MODULE_DEVICE_TABLE(of, afe4403_of_match); - - static int __maybe_unused afe4403_suspend(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = spi_get_drvdata(to_spi_device(dev)); - struct afe4403_data *afe = iio_priv(indio_dev); - int ret; - -@@ -443,7 +443,7 @@ static int __maybe_unused afe4403_suspend(struct device *dev) - - static int __maybe_unused afe4403_resume(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = spi_get_drvdata(to_spi_device(dev)); - struct afe4403_data *afe = iio_priv(indio_dev); - int ret; - -diff --git a/drivers/iio/health/afe4404.c b/drivers/iio/health/afe4404.c -index 4526640..964f523 100644 ---- a/drivers/iio/health/afe4404.c -+++ b/drivers/iio/health/afe4404.c -@@ -428,7 +428,7 @@ MODULE_DEVICE_TABLE(of, afe4404_of_match); - - static int __maybe_unused afe4404_suspend(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); - struct afe4404_data *afe = iio_priv(indio_dev); - int ret; - -@@ -449,7 +449,7 @@ static int __maybe_unused afe4404_suspend(struct device *dev) - - static int __maybe_unused afe4404_resume(struct device *dev) - { -- struct iio_dev *indio_dev = dev_to_iio_dev(dev); -+ struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); - struct afe4404_data *afe = iio_priv(indio_dev); - int ret; - -diff --git a/drivers/iio/health/max30100.c b/drivers/iio/health/max30100.c -index 90ab8a2d..183c143 100644 ---- a/drivers/iio/health/max30100.c -+++ b/drivers/iio/health/max30100.c -@@ -238,7 +238,7 @@ static irqreturn_t max30100_interrupt_handler(int irq, void *private) - - mutex_lock(&data->lock); - -- while (cnt || (cnt = max30100_fifo_count(data) > 0)) { -+ while (cnt || (cnt = max30100_fifo_count(data)) > 0) { - ret = max30100_read_measurement(data); - if (ret) - break; -diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c -index 9c47bc9..2a22ad9 100644 ---- a/drivers/iio/humidity/dht11.c -+++ b/drivers/iio/humidity/dht11.c -@@ -71,7 +71,8 @@ - * a) select an implementation using busy loop polling on those systems - * b) use the checksum to do some probabilistic decoding - */ --#define DHT11_START_TRANSMISSION 18 /* ms */ -+#define DHT11_START_TRANSMISSION_MIN 18000 /* us */ -+#define DHT11_START_TRANSMISSION_MAX 20000 /* us */ - #define DHT11_MIN_TIMERES 34000 /* ns */ - #define DHT11_THRESHOLD 49000 /* ns */ - #define DHT11_AMBIG_LOW 23000 /* ns */ -@@ -228,7 +229,8 @@ static int dht11_read_raw(struct iio_dev *iio_dev, - ret = gpio_direction_output(dht11->gpio, 0); - if (ret) - goto err; -- msleep(DHT11_START_TRANSMISSION); -+ usleep_range(DHT11_START_TRANSMISSION_MIN, -+ DHT11_START_TRANSMISSION_MAX); - ret = gpio_direction_input(dht11->gpio); - if (ret) - goto err; -diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c -index bb0fde6..cc2243f 100644 ---- a/drivers/infiniband/hw/cxgb4/qp.c -+++ b/drivers/infiniband/hw/cxgb4/qp.c -@@ -321,7 +321,8 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq, - FW_RI_RES_WR_DCAEN_V(0) | - FW_RI_RES_WR_DCACPU_V(0) | - FW_RI_RES_WR_FBMIN_V(2) | -- FW_RI_RES_WR_FBMAX_V(2) | -+ (t4_sq_onchip(&wq->sq) ? FW_RI_RES_WR_FBMAX_V(2) : -+ FW_RI_RES_WR_FBMAX_V(3)) | - FW_RI_RES_WR_CIDXFTHRESHO_V(0) | - FW_RI_RES_WR_CIDXFTHRESH_V(0) | - FW_RI_RES_WR_EQSIZE_V(eqsize)); -@@ -345,7 +346,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq, - FW_RI_RES_WR_DCAEN_V(0) | - FW_RI_RES_WR_DCACPU_V(0) | - FW_RI_RES_WR_FBMIN_V(2) | -- FW_RI_RES_WR_FBMAX_V(2) | -+ FW_RI_RES_WR_FBMAX_V(3) | - FW_RI_RES_WR_CIDXFTHRESHO_V(0) | - FW_RI_RES_WR_CIDXFTHRESH_V(0) | - FW_RI_RES_WR_EQSIZE_V(eqsize)); -diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c -index e1e274a..ba637ff 100644 ---- a/drivers/mmc/host/sdhci.c -+++ b/drivers/mmc/host/sdhci.c -@@ -2719,7 +2719,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) - if (intmask & SDHCI_INT_RETUNE) - mmc_retune_needed(host->mmc); - -- if (intmask & SDHCI_INT_CARD_INT) { -+ if ((intmask & SDHCI_INT_CARD_INT) && -+ (host->ier & SDHCI_INT_CARD_INT)) { - sdhci_enable_sdio_irq_nolock(host, false); - host->thread_isr |= SDHCI_INT_CARD_INT; - result = IRQ_WAKE_THREAD; -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-8000.c b/drivers/net/wireless/intel/iwlwifi/iwl-8000.c -index d02ca14..8d3e53f 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-8000.c -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-8000.c -@@ -91,7 +91,7 @@ - - #define IWL8000_FW_PRE "iwlwifi-8000C-" - #define IWL8000_MODULE_FIRMWARE(api) \ -- IWL8000_FW_PRE "-" __stringify(api) ".ucode" -+ IWL8000_FW_PRE __stringify(api) ".ucode" - - #define IWL8265_FW_PRE "iwlwifi-8265-" - #define IWL8265_MODULE_FIRMWARE(api) \ -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c -index fc77188..52de3c6 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c -@@ -1144,9 +1144,10 @@ static void iwl_mvm_realloc_queues_after_restart(struct iwl_mvm *mvm, - .frame_limit = IWL_FRAME_LIMIT, - }; - -- /* Make sure reserved queue is still marked as such (or allocated) */ -- mvm->queue_info[mvm_sta->reserved_queue].status = -- IWL_MVM_QUEUE_RESERVED; -+ /* Make sure reserved queue is still marked as such (if allocated) */ -+ if (mvm_sta->reserved_queue != IEEE80211_INVAL_HW_QUEUE) -+ mvm->queue_info[mvm_sta->reserved_queue].status = -+ IWL_MVM_QUEUE_RESERVED; - - for (i = 0; i <= IWL_MAX_TID_COUNT; i++) { - struct iwl_mvm_tid_data *tid_data = &mvm_sta->tid_data[i]; -diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c -index 0ec649d..b0916b1 100644 ---- a/drivers/pci/pcie/aspm.c -+++ b/drivers/pci/pcie/aspm.c -@@ -518,25 +518,32 @@ static struct pcie_link_state *alloc_pcie_link_state(struct pci_dev *pdev) - link = kzalloc(sizeof(*link), GFP_KERNEL); - if (!link) - return NULL; -+ - INIT_LIST_HEAD(&link->sibling); - INIT_LIST_HEAD(&link->children); - INIT_LIST_HEAD(&link->link); - link->pdev = pdev; -- if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) { -+ -+ /* -+ * Root Ports and PCI/PCI-X to PCIe Bridges are roots of PCIe -+ * hierarchies. -+ */ -+ if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT || -+ pci_pcie_type(pdev) == PCI_EXP_TYPE_PCIE_BRIDGE) { -+ link->root = link; -+ } else { - struct pcie_link_state *parent; -+ - parent = pdev->bus->parent->self->link_state; - if (!parent) { - kfree(link); - return NULL; - } -+ - link->parent = parent; -+ link->root = link->parent->root; - list_add(&link->link, &parent->children); - } -- /* Setup a pointer to the root port link */ -- if (!link->parent) -- link->root = link; -- else -- link->root = link->parent->root; - - list_add(&link->sibling, &link_list); - pdev->link_state = link; -diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c -index 0790153..583ae3f 100644 ---- a/drivers/pinctrl/intel/pinctrl-baytrail.c -+++ b/drivers/pinctrl/intel/pinctrl-baytrail.c -@@ -731,16 +731,23 @@ static void __iomem *byt_gpio_reg(struct byt_gpio *vg, unsigned int offset, - int reg) - { - struct byt_community *comm = byt_get_community(vg, offset); -- u32 reg_offset = 0; -+ u32 reg_offset; - - if (!comm) - return NULL; - - offset -= comm->pin_base; -- if (reg == BYT_INT_STAT_REG) -+ switch (reg) { -+ case BYT_INT_STAT_REG: - reg_offset = (offset / 32) * 4; -- else -+ break; -+ case BYT_DEBOUNCE_REG: -+ reg_offset = 0; -+ break; -+ default: - reg_offset = comm->pad_map[offset] * 16; -+ break; -+ } - - return comm->reg_base + reg_offset + reg; - } -@@ -1612,7 +1619,9 @@ static void byt_gpio_irq_handler(struct irq_desc *desc) - continue; - } - -+ raw_spin_lock(&vg->lock); - pending = readl(reg); -+ raw_spin_unlock(&vg->lock); - for_each_set_bit(pin, &pending, 32) { - virq = irq_find_mapping(vg->chip.irqdomain, base + pin); - generic_handle_irq(virq); -diff --git a/drivers/pinctrl/intel/pinctrl-merrifield.c b/drivers/pinctrl/intel/pinctrl-merrifield.c -index 7826c7f..9931be6 100644 ---- a/drivers/pinctrl/intel/pinctrl-merrifield.c -+++ b/drivers/pinctrl/intel/pinctrl-merrifield.c -@@ -794,6 +794,9 @@ static int mrfld_config_set(struct pinctrl_dev *pctldev, unsigned int pin, - unsigned int i; - int ret; - -+ if (!mrfld_buf_available(mp, pin)) -+ return -ENOTSUPP; -+ - for (i = 0; i < nconfigs; i++) { - switch (pinconf_to_config_param(configs[i])) { - case PIN_CONFIG_BIAS_DISABLE: -diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c -index e6a512e..a3ade9e 100644 ---- a/drivers/regulator/axp20x-regulator.c -+++ b/drivers/regulator/axp20x-regulator.c -@@ -272,7 +272,7 @@ static const struct regulator_desc axp806_regulators[] = { - 64, AXP806_DCDCD_V_CTRL, 0x3f, AXP806_PWR_OUT_CTRL1, - BIT(3)), - AXP_DESC(AXP806, DCDCE, "dcdce", "vine", 1100, 3400, 100, -- AXP806_DCDCB_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(4)), -+ AXP806_DCDCE_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(4)), - AXP_DESC(AXP806, ALDO1, "aldo1", "aldoin", 700, 3300, 100, - AXP806_ALDO1_V_CTRL, 0x1f, AXP806_PWR_OUT_CTRL1, BIT(5)), - AXP_DESC(AXP806, ALDO2, "aldo2", "aldoin", 700, 3400, 100, -diff --git a/drivers/staging/greybus/timesync_platform.c b/drivers/staging/greybus/timesync_platform.c -index 113f3d6..27f75b1 100644 ---- a/drivers/staging/greybus/timesync_platform.c -+++ b/drivers/staging/greybus/timesync_platform.c -@@ -45,12 +45,18 @@ u32 gb_timesync_platform_get_clock_rate(void) - - int gb_timesync_platform_lock_bus(struct gb_timesync_svc *pdata) - { -+ if (!arche_platform_change_state_cb) -+ return 0; -+ - return arche_platform_change_state_cb(ARCHE_PLATFORM_STATE_TIME_SYNC, - pdata); - } - - void gb_timesync_platform_unlock_bus(void) - { -+ if (!arche_platform_change_state_cb) -+ return; -+ - arche_platform_change_state_cb(ARCHE_PLATFORM_STATE_ACTIVE, NULL); - } - -diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c -index d2e50a2..24f9f98 100644 ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -37,6 +37,10 @@ static const struct usb_device_id usb_quirk_list[] = { - /* CBM - Flash disk */ - { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, - -+ /* WORLDE easy key (easykey.25) MIDI controller */ -+ { USB_DEVICE(0x0218, 0x0401), .driver_info = -+ USB_QUIRK_CONFIG_INTF_STRINGS }, -+ - /* HP 5300/5370C scanner */ - { USB_DEVICE(0x03f0, 0x0701), .driver_info = - USB_QUIRK_STRING_FETCH_255 }, -diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c -index 17989b7..8d412d8 100644 ---- a/drivers/usb/gadget/function/f_fs.c -+++ b/drivers/usb/gadget/function/f_fs.c -@@ -2269,6 +2269,8 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, - if (len < sizeof(*d) || h->interface >= ffs->interfaces_count) - return -EINVAL; - length = le32_to_cpu(d->dwSize); -+ if (len < length) -+ return -EINVAL; - type = le32_to_cpu(d->dwPropertyDataType); - if (type < USB_EXT_PROP_UNICODE || - type > USB_EXT_PROP_UNICODE_MULTI) { -@@ -2277,6 +2279,11 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, - return -EINVAL; - } - pnl = le16_to_cpu(d->wPropertyNameLength); -+ if (length < 14 + pnl) { -+ pr_vdebug("invalid os descriptor length: %d pnl:%d (descriptor %d)\n", -+ length, pnl, type); -+ return -EINVAL; -+ } - pdl = le32_to_cpu(*(u32 *)((u8 *)data + 10 + pnl)); - if (length != 14 + pnl + pdl) { - pr_vdebug("invalid os descriptor length: %d pnl:%d pdl:%d (descriptor %d)\n", -@@ -2363,6 +2370,9 @@ static int __ffs_data_got_descs(struct ffs_data *ffs, - } - } - if (flags & (1 << i)) { -+ if (len < 4) { -+ goto error; -+ } - os_descs_count = get_unaligned_le32(data); - data += 4; - len -= 4; -@@ -2435,7 +2445,8 @@ static int __ffs_data_got_strings(struct ffs_data *ffs, - - ENTER(); - -- if (unlikely(get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || -+ if (unlikely(len < 16 || -+ get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || - get_unaligned_le32(data + 4) != len)) - goto error; - str_count = get_unaligned_le32(data + 8); -diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c -index c3e172e..338575f 100644 ---- a/drivers/usb/musb/musb_core.c -+++ b/drivers/usb/musb/musb_core.c -@@ -578,11 +578,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, - | MUSB_PORT_STAT_RESUME; - musb->rh_timer = jiffies - + msecs_to_jiffies(USB_RESUME_TIMEOUT); -- musb->need_finish_resume = 1; -- - musb->xceiv->otg->state = OTG_STATE_A_HOST; - musb->is_active = 1; - musb_host_resume_root_hub(musb); -+ schedule_delayed_work(&musb->finish_resume_work, -+ msecs_to_jiffies(USB_RESUME_TIMEOUT)); - break; - case OTG_STATE_B_WAIT_ACON: - musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL; -@@ -2691,11 +2691,6 @@ static int musb_resume(struct device *dev) - mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV; - if ((devctl & mask) != (musb->context.devctl & mask)) - musb->port1_status = 0; -- if (musb->need_finish_resume) { -- musb->need_finish_resume = 0; -- schedule_delayed_work(&musb->finish_resume_work, -- msecs_to_jiffies(USB_RESUME_TIMEOUT)); -- } - - /* - * The USB HUB code expects the device to be in RPM_ACTIVE once it came -@@ -2747,12 +2742,6 @@ static int musb_runtime_resume(struct device *dev) - - musb_restore_context(musb); - -- if (musb->need_finish_resume) { -- musb->need_finish_resume = 0; -- schedule_delayed_work(&musb->finish_resume_work, -- msecs_to_jiffies(USB_RESUME_TIMEOUT)); -- } -- - spin_lock_irqsave(&musb->lock, flags); - error = musb_run_resume_work(musb); - if (error) -diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h -index 47331db..854fbf7 100644 ---- a/drivers/usb/musb/musb_core.h -+++ b/drivers/usb/musb/musb_core.h -@@ -410,7 +410,6 @@ struct musb { - - /* is_suspended means USB B_PERIPHERAL suspend */ - unsigned is_suspended:1; -- unsigned need_finish_resume :1; - - /* may_wakeup means remote wakeup is enabled */ - unsigned may_wakeup:1; -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index 7ce31a4..42cc72e 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -2007,6 +2007,7 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_6802, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x421d, 0xff, 0xff, 0xff) }, /* HP lt2523 (Novatel E371) */ - { } /* Terminating entry */ - }; - MODULE_DEVICE_TABLE(usb, option_ids); -diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c -index 46fca6b..1db4b61 100644 ---- a/drivers/usb/serial/pl2303.c -+++ b/drivers/usb/serial/pl2303.c -@@ -49,6 +49,7 @@ static const struct usb_device_id id_table[] = { - { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, - { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, - { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, -+ { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) }, - { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) }, - { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) }, - { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) }, -diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h -index e3b7af8..09d9be8 100644 ---- a/drivers/usb/serial/pl2303.h -+++ b/drivers/usb/serial/pl2303.h -@@ -27,6 +27,7 @@ - #define ATEN_VENDOR_ID 0x0557 - #define ATEN_VENDOR_ID2 0x0547 - #define ATEN_PRODUCT_ID 0x2008 -+#define ATEN_PRODUCT_ID2 0x2118 - - #define IODATA_VENDOR_ID 0x04bb - #define IODATA_PRODUCT_ID 0x0a03 -diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c -index 1bc6089..696458d 100644 ---- a/drivers/usb/serial/qcserial.c -+++ b/drivers/usb/serial/qcserial.c -@@ -124,6 +124,7 @@ static const struct usb_device_id id_table[] = { - {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */ - {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */ - {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ -+ {USB_DEVICE(0x413c, 0x81a6)}, /* Dell DW5570 QDL (MC8805) */ - {USB_DEVICE(0x1199, 0x68a4)}, /* Sierra Wireless QDL */ - {USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */ - {USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */ -diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c -index c6f2d89..64613fb 100644 ---- a/drivers/vhost/vhost.c -+++ b/drivers/vhost/vhost.c -@@ -130,14 +130,14 @@ static long vhost_get_vring_endian(struct vhost_virtqueue *vq, u32 idx, - - static void vhost_init_is_le(struct vhost_virtqueue *vq) - { -- if (vhost_has_feature(vq, VIRTIO_F_VERSION_1)) -- vq->is_le = true; -+ vq->is_le = vhost_has_feature(vq, VIRTIO_F_VERSION_1) -+ || virtio_legacy_is_little_endian(); - } - #endif /* CONFIG_VHOST_CROSS_ENDIAN_LEGACY */ - - static void vhost_reset_is_le(struct vhost_virtqueue *vq) - { -- vq->is_le = virtio_legacy_is_little_endian(); -+ vhost_init_is_le(vq); - } - - struct vhost_flush_struct { -@@ -1713,10 +1713,8 @@ int vhost_vq_init_access(struct vhost_virtqueue *vq) - int r; - bool is_le = vq->is_le; - -- if (!vq->private_data) { -- vhost_reset_is_le(vq); -+ if (!vq->private_data) - return 0; -- } - - vhost_init_is_le(vq); - -diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c -index f136048..489bfc6 100644 ---- a/drivers/virtio/virtio_ring.c -+++ b/drivers/virtio/virtio_ring.c -@@ -159,13 +159,6 @@ static bool vring_use_dma_api(struct virtio_device *vdev) - if (xen_domain()) - return true; - -- /* -- * On ARM-based machines, the DMA ops will do the right thing, -- * so always use them with legacy devices. -- */ -- if (IS_ENABLED(CONFIG_ARM) || IS_ENABLED(CONFIG_ARM64)) -- return !virtio_has_feature(vdev, VIRTIO_F_VERSION_1); -- - return false; - } - -diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c -index 8f6a2a5..a27fc87 100644 ---- a/fs/cifs/readdir.c -+++ b/fs/cifs/readdir.c -@@ -285,6 +285,7 @@ initiate_cifs_search(const unsigned int xid, struct file *file) - rc = -ENOMEM; - goto error_exit; - } -+ spin_lock_init(&cifsFile->file_info_lock); - file->private_data = cifsFile; - cifsFile->tlink = cifs_get_tlink(tlink); - tcon = tlink_tcon(tlink); -diff --git a/fs/dax.c b/fs/dax.c -index 014defd..bf6218d 100644 ---- a/fs/dax.c -+++ b/fs/dax.c -@@ -1270,6 +1270,11 @@ iomap_dax_actor(struct inode *inode, loff_t pos, loff_t length, void *data, - struct blk_dax_ctl dax = { 0 }; - ssize_t map_len; - -+ if (fatal_signal_pending(current)) { -+ ret = -EINTR; -+ break; -+ } -+ - dax.sector = iomap->blkno + - (((pos & PAGE_MASK) - iomap->offset) >> 9); - dax.size = (length + offset + PAGE_SIZE - 1) & PAGE_MASK; -diff --git a/fs/ext4/super.c b/fs/ext4/super.c -index 478630a..bbc316d 100644 ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -3827,6 +3827,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) - (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); - db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / - EXT4_DESC_PER_BLOCK(sb); -+ if (ext4_has_feature_meta_bg(sb)) { -+ if (le32_to_cpu(es->s_first_meta_bg) >= db_count) { -+ ext4_msg(sb, KERN_WARNING, -+ "first meta block group too large: %u " -+ "(group descriptor block count %u)", -+ le32_to_cpu(es->s_first_meta_bg), db_count); -+ goto failed_mount; -+ } -+ } - sbi->s_group_desc = ext4_kvmalloc(db_count * - sizeof(struct buffer_head *), - GFP_KERNEL); -diff --git a/fs/iomap.c b/fs/iomap.c -index a8ee8c3..814ae8f 100644 ---- a/fs/iomap.c -+++ b/fs/iomap.c -@@ -113,6 +113,9 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags, - - BUG_ON(pos + len > iomap->offset + iomap->length); - -+ if (fatal_signal_pending(current)) -+ return -EINTR; -+ - page = grab_cache_page_write_begin(inode->i_mapping, index, flags); - if (!page) - return -ENOMEM; -diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c -index 42aace4..6481369 100644 ---- a/fs/nfsd/nfs4layouts.c -+++ b/fs/nfsd/nfs4layouts.c -@@ -223,10 +223,11 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate, - struct nfs4_layout_stateid *ls; - struct nfs4_stid *stp; - -- stp = nfs4_alloc_stid(cstate->clp, nfs4_layout_stateid_cache); -+ stp = nfs4_alloc_stid(cstate->clp, nfs4_layout_stateid_cache, -+ nfsd4_free_layout_stateid); - if (!stp) - return NULL; -- stp->sc_free = nfsd4_free_layout_stateid; -+ - get_nfs4_file(fp); - stp->sc_file = fp; - -diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c -index 4b4beaa..a0dee8a 100644 ---- a/fs/nfsd/nfs4state.c -+++ b/fs/nfsd/nfs4state.c -@@ -633,8 +633,8 @@ find_or_hash_clnt_odstate(struct nfs4_file *fp, struct nfs4_clnt_odstate *new) - return co; - } - --struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, -- struct kmem_cache *slab) -+struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab, -+ void (*sc_free)(struct nfs4_stid *)) - { - struct nfs4_stid *stid; - int new_id; -@@ -650,6 +650,8 @@ struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, - idr_preload_end(); - if (new_id < 0) - goto out_free; -+ -+ stid->sc_free = sc_free; - stid->sc_client = cl; - stid->sc_stateid.si_opaque.so_id = new_id; - stid->sc_stateid.si_opaque.so_clid = cl->cl_clientid; -@@ -675,15 +677,12 @@ struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, - static struct nfs4_ol_stateid * nfs4_alloc_open_stateid(struct nfs4_client *clp) - { - struct nfs4_stid *stid; -- struct nfs4_ol_stateid *stp; - -- stid = nfs4_alloc_stid(clp, stateid_slab); -+ stid = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_ol_stateid); - if (!stid) - return NULL; - -- stp = openlockstateid(stid); -- stp->st_stid.sc_free = nfs4_free_ol_stateid; -- return stp; -+ return openlockstateid(stid); - } - - static void nfs4_free_deleg(struct nfs4_stid *stid) -@@ -781,11 +780,10 @@ alloc_init_deleg(struct nfs4_client *clp, struct svc_fh *current_fh, - goto out_dec; - if (delegation_blocked(¤t_fh->fh_handle)) - goto out_dec; -- dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab)); -+ dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab, nfs4_free_deleg)); - if (dp == NULL) - goto out_dec; - -- dp->dl_stid.sc_free = nfs4_free_deleg; - /* - * delegation seqid's are never incremented. The 4.1 special - * meaning of seqid 0 isn't meaningful, really, but let's avoid -@@ -5580,7 +5578,6 @@ init_lock_stateid(struct nfs4_ol_stateid *stp, struct nfs4_lockowner *lo, - stp->st_stateowner = nfs4_get_stateowner(&lo->lo_owner); - get_nfs4_file(fp); - stp->st_stid.sc_file = fp; -- stp->st_stid.sc_free = nfs4_free_lock_stateid; - stp->st_access_bmap = 0; - stp->st_deny_bmap = open_stp->st_deny_bmap; - stp->st_openstp = open_stp; -@@ -5623,7 +5620,7 @@ find_or_create_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fi, - lst = find_lock_stateid(lo, fi); - if (lst == NULL) { - spin_unlock(&clp->cl_lock); -- ns = nfs4_alloc_stid(clp, stateid_slab); -+ ns = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_lock_stateid); - if (ns == NULL) - return NULL; - -diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h -index c939936..4516e8b 100644 ---- a/fs/nfsd/state.h -+++ b/fs/nfsd/state.h -@@ -603,8 +603,8 @@ extern __be32 nfs4_preprocess_stateid_op(struct svc_rqst *rqstp, - __be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, - stateid_t *stateid, unsigned char typemask, - struct nfs4_stid **s, struct nfsd_net *nn); --struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, -- struct kmem_cache *slab); -+struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab, -+ void (*sc_free)(struct nfs4_stid *)); - void nfs4_unhash_stid(struct nfs4_stid *s); - void nfs4_put_stid(struct nfs4_stid *s); - void nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid); -diff --git a/include/linux/irq.h b/include/linux/irq.h -index e798755..39e3254 100644 ---- a/include/linux/irq.h -+++ b/include/linux/irq.h -@@ -184,6 +184,7 @@ struct irq_data { - * - * IRQD_TRIGGER_MASK - Mask for the trigger type bits - * IRQD_SETAFFINITY_PENDING - Affinity setting is pending -+ * IRQD_ACTIVATED - Interrupt has already been activated - * IRQD_NO_BALANCING - Balancing disabled for this IRQ - * IRQD_PER_CPU - Interrupt is per cpu - * IRQD_AFFINITY_SET - Interrupt affinity was set -@@ -202,6 +203,7 @@ struct irq_data { - enum { - IRQD_TRIGGER_MASK = 0xf, - IRQD_SETAFFINITY_PENDING = (1 << 8), -+ IRQD_ACTIVATED = (1 << 9), - IRQD_NO_BALANCING = (1 << 10), - IRQD_PER_CPU = (1 << 11), - IRQD_AFFINITY_SET = (1 << 12), -@@ -312,6 +314,21 @@ static inline bool irqd_affinity_is_managed(struct irq_data *d) - return __irqd_to_state(d) & IRQD_AFFINITY_MANAGED; - } - -+static inline bool irqd_is_activated(struct irq_data *d) -+{ -+ return __irqd_to_state(d) & IRQD_ACTIVATED; -+} -+ -+static inline void irqd_set_activated(struct irq_data *d) -+{ -+ __irqd_to_state(d) |= IRQD_ACTIVATED; -+} -+ -+static inline void irqd_clr_activated(struct irq_data *d) -+{ -+ __irqd_to_state(d) &= ~IRQD_ACTIVATED; -+} -+ - #undef __irqd_to_state - - static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) -diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h -index c1784c0..134a2f6 100644 ---- a/include/linux/memory_hotplug.h -+++ b/include/linux/memory_hotplug.h -@@ -85,7 +85,8 @@ extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages); - extern int add_one_highpage(struct page *page, int pfn, int bad_ppro); - /* VM interface that may be used by firmware interface */ - extern int online_pages(unsigned long, unsigned long, int); --extern int test_pages_in_a_zone(unsigned long, unsigned long); -+extern int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, -+ unsigned long *valid_start, unsigned long *valid_end); - extern void __offline_isolated_pages(unsigned long, unsigned long); - - typedef void (*online_page_callback_t)(struct page *page); -diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h -index 1c7eec0..3a481a4 100644 ---- a/include/linux/percpu-refcount.h -+++ b/include/linux/percpu-refcount.h -@@ -204,7 +204,7 @@ static inline void percpu_ref_get(struct percpu_ref *ref) - static inline bool percpu_ref_tryget(struct percpu_ref *ref) - { - unsigned long __percpu *percpu_count; -- int ret; -+ bool ret; - - rcu_read_lock_sched(); - -@@ -238,7 +238,7 @@ static inline bool percpu_ref_tryget(struct percpu_ref *ref) - static inline bool percpu_ref_tryget_live(struct percpu_ref *ref) - { - unsigned long __percpu *percpu_count; -- int ret = false; -+ bool ret = false; - - rcu_read_lock_sched(); - -diff --git a/kernel/cgroup.c b/kernel/cgroup.c -index 85bc9be..4e2f3de 100644 ---- a/kernel/cgroup.c -+++ b/kernel/cgroup.c -@@ -5219,6 +5219,11 @@ static struct cgroup_subsys_state *css_create(struct cgroup *cgrp, - return ERR_PTR(err); - } - -+/* -+ * The returned cgroup is fully initialized including its control mask, but -+ * it isn't associated with its kernfs_node and doesn't have the control -+ * mask applied. -+ */ - static struct cgroup *cgroup_create(struct cgroup *parent) - { - struct cgroup_root *root = parent->root; -@@ -5283,11 +5288,6 @@ static struct cgroup *cgroup_create(struct cgroup *parent) - - cgroup_propagate_control(cgrp); - -- /* @cgrp doesn't have dir yet so the following will only create csses */ -- ret = cgroup_apply_control_enable(cgrp); -- if (ret) -- goto out_destroy; -- - return cgrp; - - out_cancel_ref: -@@ -5295,9 +5295,6 @@ static struct cgroup *cgroup_create(struct cgroup *parent) - out_free_cgrp: - kfree(cgrp); - return ERR_PTR(ret); --out_destroy: -- cgroup_destroy_locked(cgrp); -- return ERR_PTR(ret); - } - - static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, -diff --git a/kernel/events/core.c b/kernel/events/core.c -index e5a8839..b1cfd74 100644 ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -1469,7 +1469,6 @@ ctx_group_list(struct perf_event *event, struct perf_event_context *ctx) - static void - list_add_event(struct perf_event *event, struct perf_event_context *ctx) - { -- - lockdep_assert_held(&ctx->lock); - - WARN_ON_ONCE(event->attach_state & PERF_ATTACH_CONTEXT); -@@ -1624,6 +1623,8 @@ static void perf_group_attach(struct perf_event *event) - { - struct perf_event *group_leader = event->group_leader, *pos; - -+ lockdep_assert_held(&event->ctx->lock); -+ - /* - * We can have double attach due to group movement in perf_event_open. - */ -@@ -1697,6 +1698,8 @@ static void perf_group_detach(struct perf_event *event) - struct perf_event *sibling, *tmp; - struct list_head *list = NULL; - -+ lockdep_assert_held(&event->ctx->lock); -+ - /* - * We can have double detach due to exit/hot-unplug + close. - */ -@@ -1895,9 +1898,29 @@ __perf_remove_from_context(struct perf_event *event, - */ - static void perf_remove_from_context(struct perf_event *event, unsigned long flags) - { -- lockdep_assert_held(&event->ctx->mutex); -+ struct perf_event_context *ctx = event->ctx; -+ -+ lockdep_assert_held(&ctx->mutex); - - event_function_call(event, __perf_remove_from_context, (void *)flags); -+ -+ /* -+ * The above event_function_call() can NO-OP when it hits -+ * TASK_TOMBSTONE. In that case we must already have been detached -+ * from the context (by perf_event_exit_event()) but the grouping -+ * might still be in-tact. -+ */ -+ WARN_ON_ONCE(event->attach_state & PERF_ATTACH_CONTEXT); -+ if ((flags & DETACH_GROUP) && -+ (event->attach_state & PERF_ATTACH_GROUP)) { -+ /* -+ * Since in that case we cannot possibly be scheduled, simply -+ * detach now. -+ */ -+ raw_spin_lock_irq(&ctx->lock); -+ perf_group_detach(event); -+ raw_spin_unlock_irq(&ctx->lock); -+ } - } - - /* -@@ -6583,6 +6606,27 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) - char *buf = NULL; - char *name; - -+ if (vma->vm_flags & VM_READ) -+ prot |= PROT_READ; -+ if (vma->vm_flags & VM_WRITE) -+ prot |= PROT_WRITE; -+ if (vma->vm_flags & VM_EXEC) -+ prot |= PROT_EXEC; -+ -+ if (vma->vm_flags & VM_MAYSHARE) -+ flags = MAP_SHARED; -+ else -+ flags = MAP_PRIVATE; -+ -+ if (vma->vm_flags & VM_DENYWRITE) -+ flags |= MAP_DENYWRITE; -+ if (vma->vm_flags & VM_MAYEXEC) -+ flags |= MAP_EXECUTABLE; -+ if (vma->vm_flags & VM_LOCKED) -+ flags |= MAP_LOCKED; -+ if (vma->vm_flags & VM_HUGETLB) -+ flags |= MAP_HUGETLB; -+ - if (file) { - struct inode *inode; - dev_t dev; -@@ -6609,27 +6653,6 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) - maj = MAJOR(dev); - min = MINOR(dev); - -- if (vma->vm_flags & VM_READ) -- prot |= PROT_READ; -- if (vma->vm_flags & VM_WRITE) -- prot |= PROT_WRITE; -- if (vma->vm_flags & VM_EXEC) -- prot |= PROT_EXEC; -- -- if (vma->vm_flags & VM_MAYSHARE) -- flags = MAP_SHARED; -- else -- flags = MAP_PRIVATE; -- -- if (vma->vm_flags & VM_DENYWRITE) -- flags |= MAP_DENYWRITE; -- if (vma->vm_flags & VM_MAYEXEC) -- flags |= MAP_EXECUTABLE; -- if (vma->vm_flags & VM_LOCKED) -- flags |= MAP_LOCKED; -- if (vma->vm_flags & VM_HUGETLB) -- flags |= MAP_HUGETLB; -- - goto got_name; - } else { - if (vma->vm_ops && vma->vm_ops->name) { -diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c -index 8c0a0ae..b59e676 100644 ---- a/kernel/irq/irqdomain.c -+++ b/kernel/irq/irqdomain.c -@@ -1346,6 +1346,30 @@ void irq_domain_free_irqs_parent(struct irq_domain *domain, - } - EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); - -+static void __irq_domain_activate_irq(struct irq_data *irq_data) -+{ -+ if (irq_data && irq_data->domain) { -+ struct irq_domain *domain = irq_data->domain; -+ -+ if (irq_data->parent_data) -+ __irq_domain_activate_irq(irq_data->parent_data); -+ if (domain->ops->activate) -+ domain->ops->activate(domain, irq_data); -+ } -+} -+ -+static void __irq_domain_deactivate_irq(struct irq_data *irq_data) -+{ -+ if (irq_data && irq_data->domain) { -+ struct irq_domain *domain = irq_data->domain; -+ -+ if (domain->ops->deactivate) -+ domain->ops->deactivate(domain, irq_data); -+ if (irq_data->parent_data) -+ __irq_domain_deactivate_irq(irq_data->parent_data); -+ } -+} -+ - /** - * irq_domain_activate_irq - Call domain_ops->activate recursively to activate - * interrupt -@@ -1356,13 +1380,9 @@ EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); - */ - void irq_domain_activate_irq(struct irq_data *irq_data) - { -- if (irq_data && irq_data->domain) { -- struct irq_domain *domain = irq_data->domain; -- -- if (irq_data->parent_data) -- irq_domain_activate_irq(irq_data->parent_data); -- if (domain->ops->activate) -- domain->ops->activate(domain, irq_data); -+ if (!irqd_is_activated(irq_data)) { -+ __irq_domain_activate_irq(irq_data); -+ irqd_set_activated(irq_data); - } - } - -@@ -1376,13 +1396,9 @@ void irq_domain_activate_irq(struct irq_data *irq_data) - */ - void irq_domain_deactivate_irq(struct irq_data *irq_data) - { -- if (irq_data && irq_data->domain) { -- struct irq_domain *domain = irq_data->domain; -- -- if (domain->ops->deactivate) -- domain->ops->deactivate(domain, irq_data); -- if (irq_data->parent_data) -- irq_domain_deactivate_irq(irq_data->parent_data); -+ if (irqd_is_activated(irq_data)) { -+ __irq_domain_deactivate_irq(irq_data); -+ irqd_clr_activated(irq_data); - } - } - -diff --git a/kernel/trace/trace_hwlat.c b/kernel/trace/trace_hwlat.c -index b97286c..f00b013 100644 ---- a/kernel/trace/trace_hwlat.c -+++ b/kernel/trace/trace_hwlat.c -@@ -266,7 +266,7 @@ static int get_sample(void) - static struct cpumask save_cpumask; - static bool disable_migrate; - --static void move_to_next_cpu(void) -+static void move_to_next_cpu(bool initmask) - { - static struct cpumask *current_mask; - int next_cpu; -@@ -275,7 +275,7 @@ static void move_to_next_cpu(void) - return; - - /* Just pick the first CPU on first iteration */ -- if (!current_mask) { -+ if (initmask) { - current_mask = &save_cpumask; - get_online_cpus(); - cpumask_and(current_mask, cpu_online_mask, tracing_buffer_mask); -@@ -330,10 +330,12 @@ static void move_to_next_cpu(void) - static int kthread_fn(void *data) - { - u64 interval; -+ bool initmask = true; - - while (!kthread_should_stop()) { - -- move_to_next_cpu(); -+ move_to_next_cpu(initmask); -+ initmask = false; - - local_irq_disable(); - get_sample(); -diff --git a/mm/filemap.c b/mm/filemap.c -index 7798010..d8d7df8 100644 ---- a/mm/filemap.c -+++ b/mm/filemap.c -@@ -1703,6 +1703,11 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos, - - cond_resched(); - find_page: -+ if (fatal_signal_pending(current)) { -+ error = -EINTR; -+ goto out; -+ } -+ - page = find_get_page(mapping, index); - if (!page) { - page_cache_sync_readahead(mapping, -diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c -index c3a8141..ede13734 100644 ---- a/mm/memory_hotplug.c -+++ b/mm/memory_hotplug.c -@@ -1483,17 +1483,20 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) - } - - /* -- * Confirm all pages in a range [start, end) is belongs to the same zone. -+ * Confirm all pages in a range [start, end) belong to the same zone. -+ * When true, return its valid [start, end). - */ --int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) -+int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, -+ unsigned long *valid_start, unsigned long *valid_end) - { - unsigned long pfn, sec_end_pfn; -+ unsigned long start, end; - struct zone *zone = NULL; - struct page *page; - int i; -- for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn); -+ for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn + 1); - pfn < end_pfn; -- pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) { -+ pfn = sec_end_pfn, sec_end_pfn += PAGES_PER_SECTION) { - /* Make sure the memory section is present first */ - if (!present_section_nr(pfn_to_section_nr(pfn))) - continue; -@@ -1509,10 +1512,20 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) - page = pfn_to_page(pfn + i); - if (zone && page_zone(page) != zone) - return 0; -+ if (!zone) -+ start = pfn + i; - zone = page_zone(page); -+ end = pfn + MAX_ORDER_NR_PAGES; - } - } -- return 1; -+ -+ if (zone) { -+ *valid_start = start; -+ *valid_end = end; -+ return 1; -+ } else { -+ return 0; -+ } - } - - /* -@@ -1859,6 +1872,7 @@ static int __ref __offline_pages(unsigned long start_pfn, - long offlined_pages; - int ret, drain, retry_max, node; - unsigned long flags; -+ unsigned long valid_start, valid_end; - struct zone *zone; - struct memory_notify arg; - -@@ -1869,10 +1883,10 @@ static int __ref __offline_pages(unsigned long start_pfn, - return -EINVAL; - /* This makes hotplug much easier...and readable. - we assume this for now. .*/ -- if (!test_pages_in_a_zone(start_pfn, end_pfn)) -+ if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) - return -EINVAL; - -- zone = page_zone(pfn_to_page(start_pfn)); -+ zone = page_zone(pfn_to_page(valid_start)); - node = zone_to_nid(zone); - nr_pages = end_pfn - start_pfn; - -diff --git a/mm/zswap.c b/mm/zswap.c -index 275b22c..dbef278 100644 ---- a/mm/zswap.c -+++ b/mm/zswap.c -@@ -78,7 +78,13 @@ static u64 zswap_duplicate_entry; - - /* Enable/disable zswap (disabled by default) */ - static bool zswap_enabled; --module_param_named(enabled, zswap_enabled, bool, 0644); -+static int zswap_enabled_param_set(const char *, -+ const struct kernel_param *); -+static struct kernel_param_ops zswap_enabled_param_ops = { -+ .set = zswap_enabled_param_set, -+ .get = param_get_bool, -+}; -+module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644); - - /* Crypto compressor to use */ - #define ZSWAP_COMPRESSOR_DEFAULT "lzo" -@@ -176,6 +182,9 @@ static atomic_t zswap_pools_count = ATOMIC_INIT(0); - /* used by param callback function */ - static bool zswap_init_started; - -+/* fatal error during init */ -+static bool zswap_init_failed; -+ - /********************************* - * helpers and fwd declarations - **********************************/ -@@ -706,6 +715,11 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, - char *s = strstrip((char *)val); - int ret; - -+ if (zswap_init_failed) { -+ pr_err("can't set param, initialization failed\n"); -+ return -ENODEV; -+ } -+ - /* no change required */ - if (!strcmp(s, *(char **)kp->arg)) - return 0; -@@ -785,6 +799,17 @@ static int zswap_zpool_param_set(const char *val, - return __zswap_param_set(val, kp, NULL, zswap_compressor); - } - -+static int zswap_enabled_param_set(const char *val, -+ const struct kernel_param *kp) -+{ -+ if (zswap_init_failed) { -+ pr_err("can't enable, initialization failed\n"); -+ return -ENODEV; -+ } -+ -+ return param_set_bool(val, kp); -+} -+ - /********************************* - * writeback code - **********************************/ -@@ -1271,6 +1296,9 @@ static int __init init_zswap(void) - dstmem_fail: - zswap_entry_cache_destroy(); - cache_fail: -+ /* if built-in, we aren't unloaded on failure; don't allow use */ -+ zswap_init_failed = true; -+ zswap_enabled = false; - return -ENOMEM; - } - /* must be late so crypto has time to come up */ -diff --git a/net/can/bcm.c b/net/can/bcm.c -index 436a753..5e9ed5e 100644 ---- a/net/can/bcm.c -+++ b/net/can/bcm.c -@@ -734,14 +734,23 @@ static struct bcm_op *bcm_find_op(struct list_head *ops, - - static void bcm_remove_op(struct bcm_op *op) - { -- hrtimer_cancel(&op->timer); -- hrtimer_cancel(&op->thrtimer); -- -- if (op->tsklet.func) -- tasklet_kill(&op->tsklet); -+ if (op->tsklet.func) { -+ while (test_bit(TASKLET_STATE_SCHED, &op->tsklet.state) || -+ test_bit(TASKLET_STATE_RUN, &op->tsklet.state) || -+ hrtimer_active(&op->timer)) { -+ hrtimer_cancel(&op->timer); -+ tasklet_kill(&op->tsklet); -+ } -+ } - -- if (op->thrtsklet.func) -- tasklet_kill(&op->thrtsklet); -+ if (op->thrtsklet.func) { -+ while (test_bit(TASKLET_STATE_SCHED, &op->thrtsklet.state) || -+ test_bit(TASKLET_STATE_RUN, &op->thrtsklet.state) || -+ hrtimer_active(&op->thrtimer)) { -+ hrtimer_cancel(&op->thrtimer); -+ tasklet_kill(&op->thrtsklet); -+ } -+ } - - if ((op->frames) && (op->frames != &op->sframe)) - kfree(op->frames); -diff --git a/net/sunrpc/auth_gss/gss_rpc_xdr.c b/net/sunrpc/auth_gss/gss_rpc_xdr.c -index dc6fb79..25d9a9c 100644 ---- a/net/sunrpc/auth_gss/gss_rpc_xdr.c -+++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c -@@ -260,7 +260,7 @@ static int gssx_dec_option_array(struct xdr_stream *xdr, - if (!oa->data) - return -ENOMEM; - -- creds = kmalloc(sizeof(struct svc_cred), GFP_KERNEL); -+ creds = kzalloc(sizeof(struct svc_cred), GFP_KERNEL); - if (!creds) { - kfree(oa->data); - return -ENOMEM; |