diff options
Diffstat (limited to '4.7.4/1001_linux-4.7.2.patch')
-rw-r--r-- | 4.7.4/1001_linux-4.7.2.patch | 7668 |
1 files changed, 0 insertions, 7668 deletions
diff --git a/4.7.4/1001_linux-4.7.2.patch b/4.7.4/1001_linux-4.7.2.patch deleted file mode 100644 index d0ef798..0000000 --- a/4.7.4/1001_linux-4.7.2.patch +++ /dev/null @@ -1,7668 +0,0 @@ -diff --git a/Documentation/module-signing.txt b/Documentation/module-signing.txt -index 696d5ca..f0e3361 100644 ---- a/Documentation/module-signing.txt -+++ b/Documentation/module-signing.txt -@@ -271,3 +271,9 @@ Since the private key is used to sign modules, viruses and malware could use - the private key to sign modules and compromise the operating system. The - private key must be either destroyed or moved to a secure location and not kept - in the root node of the kernel source tree. -+ -+If you use the same private key to sign modules for multiple kernel -+configurations, you must ensure that the module version information is -+sufficient to prevent loading a module into a different kernel. Either -+set CONFIG_MODVERSIONS=y or ensure that each configuration has a different -+kernel release string by changing EXTRAVERSION or CONFIG_LOCALVERSION. -diff --git a/Makefile b/Makefile -index 84335c0..bb98f1c 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 4 - PATCHLEVEL = 7 --SUBLEVEL = 1 -+SUBLEVEL = 2 - EXTRAVERSION = - NAME = Psychotic Stoned Sheep - -diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h -index 858f98e..0f92d97 100644 ---- a/arch/arc/include/asm/pgtable.h -+++ b/arch/arc/include/asm/pgtable.h -@@ -110,7 +110,7 @@ - #define ___DEF (_PAGE_PRESENT | _PAGE_CACHEABLE) - - /* Set of bits not changed in pte_modify */ --#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) -+#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_SPECIAL) - - /* More Abbrevaited helpers */ - #define PAGE_U_NONE __pgprot(___DEF) -diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c -index 73d7e4c..ab74b5d 100644 ---- a/arch/arc/mm/dma.c -+++ b/arch/arc/mm/dma.c -@@ -92,7 +92,8 @@ static void *arc_dma_alloc(struct device *dev, size_t size, - static void arc_dma_free(struct device *dev, size_t size, void *vaddr, - dma_addr_t dma_handle, struct dma_attrs *attrs) - { -- struct page *page = virt_to_page(dma_handle); -+ phys_addr_t paddr = plat_dma_to_phys(dev, dma_handle); -+ struct page *page = virt_to_page(paddr); - int is_non_coh = 1; - - is_non_coh = dma_get_attr(DMA_ATTR_NON_CONSISTENT, attrs) || -diff --git a/arch/arm/boot/dts/arm-realview-pbx-a9.dts b/arch/arm/boot/dts/arm-realview-pbx-a9.dts -index db808f9..90d00b4 100644 ---- a/arch/arm/boot/dts/arm-realview-pbx-a9.dts -+++ b/arch/arm/boot/dts/arm-realview-pbx-a9.dts -@@ -70,13 +70,12 @@ - * associativity as these may be erroneously set - * up by boot loader(s). - */ -- cache-size = <1048576>; // 1MB -- cache-sets = <4096>; -+ cache-size = <131072>; // 128KB -+ cache-sets = <512>; - cache-line-size = <32>; - arm,parity-disable; -- arm,tag-latency = <1>; -- arm,data-latency = <1 1>; -- arm,dirty-latency = <1>; -+ arm,tag-latency = <1 1 1>; -+ arm,data-latency = <1 1 1>; - }; - - scu: scu@1f000000 { -diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts b/arch/arm/boot/dts/sun4i-a10-a1000.dts -index c92a1ae..fa70b8f 100644 ---- a/arch/arm/boot/dts/sun4i-a10-a1000.dts -+++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts -@@ -84,6 +84,7 @@ - regulator-name = "emac-3v3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; -+ startup-delay-us = <20000>; - enable-active-high; - gpio = <&pio 7 15 GPIO_ACTIVE_HIGH>; - }; -diff --git a/arch/arm/boot/dts/sun4i-a10-hackberry.dts b/arch/arm/boot/dts/sun4i-a10-hackberry.dts -index 2b17c51..6de83a6 100644 ---- a/arch/arm/boot/dts/sun4i-a10-hackberry.dts -+++ b/arch/arm/boot/dts/sun4i-a10-hackberry.dts -@@ -66,6 +66,7 @@ - regulator-name = "emac-3v3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; -+ startup-delay-us = <20000>; - enable-active-high; - gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>; - }; -diff --git a/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts b/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts -index 7afc7a6..e28f080 100644 ---- a/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts -+++ b/arch/arm/boot/dts/sun4i-a10-jesurun-q5.dts -@@ -80,6 +80,7 @@ - regulator-name = "emac-3v3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; -+ startup-delay-us = <20000>; - enable-active-high; - gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>; /* PH19 */ - }; -diff --git a/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts b/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts -index 9fea918..39731a7 100644 ---- a/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts -+++ b/arch/arm/boot/dts/sun5i-a10s-wobo-i5.dts -@@ -79,6 +79,7 @@ - regulator-name = "emac-3v3"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; -+ startup-delay-us = <20000>; - enable-active-high; - gpio = <&pio 0 2 GPIO_ACTIVE_HIGH>; - }; -diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts -index 941f362..f4d8125 100644 ---- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts -+++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts -@@ -1386,7 +1386,7 @@ - * Pin 41: BR_UART1_TXD - * Pin 44: BR_UART1_RXD - */ -- serial@70006000 { -+ serial@0,70006000 { - compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; - status = "okay"; - }; -@@ -1398,7 +1398,7 @@ - * Pin 71: UART2_CTS_L - * Pin 74: UART2_RTS_L - */ -- serial@70006040 { -+ serial@0,70006040 { - compatible = "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart"; - status = "okay"; - }; -diff --git a/arch/arm/configs/aspeed_g4_defconfig b/arch/arm/configs/aspeed_g4_defconfig -index b6e54ee..ca39c04 100644 ---- a/arch/arm/configs/aspeed_g4_defconfig -+++ b/arch/arm/configs/aspeed_g4_defconfig -@@ -58,7 +58,7 @@ CONFIG_SERIAL_OF_PLATFORM=y - # CONFIG_IOMMU_SUPPORT is not set - CONFIG_FIRMWARE_MEMMAP=y - CONFIG_FANOTIFY=y --CONFIG_PRINTK_TIME=1 -+CONFIG_PRINTK_TIME=y - CONFIG_DYNAMIC_DEBUG=y - CONFIG_STRIP_ASM_SYMS=y - CONFIG_PAGE_POISONING=y -diff --git a/arch/arm/configs/aspeed_g5_defconfig b/arch/arm/configs/aspeed_g5_defconfig -index 8926051..4f366b0 100644 ---- a/arch/arm/configs/aspeed_g5_defconfig -+++ b/arch/arm/configs/aspeed_g5_defconfig -@@ -59,7 +59,7 @@ CONFIG_SERIAL_OF_PLATFORM=y - # CONFIG_IOMMU_SUPPORT is not set - CONFIG_FIRMWARE_MEMMAP=y - CONFIG_FANOTIFY=y --CONFIG_PRINTK_TIME=1 -+CONFIG_PRINTK_TIME=y - CONFIG_DYNAMIC_DEBUG=y - CONFIG_STRIP_ASM_SYMS=y - CONFIG_PAGE_POISONING=y -diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c -index ff7ed56..d2485c7 100644 ---- a/arch/arm/mm/dma-mapping.c -+++ b/arch/arm/mm/dma-mapping.c -@@ -49,6 +49,7 @@ struct arm_dma_alloc_args { - pgprot_t prot; - const void *caller; - bool want_vaddr; -+ int coherent_flag; - }; - - struct arm_dma_free_args { -@@ -59,6 +60,9 @@ struct arm_dma_free_args { - bool want_vaddr; - }; - -+#define NORMAL 0 -+#define COHERENT 1 -+ - struct arm_dma_allocator { - void *(*alloc)(struct arm_dma_alloc_args *args, - struct page **ret_page); -@@ -272,7 +276,7 @@ static u64 get_coherent_dma_mask(struct device *dev) - return mask; - } - --static void __dma_clear_buffer(struct page *page, size_t size) -+static void __dma_clear_buffer(struct page *page, size_t size, int coherent_flag) - { - /* - * Ensure that the allocated pages are zeroed, and that any data -@@ -284,17 +288,21 @@ static void __dma_clear_buffer(struct page *page, size_t size) - while (size > 0) { - void *ptr = kmap_atomic(page); - memset(ptr, 0, PAGE_SIZE); -- dmac_flush_range(ptr, ptr + PAGE_SIZE); -+ if (coherent_flag != COHERENT) -+ dmac_flush_range(ptr, ptr + PAGE_SIZE); - kunmap_atomic(ptr); - page++; - size -= PAGE_SIZE; - } -- outer_flush_range(base, end); -+ if (coherent_flag != COHERENT) -+ outer_flush_range(base, end); - } else { - void *ptr = page_address(page); - memset(ptr, 0, size); -- dmac_flush_range(ptr, ptr + size); -- outer_flush_range(__pa(ptr), __pa(ptr) + size); -+ if (coherent_flag != COHERENT) { -+ dmac_flush_range(ptr, ptr + size); -+ outer_flush_range(__pa(ptr), __pa(ptr) + size); -+ } - } - } - -@@ -302,7 +310,8 @@ static void __dma_clear_buffer(struct page *page, size_t size) - * Allocate a DMA buffer for 'dev' of size 'size' using the - * specified gfp mask. Note that 'size' must be page aligned. - */ --static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gfp) -+static struct page *__dma_alloc_buffer(struct device *dev, size_t size, -+ gfp_t gfp, int coherent_flag) - { - unsigned long order = get_order(size); - struct page *page, *p, *e; -@@ -318,7 +327,7 @@ static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gf - for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++) - __free_page(p); - -- __dma_clear_buffer(page, size); -+ __dma_clear_buffer(page, size, coherent_flag); - - return page; - } -@@ -340,7 +349,8 @@ static void __dma_free_buffer(struct page *page, size_t size) - - static void *__alloc_from_contiguous(struct device *dev, size_t size, - pgprot_t prot, struct page **ret_page, -- const void *caller, bool want_vaddr); -+ const void *caller, bool want_vaddr, -+ int coherent_flag); - - static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, - pgprot_t prot, struct page **ret_page, -@@ -405,10 +415,13 @@ static int __init atomic_pool_init(void) - atomic_pool = gen_pool_create(PAGE_SHIFT, -1); - if (!atomic_pool) - goto out; -- -+ /* -+ * The atomic pool is only used for non-coherent allocations -+ * so we must pass NORMAL for coherent_flag. -+ */ - if (dev_get_cma_area(NULL)) - ptr = __alloc_from_contiguous(NULL, atomic_pool_size, prot, -- &page, atomic_pool_init, true); -+ &page, atomic_pool_init, true, NORMAL); - else - ptr = __alloc_remap_buffer(NULL, atomic_pool_size, gfp, prot, - &page, atomic_pool_init, true); -@@ -522,7 +535,11 @@ static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, - { - struct page *page; - void *ptr = NULL; -- page = __dma_alloc_buffer(dev, size, gfp); -+ /* -+ * __alloc_remap_buffer is only called when the device is -+ * non-coherent -+ */ -+ page = __dma_alloc_buffer(dev, size, gfp, NORMAL); - if (!page) - return NULL; - if (!want_vaddr) -@@ -577,7 +594,8 @@ static int __free_from_pool(void *start, size_t size) - - static void *__alloc_from_contiguous(struct device *dev, size_t size, - pgprot_t prot, struct page **ret_page, -- const void *caller, bool want_vaddr) -+ const void *caller, bool want_vaddr, -+ int coherent_flag) - { - unsigned long order = get_order(size); - size_t count = size >> PAGE_SHIFT; -@@ -588,7 +606,7 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, - if (!page) - return NULL; - -- __dma_clear_buffer(page, size); -+ __dma_clear_buffer(page, size, coherent_flag); - - if (!want_vaddr) - goto out; -@@ -638,7 +656,7 @@ static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot) - #define __get_dma_pgprot(attrs, prot) __pgprot(0) - #define __alloc_remap_buffer(dev, size, gfp, prot, ret, c, wv) NULL - #define __alloc_from_pool(size, ret_page) NULL --#define __alloc_from_contiguous(dev, size, prot, ret, c, wv) NULL -+#define __alloc_from_contiguous(dev, size, prot, ret, c, wv, coherent_flag) NULL - #define __free_from_pool(cpu_addr, size) do { } while (0) - #define __free_from_contiguous(dev, page, cpu_addr, size, wv) do { } while (0) - #define __dma_free_remap(cpu_addr, size) do { } while (0) -@@ -649,7 +667,8 @@ static void *__alloc_simple_buffer(struct device *dev, size_t size, gfp_t gfp, - struct page **ret_page) - { - struct page *page; -- page = __dma_alloc_buffer(dev, size, gfp); -+ /* __alloc_simple_buffer is only called when the device is coherent */ -+ page = __dma_alloc_buffer(dev, size, gfp, COHERENT); - if (!page) - return NULL; - -@@ -679,7 +698,7 @@ static void *cma_allocator_alloc(struct arm_dma_alloc_args *args, - { - return __alloc_from_contiguous(args->dev, args->size, args->prot, - ret_page, args->caller, -- args->want_vaddr); -+ args->want_vaddr, args->coherent_flag); - } - - static void cma_allocator_free(struct arm_dma_free_args *args) -@@ -746,6 +765,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, - .prot = prot, - .caller = caller, - .want_vaddr = !dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs), -+ .coherent_flag = is_coherent ? COHERENT : NORMAL, - }; - - #ifdef CONFIG_DMA_API_DEBUG -@@ -1253,7 +1273,8 @@ static inline void __free_iova(struct dma_iommu_mapping *mapping, - static const int iommu_order_array[] = { 9, 8, 4, 0 }; - - static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, -- gfp_t gfp, struct dma_attrs *attrs) -+ gfp_t gfp, struct dma_attrs *attrs, -+ int coherent_flag) - { - struct page **pages; - int count = size >> PAGE_SHIFT; -@@ -1277,7 +1298,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, - if (!page) - goto error; - -- __dma_clear_buffer(page, size); -+ __dma_clear_buffer(page, size, coherent_flag); - - for (i = 0; i < count; i++) - pages[i] = page + i; -@@ -1327,7 +1348,7 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, - pages[i + j] = pages[i] + j; - } - -- __dma_clear_buffer(pages[i], PAGE_SIZE << order); -+ __dma_clear_buffer(pages[i], PAGE_SIZE << order, coherent_flag); - i += 1 << order; - count -= 1 << order; - } -@@ -1505,7 +1526,8 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, - */ - gfp &= ~(__GFP_COMP); - -- pages = __iommu_alloc_buffer(dev, size, gfp, attrs); -+ /* For now always consider we are in a non-coherent case */ -+ pages = __iommu_alloc_buffer(dev, size, gfp, attrs, NORMAL); - if (!pages) - return NULL; - -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 5a0a691..2038492 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -872,7 +872,7 @@ config RELOCATABLE - - config RANDOMIZE_BASE - bool "Randomize the address of the kernel image" -- select ARM64_MODULE_PLTS -+ select ARM64_MODULE_PLTS if MODULES - select RELOCATABLE - help - Randomizes the virtual address at which the kernel image is -diff --git a/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/arch/arm64/boot/dts/rockchip/rk3368.dtsi -index 8b4a7c9..080203e 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi -@@ -670,7 +670,7 @@ - #address-cells = <0>; - - reg = <0x0 0xffb71000 0x0 0x1000>, -- <0x0 0xffb72000 0x0 0x1000>, -+ <0x0 0xffb72000 0x0 0x2000>, - <0x0 0xffb74000 0x0 0x2000>, - <0x0 0xffb76000 0x0 0x2000>; - interrupts = <GIC_PPI 9 -diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c -index 4fbf3c5..0800d23 100644 ---- a/arch/arm64/kernel/debug-monitors.c -+++ b/arch/arm64/kernel/debug-monitors.c -@@ -151,7 +151,6 @@ static int debug_monitors_init(void) - /* Clear the OS lock. */ - on_each_cpu(clear_os_lock, NULL, 1); - isb(); -- local_dbg_enable(); - - /* Register hotplug handler. */ - __register_cpu_notifier(&os_lock_nb); -diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c -index 21ab5df..65d81f9 100644 ---- a/arch/arm64/kernel/hibernate.c -+++ b/arch/arm64/kernel/hibernate.c -@@ -35,6 +35,7 @@ - #include <asm/sections.h> - #include <asm/smp.h> - #include <asm/suspend.h> -+#include <asm/sysreg.h> - #include <asm/virt.h> - - /* -@@ -217,12 +218,22 @@ static int create_safe_exec_page(void *src_start, size_t length, - set_pte(pte, __pte(virt_to_phys((void *)dst) | - pgprot_val(PAGE_KERNEL_EXEC))); - -- /* Load our new page tables */ -- asm volatile("msr ttbr0_el1, %0;" -- "isb;" -- "tlbi vmalle1is;" -- "dsb ish;" -- "isb" : : "r"(virt_to_phys(pgd))); -+ /* -+ * Load our new page tables. A strict BBM approach requires that we -+ * ensure that TLBs are free of any entries that may overlap with the -+ * global mappings we are about to install. -+ * -+ * For a real hibernate/resume cycle TTBR0 currently points to a zero -+ * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI -+ * runtime services), while for a userspace-driven test_resume cycle it -+ * points to userspace page tables (and we must point it at a zero page -+ * ourselves). Elsewhere we only (un)install the idmap with preemption -+ * disabled, so T0SZ should be as required regardless. -+ */ -+ cpu_set_reserved_ttbr0(); -+ local_flush_tlb_all(); -+ write_sysreg(virt_to_phys(pgd), ttbr0_el1); -+ isb(); - - *phys_dst_addr = virt_to_phys((void *)dst); - -@@ -394,6 +405,38 @@ int swsusp_arch_resume(void) - void *, phys_addr_t, phys_addr_t); - - /* -+ * Restoring the memory image will overwrite the ttbr1 page tables. -+ * Create a second copy of just the linear map, and use this when -+ * restoring. -+ */ -+ tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); -+ if (!tmp_pg_dir) { -+ pr_err("Failed to allocate memory for temporary page tables."); -+ rc = -ENOMEM; -+ goto out; -+ } -+ rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); -+ if (rc) -+ goto out; -+ -+ /* -+ * Since we only copied the linear map, we need to find restore_pblist's -+ * linear map address. -+ */ -+ lm_restore_pblist = LMADDR(restore_pblist); -+ -+ /* -+ * We need a zero page that is zero before & after resume in order to -+ * to break before make on the ttbr1 page tables. -+ */ -+ zero_page = (void *)get_safe_page(GFP_ATOMIC); -+ if (!zero_page) { -+ pr_err("Failed to allocate zero page."); -+ rc = -ENOMEM; -+ goto out; -+ } -+ -+ /* - * Locate the exit code in the bottom-but-one page, so that *NULL - * still has disastrous affects. - */ -@@ -419,27 +462,6 @@ int swsusp_arch_resume(void) - __flush_dcache_area(hibernate_exit, exit_size); - - /* -- * Restoring the memory image will overwrite the ttbr1 page tables. -- * Create a second copy of just the linear map, and use this when -- * restoring. -- */ -- tmp_pg_dir = (pgd_t *)get_safe_page(GFP_ATOMIC); -- if (!tmp_pg_dir) { -- pr_err("Failed to allocate memory for temporary page tables."); -- rc = -ENOMEM; -- goto out; -- } -- rc = copy_page_tables(tmp_pg_dir, PAGE_OFFSET, 0); -- if (rc) -- goto out; -- -- /* -- * Since we only copied the linear map, we need to find restore_pblist's -- * linear map address. -- */ -- lm_restore_pblist = LMADDR(restore_pblist); -- -- /* - * KASLR will cause the el2 vectors to be in a different location in - * the resumed kernel. Load hibernate's temporary copy into el2. - * -@@ -453,12 +475,6 @@ int swsusp_arch_resume(void) - __hyp_set_vectors(el2_vectors); - } - -- /* -- * We need a zero page that is zero before & after resume in order to -- * to break before make on the ttbr1 page tables. -- */ -- zero_page = (void *)get_safe_page(GFP_ATOMIC); -- - hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1, - resume_hdr.reenter_kernel, lm_restore_pblist, - resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page)); -diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c -index 62ff3c0..490db85 100644 ---- a/arch/arm64/kernel/smp.c -+++ b/arch/arm64/kernel/smp.c -@@ -267,7 +267,6 @@ asmlinkage void secondary_start_kernel(void) - set_cpu_online(cpu, true); - complete(&cpu_running); - -- local_dbg_enable(); - local_irq_enable(); - local_async_enable(); - -@@ -437,9 +436,9 @@ void __init smp_cpus_done(unsigned int max_cpus) - - void __init smp_prepare_boot_cpu(void) - { -+ set_my_cpu_offset(per_cpu_offset(smp_processor_id())); - cpuinfo_store_boot_cpu(); - save_boot_cpu_run_el(); -- set_my_cpu_offset(per_cpu_offset(smp_processor_id())); - } - - static u64 __init of_get_cpu_mpidr(struct device_node *dn) -@@ -694,6 +693,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus) - smp_store_cpu_info(smp_processor_id()); - - /* -+ * If UP is mandated by "nosmp" (which implies "maxcpus=0"), don't set -+ * secondary CPUs present. -+ */ -+ if (max_cpus == 0) -+ return; -+ -+ /* - * Initialise the present map (which describes the set of CPUs - * actually populated at the present time) and release the - * secondaries from the bootloader. -diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S -index 435e820..e564d45 100644 ---- a/arch/arm64/kernel/vmlinux.lds.S -+++ b/arch/arm64/kernel/vmlinux.lds.S -@@ -181,9 +181,9 @@ SECTIONS - *(.hash) - } - -- __rela_offset = ADDR(.rela) - KIMAGE_VADDR; -+ __rela_offset = ABSOLUTE(ADDR(.rela) - KIMAGE_VADDR); - __rela_size = SIZEOF(.rela); -- __dynsym_offset = ADDR(.dynsym) - KIMAGE_VADDR; -+ __dynsym_offset = ABSOLUTE(ADDR(.dynsym) - KIMAGE_VADDR); - - . = ALIGN(SEGMENT_ALIGN); - __init_end = .; -diff --git a/arch/arm64/kvm/hyp/sysreg-sr.c b/arch/arm64/kvm/hyp/sysreg-sr.c -index 0f7c40e..9341376 100644 ---- a/arch/arm64/kvm/hyp/sysreg-sr.c -+++ b/arch/arm64/kvm/hyp/sysreg-sr.c -@@ -27,8 +27,8 @@ static void __hyp_text __sysreg_do_nothing(struct kvm_cpu_context *ctxt) { } - /* - * Non-VHE: Both host and guest must save everything. - * -- * VHE: Host must save tpidr*_el[01], actlr_el1, sp0, pc, pstate, and -- * guest must save everything. -+ * VHE: Host must save tpidr*_el[01], actlr_el1, mdscr_el1, sp0, pc, -+ * pstate, and guest must save everything. - */ - - static void __hyp_text __sysreg_save_common_state(struct kvm_cpu_context *ctxt) -@@ -37,6 +37,7 @@ static void __hyp_text __sysreg_save_common_state(struct kvm_cpu_context *ctxt) - ctxt->sys_regs[TPIDR_EL0] = read_sysreg(tpidr_el0); - ctxt->sys_regs[TPIDRRO_EL0] = read_sysreg(tpidrro_el0); - ctxt->sys_regs[TPIDR_EL1] = read_sysreg(tpidr_el1); -+ ctxt->sys_regs[MDSCR_EL1] = read_sysreg(mdscr_el1); - ctxt->gp_regs.regs.sp = read_sysreg(sp_el0); - ctxt->gp_regs.regs.pc = read_sysreg_el2(elr); - ctxt->gp_regs.regs.pstate = read_sysreg_el2(spsr); -@@ -61,7 +62,6 @@ static void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt) - ctxt->sys_regs[AMAIR_EL1] = read_sysreg_el1(amair); - ctxt->sys_regs[CNTKCTL_EL1] = read_sysreg_el1(cntkctl); - ctxt->sys_regs[PAR_EL1] = read_sysreg(par_el1); -- ctxt->sys_regs[MDSCR_EL1] = read_sysreg(mdscr_el1); - - ctxt->gp_regs.sp_el1 = read_sysreg(sp_el1); - ctxt->gp_regs.elr_el1 = read_sysreg_el1(elr); -@@ -90,6 +90,7 @@ static void __hyp_text __sysreg_restore_common_state(struct kvm_cpu_context *ctx - write_sysreg(ctxt->sys_regs[TPIDR_EL0], tpidr_el0); - write_sysreg(ctxt->sys_regs[TPIDRRO_EL0], tpidrro_el0); - write_sysreg(ctxt->sys_regs[TPIDR_EL1], tpidr_el1); -+ write_sysreg(ctxt->sys_regs[MDSCR_EL1], mdscr_el1); - write_sysreg(ctxt->gp_regs.regs.sp, sp_el0); - write_sysreg_el2(ctxt->gp_regs.regs.pc, elr); - write_sysreg_el2(ctxt->gp_regs.regs.pstate, spsr); -@@ -114,7 +115,6 @@ static void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt) - write_sysreg_el1(ctxt->sys_regs[AMAIR_EL1], amair); - write_sysreg_el1(ctxt->sys_regs[CNTKCTL_EL1], cntkctl); - write_sysreg(ctxt->sys_regs[PAR_EL1], par_el1); -- write_sysreg(ctxt->sys_regs[MDSCR_EL1], mdscr_el1); - - write_sysreg(ctxt->gp_regs.sp_el1, sp_el1); - write_sysreg_el1(ctxt->gp_regs.elr_el1, elr); -diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c -index e9e0e6d..898c0e6 100644 ---- a/arch/arm64/kvm/inject_fault.c -+++ b/arch/arm64/kvm/inject_fault.c -@@ -132,16 +132,14 @@ static u64 get_except_vector(struct kvm_vcpu *vcpu, enum exception_type type) - static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr) - { - unsigned long cpsr = *vcpu_cpsr(vcpu); -- bool is_aarch32; -+ bool is_aarch32 = vcpu_mode_is_32bit(vcpu); - u32 esr = 0; - -- is_aarch32 = vcpu_mode_is_32bit(vcpu); -- -- *vcpu_spsr(vcpu) = cpsr; - *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu); -- - *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); -+ - *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; -+ *vcpu_spsr(vcpu) = cpsr; - - vcpu_sys_reg(vcpu, FAR_EL1) = addr; - -@@ -172,11 +170,11 @@ static void inject_undef64(struct kvm_vcpu *vcpu) - unsigned long cpsr = *vcpu_cpsr(vcpu); - u32 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT); - -- *vcpu_spsr(vcpu) = cpsr; - *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu); -- - *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); -+ - *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; -+ *vcpu_spsr(vcpu) = cpsr; - - /* - * Build an unknown exception, depending on the instruction -diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c -index 0f85a46..3e90a2c 100644 ---- a/arch/arm64/mm/mmu.c -+++ b/arch/arm64/mm/mmu.c -@@ -748,9 +748,9 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot) - /* - * Check whether the physical FDT address is set and meets the minimum - * alignment requirement. Since we are relying on MIN_FDT_ALIGN to be -- * at least 8 bytes so that we can always access the size field of the -- * FDT header after mapping the first chunk, double check here if that -- * is indeed the case. -+ * at least 8 bytes so that we can always access the magic and size -+ * fields of the FDT header after mapping the first chunk, double check -+ * here if that is indeed the case. - */ - BUILD_BUG_ON(MIN_FDT_ALIGN < 8); - if (!dt_phys || dt_phys % MIN_FDT_ALIGN) -@@ -778,7 +778,7 @@ void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot) - create_mapping_noalloc(round_down(dt_phys, SWAPPER_BLOCK_SIZE), - dt_virt_base, SWAPPER_BLOCK_SIZE, prot); - -- if (fdt_check_header(dt_virt) != 0) -+ if (fdt_magic(dt_virt) != FDT_MAGIC) - return NULL; - - *size = fdt_totalsize(dt_virt); -diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S -index c431787..5bb61de 100644 ---- a/arch/arm64/mm/proc.S -+++ b/arch/arm64/mm/proc.S -@@ -180,6 +180,8 @@ ENTRY(__cpu_setup) - msr cpacr_el1, x0 // Enable FP/ASIMD - mov x0, #1 << 12 // Reset mdscr_el1 and disable - msr mdscr_el1, x0 // access to the DCC from EL0 -+ isb // Unmask debug exceptions now, -+ enable_dbg // since this is per-cpu - reset_pmuserenr_el0 x0 // Disable PMU access from EL0 - /* - * Memory region attributes for LPAE: -diff --git a/arch/metag/include/asm/cmpxchg_lnkget.h b/arch/metag/include/asm/cmpxchg_lnkget.h -index 0154e28..2369ad3 100644 ---- a/arch/metag/include/asm/cmpxchg_lnkget.h -+++ b/arch/metag/include/asm/cmpxchg_lnkget.h -@@ -73,7 +73,7 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, - " DCACHE [%2], %0\n" - #endif - "2:\n" -- : "=&d" (temp), "=&da" (retval) -+ : "=&d" (temp), "=&d" (retval) - : "da" (m), "bd" (old), "da" (new) - : "cc" - ); -diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c -index e4c21bb..804d2a2 100644 ---- a/arch/mips/kernel/cevt-r4k.c -+++ b/arch/mips/kernel/cevt-r4k.c -@@ -276,12 +276,7 @@ int r4k_clockevent_init(void) - CLOCK_EVT_FEAT_C3STOP | - CLOCK_EVT_FEAT_PERCPU; - -- clockevent_set_clock(cd, mips_hpt_frequency); -- -- /* Calculate the min / max delta */ -- cd->max_delta_ns = clockevent_delta2ns(0x7fffffff, cd); - min_delta = calculate_min_delta(); -- cd->min_delta_ns = clockevent_delta2ns(min_delta, cd); - - cd->rating = 300; - cd->irq = irq; -@@ -289,7 +284,7 @@ int r4k_clockevent_init(void) - cd->set_next_event = mips_next_event; - cd->event_handler = mips_event_handler; - -- clockevents_register_device(cd); -+ clockevents_config_and_register(cd, mips_hpt_frequency, min_delta, 0x7fffffff); - - if (cp0_timer_irq_installed) - return 0; -diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c -index 1f91056..d76275d 100644 ---- a/arch/mips/kernel/csrc-r4k.c -+++ b/arch/mips/kernel/csrc-r4k.c -@@ -23,7 +23,7 @@ static struct clocksource clocksource_mips = { - .flags = CLOCK_SOURCE_IS_CONTINUOUS, - }; - --static u64 notrace r4k_read_sched_clock(void) -+static u64 __maybe_unused notrace r4k_read_sched_clock(void) - { - return read_c0_count(); - } -@@ -82,7 +82,9 @@ int __init init_r4k_clocksource(void) - - clocksource_register_hz(&clocksource_mips, mips_hpt_frequency); - -+#ifndef CONFIG_CPU_FREQ - sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency); -+#endif - - return 0; - } -diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c -index 645c8a1..2b42a74 100644 ---- a/arch/mips/kvm/emulate.c -+++ b/arch/mips/kvm/emulate.c -@@ -1615,8 +1615,14 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, - - preempt_disable(); - if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) { -- if (kvm_mips_host_tlb_lookup(vcpu, va) < 0) -- kvm_mips_handle_kseg0_tlb_fault(va, vcpu); -+ if (kvm_mips_host_tlb_lookup(vcpu, va) < 0 && -+ kvm_mips_handle_kseg0_tlb_fault(va, vcpu)) { -+ kvm_err("%s: handling mapped kseg0 tlb fault for %lx, vcpu: %p, ASID: %#lx\n", -+ __func__, va, vcpu, read_c0_entryhi()); -+ er = EMULATE_FAIL; -+ preempt_enable(); -+ goto done; -+ } - } else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) || - KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) { - int index; -@@ -1654,14 +1660,19 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, - run, vcpu); - preempt_enable(); - goto dont_update_pc; -- } else { -- /* -- * We fault an entry from the guest tlb to the -- * shadow host TLB -- */ -- kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, -- NULL, -- NULL); -+ } -+ /* -+ * We fault an entry from the guest tlb to the -+ * shadow host TLB -+ */ -+ if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, -+ NULL, NULL)) { -+ kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", -+ __func__, va, index, vcpu, -+ read_c0_entryhi()); -+ er = EMULATE_FAIL; -+ preempt_enable(); -+ goto done; - } - } - } else { -@@ -2625,8 +2636,13 @@ enum emulation_result kvm_mips_handle_tlbmiss(unsigned long cause, - * OK we have a Guest TLB entry, now inject it into the - * shadow host TLB - */ -- kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, NULL, -- NULL); -+ if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, -+ NULL, NULL)) { -+ kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n", -+ __func__, va, index, vcpu, -+ read_c0_entryhi()); -+ er = EMULATE_FAIL; -+ } - } - } - -diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c -index ed021ae..ad2270f 100644 ---- a/arch/mips/kvm/tlb.c -+++ b/arch/mips/kvm/tlb.c -@@ -284,7 +284,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr, - } - - gfn = (KVM_GUEST_CPHYSADDR(badvaddr) >> PAGE_SHIFT); -- if (gfn >= kvm->arch.guest_pmap_npages) { -+ if ((gfn | 1) >= kvm->arch.guest_pmap_npages) { - kvm_err("%s: Invalid gfn: %#llx, BadVaddr: %#lx\n", __func__, - gfn, badvaddr); - kvm_mips_dump_host_tlbs(); -@@ -373,26 +373,40 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, - unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; - struct kvm *kvm = vcpu->kvm; - kvm_pfn_t pfn0, pfn1; -+ gfn_t gfn0, gfn1; -+ long tlb_lo[2]; - int ret; - -- if ((tlb->tlb_hi & VPN2_MASK) == 0) { -- pfn0 = 0; -- pfn1 = 0; -- } else { -- if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo0) -- >> PAGE_SHIFT) < 0) -- return -1; -- -- if (kvm_mips_map_page(kvm, mips3_tlbpfn_to_paddr(tlb->tlb_lo1) -- >> PAGE_SHIFT) < 0) -- return -1; -- -- pfn0 = kvm->arch.guest_pmap[mips3_tlbpfn_to_paddr(tlb->tlb_lo0) -- >> PAGE_SHIFT]; -- pfn1 = kvm->arch.guest_pmap[mips3_tlbpfn_to_paddr(tlb->tlb_lo1) -- >> PAGE_SHIFT]; -+ tlb_lo[0] = tlb->tlb_lo0; -+ tlb_lo[1] = tlb->tlb_lo1; -+ -+ /* -+ * The commpage address must not be mapped to anything else if the guest -+ * TLB contains entries nearby, or commpage accesses will break. -+ */ -+ if (!((tlb->tlb_hi ^ KVM_GUEST_COMMPAGE_ADDR) & -+ VPN2_MASK & (PAGE_MASK << 1))) -+ tlb_lo[(KVM_GUEST_COMMPAGE_ADDR >> PAGE_SHIFT) & 1] = 0; -+ -+ gfn0 = mips3_tlbpfn_to_paddr(tlb_lo[0]) >> PAGE_SHIFT; -+ gfn1 = mips3_tlbpfn_to_paddr(tlb_lo[1]) >> PAGE_SHIFT; -+ if (gfn0 >= kvm->arch.guest_pmap_npages || -+ gfn1 >= kvm->arch.guest_pmap_npages) { -+ kvm_err("%s: Invalid gfn: [%#llx, %#llx], EHi: %#lx\n", -+ __func__, gfn0, gfn1, tlb->tlb_hi); -+ kvm_mips_dump_guest_tlbs(vcpu); -+ return -1; - } - -+ if (kvm_mips_map_page(kvm, gfn0) < 0) -+ return -1; -+ -+ if (kvm_mips_map_page(kvm, gfn1) < 0) -+ return -1; -+ -+ pfn0 = kvm->arch.guest_pmap[gfn0]; -+ pfn1 = kvm->arch.guest_pmap[gfn1]; -+ - if (hpa0) - *hpa0 = pfn0 << PAGE_SHIFT; - -@@ -401,9 +415,9 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, - - /* Get attributes from the Guest TLB */ - entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) | -- (tlb->tlb_lo0 & MIPS3_PG_D) | (tlb->tlb_lo0 & MIPS3_PG_V); -+ (tlb_lo[0] & MIPS3_PG_D) | (tlb_lo[0] & MIPS3_PG_V); - entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | (0x3 << 3) | -- (tlb->tlb_lo1 & MIPS3_PG_D) | (tlb->tlb_lo1 & MIPS3_PG_V); -+ (tlb_lo[1] & MIPS3_PG_D) | (tlb_lo[1] & MIPS3_PG_V); - - kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, - tlb->tlb_lo0, tlb->tlb_lo1); -@@ -776,10 +790,16 @@ uint32_t kvm_get_inst(uint32_t *opc, struct kvm_vcpu *vcpu) - local_irq_restore(flags); - return KVM_INVALID_INST; - } -- kvm_mips_handle_mapped_seg_tlb_fault(vcpu, -- &vcpu->arch. -- guest_tlb[index], -- NULL, NULL); -+ if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, -+ &vcpu->arch.guest_tlb[index], -+ NULL, NULL)) { -+ kvm_err("%s: handling mapped seg tlb fault failed for %p, index: %u, vcpu: %p, ASID: %#lx\n", -+ __func__, opc, index, vcpu, -+ read_c0_entryhi()); -+ kvm_mips_dump_guest_tlbs(vcpu); -+ local_irq_restore(flags); -+ return KVM_INVALID_INST; -+ } - inst = *(opc); - } - local_irq_restore(flags); -diff --git a/arch/mips/loongson64/loongson-3/hpet.c b/arch/mips/loongson64/loongson-3/hpet.c -index 249039a..4788bea 100644 ---- a/arch/mips/loongson64/loongson-3/hpet.c -+++ b/arch/mips/loongson64/loongson-3/hpet.c -@@ -13,8 +13,8 @@ - #define SMBUS_PCI_REG64 0x64 - #define SMBUS_PCI_REGB4 0xb4 - --#define HPET_MIN_CYCLES 64 --#define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1)) -+#define HPET_MIN_CYCLES 16 -+#define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES * 12) - - static DEFINE_SPINLOCK(hpet_lock); - DEFINE_PER_CPU(struct clock_event_device, hpet_clockevent_device); -@@ -157,14 +157,14 @@ static int hpet_tick_resume(struct clock_event_device *evt) - static int hpet_next_event(unsigned long delta, - struct clock_event_device *evt) - { -- unsigned int cnt; -- int res; -+ u32 cnt; -+ s32 res; - - cnt = hpet_read(HPET_COUNTER); -- cnt += delta; -+ cnt += (u32) delta; - hpet_write(HPET_T0_CMP, cnt); - -- res = (int)(cnt - hpet_read(HPET_COUNTER)); -+ res = (s32)(cnt - hpet_read(HPET_COUNTER)); - - return res < HPET_MIN_CYCLES ? -ETIME : 0; - } -@@ -230,7 +230,7 @@ void __init setup_hpet_timer(void) - - cd = &per_cpu(hpet_clockevent_device, cpu); - cd->name = "hpet"; -- cd->rating = 320; -+ cd->rating = 100; - cd->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; - cd->set_state_shutdown = hpet_set_state_shutdown; - cd->set_state_periodic = hpet_set_state_periodic; -diff --git a/arch/mips/mm/uasm-mips.c b/arch/mips/mm/uasm-mips.c -index 9c2220a..45e3b87 100644 ---- a/arch/mips/mm/uasm-mips.c -+++ b/arch/mips/mm/uasm-mips.c -@@ -65,7 +65,7 @@ static struct insn insn_table[] = { - #ifndef CONFIG_CPU_MIPSR6 - { insn_cache, M(cache_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, - #else -- { insn_cache, M6(cache_op, 0, 0, 0, cache6_op), RS | RT | SIMM9 }, -+ { insn_cache, M6(spec3_op, 0, 0, 0, cache6_op), RS | RT | SIMM9 }, - #endif - { insn_daddiu, M(daddiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, - { insn_daddu, M(spec_op, 0, 0, 0, 0, daddu_op), RS | RT | RD }, -diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S -index b7019b5..298afcf 100644 ---- a/arch/powerpc/kernel/tm.S -+++ b/arch/powerpc/kernel/tm.S -@@ -338,8 +338,6 @@ _GLOBAL(__tm_recheckpoint) - */ - subi r7, r7, STACK_FRAME_OVERHEAD - -- SET_SCRATCH0(r1) -- - mfmsr r6 - /* R4 = original MSR to indicate whether thread used FP/Vector etc. */ - -@@ -468,6 +466,7 @@ restore_gprs: - * until we turn MSR RI back on. - */ - -+ SET_SCRATCH0(r1) - ld r5, -8(r1) - ld r1, -16(r1) - -diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S -index e571ad2..38e108e 100644 ---- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S -+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S -@@ -655,112 +655,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) - - #ifdef CONFIG_PPC_TRANSACTIONAL_MEM - BEGIN_FTR_SECTION -- b skip_tm --END_FTR_SECTION_IFCLR(CPU_FTR_TM) -- -- /* Turn on TM/FP/VSX/VMX so we can restore them. */ -- mfmsr r5 -- li r6, MSR_TM >> 32 -- sldi r6, r6, 32 -- or r5, r5, r6 -- ori r5, r5, MSR_FP -- oris r5, r5, (MSR_VEC | MSR_VSX)@h -- mtmsrd r5 -- -- /* -- * The user may change these outside of a transaction, so they must -- * always be context switched. -- */ -- ld r5, VCPU_TFHAR(r4) -- ld r6, VCPU_TFIAR(r4) -- ld r7, VCPU_TEXASR(r4) -- mtspr SPRN_TFHAR, r5 -- mtspr SPRN_TFIAR, r6 -- mtspr SPRN_TEXASR, r7 -- -- ld r5, VCPU_MSR(r4) -- rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 -- beq skip_tm /* TM not active in guest */ -- -- /* Make sure the failure summary is set, otherwise we'll program check -- * when we trechkpt. It's possible that this might have been not set -- * on a kvmppc_set_one_reg() call but we shouldn't let this crash the -- * host. -- */ -- oris r7, r7, (TEXASR_FS)@h -- mtspr SPRN_TEXASR, r7 -- -- /* -- * We need to load up the checkpointed state for the guest. -- * We need to do this early as it will blow away any GPRs, VSRs and -- * some SPRs. -- */ -- -- mr r31, r4 -- addi r3, r31, VCPU_FPRS_TM -- bl load_fp_state -- addi r3, r31, VCPU_VRS_TM -- bl load_vr_state -- mr r4, r31 -- lwz r7, VCPU_VRSAVE_TM(r4) -- mtspr SPRN_VRSAVE, r7 -- -- ld r5, VCPU_LR_TM(r4) -- lwz r6, VCPU_CR_TM(r4) -- ld r7, VCPU_CTR_TM(r4) -- ld r8, VCPU_AMR_TM(r4) -- ld r9, VCPU_TAR_TM(r4) -- mtlr r5 -- mtcr r6 -- mtctr r7 -- mtspr SPRN_AMR, r8 -- mtspr SPRN_TAR, r9 -- -- /* -- * Load up PPR and DSCR values but don't put them in the actual SPRs -- * till the last moment to avoid running with userspace PPR and DSCR for -- * too long. -- */ -- ld r29, VCPU_DSCR_TM(r4) -- ld r30, VCPU_PPR_TM(r4) -- -- std r2, PACATMSCRATCH(r13) /* Save TOC */ -- -- /* Clear the MSR RI since r1, r13 are all going to be foobar. */ -- li r5, 0 -- mtmsrd r5, 1 -- -- /* Load GPRs r0-r28 */ -- reg = 0 -- .rept 29 -- ld reg, VCPU_GPRS_TM(reg)(r31) -- reg = reg + 1 -- .endr -- -- mtspr SPRN_DSCR, r29 -- mtspr SPRN_PPR, r30 -- -- /* Load final GPRs */ -- ld 29, VCPU_GPRS_TM(29)(r31) -- ld 30, VCPU_GPRS_TM(30)(r31) -- ld 31, VCPU_GPRS_TM(31)(r31) -- -- /* TM checkpointed state is now setup. All GPRs are now volatile. */ -- TRECHKPT -- -- /* Now let's get back the state we need. */ -- HMT_MEDIUM -- GET_PACA(r13) -- ld r29, HSTATE_DSCR(r13) -- mtspr SPRN_DSCR, r29 -- ld r4, HSTATE_KVM_VCPU(r13) -- ld r1, HSTATE_HOST_R1(r13) -- ld r2, PACATMSCRATCH(r13) -- -- /* Set the MSR RI since we have our registers back. */ -- li r5, MSR_RI -- mtmsrd r5, 1 --skip_tm: -+ bl kvmppc_restore_tm -+END_FTR_SECTION_IFSET(CPU_FTR_TM) - #endif - - /* Load guest PMU registers */ -@@ -841,12 +737,6 @@ BEGIN_FTR_SECTION - /* Skip next section on POWER7 */ - b 8f - END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) -- /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */ -- mfmsr r8 -- li r0, 1 -- rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG -- mtmsrd r8 -- - /* Load up POWER8-specific registers */ - ld r5, VCPU_IAMR(r4) - lwz r6, VCPU_PSPB(r4) -@@ -1436,106 +1326,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) - - #ifdef CONFIG_PPC_TRANSACTIONAL_MEM - BEGIN_FTR_SECTION -- b 2f --END_FTR_SECTION_IFCLR(CPU_FTR_TM) -- /* Turn on TM. */ -- mfmsr r8 -- li r0, 1 -- rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG -- mtmsrd r8 -- -- ld r5, VCPU_MSR(r9) -- rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 -- beq 1f /* TM not active in guest. */ -- -- li r3, TM_CAUSE_KVM_RESCHED -- -- /* Clear the MSR RI since r1, r13 are all going to be foobar. */ -- li r5, 0 -- mtmsrd r5, 1 -- -- /* All GPRs are volatile at this point. */ -- TRECLAIM(R3) -- -- /* Temporarily store r13 and r9 so we have some regs to play with */ -- SET_SCRATCH0(r13) -- GET_PACA(r13) -- std r9, PACATMSCRATCH(r13) -- ld r9, HSTATE_KVM_VCPU(r13) -- -- /* Get a few more GPRs free. */ -- std r29, VCPU_GPRS_TM(29)(r9) -- std r30, VCPU_GPRS_TM(30)(r9) -- std r31, VCPU_GPRS_TM(31)(r9) -- -- /* Save away PPR and DSCR soon so don't run with user values. */ -- mfspr r31, SPRN_PPR -- HMT_MEDIUM -- mfspr r30, SPRN_DSCR -- ld r29, HSTATE_DSCR(r13) -- mtspr SPRN_DSCR, r29 -- -- /* Save all but r9, r13 & r29-r31 */ -- reg = 0 -- .rept 29 -- .if (reg != 9) && (reg != 13) -- std reg, VCPU_GPRS_TM(reg)(r9) -- .endif -- reg = reg + 1 -- .endr -- /* ... now save r13 */ -- GET_SCRATCH0(r4) -- std r4, VCPU_GPRS_TM(13)(r9) -- /* ... and save r9 */ -- ld r4, PACATMSCRATCH(r13) -- std r4, VCPU_GPRS_TM(9)(r9) -- -- /* Reload stack pointer and TOC. */ -- ld r1, HSTATE_HOST_R1(r13) -- ld r2, PACATOC(r13) -- -- /* Set MSR RI now we have r1 and r13 back. */ -- li r5, MSR_RI -- mtmsrd r5, 1 -- -- /* Save away checkpinted SPRs. */ -- std r31, VCPU_PPR_TM(r9) -- std r30, VCPU_DSCR_TM(r9) -- mflr r5 -- mfcr r6 -- mfctr r7 -- mfspr r8, SPRN_AMR -- mfspr r10, SPRN_TAR -- std r5, VCPU_LR_TM(r9) -- stw r6, VCPU_CR_TM(r9) -- std r7, VCPU_CTR_TM(r9) -- std r8, VCPU_AMR_TM(r9) -- std r10, VCPU_TAR_TM(r9) -- -- /* Restore r12 as trap number. */ -- lwz r12, VCPU_TRAP(r9) -- -- /* Save FP/VSX. */ -- addi r3, r9, VCPU_FPRS_TM -- bl store_fp_state -- addi r3, r9, VCPU_VRS_TM -- bl store_vr_state -- mfspr r6, SPRN_VRSAVE -- stw r6, VCPU_VRSAVE_TM(r9) --1: -- /* -- * We need to save these SPRs after the treclaim so that the software -- * error code is recorded correctly in the TEXASR. Also the user may -- * change these outside of a transaction, so they must always be -- * context switched. -- */ -- mfspr r5, SPRN_TFHAR -- mfspr r6, SPRN_TFIAR -- mfspr r7, SPRN_TEXASR -- std r5, VCPU_TFHAR(r9) -- std r6, VCPU_TFIAR(r9) -- std r7, VCPU_TEXASR(r9) --2: -+ bl kvmppc_save_tm -+END_FTR_SECTION_IFSET(CPU_FTR_TM) - #endif - - /* Increment yield count if they have a VPA */ -@@ -2245,6 +2037,13 @@ _GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */ - /* save FP state */ - bl kvmppc_save_fp - -+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM -+BEGIN_FTR_SECTION -+ ld r9, HSTATE_KVM_VCPU(r13) -+ bl kvmppc_save_tm -+END_FTR_SECTION_IFSET(CPU_FTR_TM) -+#endif -+ - /* - * Set DEC to the smaller of DEC and HDEC, so that we wake - * no later than the end of our timeslice (HDEC interrupts -@@ -2321,6 +2120,12 @@ kvm_end_cede: - bl kvmhv_accumulate_time - #endif - -+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM -+BEGIN_FTR_SECTION -+ bl kvmppc_restore_tm -+END_FTR_SECTION_IFSET(CPU_FTR_TM) -+#endif -+ - /* load up FP state */ - bl kvmppc_load_fp - -@@ -2631,6 +2436,239 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) - mr r4,r31 - blr - -+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM -+/* -+ * Save transactional state and TM-related registers. -+ * Called with r9 pointing to the vcpu struct. -+ * This can modify all checkpointed registers, but -+ * restores r1, r2 and r9 (vcpu pointer) before exit. -+ */ -+kvmppc_save_tm: -+ mflr r0 -+ std r0, PPC_LR_STKOFF(r1) -+ -+ /* Turn on TM. */ -+ mfmsr r8 -+ li r0, 1 -+ rldimi r8, r0, MSR_TM_LG, 63-MSR_TM_LG -+ mtmsrd r8 -+ -+ ld r5, VCPU_MSR(r9) -+ rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 -+ beq 1f /* TM not active in guest. */ -+ -+ std r1, HSTATE_HOST_R1(r13) -+ li r3, TM_CAUSE_KVM_RESCHED -+ -+ /* Clear the MSR RI since r1, r13 are all going to be foobar. */ -+ li r5, 0 -+ mtmsrd r5, 1 -+ -+ /* All GPRs are volatile at this point. */ -+ TRECLAIM(R3) -+ -+ /* Temporarily store r13 and r9 so we have some regs to play with */ -+ SET_SCRATCH0(r13) -+ GET_PACA(r13) -+ std r9, PACATMSCRATCH(r13) -+ ld r9, HSTATE_KVM_VCPU(r13) -+ -+ /* Get a few more GPRs free. */ -+ std r29, VCPU_GPRS_TM(29)(r9) -+ std r30, VCPU_GPRS_TM(30)(r9) -+ std r31, VCPU_GPRS_TM(31)(r9) -+ -+ /* Save away PPR and DSCR soon so don't run with user values. */ -+ mfspr r31, SPRN_PPR -+ HMT_MEDIUM -+ mfspr r30, SPRN_DSCR -+ ld r29, HSTATE_DSCR(r13) -+ mtspr SPRN_DSCR, r29 -+ -+ /* Save all but r9, r13 & r29-r31 */ -+ reg = 0 -+ .rept 29 -+ .if (reg != 9) && (reg != 13) -+ std reg, VCPU_GPRS_TM(reg)(r9) -+ .endif -+ reg = reg + 1 -+ .endr -+ /* ... now save r13 */ -+ GET_SCRATCH0(r4) -+ std r4, VCPU_GPRS_TM(13)(r9) -+ /* ... and save r9 */ -+ ld r4, PACATMSCRATCH(r13) -+ std r4, VCPU_GPRS_TM(9)(r9) -+ -+ /* Reload stack pointer and TOC. */ -+ ld r1, HSTATE_HOST_R1(r13) -+ ld r2, PACATOC(r13) -+ -+ /* Set MSR RI now we have r1 and r13 back. */ -+ li r5, MSR_RI -+ mtmsrd r5, 1 -+ -+ /* Save away checkpinted SPRs. */ -+ std r31, VCPU_PPR_TM(r9) -+ std r30, VCPU_DSCR_TM(r9) -+ mflr r5 -+ mfcr r6 -+ mfctr r7 -+ mfspr r8, SPRN_AMR -+ mfspr r10, SPRN_TAR -+ std r5, VCPU_LR_TM(r9) -+ stw r6, VCPU_CR_TM(r9) -+ std r7, VCPU_CTR_TM(r9) -+ std r8, VCPU_AMR_TM(r9) -+ std r10, VCPU_TAR_TM(r9) -+ -+ /* Restore r12 as trap number. */ -+ lwz r12, VCPU_TRAP(r9) -+ -+ /* Save FP/VSX. */ -+ addi r3, r9, VCPU_FPRS_TM -+ bl store_fp_state -+ addi r3, r9, VCPU_VRS_TM -+ bl store_vr_state -+ mfspr r6, SPRN_VRSAVE -+ stw r6, VCPU_VRSAVE_TM(r9) -+1: -+ /* -+ * We need to save these SPRs after the treclaim so that the software -+ * error code is recorded correctly in the TEXASR. Also the user may -+ * change these outside of a transaction, so they must always be -+ * context switched. -+ */ -+ mfspr r5, SPRN_TFHAR -+ mfspr r6, SPRN_TFIAR -+ mfspr r7, SPRN_TEXASR -+ std r5, VCPU_TFHAR(r9) -+ std r6, VCPU_TFIAR(r9) -+ std r7, VCPU_TEXASR(r9) -+ -+ ld r0, PPC_LR_STKOFF(r1) -+ mtlr r0 -+ blr -+ -+/* -+ * Restore transactional state and TM-related registers. -+ * Called with r4 pointing to the vcpu struct. -+ * This potentially modifies all checkpointed registers. -+ * It restores r1, r2, r4 from the PACA. -+ */ -+kvmppc_restore_tm: -+ mflr r0 -+ std r0, PPC_LR_STKOFF(r1) -+ -+ /* Turn on TM/FP/VSX/VMX so we can restore them. */ -+ mfmsr r5 -+ li r6, MSR_TM >> 32 -+ sldi r6, r6, 32 -+ or r5, r5, r6 -+ ori r5, r5, MSR_FP -+ oris r5, r5, (MSR_VEC | MSR_VSX)@h -+ mtmsrd r5 -+ -+ /* -+ * The user may change these outside of a transaction, so they must -+ * always be context switched. -+ */ -+ ld r5, VCPU_TFHAR(r4) -+ ld r6, VCPU_TFIAR(r4) -+ ld r7, VCPU_TEXASR(r4) -+ mtspr SPRN_TFHAR, r5 -+ mtspr SPRN_TFIAR, r6 -+ mtspr SPRN_TEXASR, r7 -+ -+ ld r5, VCPU_MSR(r4) -+ rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 -+ beqlr /* TM not active in guest */ -+ std r1, HSTATE_HOST_R1(r13) -+ -+ /* Make sure the failure summary is set, otherwise we'll program check -+ * when we trechkpt. It's possible that this might have been not set -+ * on a kvmppc_set_one_reg() call but we shouldn't let this crash the -+ * host. -+ */ -+ oris r7, r7, (TEXASR_FS)@h -+ mtspr SPRN_TEXASR, r7 -+ -+ /* -+ * We need to load up the checkpointed state for the guest. -+ * We need to do this early as it will blow away any GPRs, VSRs and -+ * some SPRs. -+ */ -+ -+ mr r31, r4 -+ addi r3, r31, VCPU_FPRS_TM -+ bl load_fp_state -+ addi r3, r31, VCPU_VRS_TM -+ bl load_vr_state -+ mr r4, r31 -+ lwz r7, VCPU_VRSAVE_TM(r4) -+ mtspr SPRN_VRSAVE, r7 -+ -+ ld r5, VCPU_LR_TM(r4) -+ lwz r6, VCPU_CR_TM(r4) -+ ld r7, VCPU_CTR_TM(r4) -+ ld r8, VCPU_AMR_TM(r4) -+ ld r9, VCPU_TAR_TM(r4) -+ mtlr r5 -+ mtcr r6 -+ mtctr r7 -+ mtspr SPRN_AMR, r8 -+ mtspr SPRN_TAR, r9 -+ -+ /* -+ * Load up PPR and DSCR values but don't put them in the actual SPRs -+ * till the last moment to avoid running with userspace PPR and DSCR for -+ * too long. -+ */ -+ ld r29, VCPU_DSCR_TM(r4) -+ ld r30, VCPU_PPR_TM(r4) -+ -+ std r2, PACATMSCRATCH(r13) /* Save TOC */ -+ -+ /* Clear the MSR RI since r1, r13 are all going to be foobar. */ -+ li r5, 0 -+ mtmsrd r5, 1 -+ -+ /* Load GPRs r0-r28 */ -+ reg = 0 -+ .rept 29 -+ ld reg, VCPU_GPRS_TM(reg)(r31) -+ reg = reg + 1 -+ .endr -+ -+ mtspr SPRN_DSCR, r29 -+ mtspr SPRN_PPR, r30 -+ -+ /* Load final GPRs */ -+ ld 29, VCPU_GPRS_TM(29)(r31) -+ ld 30, VCPU_GPRS_TM(30)(r31) -+ ld 31, VCPU_GPRS_TM(31)(r31) -+ -+ /* TM checkpointed state is now setup. All GPRs are now volatile. */ -+ TRECHKPT -+ -+ /* Now let's get back the state we need. */ -+ HMT_MEDIUM -+ GET_PACA(r13) -+ ld r29, HSTATE_DSCR(r13) -+ mtspr SPRN_DSCR, r29 -+ ld r4, HSTATE_KVM_VCPU(r13) -+ ld r1, HSTATE_HOST_R1(r13) -+ ld r2, PACATMSCRATCH(r13) -+ -+ /* Set the MSR RI since we have our registers back. */ -+ li r5, MSR_RI -+ mtmsrd r5, 1 -+ -+ ld r0, PPC_LR_STKOFF(r1) -+ mtlr r0 -+ blr -+#endif -+ - /* - * We come here if we get any exception or interrupt while we are - * executing host real mode code while in guest MMU context. -diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h -index 18d2beb..42b968a8 100644 ---- a/arch/s390/include/asm/pgtable.h -+++ b/arch/s390/include/asm/pgtable.h -@@ -893,7 +893,7 @@ void ptep_zap_key(struct mm_struct *mm, unsigned long addr, pte_t *ptep); - bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long address); - int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, - unsigned char key, bool nq); --unsigned char get_guest_storage_key(struct mm_struct *mm, unsigned long addr); -+unsigned long get_guest_storage_key(struct mm_struct *mm, unsigned long addr); - - /* - * Certain architectures need to do special things when PTEs -diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h -index a2e6ef3..0a20316 100644 ---- a/arch/s390/include/asm/tlbflush.h -+++ b/arch/s390/include/asm/tlbflush.h -@@ -81,7 +81,8 @@ static inline void __tlb_flush_full(struct mm_struct *mm) - } - - /* -- * Flush TLB entries for a specific ASCE on all CPUs. -+ * Flush TLB entries for a specific ASCE on all CPUs. Should never be used -+ * when more than one asce (e.g. gmap) ran on this mm. - */ - static inline void __tlb_flush_asce(struct mm_struct *mm, unsigned long asce) - { -diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c -index cace818..313c3b8 100644 ---- a/arch/s390/mm/gmap.c -+++ b/arch/s390/mm/gmap.c -@@ -85,7 +85,7 @@ EXPORT_SYMBOL_GPL(gmap_alloc); - static void gmap_flush_tlb(struct gmap *gmap) - { - if (MACHINE_HAS_IDTE) -- __tlb_flush_asce(gmap->mm, gmap->asce); -+ __tlb_flush_idte(gmap->asce); - else - __tlb_flush_global(); - } -@@ -124,7 +124,7 @@ void gmap_free(struct gmap *gmap) - - /* Flush tlb. */ - if (MACHINE_HAS_IDTE) -- __tlb_flush_asce(gmap->mm, gmap->asce); -+ __tlb_flush_idte(gmap->asce); - else - __tlb_flush_global(); - -diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c -index 9f0ce0e..ebb4f87 100644 ---- a/arch/s390/mm/pgtable.c -+++ b/arch/s390/mm/pgtable.c -@@ -543,7 +543,7 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, - } - EXPORT_SYMBOL(set_guest_storage_key); - --unsigned char get_guest_storage_key(struct mm_struct *mm, unsigned long addr) -+unsigned long get_guest_storage_key(struct mm_struct *mm, unsigned long addr) - { - unsigned char key; - spinlock_t *ptl; -diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c -index 8acaf4e..a86d7cc 100644 ---- a/arch/um/os-Linux/signal.c -+++ b/arch/um/os-Linux/signal.c -@@ -15,6 +15,7 @@ - #include <kern_util.h> - #include <os.h> - #include <sysdep/mcontext.h> -+#include <um_malloc.h> - - void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = { - [SIGTRAP] = relay_signal, -@@ -32,7 +33,7 @@ static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc) - struct uml_pt_regs *r; - int save_errno = errno; - -- r = malloc(sizeof(struct uml_pt_regs)); -+ r = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); - if (!r) - panic("out of memory"); - -@@ -91,7 +92,7 @@ static void timer_real_alarm_handler(mcontext_t *mc) - { - struct uml_pt_regs *regs; - -- regs = malloc(sizeof(struct uml_pt_regs)); -+ regs = uml_kmalloc(sizeof(struct uml_pt_regs), UM_GFP_ATOMIC); - if (!regs) - panic("out of memory"); - -diff --git a/arch/unicore32/include/asm/mmu_context.h b/arch/unicore32/include/asm/mmu_context.h -index e35632e..62dfc64 100644 ---- a/arch/unicore32/include/asm/mmu_context.h -+++ b/arch/unicore32/include/asm/mmu_context.h -@@ -98,7 +98,7 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, - } - - static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, -- bool write, bool foreign) -+ bool write, bool execute, bool foreign) - { - /* by default, allow everything */ - return true; -diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c -index 874e8bd..bd136ac 100644 ---- a/arch/x86/events/intel/uncore_snbep.c -+++ b/arch/x86/events/intel/uncore_snbep.c -@@ -2546,7 +2546,7 @@ void hswep_uncore_cpu_init(void) - - static struct intel_uncore_type hswep_uncore_ha = { - .name = "ha", -- .num_counters = 5, -+ .num_counters = 4, - .num_boxes = 2, - .perf_ctr_bits = 48, - SNBEP_UNCORE_PCI_COMMON_INIT(), -@@ -2565,7 +2565,7 @@ static struct uncore_event_desc hswep_uncore_imc_events[] = { - - static struct intel_uncore_type hswep_uncore_imc = { - .name = "imc", -- .num_counters = 5, -+ .num_counters = 4, - .num_boxes = 8, - .perf_ctr_bits = 48, - .fixed_ctr_bits = 48, -@@ -2611,7 +2611,7 @@ static struct intel_uncore_type hswep_uncore_irp = { - - static struct intel_uncore_type hswep_uncore_qpi = { - .name = "qpi", -- .num_counters = 5, -+ .num_counters = 4, - .num_boxes = 3, - .perf_ctr_bits = 48, - .perf_ctr = SNBEP_PCI_PMON_CTR0, -@@ -2693,7 +2693,7 @@ static struct event_constraint hswep_uncore_r3qpi_constraints[] = { - - static struct intel_uncore_type hswep_uncore_r3qpi = { - .name = "r3qpi", -- .num_counters = 4, -+ .num_counters = 3, - .num_boxes = 3, - .perf_ctr_bits = 44, - .constraints = hswep_uncore_r3qpi_constraints, -@@ -2892,7 +2892,7 @@ static struct intel_uncore_type bdx_uncore_ha = { - - static struct intel_uncore_type bdx_uncore_imc = { - .name = "imc", -- .num_counters = 5, -+ .num_counters = 4, - .num_boxes = 8, - .perf_ctr_bits = 48, - .fixed_ctr_bits = 48, -diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c -index c146f3c..0149ac5 100644 ---- a/arch/x86/kvm/mtrr.c -+++ b/arch/x86/kvm/mtrr.c -@@ -539,6 +539,7 @@ static void mtrr_lookup_var_start(struct mtrr_iter *iter) - - iter->fixed = false; - iter->start_max = iter->start; -+ iter->range = NULL; - iter->range = list_prepare_entry(iter->range, &mtrr_state->head, node); - - __mtrr_lookup_var_next(iter); -diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c -index 64a79f2..8326d68 100644 ---- a/arch/x86/kvm/vmx.c -+++ b/arch/x86/kvm/vmx.c -@@ -8224,6 +8224,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu) - if ((vectoring_info & VECTORING_INFO_VALID_MASK) && - (exit_reason != EXIT_REASON_EXCEPTION_NMI && - exit_reason != EXIT_REASON_EPT_VIOLATION && -+ exit_reason != EXIT_REASON_PML_FULL && - exit_reason != EXIT_REASON_TASK_SWITCH)) { - vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR; - vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV; -@@ -8854,6 +8855,22 @@ static void vmx_load_vmcs01(struct kvm_vcpu *vcpu) - put_cpu(); - } - -+/* -+ * Ensure that the current vmcs of the logical processor is the -+ * vmcs01 of the vcpu before calling free_nested(). -+ */ -+static void vmx_free_vcpu_nested(struct kvm_vcpu *vcpu) -+{ -+ struct vcpu_vmx *vmx = to_vmx(vcpu); -+ int r; -+ -+ r = vcpu_load(vcpu); -+ BUG_ON(r); -+ vmx_load_vmcs01(vcpu); -+ free_nested(vmx); -+ vcpu_put(vcpu); -+} -+ - static void vmx_free_vcpu(struct kvm_vcpu *vcpu) - { - struct vcpu_vmx *vmx = to_vmx(vcpu); -@@ -8862,8 +8879,7 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) - vmx_destroy_pml_buffer(vmx); - free_vpid(vmx->vpid); - leave_guest_mode(vcpu); -- vmx_load_vmcs01(vcpu); -- free_nested(vmx); -+ vmx_free_vcpu_nested(vcpu); - free_loaded_vmcs(vmx->loaded_vmcs); - kfree(vmx->guest_msrs); - kvm_vcpu_uninit(vcpu); -diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index 7da5dd2..fea2c57 100644 ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -91,6 +91,7 @@ static u64 __read_mostly efer_reserved_bits = ~((u64)EFER_SCE); - - static void update_cr8_intercept(struct kvm_vcpu *vcpu); - static void process_nmi(struct kvm_vcpu *vcpu); -+static void process_smi(struct kvm_vcpu *vcpu); - static void __kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags); - - struct kvm_x86_ops *kvm_x86_ops __read_mostly; -@@ -5296,13 +5297,8 @@ static void kvm_smm_changed(struct kvm_vcpu *vcpu) - /* This is a good place to trace that we are exiting SMM. */ - trace_kvm_enter_smm(vcpu->vcpu_id, vcpu->arch.smbase, false); - -- if (unlikely(vcpu->arch.smi_pending)) { -- kvm_make_request(KVM_REQ_SMI, vcpu); -- vcpu->arch.smi_pending = 0; -- } else { -- /* Process a latched INIT, if any. */ -- kvm_make_request(KVM_REQ_EVENT, vcpu); -- } -+ /* Process a latched INIT or SMI, if any. */ -+ kvm_make_request(KVM_REQ_EVENT, vcpu); - } - - kvm_mmu_reset_context(vcpu); -@@ -6102,7 +6098,10 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) - } - - /* try to inject new event if pending */ -- if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) { -+ if (vcpu->arch.smi_pending && !is_smm(vcpu)) { -+ vcpu->arch.smi_pending = false; -+ process_smi(vcpu); -+ } else if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) { - --vcpu->arch.nmi_pending; - vcpu->arch.nmi_injected = true; - kvm_x86_ops->set_nmi(vcpu); -@@ -6312,11 +6311,6 @@ static void process_smi(struct kvm_vcpu *vcpu) - char buf[512]; - u32 cr0; - -- if (is_smm(vcpu)) { -- vcpu->arch.smi_pending = true; -- return; -- } -- - trace_kvm_enter_smm(vcpu->vcpu_id, vcpu->arch.smbase, true); - vcpu->arch.hflags |= HF_SMM_MASK; - memset(buf, 0, 512); -@@ -6379,6 +6373,12 @@ static void process_smi(struct kvm_vcpu *vcpu) - kvm_mmu_reset_context(vcpu); - } - -+static void process_smi_request(struct kvm_vcpu *vcpu) -+{ -+ vcpu->arch.smi_pending = true; -+ kvm_make_request(KVM_REQ_EVENT, vcpu); -+} -+ - void kvm_make_scan_ioapic_request(struct kvm *kvm) - { - kvm_make_all_cpus_request(kvm, KVM_REQ_SCAN_IOAPIC); -@@ -6500,7 +6500,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) - if (kvm_check_request(KVM_REQ_STEAL_UPDATE, vcpu)) - record_steal_time(vcpu); - if (kvm_check_request(KVM_REQ_SMI, vcpu)) -- process_smi(vcpu); -+ process_smi_request(vcpu); - if (kvm_check_request(KVM_REQ_NMI, vcpu)) - process_nmi(vcpu); - if (kvm_check_request(KVM_REQ_PMU, vcpu)) -@@ -6573,8 +6573,18 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) - - if (inject_pending_event(vcpu, req_int_win) != 0) - req_immediate_exit = true; -- /* enable NMI/IRQ window open exits if needed */ - else { -+ /* Enable NMI/IRQ window open exits if needed. -+ * -+ * SMIs have two cases: 1) they can be nested, and -+ * then there is nothing to do here because RSM will -+ * cause a vmexit anyway; 2) or the SMI can be pending -+ * because inject_pending_event has completed the -+ * injection of an IRQ or NMI from the previous vmexit, -+ * and then we request an immediate exit to inject the SMI. -+ */ -+ if (vcpu->arch.smi_pending && !is_smm(vcpu)) -+ req_immediate_exit = true; - if (vcpu->arch.nmi_pending) - kvm_x86_ops->enable_nmi_window(vcpu); - if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) -@@ -6625,8 +6635,10 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) - - kvm_load_guest_xcr0(vcpu); - -- if (req_immediate_exit) -+ if (req_immediate_exit) { -+ kvm_make_request(KVM_REQ_EVENT, vcpu); - smp_send_reschedule(vcpu->cpu); -+ } - - trace_kvm_entry(vcpu->vcpu_id); - wait_lapic_expire(vcpu); -@@ -7427,6 +7439,7 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) - { - vcpu->arch.hflags = 0; - -+ vcpu->arch.smi_pending = 0; - atomic_set(&vcpu->arch.nmi_queued, 0); - vcpu->arch.nmi_pending = 0; - vcpu->arch.nmi_injected = false; -diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c -index 8b93e63..ae97f24 100644 ---- a/arch/x86/pci/intel_mid_pci.c -+++ b/arch/x86/pci/intel_mid_pci.c -@@ -37,6 +37,7 @@ - - /* Quirks for the listed devices */ - #define PCI_DEVICE_ID_INTEL_MRFL_MMC 0x1190 -+#define PCI_DEVICE_ID_INTEL_MRFL_HSU 0x1191 - - /* Fixed BAR fields */ - #define PCIE_VNDR_CAP_ID_FIXED_BAR 0x00 /* Fixed BAR (TBD) */ -@@ -225,13 +226,20 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) - /* Special treatment for IRQ0 */ - if (dev->irq == 0) { - /* -+ * Skip HS UART common registers device since it has -+ * IRQ0 assigned and not used by the kernel. -+ */ -+ if (dev->device == PCI_DEVICE_ID_INTEL_MRFL_HSU) -+ return -EBUSY; -+ /* - * TNG has IRQ0 assigned to eMMC controller. But there - * are also other devices with bogus PCI configuration - * that have IRQ0 assigned. This check ensures that -- * eMMC gets it. -+ * eMMC gets it. The rest of devices still could be -+ * enabled without interrupt line being allocated. - */ - if (dev->device != PCI_DEVICE_ID_INTEL_MRFL_MMC) -- return -EBUSY; -+ return 0; - } - break; - default: -diff --git a/block/bio.c b/block/bio.c -index 0e4aa42..4623869 100644 ---- a/block/bio.c -+++ b/block/bio.c -@@ -579,6 +579,8 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) - bio->bi_rw = bio_src->bi_rw; - bio->bi_iter = bio_src->bi_iter; - bio->bi_io_vec = bio_src->bi_io_vec; -+ -+ bio_clone_blkcg_association(bio, bio_src); - } - EXPORT_SYMBOL(__bio_clone_fast); - -@@ -684,6 +686,8 @@ integrity_clone: - } - } - -+ bio_clone_blkcg_association(bio, bio_src); -+ - return bio; - } - EXPORT_SYMBOL(bio_clone_bioset); -@@ -2005,6 +2009,17 @@ void bio_disassociate_task(struct bio *bio) - } - } - -+/** -+ * bio_clone_blkcg_association - clone blkcg association from src to dst bio -+ * @dst: destination bio -+ * @src: source bio -+ */ -+void bio_clone_blkcg_association(struct bio *dst, struct bio *src) -+{ -+ if (src->bi_css) -+ WARN_ON(bio_associate_blkcg(dst, src->bi_css)); -+} -+ - #endif /* CONFIG_BLK_CGROUP */ - - static void __init biovec_init_slabs(void) -diff --git a/block/genhd.c b/block/genhd.c -index 3eebd25..086f1a3 100644 ---- a/block/genhd.c -+++ b/block/genhd.c -@@ -613,7 +613,7 @@ void add_disk(struct gendisk *disk) - - /* Register BDI before referencing it from bdev */ - bdi = &disk->queue->backing_dev_info; -- bdi_register_dev(bdi, disk_devt(disk)); -+ bdi_register_owner(bdi, disk_to_dev(disk)); - - blk_register_region(disk_devt(disk), disk->minors, NULL, - exact_match, exact_lock, disk); -diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c -index 290d6f5..f4218df 100644 ---- a/drivers/acpi/ec.c -+++ b/drivers/acpi/ec.c -@@ -101,6 +101,7 @@ enum ec_command { - #define ACPI_EC_UDELAY_POLL 550 /* Wait 1ms for EC transaction polling */ - #define ACPI_EC_CLEAR_MAX 100 /* Maximum number of events to query - * when trying to clear the EC */ -+#define ACPI_EC_MAX_QUERIES 16 /* Maximum number of parallel queries */ - - enum { - EC_FLAGS_QUERY_PENDING, /* Query is pending */ -@@ -121,6 +122,10 @@ static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY; - module_param(ec_delay, uint, 0644); - MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes"); - -+static unsigned int ec_max_queries __read_mostly = ACPI_EC_MAX_QUERIES; -+module_param(ec_max_queries, uint, 0644); -+MODULE_PARM_DESC(ec_max_queries, "Maximum parallel _Qxx evaluations"); -+ - static bool ec_busy_polling __read_mostly; - module_param(ec_busy_polling, bool, 0644); - MODULE_PARM_DESC(ec_busy_polling, "Use busy polling to advance EC transaction"); -@@ -174,6 +179,7 @@ static void acpi_ec_event_processor(struct work_struct *work); - - struct acpi_ec *boot_ec, *first_ec; - EXPORT_SYMBOL(first_ec); -+static struct workqueue_struct *ec_query_wq; - - static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ - static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ -@@ -1098,7 +1104,7 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data) - * work queue execution. - */ - ec_dbg_evt("Query(0x%02x) scheduled", value); -- if (!schedule_work(&q->work)) { -+ if (!queue_work(ec_query_wq, &q->work)) { - ec_dbg_evt("Query(0x%02x) overlapped", value); - result = -EBUSY; - } -@@ -1660,15 +1666,41 @@ static struct acpi_driver acpi_ec_driver = { - }, - }; - -+static inline int acpi_ec_query_init(void) -+{ -+ if (!ec_query_wq) { -+ ec_query_wq = alloc_workqueue("kec_query", 0, -+ ec_max_queries); -+ if (!ec_query_wq) -+ return -ENODEV; -+ } -+ return 0; -+} -+ -+static inline void acpi_ec_query_exit(void) -+{ -+ if (ec_query_wq) { -+ destroy_workqueue(ec_query_wq); -+ ec_query_wq = NULL; -+ } -+} -+ - int __init acpi_ec_init(void) - { -- int result = 0; -+ int result; - -+ /* register workqueue for _Qxx evaluations */ -+ result = acpi_ec_query_init(); -+ if (result) -+ goto err_exit; - /* Now register the driver for the EC */ - result = acpi_bus_register_driver(&acpi_ec_driver); -- if (result < 0) -- return -ENODEV; -+ if (result) -+ goto err_exit; - -+err_exit: -+ if (result) -+ acpi_ec_query_exit(); - return result; - } - -@@ -1678,5 +1710,6 @@ static void __exit acpi_ec_exit(void) - { - - acpi_bus_unregister_driver(&acpi_ec_driver); -+ acpi_ec_query_exit(); - } - #endif /* 0 */ -diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c -index cae5385..bd46569 100644 ---- a/drivers/bcma/host_pci.c -+++ b/drivers/bcma/host_pci.c -@@ -295,6 +295,7 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = { - { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, - { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) }, - { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_DELL, 0x0016) }, -+ { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_FOXCONN, 0xe092) }, - { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) }, - { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, - { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) }, -diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c -index 84708a5..a1dcf12 100644 ---- a/drivers/block/floppy.c -+++ b/drivers/block/floppy.c -@@ -3663,11 +3663,6 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) - - opened_bdev[drive] = bdev; - -- if (!(mode & (FMODE_READ|FMODE_WRITE))) { -- res = -EINVAL; -- goto out; -- } -- - res = -ENXIO; - - if (!floppy_track_buffer) { -@@ -3711,13 +3706,15 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) - if (UFDCS->rawcmd == 1) - UFDCS->rawcmd = 2; - -- UDRS->last_checked = 0; -- clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); -- check_disk_change(bdev); -- if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) -- goto out; -- if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags)) -- goto out; -+ if (mode & (FMODE_READ|FMODE_WRITE)) { -+ UDRS->last_checked = 0; -+ clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags); -+ check_disk_change(bdev); -+ if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags)) -+ goto out; -+ if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags)) -+ goto out; -+ } - - res = -EROFS; - -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 2589468..fadba88 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -123,6 +123,7 @@ static const struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x13d3, 0x3472) }, - { USB_DEVICE(0x13d3, 0x3474) }, - { USB_DEVICE(0x13d3, 0x3487) }, -+ { USB_DEVICE(0x13d3, 0x3490) }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, -@@ -190,6 +191,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU22 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index a3be65e..9f40c34 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -237,6 +237,7 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, -diff --git a/drivers/char/random.c b/drivers/char/random.c -index 87ab9f6..d72c6d1 100644 ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -949,6 +949,7 @@ void add_interrupt_randomness(int irq, int irq_flags) - /* award one bit for the contents of the fast pool */ - credit_entropy_bits(r, credit + 1); - } -+EXPORT_SYMBOL_GPL(add_interrupt_randomness); - - #ifdef CONFIG_BLOCK - void add_disk_randomness(struct gendisk *disk) -@@ -1461,12 +1462,16 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) - static ssize_t - urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) - { -+ static int maxwarn = 10; - int ret; - -- if (unlikely(nonblocking_pool.initialized == 0)) -- printk_once(KERN_NOTICE "random: %s urandom read " -- "with %d bits of entropy available\n", -- current->comm, nonblocking_pool.entropy_total); -+ if (unlikely(nonblocking_pool.initialized == 0) && -+ maxwarn > 0) { -+ maxwarn--; -+ printk(KERN_NOTICE "random: %s: uninitialized urandom read " -+ "(%zd bytes read, %d bits of entropy available)\n", -+ current->comm, nbytes, nonblocking_pool.entropy_total); -+ } - - nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3)); - ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); -@@ -1774,13 +1779,15 @@ int random_int_secret_init(void) - return 0; - } - -+static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash) -+ __aligned(sizeof(unsigned long)); -+ - /* - * Get a random word for internal kernel use only. Similar to urandom but - * with the goal of minimal entropy pool depletion. As a result, the random - * value is not cryptographically secure but for several uses the cost of - * depleting entropy is too high - */ --static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash); - unsigned int get_random_int(void) - { - __u32 *hash; -@@ -1850,12 +1857,18 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, - { - struct entropy_store *poolp = &input_pool; - -- /* Suspend writing if we're above the trickle threshold. -- * We'll be woken up again once below random_write_wakeup_thresh, -- * or when the calling thread is about to terminate. -- */ -- wait_event_interruptible(random_write_wait, kthread_should_stop() || -+ if (unlikely(nonblocking_pool.initialized == 0)) -+ poolp = &nonblocking_pool; -+ else { -+ /* Suspend writing if we're above the trickle -+ * threshold. We'll be woken up again once below -+ * random_write_wakeup_thresh, or when the calling -+ * thread is about to terminate. -+ */ -+ wait_event_interruptible(random_write_wait, -+ kthread_should_stop() || - ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits); -+ } - mix_pool_bytes(poolp, buffer, count); - credit_entropy_bits(poolp, entropy); - } -diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c -index a12b319..e9fd1d8 100644 ---- a/drivers/char/tpm/tpm_crb.c -+++ b/drivers/char/tpm/tpm_crb.c -@@ -246,7 +246,7 @@ static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv, - - /* Detect a 64 bit address on a 32 bit system */ - if (start != new_res.start) -- return ERR_PTR(-EINVAL); -+ return (void __iomem *) ERR_PTR(-EINVAL); - - if (!resource_contains(&priv->res, &new_res)) - return devm_ioremap_resource(dev, &new_res); -diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c -index 8059a8d..31b77f7 100644 ---- a/drivers/clk/rockchip/clk-rk3399.c -+++ b/drivers/clk/rockchip/clk-rk3399.c -@@ -586,7 +586,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = { - RK3399_CLKGATE_CON(8), 15, GFLAGS), - - COMPOSITE(SCLK_SPDIF_REC_DPTX, "clk_spdif_rec_dptx", mux_pll_src_cpll_gpll_p, 0, -- RK3399_CLKSEL_CON(32), 15, 1, MFLAGS, 0, 5, DFLAGS, -+ RK3399_CLKSEL_CON(32), 15, 1, MFLAGS, 8, 5, DFLAGS, - RK3399_CLKGATE_CON(10), 6, GFLAGS), - /* i2s */ - COMPOSITE(0, "clk_i2s0_div", mux_pll_src_cpll_gpll_p, 0, -diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c -index 1fa1a32..1b15917 100644 ---- a/drivers/cpufreq/intel_pstate.c -+++ b/drivers/cpufreq/intel_pstate.c -@@ -944,7 +944,7 @@ static int core_get_max_pstate(void) - if (err) - goto skip_tar; - -- tdp_msr = MSR_CONFIG_TDP_NOMINAL + tdp_ctrl; -+ tdp_msr = MSR_CONFIG_TDP_NOMINAL + (tdp_ctrl & 0x3); - err = rdmsrl_safe(tdp_msr, &tdp_ratio); - if (err) - goto skip_tar; -diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c -index 10c305b..4e0f8e7 100644 ---- a/drivers/edac/edac_mc_sysfs.c -+++ b/drivers/edac/edac_mc_sysfs.c -@@ -313,7 +313,6 @@ static struct device_type csrow_attr_type = { - * possible dynamic channel DIMM Label attribute files - * - */ -- - DEVICE_CHANNEL(ch0_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 0); - DEVICE_CHANNEL(ch1_dimm_label, S_IRUGO | S_IWUSR, -@@ -326,6 +325,10 @@ DEVICE_CHANNEL(ch4_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 4); - DEVICE_CHANNEL(ch5_dimm_label, S_IRUGO | S_IWUSR, - channel_dimm_label_show, channel_dimm_label_store, 5); -+DEVICE_CHANNEL(ch6_dimm_label, S_IRUGO | S_IWUSR, -+ channel_dimm_label_show, channel_dimm_label_store, 6); -+DEVICE_CHANNEL(ch7_dimm_label, S_IRUGO | S_IWUSR, -+ channel_dimm_label_show, channel_dimm_label_store, 7); - - /* Total possible dynamic DIMM Label attribute file table */ - static struct attribute *dynamic_csrow_dimm_attr[] = { -@@ -335,6 +338,8 @@ static struct attribute *dynamic_csrow_dimm_attr[] = { - &dev_attr_legacy_ch3_dimm_label.attr.attr, - &dev_attr_legacy_ch4_dimm_label.attr.attr, - &dev_attr_legacy_ch5_dimm_label.attr.attr, -+ &dev_attr_legacy_ch6_dimm_label.attr.attr, -+ &dev_attr_legacy_ch7_dimm_label.attr.attr, - NULL - }; - -@@ -351,6 +356,10 @@ DEVICE_CHANNEL(ch4_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 4); - DEVICE_CHANNEL(ch5_ce_count, S_IRUGO, - channel_ce_count_show, NULL, 5); -+DEVICE_CHANNEL(ch6_ce_count, S_IRUGO, -+ channel_ce_count_show, NULL, 6); -+DEVICE_CHANNEL(ch7_ce_count, S_IRUGO, -+ channel_ce_count_show, NULL, 7); - - /* Total possible dynamic ce_count attribute file table */ - static struct attribute *dynamic_csrow_ce_count_attr[] = { -@@ -360,6 +369,8 @@ static struct attribute *dynamic_csrow_ce_count_attr[] = { - &dev_attr_legacy_ch3_ce_count.attr.attr, - &dev_attr_legacy_ch4_ce_count.attr.attr, - &dev_attr_legacy_ch5_ce_count.attr.attr, -+ &dev_attr_legacy_ch6_ce_count.attr.attr, -+ &dev_attr_legacy_ch7_ce_count.attr.attr, - NULL - }; - -@@ -371,9 +382,16 @@ static umode_t csrow_dev_is_visible(struct kobject *kobj, - - if (idx >= csrow->nr_channels) - return 0; -+ -+ if (idx >= ARRAY_SIZE(dynamic_csrow_ce_count_attr) - 1) { -+ WARN_ONCE(1, "idx: %d\n", idx); -+ return 0; -+ } -+ - /* Only expose populated DIMMs */ - if (!csrow->channels[idx]->dimm->nr_pages) - return 0; -+ - return attr->mode; - } - -diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c -index cdaba13..c0f7cce 100644 ---- a/drivers/gpio/gpio-intel-mid.c -+++ b/drivers/gpio/gpio-intel-mid.c -@@ -17,7 +17,6 @@ - * Moorestown platform Langwell chip. - * Medfield platform Penwell chip. - * Clovertrail platform Cloverview chip. -- * Merrifield platform Tangier chip. - */ - - #include <linux/module.h> -@@ -64,10 +63,6 @@ enum GPIO_REG { - /* intel_mid gpio driver data */ - struct intel_mid_gpio_ddata { - u16 ngpio; /* number of gpio pins */ -- u32 gplr_offset; /* offset of first GPLR register from base */ -- u32 flis_base; /* base address of FLIS registers */ -- u32 flis_len; /* length of FLIS registers */ -- u32 (*get_flis_offset)(int gpio); - u32 chip_irq_type; /* chip interrupt type */ - }; - -@@ -252,15 +247,6 @@ static const struct intel_mid_gpio_ddata gpio_cloverview_core = { - .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE, - }; - --static const struct intel_mid_gpio_ddata gpio_tangier = { -- .ngpio = 192, -- .gplr_offset = 4, -- .flis_base = 0xff0c0000, -- .flis_len = 0x8000, -- .get_flis_offset = NULL, -- .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE, --}; -- - static const struct pci_device_id intel_gpio_ids[] = { - { - /* Lincroft */ -@@ -287,11 +273,6 @@ static const struct pci_device_id intel_gpio_ids[] = { - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08f7), - .driver_data = (kernel_ulong_t)&gpio_cloverview_core, - }, -- { -- /* Tangier */ -- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1199), -- .driver_data = (kernel_ulong_t)&gpio_tangier, -- }, - { 0 } - }; - MODULE_DEVICE_TABLE(pci, intel_gpio_ids); -@@ -401,7 +382,7 @@ static int intel_gpio_probe(struct pci_dev *pdev, - spin_lock_init(&priv->lock); - - pci_set_drvdata(pdev, priv); -- retval = gpiochip_add_data(&priv->chip, priv); -+ retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv); - if (retval) { - dev_err(&pdev->dev, "gpiochip_add error %d\n", retval); - return retval; -diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c -index 5e3be32..3745de6 100644 ---- a/drivers/gpio/gpio-pca953x.c -+++ b/drivers/gpio/gpio-pca953x.c -@@ -90,7 +90,7 @@ MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids); - #define MAX_BANK 5 - #define BANK_SZ 8 - --#define NBANK(chip) (chip->gpio_chip.ngpio / BANK_SZ) -+#define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ) - - struct pca953x_chip { - unsigned gpio_start; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c -index 9df1bcb..9831753 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c -@@ -551,28 +551,19 @@ int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev) - le16_to_cpu(firmware_info->info.usReferenceClock); - ppll->reference_div = 0; - -- if (crev < 2) -- ppll->pll_out_min = -- le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output); -- else -- ppll->pll_out_min = -- le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output); -+ ppll->pll_out_min = -+ le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output); - ppll->pll_out_max = - le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); - -- if (crev >= 4) { -- ppll->lcd_pll_out_min = -- le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; -- if (ppll->lcd_pll_out_min == 0) -- ppll->lcd_pll_out_min = ppll->pll_out_min; -- ppll->lcd_pll_out_max = -- le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100; -- if (ppll->lcd_pll_out_max == 0) -- ppll->lcd_pll_out_max = ppll->pll_out_max; -- } else { -+ ppll->lcd_pll_out_min = -+ le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; -+ if (ppll->lcd_pll_out_min == 0) - ppll->lcd_pll_out_min = ppll->pll_out_min; -+ ppll->lcd_pll_out_max = -+ le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100; -+ if (ppll->lcd_pll_out_max == 0) - ppll->lcd_pll_out_max = ppll->pll_out_max; -- } - - if (ppll->pll_out_min == 0) - ppll->pll_out_min = 64800; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -index 35a1248..1b4c069 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c -@@ -10,6 +10,7 @@ - #include <linux/slab.h> - #include <linux/acpi.h> - #include <linux/pci.h> -+#include <linux/delay.h> - - #include "amd_acpi.h" - -@@ -259,6 +260,10 @@ static int amdgpu_atpx_set_discrete_state(struct amdgpu_atpx *atpx, u8 state) - if (!info) - return -EIO; - kfree(info); -+ -+ /* 200ms delay is required after off */ -+ if (state == 0) -+ msleep(200); - } - return 0; - } -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c -index cb07da4..ff0b55a 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c -@@ -1690,7 +1690,6 @@ amdgpu_connector_add(struct amdgpu_device *adev, - DRM_MODE_SCALE_NONE); - /* no HPD on analog connectors */ - amdgpu_connector->hpd.hpd = AMDGPU_HPD_NONE; -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; - connector->interlace_allowed = true; - connector->doublescan_allowed = true; - break; -@@ -1893,8 +1892,10 @@ amdgpu_connector_add(struct amdgpu_device *adev, - } - - if (amdgpu_connector->hpd.hpd == AMDGPU_HPD_NONE) { -- if (i2c_bus->valid) -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; -+ if (i2c_bus->valid) { -+ connector->polled = DRM_CONNECTOR_POLL_CONNECT | -+ DRM_CONNECTOR_POLL_DISCONNECT; -+ } - } else - connector->polled = DRM_CONNECTOR_POLL_HPD; - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c -index 6e92008..b7f5650 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c -@@ -1841,7 +1841,23 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) - } - - drm_kms_helper_poll_enable(dev); -+ -+ /* -+ * Most of the connector probing functions try to acquire runtime pm -+ * refs to ensure that the GPU is powered on when connector polling is -+ * performed. Since we're calling this from a runtime PM callback, -+ * trying to acquire rpm refs will cause us to deadlock. -+ * -+ * Since we're guaranteed to be holding the rpm lock, it's safe to -+ * temporarily disable the rpm helpers so this doesn't deadlock us. -+ */ -+#ifdef CONFIG_PM -+ dev->dev->power.disable_depth++; -+#endif - drm_helper_hpd_irq_event(dev); -+#ifdef CONFIG_PM -+ dev->dev->power.disable_depth--; -+#endif - - if (fbcon) { - amdgpu_fbdev_set_suspend(adev, 0); -diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c -index 48b6bd6..c32eca2 100644 ---- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c -+++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c -@@ -98,6 +98,7 @@ amdgpu_atombios_encoder_set_backlight_level(struct amdgpu_encoder *amdgpu_encode - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: -+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: - if (dig->backlight_level == 0) - amdgpu_atombios_encoder_setup_dig_transmitter(encoder, - ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); -diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c -index 1feb643..9269548 100644 ---- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c -@@ -167,6 +167,7 @@ static int gmc_v7_0_init_microcode(struct amdgpu_device *adev) - break; - case CHIP_KAVERI: - case CHIP_KABINI: -+ case CHIP_MULLINS: - return 0; - default: BUG(); - } -diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c -index 90b35c5..ffc7c0d 100644 ---- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c -+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c -@@ -592,12 +592,12 @@ bool atomctrl_get_pp_assign_pin( - const uint32_t pinId, - pp_atomctrl_gpio_pin_assignment *gpio_pin_assignment) - { -- bool bRet = 0; -+ bool bRet = false; - ATOM_GPIO_PIN_LUT *gpio_lookup_table = - get_gpio_lookup_table(hwmgr->device); - - PP_ASSERT_WITH_CODE((NULL != gpio_lookup_table), -- "Could not find GPIO lookup Table in BIOS.", return -1); -+ "Could not find GPIO lookup Table in BIOS.", return false); - - bRet = atomctrl_lookup_gpio_pin(gpio_lookup_table, pinId, - gpio_pin_assignment); -diff --git a/drivers/gpu/drm/drm_cache.c b/drivers/gpu/drm/drm_cache.c -index 059f7c3..a7916e5 100644 ---- a/drivers/gpu/drm/drm_cache.c -+++ b/drivers/gpu/drm/drm_cache.c -@@ -136,6 +136,7 @@ drm_clflush_virt_range(void *addr, unsigned long length) - mb(); - for (; addr < end; addr += size) - clflushopt(addr); -+ clflushopt(end - 1); /* force serialisation */ - mb(); - return; - } -diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c -index eeaf5a7..67b28f8 100644 ---- a/drivers/gpu/drm/drm_dp_helper.c -+++ b/drivers/gpu/drm/drm_dp_helper.c -@@ -203,7 +203,7 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, - - ret = aux->transfer(aux, &msg); - -- if (ret > 0) { -+ if (ret >= 0) { - native_reply = msg.reply & DP_AUX_NATIVE_REPLY_MASK; - if (native_reply == DP_AUX_NATIVE_REPLY_ACK) { - if (ret == size) -diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index 7df26d4..2cb472b 100644 ---- a/drivers/gpu/drm/drm_edid.c -+++ b/drivers/gpu/drm/drm_edid.c -@@ -74,6 +74,8 @@ - #define EDID_QUIRK_FORCE_8BPC (1 << 8) - /* Force 12bpc */ - #define EDID_QUIRK_FORCE_12BPC (1 << 9) -+/* Force 6bpc */ -+#define EDID_QUIRK_FORCE_6BPC (1 << 10) - - struct detailed_mode_closure { - struct drm_connector *connector; -@@ -100,6 +102,9 @@ static struct edid_quirk { - /* Unknown Acer */ - { "ACR", 2423, EDID_QUIRK_FIRST_DETAILED_PREFERRED }, - -+ /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ -+ { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, -+ - /* Belinea 10 15 55 */ - { "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 }, - { "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 }, -@@ -4082,6 +4087,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) - - drm_add_display_info(edid, &connector->display_info, connector); - -+ if (quirks & EDID_QUIRK_FORCE_6BPC) -+ connector->display_info.bpc = 6; -+ - if (quirks & EDID_QUIRK_FORCE_8BPC) - connector->display_info.bpc = 8; - -diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h -index bc3f2e6..227a63e 100644 ---- a/drivers/gpu/drm/i915/i915_drv.h -+++ b/drivers/gpu/drm/i915/i915_drv.h -@@ -2591,6 +2591,8 @@ struct drm_i915_cmd_table { - #define SKL_REVID_D0 0x3 - #define SKL_REVID_E0 0x4 - #define SKL_REVID_F0 0x5 -+#define SKL_REVID_G0 0x6 -+#define SKL_REVID_H0 0x7 - - #define IS_SKL_REVID(p, since, until) (IS_SKYLAKE(p) && IS_REVID(p, since, until)) - -diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h -index 3fcf7dd..bc3b6dd 100644 ---- a/drivers/gpu/drm/i915/i915_reg.h -+++ b/drivers/gpu/drm/i915/i915_reg.h -@@ -1672,6 +1672,9 @@ enum skl_disp_power_wells { - - #define GEN7_TLB_RD_ADDR _MMIO(0x4700) - -+#define GEN9_GAMT_ECO_REG_RW_IA _MMIO(0x4ab0) -+#define GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS (1<<18) -+ - #define GAMT_CHKN_BIT_REG _MMIO(0x4ab8) - #define GAMT_CHKN_DISABLE_DYNAMIC_CREDIT_SHARING (1<<28) - -@@ -7538,6 +7541,8 @@ enum skl_disp_power_wells { - - #define CDCLK_FREQ _MMIO(0x46200) - -+#define CDCLK_FREQ _MMIO(0x46200) -+ - #define _TRANSA_MSA_MISC 0x60410 - #define _TRANSB_MSA_MISC 0x61410 - #define _TRANSC_MSA_MISC 0x62410 -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 3074c56..3289319 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -9700,6 +9700,8 @@ static void broadwell_set_cdclk(struct drm_device *dev, int cdclk) - - I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1); - -+ I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1); -+ - intel_update_cdclk(dev); - - WARN(cdclk != dev_priv->cdclk_freq, -@@ -12095,21 +12097,11 @@ connected_sink_compute_bpp(struct intel_connector *connector, - pipe_config->pipe_bpp = connector->base.display_info.bpc*3; - } - -- /* Clamp bpp to default limit on screens without EDID 1.4 */ -- if (connector->base.display_info.bpc == 0) { -- int type = connector->base.connector_type; -- int clamp_bpp = 24; -- -- /* Fall back to 18 bpp when DP sink capability is unknown. */ -- if (type == DRM_MODE_CONNECTOR_DisplayPort || -- type == DRM_MODE_CONNECTOR_eDP) -- clamp_bpp = 18; -- -- if (bpp > clamp_bpp) { -- DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of %d\n", -- bpp, clamp_bpp); -- pipe_config->pipe_bpp = clamp_bpp; -- } -+ /* Clamp bpp to 8 on screens without EDID 1.4 */ -+ if (connector->base.display_info.bpc == 0 && bpp > 24) { -+ DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of 24\n", -+ bpp); -+ pipe_config->pipe_bpp = 24; - } - } - -diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c -index 2863b92..c1ca5a7 100644 ---- a/drivers/gpu/drm/i915/intel_pm.c -+++ b/drivers/gpu/drm/i915/intel_pm.c -@@ -4563,7 +4563,8 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) - else - gen6_set_rps(dev_priv->dev, dev_priv->rps.idle_freq); - dev_priv->rps.last_adj = 0; -- I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); -+ I915_WRITE(GEN6_PMINTRMSK, -+ gen6_sanitize_rps_pm_mask(dev_priv, ~0)); - } - mutex_unlock(&dev_priv->rps.hw_lock); - -diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c -index 68c5af0..9d778f3 100644 ---- a/drivers/gpu/drm/i915/intel_ringbuffer.c -+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c -@@ -1135,6 +1135,11 @@ static int skl_init_workarounds(struct intel_engine_cs *engine) - /* WaDisableGafsUnitClkGating:skl */ - WA_SET_BIT(GEN7_UCGCTL4, GEN8_EU_GAUNIT_CLOCK_GATE_DISABLE); - -+ /* WaInPlaceDecompressionHang:skl */ -+ if (IS_SKL_REVID(dev_priv, SKL_REVID_H0, REVID_FOREVER)) -+ WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, -+ GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); -+ - /* WaDisableLSQCROPERFforOCL:skl */ - ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); - if (ret) -@@ -1194,6 +1199,11 @@ static int bxt_init_workarounds(struct intel_engine_cs *engine) - WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2, - GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION); - -+ /* WaInPlaceDecompressionHang:bxt */ -+ if (IS_BXT_REVID(dev_priv, BXT_REVID_C0, REVID_FOREVER)) -+ WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, -+ GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); -+ - return 0; - } - -@@ -1241,6 +1251,10 @@ static int kbl_init_workarounds(struct intel_engine_cs *engine) - GEN7_HALF_SLICE_CHICKEN1, - GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); - -+ /* WaInPlaceDecompressionHang:kbl */ -+ WA_SET_BIT(GEN9_GAMT_ECO_REG_RW_IA, -+ GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); -+ - /* WaDisableLSQCROPERFforOCL:kbl */ - ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4); - if (ret) -diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c -index 11f8dd9..d6c134b 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_drm.c -+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c -@@ -324,7 +324,16 @@ static int nouveau_drm_probe(struct pci_dev *pdev, - !vga_switcheroo_handler_flags()) - return -EPROBE_DEFER; - -- /* remove conflicting drivers (vesafb, efifb etc) */ -+ /* We need to check that the chipset is supported before booting -+ * fbdev off the hardware, as there's no way to put it back. -+ */ -+ ret = nvkm_device_pci_new(pdev, NULL, "error", true, false, 0, &device); -+ if (ret) -+ return ret; -+ -+ nvkm_device_del(&device); -+ -+ /* Remove conflicting drivers (vesafb, efifb etc). */ - aper = alloc_apertures(3); - if (!aper) - return -ENOMEM; -diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c -index 7d9248b..da8fd5f 100644 ---- a/drivers/gpu/drm/nouveau/nv04_fbcon.c -+++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c -@@ -107,11 +107,11 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) - ((image->dx + image->width) & 0xffff)); - OUT_RING(chan, bg); - OUT_RING(chan, fg); -- OUT_RING(chan, (image->height << 16) | image->width); -+ OUT_RING(chan, (image->height << 16) | ALIGN(image->width, 8)); - OUT_RING(chan, (image->height << 16) | image->width); - OUT_RING(chan, (image->dy << 16) | (image->dx & 0xffff)); - -- dsize = ALIGN(image->width * image->height, 32) >> 5; -+ dsize = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; - while (dsize) { - int iter_len = dsize > 128 ? 128 : dsize; - -diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c -index 1aeb698..af3d3c4 100644 ---- a/drivers/gpu/drm/nouveau/nv50_fbcon.c -+++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c -@@ -125,7 +125,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) - OUT_RING(chan, 0); - OUT_RING(chan, image->dy); - -- dwords = ALIGN(image->width * image->height, 32) >> 5; -+ dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; - while (dwords) { - int push = dwords > 2047 ? 2047 : dwords; - -diff --git a/drivers/gpu/drm/nouveau/nvc0_fbcon.c b/drivers/gpu/drm/nouveau/nvc0_fbcon.c -index 839f4c8..054b6a0 100644 ---- a/drivers/gpu/drm/nouveau/nvc0_fbcon.c -+++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c -@@ -125,7 +125,7 @@ nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) - OUT_RING (chan, 0); - OUT_RING (chan, image->dy); - -- dwords = ALIGN(image->width * image->height, 32) >> 5; -+ dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5; - while (dwords) { - int push = dwords > 2047 ? 2047 : dwords; - -diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c -index 69de8c6..f1e15a4 100644 ---- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c -+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.c -@@ -76,8 +76,8 @@ nv30_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, - nvkm_wo32(chan->inst, i, 0x00040004); - for (i = 0x1f18; i <= 0x3088 ; i += 16) { - nvkm_wo32(chan->inst, i + 0, 0x10700ff9); -- nvkm_wo32(chan->inst, i + 1, 0x0436086c); -- nvkm_wo32(chan->inst, i + 2, 0x000c001b); -+ nvkm_wo32(chan->inst, i + 4, 0x0436086c); -+ nvkm_wo32(chan->inst, i + 8, 0x000c001b); - } - for (i = 0x30b8; i < 0x30c8; i += 4) - nvkm_wo32(chan->inst, i, 0x0000ffff); -diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c -index 2207dac2..300f5ed 100644 ---- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c -+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.c -@@ -75,8 +75,8 @@ nv34_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch, - nvkm_wo32(chan->inst, i, 0x00040004); - for (i = 0x15ac; i <= 0x271c ; i += 16) { - nvkm_wo32(chan->inst, i + 0, 0x10700ff9); -- nvkm_wo32(chan->inst, i + 1, 0x0436086c); -- nvkm_wo32(chan->inst, i + 2, 0x000c001b); -+ nvkm_wo32(chan->inst, i + 4, 0x0436086c); -+ nvkm_wo32(chan->inst, i + 8, 0x000c001b); - } - for (i = 0x274c; i < 0x275c; i += 4) - nvkm_wo32(chan->inst, i, 0x0000ffff); -diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c -index 587cae4..56bb758 100644 ---- a/drivers/gpu/drm/radeon/atombios_encoders.c -+++ b/drivers/gpu/drm/radeon/atombios_encoders.c -@@ -120,6 +120,7 @@ atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: -+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: - if (dig->backlight_level == 0) - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); - else { -diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c -index f8097a0..5df3ec7 100644 ---- a/drivers/gpu/drm/radeon/radeon_atombios.c -+++ b/drivers/gpu/drm/radeon/radeon_atombios.c -@@ -1155,7 +1155,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) - le16_to_cpu(firmware_info->info.usReferenceClock); - p1pll->reference_div = 0; - -- if (crev < 2) -+ if ((frev < 2) && (crev < 2)) - p1pll->pll_out_min = - le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output); - else -@@ -1164,7 +1164,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) - p1pll->pll_out_max = - le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); - -- if (crev >= 4) { -+ if (((frev < 2) && (crev >= 4)) || (frev >= 2)) { - p1pll->lcd_pll_out_min = - le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; - if (p1pll->lcd_pll_out_min == 0) -diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -index 95f4fea..1b3f4e5 100644 ---- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c -+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -@@ -10,6 +10,7 @@ - #include <linux/slab.h> - #include <linux/acpi.h> - #include <linux/pci.h> -+#include <linux/delay.h> - - #include "radeon_acpi.h" - -@@ -258,6 +259,10 @@ static int radeon_atpx_set_discrete_state(struct radeon_atpx *atpx, u8 state) - if (!info) - return -EIO; - kfree(info); -+ -+ /* 200ms delay is required after off */ -+ if (state == 0) -+ msleep(200); - } - return 0; - } -diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c -index 81a63d7..b79f3b0 100644 ---- a/drivers/gpu/drm/radeon/radeon_connectors.c -+++ b/drivers/gpu/drm/radeon/radeon_connectors.c -@@ -2064,7 +2064,6 @@ radeon_add_atom_connector(struct drm_device *dev, - RADEON_OUTPUT_CSC_BYPASS); - /* no HPD on analog connectors */ - radeon_connector->hpd.hpd = RADEON_HPD_NONE; -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; - connector->interlace_allowed = true; - connector->doublescan_allowed = true; - break; -@@ -2314,8 +2313,10 @@ radeon_add_atom_connector(struct drm_device *dev, - } - - if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { -- if (i2c_bus->valid) -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; -+ if (i2c_bus->valid) { -+ connector->polled = DRM_CONNECTOR_POLL_CONNECT | -+ DRM_CONNECTOR_POLL_DISCONNECT; -+ } - } else - connector->polled = DRM_CONNECTOR_POLL_HPD; - -@@ -2391,7 +2392,6 @@ radeon_add_legacy_connector(struct drm_device *dev, - 1); - /* no HPD on analog connectors */ - radeon_connector->hpd.hpd = RADEON_HPD_NONE; -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; - connector->interlace_allowed = true; - connector->doublescan_allowed = true; - break; -@@ -2476,10 +2476,13 @@ radeon_add_legacy_connector(struct drm_device *dev, - } - - if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { -- if (i2c_bus->valid) -- connector->polled = DRM_CONNECTOR_POLL_CONNECT; -+ if (i2c_bus->valid) { -+ connector->polled = DRM_CONNECTOR_POLL_CONNECT | -+ DRM_CONNECTOR_POLL_DISCONNECT; -+ } - } else - connector->polled = DRM_CONNECTOR_POLL_HPD; -+ - connector->display_info.subpixel_order = subpixel_order; - drm_connector_register(connector); - } -diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -index 1c4d5b5..b167323 100644 ---- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -@@ -1048,6 +1048,17 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) - drm_crtc_cleanup(crtc); - } - -+static void vop_crtc_reset(struct drm_crtc *crtc) -+{ -+ if (crtc->state) -+ __drm_atomic_helper_crtc_destroy_state(crtc->state); -+ kfree(crtc->state); -+ -+ crtc->state = kzalloc(sizeof(struct rockchip_crtc_state), GFP_KERNEL); -+ if (crtc->state) -+ crtc->state->crtc = crtc; -+} -+ - static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) - { - struct rockchip_crtc_state *rockchip_state; -@@ -1073,7 +1084,7 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { - .set_config = drm_atomic_helper_set_config, - .page_flip = drm_atomic_helper_page_flip, - .destroy = vop_crtc_destroy, -- .reset = drm_atomic_helper_crtc_reset, -+ .reset = vop_crtc_reset, - .atomic_duplicate_state = vop_crtc_duplicate_state, - .atomic_destroy_state = vop_crtc_destroy_state, - }; -diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c -index 16b6f11..99ec3ff 100644 ---- a/drivers/hid/uhid.c -+++ b/drivers/hid/uhid.c -@@ -51,10 +51,26 @@ struct uhid_device { - u32 report_id; - u32 report_type; - struct uhid_event report_buf; -+ struct work_struct worker; - }; - - static struct miscdevice uhid_misc; - -+static void uhid_device_add_worker(struct work_struct *work) -+{ -+ struct uhid_device *uhid = container_of(work, struct uhid_device, worker); -+ int ret; -+ -+ ret = hid_add_device(uhid->hid); -+ if (ret) { -+ hid_err(uhid->hid, "Cannot register HID device: error %d\n", ret); -+ -+ hid_destroy_device(uhid->hid); -+ uhid->hid = NULL; -+ uhid->running = false; -+ } -+} -+ - static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev) - { - __u8 newhead; -@@ -498,18 +514,14 @@ static int uhid_dev_create2(struct uhid_device *uhid, - uhid->hid = hid; - uhid->running = true; - -- ret = hid_add_device(hid); -- if (ret) { -- hid_err(hid, "Cannot register HID device\n"); -- goto err_hid; -- } -+ /* Adding of a HID device is done through a worker, to allow HID drivers -+ * which use feature requests during .probe to work, without they would -+ * be blocked on devlock, which is held by uhid_char_write. -+ */ -+ schedule_work(&uhid->worker); - - return 0; - --err_hid: -- hid_destroy_device(hid); -- uhid->hid = NULL; -- uhid->running = false; - err_free: - kfree(uhid->rd_data); - uhid->rd_data = NULL; -@@ -550,6 +562,8 @@ static int uhid_dev_destroy(struct uhid_device *uhid) - uhid->running = false; - wake_up_interruptible(&uhid->report_wait); - -+ cancel_work_sync(&uhid->worker); -+ - hid_destroy_device(uhid->hid); - kfree(uhid->rd_data); - -@@ -612,6 +626,7 @@ static int uhid_char_open(struct inode *inode, struct file *file) - init_waitqueue_head(&uhid->waitq); - init_waitqueue_head(&uhid->report_wait); - uhid->running = false; -+ INIT_WORK(&uhid->worker, uhid_device_add_worker); - - file->private_data = uhid; - nonseekable_open(inode, file); -diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index 952f20f..e82f7e1 100644 ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -42,6 +42,7 @@ - #include <linux/screen_info.h> - #include <linux/kdebug.h> - #include <linux/efi.h> -+#include <linux/random.h> - #include "hyperv_vmbus.h" - - static struct acpi_device *hv_acpi_dev; -@@ -806,6 +807,8 @@ static void vmbus_isr(void) - else - tasklet_schedule(hv_context.msg_dpc[cpu]); - } -+ -+ add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); - } - - -diff --git a/drivers/i2c/busses/i2c-efm32.c b/drivers/i2c/busses/i2c-efm32.c -index 8eff627..e253598 100644 ---- a/drivers/i2c/busses/i2c-efm32.c -+++ b/drivers/i2c/busses/i2c-efm32.c -@@ -433,7 +433,7 @@ static int efm32_i2c_probe(struct platform_device *pdev) - ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata); - if (ret < 0) { - dev_err(&pdev->dev, "failed to request irq (%d)\n", ret); -- return ret; -+ goto err_disable_clk; - } - - ret = i2c_add_adapter(&ddata->adapter); -diff --git a/drivers/infiniband/core/rw.c b/drivers/infiniband/core/rw.c -index 1eb9b12..dbfd854 100644 ---- a/drivers/infiniband/core/rw.c -+++ b/drivers/infiniband/core/rw.c -@@ -58,19 +58,13 @@ static inline bool rdma_rw_io_needs_mr(struct ib_device *dev, u8 port_num, - return false; - } - --static inline u32 rdma_rw_max_sge(struct ib_device *dev, -- enum dma_data_direction dir) --{ -- return dir == DMA_TO_DEVICE ? -- dev->attrs.max_sge : dev->attrs.max_sge_rd; --} -- - static inline u32 rdma_rw_fr_page_list_len(struct ib_device *dev) - { - /* arbitrary limit to avoid allocating gigantic resources */ - return min_t(u32, dev->attrs.max_fast_reg_page_list_len, 256); - } - -+/* Caller must have zero-initialized *reg. */ - static int rdma_rw_init_one_mr(struct ib_qp *qp, u8 port_num, - struct rdma_rw_reg_ctx *reg, struct scatterlist *sg, - u32 sg_cnt, u32 offset) -@@ -114,6 +108,7 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - u8 port_num, struct scatterlist *sg, u32 sg_cnt, u32 offset, - u64 remote_addr, u32 rkey, enum dma_data_direction dir) - { -+ struct rdma_rw_reg_ctx *prev = NULL; - u32 pages_per_mr = rdma_rw_fr_page_list_len(qp->pd->device); - int i, j, ret = 0, count = 0; - -@@ -125,7 +120,6 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - } - - for (i = 0; i < ctx->nr_ops; i++) { -- struct rdma_rw_reg_ctx *prev = i ? &ctx->reg[i - 1] : NULL; - struct rdma_rw_reg_ctx *reg = &ctx->reg[i]; - u32 nents = min(sg_cnt, pages_per_mr); - -@@ -162,9 +156,13 @@ static int rdma_rw_init_mr_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - sg_cnt -= nents; - for (j = 0; j < nents; j++) - sg = sg_next(sg); -+ prev = reg; - offset = 0; - } - -+ if (prev) -+ prev->wr.wr.next = NULL; -+ - ctx->type = RDMA_RW_MR; - return count; - -@@ -181,7 +179,8 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - u64 remote_addr, u32 rkey, enum dma_data_direction dir) - { - struct ib_device *dev = qp->pd->device; -- u32 max_sge = rdma_rw_max_sge(dev, dir); -+ u32 max_sge = dir == DMA_TO_DEVICE ? qp->max_write_sge : -+ qp->max_read_sge; - struct ib_sge *sge; - u32 total_len = 0, i, j; - -@@ -205,11 +204,10 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - rdma_wr->wr.opcode = IB_WR_RDMA_READ; - rdma_wr->remote_addr = remote_addr + total_len; - rdma_wr->rkey = rkey; -+ rdma_wr->wr.num_sge = nr_sge; - rdma_wr->wr.sg_list = sge; - - for (j = 0; j < nr_sge; j++, sg = sg_next(sg)) { -- rdma_wr->wr.num_sge++; -- - sge->addr = ib_sg_dma_address(dev, sg) + offset; - sge->length = ib_sg_dma_len(dev, sg) - offset; - sge->lkey = qp->pd->local_dma_lkey; -@@ -220,8 +218,8 @@ static int rdma_rw_init_map_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, - offset = 0; - } - -- if (i + 1 < ctx->nr_ops) -- rdma_wr->wr.next = &ctx->map.wrs[i + 1].wr; -+ rdma_wr->wr.next = i + 1 < ctx->nr_ops ? -+ &ctx->map.wrs[i + 1].wr : NULL; - } - - ctx->type = RDMA_RW_MULTI_WR; -diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c -index 6298f54..e39a0b5 100644 ---- a/drivers/infiniband/core/verbs.c -+++ b/drivers/infiniband/core/verbs.c -@@ -814,6 +814,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, - } - } - -+ /* -+ * Note: all hw drivers guarantee that max_send_sge is lower than -+ * the device RDMA WRITE SGE limit but not all hw drivers ensure that -+ * max_send_sge <= max_sge_rd. -+ */ -+ qp->max_write_sge = qp_init_attr->cap.max_send_sge; -+ qp->max_read_sge = min_t(u32, qp_init_attr->cap.max_send_sge, -+ device->attrs.max_sge_rd); -+ - return qp; - } - EXPORT_SYMBOL(ib_create_qp); -diff --git a/drivers/infiniband/hw/mlx5/gsi.c b/drivers/infiniband/hw/mlx5/gsi.c -index 53e03c8..79e6309 100644 ---- a/drivers/infiniband/hw/mlx5/gsi.c -+++ b/drivers/infiniband/hw/mlx5/gsi.c -@@ -69,15 +69,6 @@ static bool mlx5_ib_deth_sqpn_cap(struct mlx5_ib_dev *dev) - return MLX5_CAP_GEN(dev->mdev, set_deth_sqpn); - } - --static u32 next_outstanding(struct mlx5_ib_gsi_qp *gsi, u32 index) --{ -- return ++index % gsi->cap.max_send_wr; --} -- --#define for_each_outstanding_wr(gsi, index) \ -- for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; \ -- index = next_outstanding(gsi, index)) -- - /* Call with gsi->lock locked */ - static void generate_completions(struct mlx5_ib_gsi_qp *gsi) - { -@@ -85,8 +76,9 @@ static void generate_completions(struct mlx5_ib_gsi_qp *gsi) - struct mlx5_ib_gsi_wr *wr; - u32 index; - -- for_each_outstanding_wr(gsi, index) { -- wr = &gsi->outstanding_wrs[index]; -+ for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; -+ index++) { -+ wr = &gsi->outstanding_wrs[index % gsi->cap.max_send_wr]; - - if (!wr->completed) - break; -@@ -430,8 +422,9 @@ static int mlx5_ib_add_outstanding_wr(struct mlx5_ib_gsi_qp *gsi, - return -ENOMEM; - } - -- gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi]; -- gsi->outstanding_pi = next_outstanding(gsi, gsi->outstanding_pi); -+ gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi % -+ gsi->cap.max_send_wr]; -+ gsi->outstanding_pi++; - - if (!wc) { - memset(&gsi_wr->wc, 0, sizeof(gsi_wr->wc)); -diff --git a/drivers/infiniband/sw/rdmavt/Kconfig b/drivers/infiniband/sw/rdmavt/Kconfig -index 11aa6a3..1da8d01 100644 ---- a/drivers/infiniband/sw/rdmavt/Kconfig -+++ b/drivers/infiniband/sw/rdmavt/Kconfig -@@ -1,6 +1,5 @@ - config INFINIBAND_RDMAVT - tristate "RDMA verbs transport library" - depends on 64BIT -- default m - ---help--- - This is a common software verbs provider for RDMA networks. -diff --git a/drivers/infiniband/sw/rdmavt/cq.c b/drivers/infiniband/sw/rdmavt/cq.c -index 6ca6fa8..f2f229e 100644 ---- a/drivers/infiniband/sw/rdmavt/cq.c -+++ b/drivers/infiniband/sw/rdmavt/cq.c -@@ -510,6 +510,7 @@ int rvt_driver_cq_init(struct rvt_dev_info *rdi) - - if (rdi->worker) - return 0; -+ spin_lock_init(&rdi->n_cqs_lock); - rdi->worker = kzalloc(sizeof(*rdi->worker), GFP_KERNEL); - if (!rdi->worker) - return -ENOMEM; -diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c -index 4a41556..9a3b954 100644 ---- a/drivers/infiniband/ulp/srpt/ib_srpt.c -+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c -@@ -1601,6 +1601,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch) - struct ib_qp_init_attr *qp_init; - struct srpt_port *sport = ch->sport; - struct srpt_device *sdev = sport->sdev; -+ const struct ib_device_attr *attrs = &sdev->device->attrs; - u32 srp_sq_size = sport->port_attrib.srp_sq_size; - int ret; - -@@ -1638,7 +1639,7 @@ retry: - */ - qp_init->cap.max_send_wr = srp_sq_size / 2; - qp_init->cap.max_rdma_ctxs = srp_sq_size / 2; -- qp_init->cap.max_send_sge = SRPT_DEF_SG_PER_WQE; -+ qp_init->cap.max_send_sge = min(attrs->max_sge, SRPT_MAX_SG_PER_WQE); - qp_init->port_num = ch->sport->port; - - ch->qp = ib_create_qp(sdev->pd, qp_init); -diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h -index 3890304..5818787 100644 ---- a/drivers/infiniband/ulp/srpt/ib_srpt.h -+++ b/drivers/infiniband/ulp/srpt/ib_srpt.h -@@ -106,7 +106,11 @@ enum { - SRP_LOGIN_RSP_MULTICHAN_MAINTAINED = 0x2, - - SRPT_DEF_SG_TABLESIZE = 128, -- SRPT_DEF_SG_PER_WQE = 16, -+ /* -+ * An experimentally determined value that avoids that QP creation -+ * fails due to "swiotlb buffer is full" on systems using the swiotlb. -+ */ -+ SRPT_MAX_SG_PER_WQE = 16, - - MIN_SRPT_SQ_SIZE = 16, - DEF_SRPT_SQ_SIZE = 4096, -diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c -index 2f58985..d15b338 100644 ---- a/drivers/input/mouse/elan_i2c_core.c -+++ b/drivers/input/mouse/elan_i2c_core.c -@@ -4,7 +4,8 @@ - * Copyright (c) 2013 ELAN Microelectronics Corp. - * - * Author: æž—æ”¿ç¶ (Duson Lin) <dusonlin@emc.com.tw> -- * Version: 1.6.0 -+ * Author: KT Liao <kt.liao@emc.com.tw> -+ * Version: 1.6.2 - * - * Based on cyapa driver: - * copyright (c) 2011-2012 Cypress Semiconductor, Inc. -@@ -40,7 +41,7 @@ - #include "elan_i2c.h" - - #define DRIVER_NAME "elan_i2c" --#define ELAN_DRIVER_VERSION "1.6.1" -+#define ELAN_DRIVER_VERSION "1.6.2" - #define ELAN_VENDOR_ID 0x04f3 - #define ETP_MAX_PRESSURE 255 - #define ETP_FWIDTH_REDUCE 90 -@@ -199,9 +200,41 @@ static int elan_sleep(struct elan_tp_data *data) - return error; - } - -+static int elan_query_product(struct elan_tp_data *data) -+{ -+ int error; -+ -+ error = data->ops->get_product_id(data->client, &data->product_id); -+ if (error) -+ return error; -+ -+ error = data->ops->get_sm_version(data->client, &data->ic_type, -+ &data->sm_version); -+ if (error) -+ return error; -+ -+ return 0; -+} -+ -+static int elan_check_ASUS_special_fw(struct elan_tp_data *data) -+{ -+ if (data->ic_type != 0x0E) -+ return false; -+ -+ switch (data->product_id) { -+ case 0x05 ... 0x07: -+ case 0x09: -+ case 0x13: -+ return true; -+ default: -+ return false; -+ } -+} -+ - static int __elan_initialize(struct elan_tp_data *data) - { - struct i2c_client *client = data->client; -+ bool woken_up = false; - int error; - - error = data->ops->initialize(client); -@@ -210,6 +243,27 @@ static int __elan_initialize(struct elan_tp_data *data) - return error; - } - -+ error = elan_query_product(data); -+ if (error) -+ return error; -+ -+ /* -+ * Some ASUS devices were shipped with firmware that requires -+ * touchpads to be woken up first, before attempting to switch -+ * them into absolute reporting mode. -+ */ -+ if (elan_check_ASUS_special_fw(data)) { -+ error = data->ops->sleep_control(client, false); -+ if (error) { -+ dev_err(&client->dev, -+ "failed to wake device up: %d\n", error); -+ return error; -+ } -+ -+ msleep(200); -+ woken_up = true; -+ } -+ - data->mode |= ETP_ENABLE_ABS; - error = data->ops->set_mode(client, data->mode); - if (error) { -@@ -218,11 +272,13 @@ static int __elan_initialize(struct elan_tp_data *data) - return error; - } - -- error = data->ops->sleep_control(client, false); -- if (error) { -- dev_err(&client->dev, -- "failed to wake device up: %d\n", error); -- return error; -+ if (!woken_up) { -+ error = data->ops->sleep_control(client, false); -+ if (error) { -+ dev_err(&client->dev, -+ "failed to wake device up: %d\n", error); -+ return error; -+ } - } - - return 0; -@@ -248,10 +304,6 @@ static int elan_query_device_info(struct elan_tp_data *data) - { - int error; - -- error = data->ops->get_product_id(data->client, &data->product_id); -- if (error) -- return error; -- - error = data->ops->get_version(data->client, false, &data->fw_version); - if (error) - return error; -@@ -261,11 +313,6 @@ static int elan_query_device_info(struct elan_tp_data *data) - if (error) - return error; - -- error = data->ops->get_sm_version(data->client, &data->ic_type, -- &data->sm_version); -- if (error) -- return error; -- - error = data->ops->get_version(data->client, true, &data->iap_version); - if (error) - return error; -diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c -index 880c40b..b7e8c11 100644 ---- a/drivers/input/touchscreen/sur40.c -+++ b/drivers/input/touchscreen/sur40.c -@@ -126,7 +126,7 @@ struct sur40_image_header { - #define VIDEO_PACKET_SIZE 16384 - - /* polling interval (ms) */ --#define POLL_INTERVAL 4 -+#define POLL_INTERVAL 1 - - /* maximum number of contacts FIXME: this is a guess? */ - #define MAX_CONTACTS 64 -@@ -448,7 +448,7 @@ static void sur40_process_video(struct sur40_state *sur40) - - /* return error if streaming was stopped in the meantime */ - if (sur40->sequence == -1) -- goto err_poll; -+ return; - - /* mark as finished */ - new_buf->vb.vb2_buf.timestamp = ktime_get_ns(); -@@ -736,6 +736,7 @@ static int sur40_start_streaming(struct vb2_queue *vq, unsigned int count) - static void sur40_stop_streaming(struct vb2_queue *vq) - { - struct sur40_state *sur40 = vb2_get_drv_priv(vq); -+ vb2_wait_for_all_buffers(vq); - sur40->sequence = -1; - - /* Release all active buffers */ -diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c -index 634f636..2511c8b 100644 ---- a/drivers/iommu/amd_iommu.c -+++ b/drivers/iommu/amd_iommu.c -@@ -466,9 +466,11 @@ static void init_iommu_group(struct device *dev) - if (!domain) - goto out; - -- dma_domain = to_pdomain(domain)->priv; -+ if (to_pdomain(domain)->flags == PD_DMA_OPS_MASK) { -+ dma_domain = to_pdomain(domain)->priv; -+ init_unity_mappings_for_device(dev, dma_domain); -+ } - -- init_unity_mappings_for_device(dev, dma_domain); - out: - iommu_group_put(group); - } -@@ -2512,8 +2514,15 @@ static void update_device_table(struct protection_domain *domain) - { - struct iommu_dev_data *dev_data; - -- list_for_each_entry(dev_data, &domain->dev_list, list) -+ list_for_each_entry(dev_data, &domain->dev_list, list) { - set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled); -+ -+ if (dev_data->devid == dev_data->alias) -+ continue; -+ -+ /* There is an alias, update device table entry for it */ -+ set_dte_entry(dev_data->alias, domain, dev_data->ats.enabled); -+ } - } - - static void update_domain(struct protection_domain *domain) -@@ -3103,9 +3112,7 @@ static struct iommu_domain *amd_iommu_domain_alloc(unsigned type) - static void amd_iommu_domain_free(struct iommu_domain *dom) - { - struct protection_domain *domain; -- -- if (!dom) -- return; -+ struct dma_ops_domain *dma_dom; - - domain = to_pdomain(dom); - -@@ -3114,13 +3121,24 @@ static void amd_iommu_domain_free(struct iommu_domain *dom) - - BUG_ON(domain->dev_cnt != 0); - -- if (domain->mode != PAGE_MODE_NONE) -- free_pagetable(domain); -+ if (!dom) -+ return; -+ -+ switch (dom->type) { -+ case IOMMU_DOMAIN_DMA: -+ dma_dom = domain->priv; -+ dma_ops_domain_free(dma_dom); -+ break; -+ default: -+ if (domain->mode != PAGE_MODE_NONE) -+ free_pagetable(domain); - -- if (domain->flags & PD_IOMMUV2_MASK) -- free_gcr3_table(domain); -+ if (domain->flags & PD_IOMMUV2_MASK) -+ free_gcr3_table(domain); - -- protection_domain_free(domain); -+ protection_domain_free(domain); -+ break; -+ } - } - - static void amd_iommu_detach_device(struct iommu_domain *dom, -diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c -index 5ecc86c..e27e3b7df 100644 ---- a/drivers/iommu/exynos-iommu.c -+++ b/drivers/iommu/exynos-iommu.c -@@ -709,6 +709,7 @@ static struct platform_driver exynos_sysmmu_driver __refdata = { - .name = "exynos-sysmmu", - .of_match_table = sysmmu_of_match, - .pm = &sysmmu_pm_ops, -+ .suppress_bind_attrs = true, - } - }; - -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index 323dac9..d416242 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -2076,7 +2076,7 @@ out_unlock: - spin_unlock(&iommu->lock); - spin_unlock_irqrestore(&device_domain_lock, flags); - -- return 0; -+ return ret; - } - - struct domain_context_mapping_data { -diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c -index a1ed1b7..f5c90e1 100644 ---- a/drivers/iommu/io-pgtable-arm.c -+++ b/drivers/iommu/io-pgtable-arm.c -@@ -576,7 +576,7 @@ static phys_addr_t arm_lpae_iova_to_phys(struct io_pgtable_ops *ops, - return 0; - - found_translation: -- iova &= (ARM_LPAE_GRANULE(data) - 1); -+ iova &= (ARM_LPAE_BLOCK_SIZE(lvl, data) - 1); - return ((phys_addr_t)iopte_to_pfn(pte,data) << data->pg_shift) | iova; - } - -diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c -index b7341de..4bb49cd 100644 ---- a/drivers/md/dm-flakey.c -+++ b/drivers/md/dm-flakey.c -@@ -289,10 +289,16 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) - pb->bio_submitted = true; - - /* -- * Map reads as normal. -+ * Map reads as normal only if corrupt_bio_byte set. - */ -- if (bio_data_dir(bio) == READ) -- goto map_bio; -+ if (bio_data_dir(bio) == READ) { -+ /* If flags were specified, only corrupt those that match. */ -+ if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) && -+ all_corrupt_bio_flags_match(bio, fc)) -+ goto map_bio; -+ else -+ return -EIO; -+ } - - /* - * Drop writes? -@@ -330,12 +336,13 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, int error) - - /* - * Corrupt successful READs while in down state. -- * If flags were specified, only corrupt those that match. - */ -- if (fc->corrupt_bio_byte && !error && pb->bio_submitted && -- (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && -- all_corrupt_bio_flags_match(bio, fc)) -- corrupt_bio_data(bio, fc); -+ if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) { -+ if (fc->corrupt_bio_byte) -+ corrupt_bio_data(bio, fc); -+ else -+ return -EIO; -+ } - - return error; - } -diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c -index 459a9f8..0f0eb8a 100644 ---- a/drivers/md/dm-verity-fec.c -+++ b/drivers/md/dm-verity-fec.c -@@ -453,9 +453,7 @@ int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, - */ - - offset = block << v->data_dev_block_bits; -- -- res = offset; -- div64_u64(res, v->fec->rounds << v->data_dev_block_bits); -+ res = div64_u64(offset, v->fec->rounds << v->data_dev_block_bits); - - /* - * The base RS block we can feed to the interleaver to find out all -diff --git a/drivers/md/dm.c b/drivers/md/dm.c -index 1b2f962..fd40bcb 100644 ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -2175,7 +2175,7 @@ static void dm_request_fn(struct request_queue *q) - md_in_flight(md) && rq->bio && rq->bio->bi_vcnt == 1 && - md->last_rq_pos == pos && md->last_rq_rw == rq_data_dir(rq)) || - (ti->type->busy && ti->type->busy(ti))) { -- blk_delay_queue(q, HZ / 100); -+ blk_delay_queue(q, 10); - return; - } - -@@ -3128,7 +3128,8 @@ static void unlock_fs(struct mapped_device *md) - * Caller must hold md->suspend_lock - */ - static int __dm_suspend(struct mapped_device *md, struct dm_table *map, -- unsigned suspend_flags, int interruptible) -+ unsigned suspend_flags, int interruptible, -+ int dmf_suspended_flag) - { - bool do_lockfs = suspend_flags & DM_SUSPEND_LOCKFS_FLAG; - bool noflush = suspend_flags & DM_SUSPEND_NOFLUSH_FLAG; -@@ -3195,6 +3196,8 @@ static int __dm_suspend(struct mapped_device *md, struct dm_table *map, - * to finish. - */ - r = dm_wait_for_completion(md, interruptible); -+ if (!r) -+ set_bit(dmf_suspended_flag, &md->flags); - - if (noflush) - clear_bit(DMF_NOFLUSH_SUSPENDING, &md->flags); -@@ -3256,12 +3259,10 @@ retry: - - map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); - -- r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE); -+ r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE, DMF_SUSPENDED); - if (r) - goto out_unlock; - -- set_bit(DMF_SUSPENDED, &md->flags); -- - dm_table_postsuspend_targets(map); - - out_unlock: -@@ -3355,9 +3356,8 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla - * would require changing .presuspend to return an error -- avoid this - * until there is a need for more elaborate variants of internal suspend. - */ -- (void) __dm_suspend(md, map, suspend_flags, TASK_UNINTERRUPTIBLE); -- -- set_bit(DMF_SUSPENDED_INTERNALLY, &md->flags); -+ (void) __dm_suspend(md, map, suspend_flags, TASK_UNINTERRUPTIBLE, -+ DMF_SUSPENDED_INTERNALLY); - - dm_table_postsuspend_targets(map); - } -diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c -index 1100e98..7df7fb3 100644 ---- a/drivers/media/dvb-core/dvb_ringbuffer.c -+++ b/drivers/media/dvb-core/dvb_ringbuffer.c -@@ -55,7 +55,13 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) - - int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf) - { -- return (rbuf->pread==rbuf->pwrite); -+ /* smp_load_acquire() to load write pointer on reader side -+ * this pairs with smp_store_release() in dvb_ringbuffer_write(), -+ * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset() -+ * -+ * for memory barriers also see Documentation/circular-buffers.txt -+ */ -+ return (rbuf->pread == smp_load_acquire(&rbuf->pwrite)); - } - - -@@ -64,7 +70,12 @@ ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf) - { - ssize_t free; - -- free = rbuf->pread - rbuf->pwrite; -+ /* ACCESS_ONCE() to load read pointer on writer side -+ * this pairs with smp_store_release() in dvb_ringbuffer_read(), -+ * dvb_ringbuffer_read_user(), dvb_ringbuffer_flush(), -+ * or dvb_ringbuffer_reset() -+ */ -+ free = ACCESS_ONCE(rbuf->pread) - rbuf->pwrite; - if (free <= 0) - free += rbuf->size; - return free-1; -@@ -76,7 +87,11 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) - { - ssize_t avail; - -- avail = rbuf->pwrite - rbuf->pread; -+ /* smp_load_acquire() to load write pointer on reader side -+ * this pairs with smp_store_release() in dvb_ringbuffer_write(), -+ * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset() -+ */ -+ avail = smp_load_acquire(&rbuf->pwrite) - rbuf->pread; - if (avail < 0) - avail += rbuf->size; - return avail; -@@ -86,14 +101,25 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) - - void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf) - { -- rbuf->pread = rbuf->pwrite; -+ /* dvb_ringbuffer_flush() counts as read operation -+ * smp_load_acquire() to load write pointer -+ * smp_store_release() to update read pointer, this ensures that the -+ * correct pointer is visible for subsequent dvb_ringbuffer_free() -+ * calls on other cpu cores -+ */ -+ smp_store_release(&rbuf->pread, smp_load_acquire(&rbuf->pwrite)); - rbuf->error = 0; - } - EXPORT_SYMBOL(dvb_ringbuffer_flush); - - void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf) - { -- rbuf->pread = rbuf->pwrite = 0; -+ /* dvb_ringbuffer_reset() counts as read and write operation -+ * smp_store_release() to update read pointer -+ */ -+ smp_store_release(&rbuf->pread, 0); -+ /* smp_store_release() to update write pointer */ -+ smp_store_release(&rbuf->pwrite, 0); - rbuf->error = 0; - } - -@@ -119,12 +145,17 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, si - return -EFAULT; - buf += split; - todo -= split; -- rbuf->pread = 0; -+ /* smp_store_release() for read pointer update to ensure -+ * that buf is not overwritten until read is complete, -+ * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free() -+ */ -+ smp_store_release(&rbuf->pread, 0); - } - if (copy_to_user(buf, rbuf->data+rbuf->pread, todo)) - return -EFAULT; - -- rbuf->pread = (rbuf->pread + todo) % rbuf->size; -+ /* smp_store_release() to update read pointer, see above */ -+ smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size); - - return len; - } -@@ -139,11 +170,16 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len) - memcpy(buf, rbuf->data+rbuf->pread, split); - buf += split; - todo -= split; -- rbuf->pread = 0; -+ /* smp_store_release() for read pointer update to ensure -+ * that buf is not overwritten until read is complete, -+ * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free() -+ */ -+ smp_store_release(&rbuf->pread, 0); - } - memcpy(buf, rbuf->data+rbuf->pread, todo); - -- rbuf->pread = (rbuf->pread + todo) % rbuf->size; -+ /* smp_store_release() to update read pointer, see above */ -+ smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size); - } - - -@@ -158,10 +194,16 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t - memcpy(rbuf->data+rbuf->pwrite, buf, split); - buf += split; - todo -= split; -- rbuf->pwrite = 0; -+ /* smp_store_release() for write pointer update to ensure that -+ * written data is visible on other cpu cores before the pointer -+ * update, this pairs with smp_load_acquire() in -+ * dvb_ringbuffer_empty() or dvb_ringbuffer_avail() -+ */ -+ smp_store_release(&rbuf->pwrite, 0); - } - memcpy(rbuf->data+rbuf->pwrite, buf, todo); -- rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; -+ /* smp_store_release() for write pointer update, see above */ -+ smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size); - - return len; - } -@@ -181,12 +223,18 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, - return len - todo; - buf += split; - todo -= split; -- rbuf->pwrite = 0; -+ /* smp_store_release() for write pointer update to ensure that -+ * written data is visible on other cpu cores before the pointer -+ * update, this pairs with smp_load_acquire() in -+ * dvb_ringbuffer_empty() or dvb_ringbuffer_avail() -+ */ -+ smp_store_release(&rbuf->pwrite, 0); - } - status = copy_from_user(rbuf->data+rbuf->pwrite, buf, todo); - if (status) - return len - todo; -- rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; -+ /* smp_store_release() for write pointer update, see above */ -+ smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size); - - return len; - } -diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c -index b16466f..beb4fd5 100644 ---- a/drivers/media/platform/s5p-mfc/s5p_mfc.c -+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c -@@ -1050,6 +1050,11 @@ static int match_child(struct device *dev, void *data) - return !strcmp(dev_name(dev), (char *)data); - } - -+static void s5p_mfc_memdev_release(struct device *dev) -+{ -+ dma_release_declared_memory(dev); -+} -+ - static void *mfc_get_drv_data(struct platform_device *pdev); - - static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) -@@ -1062,6 +1067,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) - mfc_err("Not enough memory\n"); - return -ENOMEM; - } -+ -+ dev_set_name(dev->mem_dev_l, "%s", "s5p-mfc-l"); -+ dev->mem_dev_l->release = s5p_mfc_memdev_release; - device_initialize(dev->mem_dev_l); - of_property_read_u32_array(dev->plat_dev->dev.of_node, - "samsung,mfc-l", mem_info, 2); -@@ -1079,6 +1087,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev) - mfc_err("Not enough memory\n"); - return -ENOMEM; - } -+ -+ dev_set_name(dev->mem_dev_r, "%s", "s5p-mfc-r"); -+ dev->mem_dev_r->release = s5p_mfc_memdev_release; - device_initialize(dev->mem_dev_r); - of_property_read_u32_array(dev->plat_dev->dev.of_node, - "samsung,mfc-r", mem_info, 2); -diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c -index 6ffe776..a0fd4e6 100644 ---- a/drivers/media/rc/ir-rc5-decoder.c -+++ b/drivers/media/rc/ir-rc5-decoder.c -@@ -29,7 +29,7 @@ - #define RC5_BIT_START (1 * RC5_UNIT) - #define RC5_BIT_END (1 * RC5_UNIT) - #define RC5X_SPACE (4 * RC5_UNIT) --#define RC5_TRAILER (10 * RC5_UNIT) /* In reality, approx 100 */ -+#define RC5_TRAILER (6 * RC5_UNIT) /* In reality, approx 100 */ - - enum rc5_state { - STATE_INACTIVE, -diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c -index 99b303b..e8ceb0e 100644 ---- a/drivers/media/rc/nuvoton-cir.c -+++ b/drivers/media/rc/nuvoton-cir.c -@@ -401,6 +401,7 @@ static int nvt_hw_detect(struct nvt_dev *nvt) - /* Check if we're wired for the alternate EFER setup */ - nvt->chip_major = nvt_cr_read(nvt, CR_CHIP_ID_HI); - if (nvt->chip_major == 0xff) { -+ nvt_efm_disable(nvt); - nvt->cr_efir = CR_EFIR2; - nvt->cr_efdr = CR_EFDR2; - nvt_efm_enable(nvt); -diff --git a/drivers/media/usb/usbtv/usbtv-audio.c b/drivers/media/usb/usbtv/usbtv-audio.c -index 78c12d2..5dab024 100644 ---- a/drivers/media/usb/usbtv/usbtv-audio.c -+++ b/drivers/media/usb/usbtv/usbtv-audio.c -@@ -278,6 +278,9 @@ static void snd_usbtv_trigger(struct work_struct *work) - { - struct usbtv *chip = container_of(work, struct usbtv, snd_trigger); - -+ if (!chip->snd) -+ return; -+ - if (atomic_read(&chip->snd_stream)) - usbtv_audio_start(chip); - else -@@ -378,6 +381,8 @@ err: - - void usbtv_audio_free(struct usbtv *usbtv) - { -+ cancel_work_sync(&usbtv->snd_trigger); -+ - if (usbtv->snd && usbtv->udev) { - snd_card_free(usbtv->snd); - usbtv->snd = NULL; -diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c -index 9fbcb67..633fc1a 100644 ---- a/drivers/media/v4l2-core/videobuf2-core.c -+++ b/drivers/media/v4l2-core/videobuf2-core.c -@@ -1648,7 +1648,7 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, - void *pb, int nonblocking) - { - unsigned long flags; -- int ret; -+ int ret = 0; - - /* - * Wait for at least one buffer to become available on the done_list. -@@ -1664,10 +1664,12 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, - spin_lock_irqsave(&q->done_lock, flags); - *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); - /* -- * Only remove the buffer from done_list if v4l2_buffer can handle all -- * the planes. -+ * Only remove the buffer from done_list if all planes can be -+ * handled. Some cases such as V4L2 file I/O and DVB have pb -+ * == NULL; skip the check then as there's nothing to verify. - */ -- ret = call_bufop(q, verify_planes_array, *vb, pb); -+ if (pb) -+ ret = call_bufop(q, verify_planes_array, *vb, pb); - if (!ret) - list_del(&(*vb)->done_entry); - spin_unlock_irqrestore(&q->done_lock, flags); -diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c -index 0b1b8c7..7f366f1 100644 ---- a/drivers/media/v4l2-core/videobuf2-v4l2.c -+++ b/drivers/media/v4l2-core/videobuf2-v4l2.c -@@ -74,6 +74,11 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer - return 0; - } - -+static int __verify_planes_array_core(struct vb2_buffer *vb, const void *pb) -+{ -+ return __verify_planes_array(vb, pb); -+} -+ - /** - * __verify_length() - Verify that the bytesused value for each plane fits in - * the plane length and that the data offset doesn't exceed the bytesused value. -@@ -437,6 +442,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, - } - - static const struct vb2_buf_ops v4l2_buf_ops = { -+ .verify_planes_array = __verify_planes_array_core, - .fill_user_buffer = __fill_v4l2_buffer, - .fill_vb2_buffer = __fill_vb2_buffer, - .copy_timestamp = __copy_timestamp, -diff --git a/drivers/mfd/qcom_rpm.c b/drivers/mfd/qcom_rpm.c -index 1be47ad..880d469 100644 ---- a/drivers/mfd/qcom_rpm.c -+++ b/drivers/mfd/qcom_rpm.c -@@ -34,7 +34,13 @@ struct qcom_rpm_resource { - struct qcom_rpm_data { - u32 version; - const struct qcom_rpm_resource *resource_table; -- unsigned n_resources; -+ unsigned int n_resources; -+ unsigned int req_ctx_off; -+ unsigned int req_sel_off; -+ unsigned int ack_ctx_off; -+ unsigned int ack_sel_off; -+ unsigned int req_sel_size; -+ unsigned int ack_sel_size; - }; - - struct qcom_rpm { -@@ -61,11 +67,7 @@ struct qcom_rpm { - - #define RPM_REQUEST_TIMEOUT (5 * HZ) - --#define RPM_REQUEST_CONTEXT 3 --#define RPM_REQ_SELECT 11 --#define RPM_ACK_CONTEXT 15 --#define RPM_ACK_SELECTOR 23 --#define RPM_SELECT_SIZE 7 -+#define RPM_MAX_SEL_SIZE 7 - - #define RPM_NOTIFICATION BIT(30) - #define RPM_REJECTED BIT(31) -@@ -157,6 +159,12 @@ static const struct qcom_rpm_data apq8064_template = { - .version = 3, - .resource_table = apq8064_rpm_resource_table, - .n_resources = ARRAY_SIZE(apq8064_rpm_resource_table), -+ .req_ctx_off = 3, -+ .req_sel_off = 11, -+ .ack_ctx_off = 15, -+ .ack_sel_off = 23, -+ .req_sel_size = 4, -+ .ack_sel_size = 7, - }; - - static const struct qcom_rpm_resource msm8660_rpm_resource_table[] = { -@@ -240,6 +248,12 @@ static const struct qcom_rpm_data msm8660_template = { - .version = 2, - .resource_table = msm8660_rpm_resource_table, - .n_resources = ARRAY_SIZE(msm8660_rpm_resource_table), -+ .req_ctx_off = 3, -+ .req_sel_off = 11, -+ .ack_ctx_off = 19, -+ .ack_sel_off = 27, -+ .req_sel_size = 7, -+ .ack_sel_size = 7, - }; - - static const struct qcom_rpm_resource msm8960_rpm_resource_table[] = { -@@ -322,6 +336,12 @@ static const struct qcom_rpm_data msm8960_template = { - .version = 3, - .resource_table = msm8960_rpm_resource_table, - .n_resources = ARRAY_SIZE(msm8960_rpm_resource_table), -+ .req_ctx_off = 3, -+ .req_sel_off = 11, -+ .ack_ctx_off = 15, -+ .ack_sel_off = 23, -+ .req_sel_size = 4, -+ .ack_sel_size = 7, - }; - - static const struct qcom_rpm_resource ipq806x_rpm_resource_table[] = { -@@ -362,6 +382,12 @@ static const struct qcom_rpm_data ipq806x_template = { - .version = 3, - .resource_table = ipq806x_rpm_resource_table, - .n_resources = ARRAY_SIZE(ipq806x_rpm_resource_table), -+ .req_ctx_off = 3, -+ .req_sel_off = 11, -+ .ack_ctx_off = 15, -+ .ack_sel_off = 23, -+ .req_sel_size = 4, -+ .ack_sel_size = 7, - }; - - static const struct of_device_id qcom_rpm_of_match[] = { -@@ -380,7 +406,7 @@ int qcom_rpm_write(struct qcom_rpm *rpm, - { - const struct qcom_rpm_resource *res; - const struct qcom_rpm_data *data = rpm->data; -- u32 sel_mask[RPM_SELECT_SIZE] = { 0 }; -+ u32 sel_mask[RPM_MAX_SEL_SIZE] = { 0 }; - int left; - int ret = 0; - int i; -@@ -398,12 +424,12 @@ int qcom_rpm_write(struct qcom_rpm *rpm, - writel_relaxed(buf[i], RPM_REQ_REG(rpm, res->target_id + i)); - - bitmap_set((unsigned long *)sel_mask, res->select_id, 1); -- for (i = 0; i < ARRAY_SIZE(sel_mask); i++) { -+ for (i = 0; i < rpm->data->req_sel_size; i++) { - writel_relaxed(sel_mask[i], -- RPM_CTRL_REG(rpm, RPM_REQ_SELECT + i)); -+ RPM_CTRL_REG(rpm, rpm->data->req_sel_off + i)); - } - -- writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, RPM_REQUEST_CONTEXT)); -+ writel_relaxed(BIT(state), RPM_CTRL_REG(rpm, rpm->data->req_ctx_off)); - - reinit_completion(&rpm->ack); - regmap_write(rpm->ipc_regmap, rpm->ipc_offset, BIT(rpm->ipc_bit)); -@@ -426,10 +452,11 @@ static irqreturn_t qcom_rpm_ack_interrupt(int irq, void *dev) - u32 ack; - int i; - -- ack = readl_relaxed(RPM_CTRL_REG(rpm, RPM_ACK_CONTEXT)); -- for (i = 0; i < RPM_SELECT_SIZE; i++) -- writel_relaxed(0, RPM_CTRL_REG(rpm, RPM_ACK_SELECTOR + i)); -- writel(0, RPM_CTRL_REG(rpm, RPM_ACK_CONTEXT)); -+ ack = readl_relaxed(RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); -+ for (i = 0; i < rpm->data->ack_sel_size; i++) -+ writel_relaxed(0, -+ RPM_CTRL_REG(rpm, rpm->data->ack_sel_off + i)); -+ writel(0, RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); - - if (ack & RPM_NOTIFICATION) { - dev_warn(rpm->dev, "ignoring notification!\n"); -diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c -index 0b0dc29..77533f7 100644 ---- a/drivers/mtd/nand/nand_base.c -+++ b/drivers/mtd/nand/nand_base.c -@@ -2610,7 +2610,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, - int cached = writelen > bytes && page != blockmask; - uint8_t *wbuf = buf; - int use_bufpoi; -- int part_pagewr = (column || writelen < (mtd->writesize - 1)); -+ int part_pagewr = (column || writelen < mtd->writesize); - - if (part_pagewr) - use_bufpoi = 1; -diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c -index ef36182..0680516 100644 ---- a/drivers/mtd/ubi/build.c -+++ b/drivers/mtd/ubi/build.c -@@ -874,7 +874,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - for (i = 0; i < UBI_MAX_DEVICES; i++) { - ubi = ubi_devices[i]; - if (ubi && mtd->index == ubi->mtd->index) { -- ubi_err(ubi, "mtd%d is already attached to ubi%d", -+ pr_err("ubi: mtd%d is already attached to ubi%d", - mtd->index, i); - return -EEXIST; - } -@@ -889,7 +889,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - * no sense to attach emulated MTD devices, so we prohibit this. - */ - if (mtd->type == MTD_UBIVOLUME) { -- ubi_err(ubi, "refuse attaching mtd%d - it is already emulated on top of UBI", -+ pr_err("ubi: refuse attaching mtd%d - it is already emulated on top of UBI", - mtd->index); - return -EINVAL; - } -@@ -900,7 +900,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - if (!ubi_devices[ubi_num]) - break; - if (ubi_num == UBI_MAX_DEVICES) { -- ubi_err(ubi, "only %d UBI devices may be created", -+ pr_err("ubi: only %d UBI devices may be created", - UBI_MAX_DEVICES); - return -ENFILE; - } -@@ -910,7 +910,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - - /* Make sure ubi_num is not busy */ - if (ubi_devices[ubi_num]) { -- ubi_err(ubi, "already exists"); -+ pr_err("ubi: ubi%i already exists", ubi_num); - return -EEXIST; - } - } -@@ -992,6 +992,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - goto out_detach; - } - -+ /* Make device "available" before it becomes accessible via sysfs */ -+ ubi_devices[ubi_num] = ubi; -+ - err = uif_init(ubi, &ref); - if (err) - goto out_detach; -@@ -1036,7 +1039,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, - wake_up_process(ubi->bgt_thread); - spin_unlock(&ubi->wl_lock); - -- ubi_devices[ubi_num] = ubi; - ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL); - return ubi_num; - -@@ -1047,6 +1049,7 @@ out_uif: - ubi_assert(ref); - uif_close(ubi); - out_detach: -+ ubi_devices[ubi_num] = NULL; - ubi_wl_close(ubi); - ubi_free_internal_volumes(ubi); - vfree(ubi->vtbl); -diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c -index 10059df..0138f52 100644 ---- a/drivers/mtd/ubi/vmt.c -+++ b/drivers/mtd/ubi/vmt.c -@@ -488,13 +488,6 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) - spin_unlock(&ubi->volumes_lock); - } - -- /* Change volume table record */ -- vtbl_rec = ubi->vtbl[vol_id]; -- vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs); -- err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); -- if (err) -- goto out_acc; -- - if (pebs < 0) { - for (i = 0; i < -pebs; i++) { - err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i); -@@ -512,6 +505,24 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs) - spin_unlock(&ubi->volumes_lock); - } - -+ /* -+ * When we shrink a volume we have to flush all pending (erase) work. -+ * Otherwise it can happen that upon next attach UBI finds a LEB with -+ * lnum > highest_lnum and refuses to attach. -+ */ -+ if (pebs < 0) { -+ err = ubi_wl_flush(ubi, vol_id, UBI_ALL); -+ if (err) -+ goto out_acc; -+ } -+ -+ /* Change volume table record */ -+ vtbl_rec = ubi->vtbl[vol_id]; -+ vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs); -+ err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); -+ if (err) -+ goto out_acc; -+ - vol->reserved_pebs = reserved_pebs; - if (vol->vol_type == UBI_DYNAMIC_VOLUME) { - vol->used_ebs = reserved_pebs; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -index 5b30922..2ce3199 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c -@@ -2469,10 +2469,22 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb) - void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked) - { - struct brcmf_fws_info *fws = drvr->fws; -+ struct brcmf_if *ifp; -+ int i; - -- fws->bus_flow_blocked = flow_blocked; -- if (!flow_blocked) -- brcmf_fws_schedule_deq(fws); -- else -- fws->stats.bus_flow_block++; -+ if (fws->avoid_queueing) { -+ for (i = 0; i < BRCMF_MAX_IFS; i++) { -+ ifp = drvr->iflist[i]; -+ if (!ifp || !ifp->ndev) -+ continue; -+ brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, -+ flow_blocked); -+ } -+ } else { -+ fws->bus_flow_blocked = flow_blocked; -+ if (!flow_blocked) -+ brcmf_fws_schedule_deq(fws); -+ else -+ fws->stats.bus_flow_block++; -+ } - } -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c -index a588b05..6f020e4 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c -@@ -433,6 +433,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { - /* 8000 Series */ - {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x1010, iwl8260_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24F3, 0x10B0, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x0130, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x1130, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x0132, iwl8260_2ac_cfg)}, -@@ -454,6 +455,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { - {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24F3, 0xD0B0, iwl8260_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24F3, 0xB0B0, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x8110, iwl8260_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24F3, 0x9010, iwl8260_2ac_cfg)}, -@@ -481,6 +484,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = { - {IWL_PCI_DEVICE(0x24FD, 0x0010, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x0110, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x1110, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x1130, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x0130, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x1010, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x0050, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x0150, iwl8265_2ac_cfg)}, -@@ -491,6 +496,10 @@ static const struct pci_device_id iwl_hw_card_ids[] = { - {IWL_PCI_DEVICE(0x24FD, 0x0810, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x9110, iwl8265_2ac_cfg)}, - {IWL_PCI_DEVICE(0x24FD, 0x8130, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x0910, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x0930, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x0950, iwl8265_2ac_cfg)}, -+ {IWL_PCI_DEVICE(0x24FD, 0x0850, iwl8265_2ac_cfg)}, - - /* 9000 Series */ - {IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)}, -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -index de6974f..2d8cce2 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -@@ -496,7 +496,7 @@ void iwl_pcie_dump_csr(struct iwl_trans *trans); - /***************************************************** - * Helpers - ******************************************************/ --static inline void iwl_disable_interrupts(struct iwl_trans *trans) -+static inline void _iwl_disable_interrupts(struct iwl_trans *trans) - { - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); - -@@ -519,7 +519,16 @@ static inline void iwl_disable_interrupts(struct iwl_trans *trans) - IWL_DEBUG_ISR(trans, "Disabled interrupts\n"); - } - --static inline void iwl_enable_interrupts(struct iwl_trans *trans) -+static inline void iwl_disable_interrupts(struct iwl_trans *trans) -+{ -+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); -+ -+ spin_lock(&trans_pcie->irq_lock); -+ _iwl_disable_interrupts(trans); -+ spin_unlock(&trans_pcie->irq_lock); -+} -+ -+static inline void _iwl_enable_interrupts(struct iwl_trans *trans) - { - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); - -@@ -542,6 +551,14 @@ static inline void iwl_enable_interrupts(struct iwl_trans *trans) - } - } - -+static inline void iwl_enable_interrupts(struct iwl_trans *trans) -+{ -+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); -+ -+ spin_lock(&trans_pcie->irq_lock); -+ _iwl_enable_interrupts(trans); -+ spin_unlock(&trans_pcie->irq_lock); -+} - static inline void iwl_enable_hw_int_msk_msix(struct iwl_trans *trans, u32 msk) - { - struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -index 0a4a3c5..aaaf2ad 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -@@ -1507,7 +1507,7 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) - * have anything to service - */ - if (test_bit(STATUS_INT_ENABLED, &trans->status)) -- iwl_enable_interrupts(trans); -+ _iwl_enable_interrupts(trans); - spin_unlock(&trans_pcie->irq_lock); - lock_map_release(&trans->sync_cmd_lockdep_map); - return IRQ_NONE; -@@ -1699,15 +1699,17 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) - inta & ~trans_pcie->inta_mask); - } - -+ spin_lock(&trans_pcie->irq_lock); -+ /* only Re-enable all interrupt if disabled by irq */ -+ if (test_bit(STATUS_INT_ENABLED, &trans->status)) -+ _iwl_enable_interrupts(trans); - /* we are loading the firmware, enable FH_TX interrupt only */ -- if (handled & CSR_INT_BIT_FH_TX) -+ else if (handled & CSR_INT_BIT_FH_TX) - iwl_enable_fw_load_int(trans); -- /* only Re-enable all interrupt if disabled by irq */ -- else if (test_bit(STATUS_INT_ENABLED, &trans->status)) -- iwl_enable_interrupts(trans); - /* Re-enable RF_KILL if it occurred */ - else if (handled & CSR_INT_BIT_RF_KILL) - iwl_enable_rfkill_int(trans); -+ spin_unlock(&trans_pcie->irq_lock); - - out: - lock_map_release(&trans->sync_cmd_lockdep_map); -@@ -1771,7 +1773,7 @@ void iwl_pcie_reset_ict(struct iwl_trans *trans) - return; - - spin_lock(&trans_pcie->irq_lock); -- iwl_disable_interrupts(trans); -+ _iwl_disable_interrupts(trans); - - memset(trans_pcie->ict_tbl, 0, ICT_SIZE); - -@@ -1787,7 +1789,7 @@ void iwl_pcie_reset_ict(struct iwl_trans *trans) - trans_pcie->use_ict = true; - trans_pcie->ict_index = 0; - iwl_write32(trans, CSR_INT, trans_pcie->inta_mask); -- iwl_enable_interrupts(trans); -+ _iwl_enable_interrupts(trans); - spin_unlock(&trans_pcie->irq_lock); - } - -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -index f603d78..d9f1394 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -@@ -801,6 +801,8 @@ static int iwl_pcie_load_cpu_sections_8000(struct iwl_trans *trans, - - *first_ucode_section = last_read_idx; - -+ iwl_enable_interrupts(trans); -+ - if (cpu == 1) - iwl_write_direct32(trans, FH_UCODE_LOAD_STATUS, 0xFFFF); - else -@@ -980,6 +982,8 @@ static int iwl_pcie_load_given_ucode(struct iwl_trans *trans, - iwl_pcie_apply_destination(trans); - } - -+ iwl_enable_interrupts(trans); -+ - /* release CPU reset */ - iwl_write32(trans, CSR_RESET, 0); - -@@ -1033,9 +1037,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power) - was_hw_rfkill = iwl_is_rfkill_set(trans); - - /* tell the device to stop sending interrupts */ -- spin_lock(&trans_pcie->irq_lock); - iwl_disable_interrupts(trans); -- spin_unlock(&trans_pcie->irq_lock); - - /* device going down, Stop using ICT table */ - iwl_pcie_disable_ict(trans); -@@ -1079,9 +1081,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power) - * the time, unless the interrupt is ACKed even if the interrupt - * should be masked. Re-ACK all the interrupts here. - */ -- spin_lock(&trans_pcie->irq_lock); - iwl_disable_interrupts(trans); -- spin_unlock(&trans_pcie->irq_lock); - - /* clear all status bits */ - clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); -@@ -1215,7 +1215,6 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, - ret = iwl_pcie_load_given_ucode_8000(trans, fw); - else - ret = iwl_pcie_load_given_ucode(trans, fw); -- iwl_enable_interrupts(trans); - - /* re-check RF-Kill state since we may have missed the interrupt */ - hw_rfkill = iwl_is_rfkill_set(trans); -@@ -1567,15 +1566,11 @@ static void iwl_trans_pcie_op_mode_leave(struct iwl_trans *trans) - mutex_lock(&trans_pcie->mutex); - - /* disable interrupts - don't enable HW RF kill interrupt */ -- spin_lock(&trans_pcie->irq_lock); - iwl_disable_interrupts(trans); -- spin_unlock(&trans_pcie->irq_lock); - - iwl_pcie_apm_stop(trans, true); - -- spin_lock(&trans_pcie->irq_lock); - iwl_disable_interrupts(trans); -- spin_unlock(&trans_pcie->irq_lock); - - iwl_pcie_disable_ict(trans); - -diff --git a/drivers/of/base.c b/drivers/of/base.c -index ebf84e3..8bb3d1a 100644 ---- a/drivers/of/base.c -+++ b/drivers/of/base.c -@@ -112,6 +112,7 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj, - return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length); - } - -+/* always return newly allocated name, caller must free after use */ - static const char *safe_name(struct kobject *kobj, const char *orig_name) - { - const char *name = orig_name; -@@ -126,9 +127,12 @@ static const char *safe_name(struct kobject *kobj, const char *orig_name) - name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i); - } - -- if (name != orig_name) -+ if (name == orig_name) { -+ name = kstrdup(orig_name, GFP_KERNEL); -+ } else { - pr_warn("device-tree: Duplicate name in %s, renamed to \"%s\"\n", - kobject_name(kobj), name); -+ } - return name; - } - -@@ -159,6 +163,7 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp) - int __of_attach_node_sysfs(struct device_node *np) - { - const char *name; -+ struct kobject *parent; - struct property *pp; - int rc; - -@@ -171,15 +176,16 @@ int __of_attach_node_sysfs(struct device_node *np) - np->kobj.kset = of_kset; - if (!np->parent) { - /* Nodes without parents are new top level trees */ -- rc = kobject_add(&np->kobj, NULL, "%s", -- safe_name(&of_kset->kobj, "base")); -+ name = safe_name(&of_kset->kobj, "base"); -+ parent = NULL; - } else { - name = safe_name(&np->parent->kobj, kbasename(np->full_name)); -- if (!name || !name[0]) -- return -EINVAL; -- -- rc = kobject_add(&np->kobj, &np->parent->kobj, "%s", name); -+ parent = &np->parent->kobj; - } -+ if (!name) -+ return -ENOMEM; -+ rc = kobject_add(&np->kobj, parent, "%s", name); -+ kfree(name); - if (rc) - return rc; - -@@ -1815,6 +1821,12 @@ int __of_remove_property(struct device_node *np, struct property *prop) - return 0; - } - -+void __of_sysfs_remove_bin_file(struct device_node *np, struct property *prop) -+{ -+ sysfs_remove_bin_file(&np->kobj, &prop->attr); -+ kfree(prop->attr.attr.name); -+} -+ - void __of_remove_property_sysfs(struct device_node *np, struct property *prop) - { - if (!IS_ENABLED(CONFIG_SYSFS)) -@@ -1822,7 +1834,7 @@ void __of_remove_property_sysfs(struct device_node *np, struct property *prop) - - /* at early boot, bail here and defer setup to of_init() */ - if (of_kset && of_node_is_attached(np)) -- sysfs_remove_bin_file(&np->kobj, &prop->attr); -+ __of_sysfs_remove_bin_file(np, prop); - } - - /** -@@ -1895,7 +1907,7 @@ void __of_update_property_sysfs(struct device_node *np, struct property *newprop - return; - - if (oldprop) -- sysfs_remove_bin_file(&np->kobj, &oldprop->attr); -+ __of_sysfs_remove_bin_file(np, oldprop); - __of_add_property_sysfs(np, newprop); - } - -diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c -index 3033fa3..a201559 100644 ---- a/drivers/of/dynamic.c -+++ b/drivers/of/dynamic.c -@@ -55,7 +55,7 @@ void __of_detach_node_sysfs(struct device_node *np) - /* only remove properties if on sysfs */ - if (of_node_is_attached(np)) { - for_each_property_of_node(np, pp) -- sysfs_remove_bin_file(&np->kobj, &pp->attr); -+ __of_sysfs_remove_bin_file(np, pp); - kobject_del(&np->kobj); - } - -diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h -index 829469f..18bbb451 100644 ---- a/drivers/of/of_private.h -+++ b/drivers/of/of_private.h -@@ -83,6 +83,9 @@ extern int __of_attach_node_sysfs(struct device_node *np); - extern void __of_detach_node(struct device_node *np); - extern void __of_detach_node_sysfs(struct device_node *np); - -+extern void __of_sysfs_remove_bin_file(struct device_node *np, -+ struct property *prop); -+ - /* iterators for transactions, used for overlays */ - /* forward iterator */ - #define for_each_transaction_entry(_oft, _te) \ -diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c -index ee72ebe..7902fbf 100644 ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -3189,13 +3189,15 @@ static void quirk_no_bus_reset(struct pci_dev *dev) - } - - /* -- * Atheros AR93xx chips do not behave after a bus reset. The device will -- * throw a Link Down error on AER-capable systems and regardless of AER, -- * config space of the device is never accessible again and typically -- * causes the system to hang or reset when access is attempted. -+ * Some Atheros AR9xxx and QCA988x chips do not behave after a bus reset. -+ * The device will throw a Link Down error on AER-capable systems and -+ * regardless of AER, config space of the device is never accessible again -+ * and typically causes the system to hang or reset when access is attempted. - * http://www.spinics.net/lists/linux-pci/msg34797.html - */ - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); -+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); - - static void quirk_no_pm_reset(struct pci_dev *dev) - { -diff --git a/drivers/phy/phy-rcar-gen3-usb2.c b/drivers/phy/phy-rcar-gen3-usb2.c -index 4be3f5d..31156c9 100644 ---- a/drivers/phy/phy-rcar-gen3-usb2.c -+++ b/drivers/phy/phy-rcar-gen3-usb2.c -@@ -21,6 +21,7 @@ - #include <linux/phy/phy.h> - #include <linux/platform_device.h> - #include <linux/regulator/consumer.h> -+#include <linux/workqueue.h> - - /******* USB2.0 Host registers (original offset is +0x200) *******/ - #define USB2_INT_ENABLE 0x000 -@@ -81,9 +82,25 @@ struct rcar_gen3_chan { - struct extcon_dev *extcon; - struct phy *phy; - struct regulator *vbus; -+ struct work_struct work; -+ bool extcon_host; - bool has_otg; - }; - -+static void rcar_gen3_phy_usb2_work(struct work_struct *work) -+{ -+ struct rcar_gen3_chan *ch = container_of(work, struct rcar_gen3_chan, -+ work); -+ -+ if (ch->extcon_host) { -+ extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, true); -+ extcon_set_cable_state_(ch->extcon, EXTCON_USB, false); -+ } else { -+ extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, false); -+ extcon_set_cable_state_(ch->extcon, EXTCON_USB, true); -+ } -+} -+ - static void rcar_gen3_set_host_mode(struct rcar_gen3_chan *ch, int host) - { - void __iomem *usb2_base = ch->base; -@@ -130,8 +147,8 @@ static void rcar_gen3_init_for_host(struct rcar_gen3_chan *ch) - rcar_gen3_set_host_mode(ch, 1); - rcar_gen3_enable_vbus_ctrl(ch, 1); - -- extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, true); -- extcon_set_cable_state_(ch->extcon, EXTCON_USB, false); -+ ch->extcon_host = true; -+ schedule_work(&ch->work); - } - - static void rcar_gen3_init_for_peri(struct rcar_gen3_chan *ch) -@@ -140,8 +157,8 @@ static void rcar_gen3_init_for_peri(struct rcar_gen3_chan *ch) - rcar_gen3_set_host_mode(ch, 0); - rcar_gen3_enable_vbus_ctrl(ch, 0); - -- extcon_set_cable_state_(ch->extcon, EXTCON_USB_HOST, false); -- extcon_set_cable_state_(ch->extcon, EXTCON_USB, true); -+ ch->extcon_host = false; -+ schedule_work(&ch->work); - } - - static bool rcar_gen3_check_id(struct rcar_gen3_chan *ch) -@@ -301,6 +318,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) - if (irq >= 0) { - int ret; - -+ INIT_WORK(&channel->work, rcar_gen3_phy_usb2_work); - irq = devm_request_irq(dev, irq, rcar_gen3_phy_usb2_irq, - IRQF_SHARED, dev_name(dev), channel); - if (irq < 0) -diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c -index ac4f564..bf65c94 100644 ---- a/drivers/pinctrl/intel/pinctrl-cherryview.c -+++ b/drivers/pinctrl/intel/pinctrl-cherryview.c -@@ -160,7 +160,6 @@ struct chv_pin_context { - * @pctldev: Pointer to the pin controller device - * @chip: GPIO chip in this pin controller - * @regs: MMIO registers -- * @lock: Lock to serialize register accesses - * @intr_lines: Stores mapping between 16 HW interrupt wires and GPIO - * offset (in GPIO number space) - * @community: Community this pinctrl instance represents -@@ -174,7 +173,6 @@ struct chv_pinctrl { - struct pinctrl_dev *pctldev; - struct gpio_chip chip; - void __iomem *regs; -- raw_spinlock_t lock; - unsigned intr_lines[16]; - const struct chv_community *community; - u32 saved_intmask; -@@ -657,6 +655,17 @@ static const struct chv_community *chv_communities[] = { - &southeast_community, - }; - -+/* -+ * Lock to serialize register accesses -+ * -+ * Due to a silicon issue, a shared lock must be used to prevent -+ * concurrent accesses across the 4 GPIO controllers. -+ * -+ * See Intel Atom Z8000 Processor Series Specification Update (Rev. 005), -+ * errata #CHT34, for further information. -+ */ -+static DEFINE_RAW_SPINLOCK(chv_lock); -+ - static void __iomem *chv_padreg(struct chv_pinctrl *pctrl, unsigned offset, - unsigned reg) - { -@@ -718,13 +727,13 @@ static void chv_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, - u32 ctrl0, ctrl1; - bool locked; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); - ctrl1 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL1)); - locked = chv_pad_locked(pctrl, offset); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - if (ctrl0 & CHV_PADCTRL0_GPIOEN) { - seq_puts(s, "GPIO "); -@@ -787,14 +796,14 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, - - grp = &pctrl->community->groups[group]; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - /* Check first that the pad is not locked */ - for (i = 0; i < grp->npins; i++) { - if (chv_pad_locked(pctrl, grp->pins[i])) { - dev_warn(pctrl->dev, "unable to set mode for locked pin %u\n", - grp->pins[i]); -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - return -EBUSY; - } - } -@@ -837,7 +846,7 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function, - pin, altfunc->mode, altfunc->invert_oe ? "" : "not "); - } - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - return 0; - } -@@ -851,13 +860,13 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, - void __iomem *reg; - u32 value; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - if (chv_pad_locked(pctrl, offset)) { - value = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0)); - if (!(value & CHV_PADCTRL0_GPIOEN)) { - /* Locked so cannot enable */ -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - return -EBUSY; - } - } else { -@@ -897,7 +906,7 @@ static int chv_gpio_request_enable(struct pinctrl_dev *pctldev, - chv_writel(value, reg); - } - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - return 0; - } -@@ -911,13 +920,13 @@ static void chv_gpio_disable_free(struct pinctrl_dev *pctldev, - void __iomem *reg; - u32 value; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - reg = chv_padreg(pctrl, offset, CHV_PADCTRL0); - value = readl(reg) & ~CHV_PADCTRL0_GPIOEN; - chv_writel(value, reg); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - } - - static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, -@@ -929,7 +938,7 @@ static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, - unsigned long flags; - u32 ctrl0; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - ctrl0 = readl(reg) & ~CHV_PADCTRL0_GPIOCFG_MASK; - if (input) -@@ -938,7 +947,7 @@ static int chv_gpio_set_direction(struct pinctrl_dev *pctldev, - ctrl0 |= CHV_PADCTRL0_GPIOCFG_GPO << CHV_PADCTRL0_GPIOCFG_SHIFT; - chv_writel(ctrl0, reg); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - return 0; - } -@@ -963,10 +972,10 @@ static int chv_config_get(struct pinctrl_dev *pctldev, unsigned pin, - u16 arg = 0; - u32 term; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); - ctrl1 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL1)); -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - term = (ctrl0 & CHV_PADCTRL0_TERM_MASK) >> CHV_PADCTRL0_TERM_SHIFT; - -@@ -1040,7 +1049,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, - unsigned long flags; - u32 ctrl0, pull; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - ctrl0 = readl(reg); - - switch (param) { -@@ -1063,7 +1072,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, - pull = CHV_PADCTRL0_TERM_20K << CHV_PADCTRL0_TERM_SHIFT; - break; - default: -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - return -EINVAL; - } - -@@ -1081,7 +1090,7 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, - pull = CHV_PADCTRL0_TERM_20K << CHV_PADCTRL0_TERM_SHIFT; - break; - default: -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - return -EINVAL; - } - -@@ -1089,12 +1098,12 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin, - break; - - default: -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - return -EINVAL; - } - - chv_writel(ctrl0, reg); -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - return 0; - } -@@ -1160,9 +1169,9 @@ static int chv_gpio_get(struct gpio_chip *chip, unsigned offset) - unsigned long flags; - u32 ctrl0, cfg; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - cfg = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK; - cfg >>= CHV_PADCTRL0_GPIOCFG_SHIFT; -@@ -1180,7 +1189,7 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value) - void __iomem *reg; - u32 ctrl0; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - reg = chv_padreg(pctrl, pin, CHV_PADCTRL0); - ctrl0 = readl(reg); -@@ -1192,7 +1201,7 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value) - - chv_writel(ctrl0, reg); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - } - - static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset) -@@ -1202,9 +1211,9 @@ static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset) - u32 ctrl0, direction; - unsigned long flags; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - direction = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK; - direction >>= CHV_PADCTRL0_GPIOCFG_SHIFT; -@@ -1242,14 +1251,14 @@ static void chv_gpio_irq_ack(struct irq_data *d) - int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d)); - u32 intr_line; - -- raw_spin_lock(&pctrl->lock); -+ raw_spin_lock(&chv_lock); - - intr_line = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); - intr_line &= CHV_PADCTRL0_INTSEL_MASK; - intr_line >>= CHV_PADCTRL0_INTSEL_SHIFT; - chv_writel(BIT(intr_line), pctrl->regs + CHV_INTSTAT); - -- raw_spin_unlock(&pctrl->lock); -+ raw_spin_unlock(&chv_lock); - } - - static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) -@@ -1260,7 +1269,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) - u32 value, intr_line; - unsigned long flags; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - intr_line = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); - intr_line &= CHV_PADCTRL0_INTSEL_MASK; -@@ -1273,7 +1282,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask) - value |= BIT(intr_line); - chv_writel(value, pctrl->regs + CHV_INTMASK); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - } - - static void chv_gpio_irq_mask(struct irq_data *d) -@@ -1307,7 +1316,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) - unsigned long flags; - u32 intsel, value; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - intsel = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0)); - intsel &= CHV_PADCTRL0_INTSEL_MASK; - intsel >>= CHV_PADCTRL0_INTSEL_SHIFT; -@@ -1322,7 +1331,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d) - irq_set_handler_locked(d, handler); - pctrl->intr_lines[intsel] = offset; - } -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - } - - chv_gpio_irq_unmask(d); -@@ -1338,7 +1347,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type) - unsigned long flags; - u32 value; - -- raw_spin_lock_irqsave(&pctrl->lock, flags); -+ raw_spin_lock_irqsave(&chv_lock, flags); - - /* - * Pins which can be used as shared interrupt are configured in -@@ -1387,7 +1396,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type) - else if (type & IRQ_TYPE_LEVEL_MASK) - irq_set_handler_locked(d, handle_level_irq); - -- raw_spin_unlock_irqrestore(&pctrl->lock, flags); -+ raw_spin_unlock_irqrestore(&chv_lock, flags); - - return 0; - } -@@ -1499,7 +1508,6 @@ static int chv_pinctrl_probe(struct platform_device *pdev) - if (i == ARRAY_SIZE(chv_communities)) - return -ENODEV; - -- raw_spin_lock_init(&pctrl->lock); - pctrl->dev = &pdev->dev; - - #ifdef CONFIG_PM_SLEEP -diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c -index 6f145f2..96ffda4 100644 ---- a/drivers/platform/x86/hp-wmi.c -+++ b/drivers/platform/x86/hp-wmi.c -@@ -718,6 +718,11 @@ static int __init hp_wmi_rfkill_setup(struct platform_device *device) - if (err) - return err; - -+ err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, &wireless, -+ sizeof(wireless), 0); -+ if (err) -+ return err; -+ - if (wireless & 0x1) { - wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev, - RFKILL_TYPE_WLAN, -@@ -882,7 +887,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) - wwan_rfkill = NULL; - rfkill2_count = 0; - -- if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device)) -+ if (hp_wmi_rfkill_setup(device)) - hp_wmi_rfkill2_setup(device); - - err = device_create_file(&device->dev, &dev_attr_display); -diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c -index 02fb6b4..d838e77 100644 ---- a/drivers/regulator/s2mps11.c -+++ b/drivers/regulator/s2mps11.c -@@ -750,7 +750,7 @@ static const struct regulator_linear_range s2mps15_ldo_voltage_ranges3[] = { - - /* voltage range for s2mps15 LDO 7, 8, 9 and 10 */ - static const struct regulator_linear_range s2mps15_ldo_voltage_ranges4[] = { -- REGULATOR_LINEAR_RANGE(700000, 0xc, 0x18, 25000), -+ REGULATOR_LINEAR_RANGE(700000, 0x10, 0x20, 25000), - }; - - /* voltage range for s2mps15 LDO 1 */ -@@ -760,12 +760,12 @@ static const struct regulator_linear_range s2mps15_ldo_voltage_ranges5[] = { - - /* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */ - static const struct regulator_linear_range s2mps15_buck_voltage_ranges1[] = { -- REGULATOR_LINEAR_RANGE(500000, 0x20, 0xb0, 6250), -+ REGULATOR_LINEAR_RANGE(500000, 0x20, 0xc0, 6250), - }; - - /* voltage range for s2mps15 BUCK 8, 9 and 10 */ - static const struct regulator_linear_range s2mps15_buck_voltage_ranges2[] = { -- REGULATOR_LINEAR_RANGE(1000000, 0x20, 0xc0, 12500), -+ REGULATOR_LINEAR_RANGE(1000000, 0x20, 0x78, 12500), - }; - - static const struct regulator_desc s2mps15_regulators[] = { -diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c -index db3958b..fe0539e 100644 ---- a/drivers/remoteproc/remoteproc_core.c -+++ b/drivers/remoteproc/remoteproc_core.c -@@ -1264,11 +1264,6 @@ int rproc_add(struct rproc *rproc) - if (ret < 0) - return ret; - -- /* expose to rproc_get_by_phandle users */ -- mutex_lock(&rproc_list_mutex); -- list_add(&rproc->node, &rproc_list); -- mutex_unlock(&rproc_list_mutex); -- - dev_info(dev, "%s is available\n", rproc->name); - - dev_info(dev, "Note: remoteproc is still under development and considered experimental.\n"); -@@ -1276,8 +1271,16 @@ int rproc_add(struct rproc *rproc) - - /* create debugfs entries */ - rproc_create_debug_dir(rproc); -+ ret = rproc_add_virtio_devices(rproc); -+ if (ret < 0) -+ return ret; - -- return rproc_add_virtio_devices(rproc); -+ /* expose to rproc_get_by_phandle users */ -+ mutex_lock(&rproc_list_mutex); -+ list_add(&rproc->node, &rproc_list); -+ mutex_unlock(&rproc_list_mutex); -+ -+ return 0; - } - EXPORT_SYMBOL(rproc_add); - -diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c -index d01ad7e..4e823c4 100644 ---- a/drivers/rtc/rtc-s3c.c -+++ b/drivers/rtc/rtc-s3c.c -@@ -149,12 +149,14 @@ static int s3c_rtc_setfreq(struct s3c_rtc *info, int freq) - if (!is_power_of_2(freq)) - return -EINVAL; - -+ s3c_rtc_enable_clk(info); - spin_lock_irq(&info->pie_lock); - - if (info->data->set_freq) - info->data->set_freq(info, freq); - - spin_unlock_irq(&info->pie_lock); -+ s3c_rtc_disable_clk(info); - - return 0; - } -diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c -index b2afad5..2a34eb5 100644 ---- a/drivers/s390/cio/cmf.c -+++ b/drivers/s390/cio/cmf.c -@@ -753,6 +753,17 @@ static void reset_cmb(struct ccw_device *cdev) - cmf_generic_reset(cdev); - } - -+static int cmf_enabled(struct ccw_device *cdev) -+{ -+ int enabled; -+ -+ spin_lock_irq(cdev->ccwlock); -+ enabled = !!cdev->private->cmb; -+ spin_unlock_irq(cdev->ccwlock); -+ -+ return enabled; -+} -+ - static struct attribute_group cmf_attr_group; - - static struct cmb_operations cmbops_basic = { -@@ -1153,13 +1164,8 @@ static ssize_t cmb_enable_show(struct device *dev, - char *buf) - { - struct ccw_device *cdev = to_ccwdev(dev); -- int enabled; - -- spin_lock_irq(cdev->ccwlock); -- enabled = !!cdev->private->cmb; -- spin_unlock_irq(cdev->ccwlock); -- -- return sprintf(buf, "%d\n", enabled); -+ return sprintf(buf, "%d\n", cmf_enabled(cdev)); - } - - static ssize_t cmb_enable_store(struct device *dev, -@@ -1199,15 +1205,20 @@ int ccw_set_cmf(struct ccw_device *cdev, int enable) - * @cdev: The ccw device to be enabled - * - * Returns %0 for success or a negative error value. -- * -+ * Note: If this is called on a device for which channel measurement is already -+ * enabled a reset of the measurement data is triggered. - * Context: - * non-atomic - */ - int enable_cmf(struct ccw_device *cdev) - { -- int ret; -+ int ret = 0; - - device_lock(&cdev->dev); -+ if (cmf_enabled(cdev)) { -+ cmbops->reset(cdev); -+ goto out_unlock; -+ } - get_device(&cdev->dev); - ret = cmbops->alloc(cdev); - if (ret) -@@ -1226,7 +1237,7 @@ int enable_cmf(struct ccw_device *cdev) - out: - if (ret) - put_device(&cdev->dev); -- -+out_unlock: - device_unlock(&cdev->dev); - return ret; - } -diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c -index 3bd0be6..c7e5695 100644 ---- a/drivers/scsi/lpfc/lpfc_scsi.c -+++ b/drivers/scsi/lpfc/lpfc_scsi.c -@@ -3874,7 +3874,7 @@ int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba, - uint32_t tag; - uint16_t hwq; - -- if (shost_use_blk_mq(cmnd->device->host)) { -+ if (cmnd && shost_use_blk_mq(cmnd->device->host)) { - tag = blk_mq_unique_tag(cmnd->request); - hwq = blk_mq_unique_tag_to_hwq(tag); - -diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c -index f4b0690..2dab3dc 100644 ---- a/drivers/scsi/megaraid/megaraid_sas_base.c -+++ b/drivers/scsi/megaraid/megaraid_sas_base.c -@@ -4079,6 +4079,12 @@ megasas_get_pd_list(struct megasas_instance *instance) - struct MR_PD_ADDRESS *pd_addr; - dma_addr_t ci_h = 0; - -+ if (instance->pd_list_not_supported) { -+ dev_info(&instance->pdev->dev, "MR_DCMD_PD_LIST_QUERY " -+ "not supported by firmware\n"); -+ return ret; -+ } -+ - cmd = megasas_get_cmd(instance); - - if (!cmd) { -diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c -index f1eed7f..9c2788b 100644 ---- a/drivers/soc/qcom/smp2p.c -+++ b/drivers/soc/qcom/smp2p.c -@@ -344,11 +344,12 @@ static int qcom_smp2p_outbound_entry(struct qcom_smp2p *smp2p, - /* Allocate an entry from the smem item */ - strlcpy(buf, entry->name, SMP2P_MAX_ENTRY_NAME); - memcpy_toio(out->entries[out->valid_entries].name, buf, SMP2P_MAX_ENTRY_NAME); -- out->valid_entries++; - - /* Make the logical entry reference the physical value */ - entry->value = &out->entries[out->valid_entries].value; - -+ out->valid_entries++; -+ - entry->state = qcom_smem_state_register(node, &smp2p_state_ops, entry); - if (IS_ERR(entry->state)) { - dev_err(smp2p->dev, "failed to register qcom_smem_state\n"); -diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c -index fe07c05..daf2844 100644 ---- a/drivers/spi/spi-pxa2xx.c -+++ b/drivers/spi/spi-pxa2xx.c -@@ -585,7 +585,14 @@ static void reset_sccr1(struct driver_data *drv_data) - u32 sccr1_reg; - - sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1; -- sccr1_reg &= ~SSCR1_RFT; -+ switch (drv_data->ssp_type) { -+ case QUARK_X1000_SSP: -+ sccr1_reg &= ~QUARK_X1000_SSCR1_RFT; -+ break; -+ default: -+ sccr1_reg &= ~SSCR1_RFT; -+ break; -+ } - sccr1_reg |= chip->threshold; - pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg); - } -diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c -index 50f3d3a..39b928c 100644 ---- a/drivers/target/iscsi/iscsi_target.c -+++ b/drivers/target/iscsi/iscsi_target.c -@@ -492,7 +492,8 @@ void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd) - bool scsi_cmd = (cmd->iscsi_opcode == ISCSI_OP_SCSI_CMD); - - spin_lock_bh(&conn->cmd_lock); -- if (!list_empty(&cmd->i_conn_node)) -+ if (!list_empty(&cmd->i_conn_node) && -+ !(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP)) - list_del_init(&cmd->i_conn_node); - spin_unlock_bh(&conn->cmd_lock); - -@@ -4034,6 +4035,7 @@ int iscsi_target_rx_thread(void *arg) - - static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) - { -+ LIST_HEAD(tmp_list); - struct iscsi_cmd *cmd = NULL, *cmd_tmp = NULL; - struct iscsi_session *sess = conn->sess; - /* -@@ -4042,18 +4044,26 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) - * has been reset -> returned sleeping pre-handler state. - */ - spin_lock_bh(&conn->cmd_lock); -- list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { -+ list_splice_init(&conn->conn_cmd_list, &tmp_list); - -+ list_for_each_entry(cmd, &tmp_list, i_conn_node) { -+ struct se_cmd *se_cmd = &cmd->se_cmd; -+ -+ if (se_cmd->se_tfo != NULL) { -+ spin_lock(&se_cmd->t_state_lock); -+ se_cmd->transport_state |= CMD_T_FABRIC_STOP; -+ spin_unlock(&se_cmd->t_state_lock); -+ } -+ } -+ spin_unlock_bh(&conn->cmd_lock); -+ -+ list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) { - list_del_init(&cmd->i_conn_node); -- spin_unlock_bh(&conn->cmd_lock); - - iscsit_increment_maxcmdsn(cmd, sess); -- - iscsit_free_cmd(cmd, true); - -- spin_lock_bh(&conn->cmd_lock); - } -- spin_unlock_bh(&conn->cmd_lock); - } - - static void iscsit_stop_timers_for_cmds( -diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c -index b5212f0..adf419f 100644 ---- a/drivers/target/iscsi/iscsi_target_login.c -+++ b/drivers/target/iscsi/iscsi_target_login.c -@@ -1371,8 +1371,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) - } - login->zero_tsih = zero_tsih; - -- conn->sess->se_sess->sup_prot_ops = -- conn->conn_transport->iscsit_get_sup_prot_ops(conn); -+ if (conn->sess) -+ conn->sess->se_sess->sup_prot_ops = -+ conn->conn_transport->iscsit_get_sup_prot_ops(conn); - - tpg = conn->tpg; - if (!tpg) { -diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c -index a4046ca..6b42348 100644 ---- a/drivers/target/target_core_device.c -+++ b/drivers/target/target_core_device.c -@@ -821,13 +821,15 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) - * in ATA and we need to set TPE=1 - */ - bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib, -- struct request_queue *q, int block_size) -+ struct request_queue *q) - { -+ int block_size = queue_logical_block_size(q); -+ - if (!blk_queue_discard(q)) - return false; - -- attrib->max_unmap_lba_count = (q->limits.max_discard_sectors << 9) / -- block_size; -+ attrib->max_unmap_lba_count = -+ q->limits.max_discard_sectors >> (ilog2(block_size) - 9); - /* - * Currently hardcoded to 1 in Linux/SCSI code.. - */ -diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c -index 75f0f08..7929186 100644 ---- a/drivers/target/target_core_file.c -+++ b/drivers/target/target_core_file.c -@@ -161,8 +161,7 @@ static int fd_configure_device(struct se_device *dev) - dev_size, div_u64(dev_size, fd_dev->fd_block_size), - fd_dev->fd_block_size); - -- if (target_configure_unmap_from_queue(&dev->dev_attrib, q, -- fd_dev->fd_block_size)) -+ if (target_configure_unmap_from_queue(&dev->dev_attrib, q)) - pr_debug("IFILE: BLOCK Discard support available," - " disabled by default\n"); - /* -diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c -index 7c4efb4..2077bc2 100644 ---- a/drivers/target/target_core_iblock.c -+++ b/drivers/target/target_core_iblock.c -@@ -121,8 +121,7 @@ static int iblock_configure_device(struct se_device *dev) - dev->dev_attrib.hw_max_sectors = queue_max_hw_sectors(q); - dev->dev_attrib.hw_queue_depth = q->nr_requests; - -- if (target_configure_unmap_from_queue(&dev->dev_attrib, q, -- dev->dev_attrib.hw_block_size)) -+ if (target_configure_unmap_from_queue(&dev->dev_attrib, q)) - pr_debug("IBLOCK: BLOCK Discard support available," - " disabled by default\n"); - -diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h -index fc91e85..e2c970a 100644 ---- a/drivers/target/target_core_internal.h -+++ b/drivers/target/target_core_internal.h -@@ -146,6 +146,7 @@ sense_reason_t target_cmd_size_check(struct se_cmd *cmd, unsigned int size); - void target_qf_do_work(struct work_struct *work); - bool target_check_wce(struct se_device *dev); - bool target_check_fua(struct se_device *dev); -+void __target_execute_cmd(struct se_cmd *, bool); - - /* target_core_stat.c */ - void target_stat_setup_dev_default_groups(struct se_device *); -diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c -index a9057aa..04f616b 100644 ---- a/drivers/target/target_core_sbc.c -+++ b/drivers/target/target_core_sbc.c -@@ -602,7 +602,7 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool succes - cmd->transport_state |= CMD_T_ACTIVE|CMD_T_BUSY|CMD_T_SENT; - spin_unlock_irq(&cmd->t_state_lock); - -- __target_execute_cmd(cmd); -+ __target_execute_cmd(cmd, false); - - kfree(buf); - return ret; -diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c -index 5ab3967..42c2a44 100644 ---- a/drivers/target/target_core_transport.c -+++ b/drivers/target/target_core_transport.c -@@ -1303,23 +1303,6 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb) - - trace_target_sequencer_start(cmd); - -- /* -- * Check for an existing UNIT ATTENTION condition -- */ -- ret = target_scsi3_ua_check(cmd); -- if (ret) -- return ret; -- -- ret = target_alua_state_check(cmd); -- if (ret) -- return ret; -- -- ret = target_check_reservation(cmd); -- if (ret) { -- cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; -- return ret; -- } -- - ret = dev->transport->parse_cdb(cmd); - if (ret == TCM_UNSUPPORTED_SCSI_OPCODE) - pr_warn_ratelimited("%s/%s: Unsupported SCSI Opcode 0x%02x, sending CHECK_CONDITION.\n", -@@ -1761,20 +1744,45 @@ queue_full: - } - EXPORT_SYMBOL(transport_generic_request_failure); - --void __target_execute_cmd(struct se_cmd *cmd) -+void __target_execute_cmd(struct se_cmd *cmd, bool do_checks) - { - sense_reason_t ret; - -- if (cmd->execute_cmd) { -- ret = cmd->execute_cmd(cmd); -- if (ret) { -- spin_lock_irq(&cmd->t_state_lock); -- cmd->transport_state &= ~(CMD_T_BUSY|CMD_T_SENT); -- spin_unlock_irq(&cmd->t_state_lock); -+ if (!cmd->execute_cmd) { -+ ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; -+ goto err; -+ } -+ if (do_checks) { -+ /* -+ * Check for an existing UNIT ATTENTION condition after -+ * target_handle_task_attr() has done SAM task attr -+ * checking, and possibly have already defered execution -+ * out to target_restart_delayed_cmds() context. -+ */ -+ ret = target_scsi3_ua_check(cmd); -+ if (ret) -+ goto err; -+ -+ ret = target_alua_state_check(cmd); -+ if (ret) -+ goto err; - -- transport_generic_request_failure(cmd, ret); -+ ret = target_check_reservation(cmd); -+ if (ret) { -+ cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; -+ goto err; - } - } -+ -+ ret = cmd->execute_cmd(cmd); -+ if (!ret) -+ return; -+err: -+ spin_lock_irq(&cmd->t_state_lock); -+ cmd->transport_state &= ~(CMD_T_BUSY|CMD_T_SENT); -+ spin_unlock_irq(&cmd->t_state_lock); -+ -+ transport_generic_request_failure(cmd, ret); - } - - static int target_write_prot_action(struct se_cmd *cmd) -@@ -1819,6 +1827,8 @@ static bool target_handle_task_attr(struct se_cmd *cmd) - if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) - return false; - -+ cmd->se_cmd_flags |= SCF_TASK_ATTR_SET; -+ - /* - * Check for the existence of HEAD_OF_QUEUE, and if true return 1 - * to allow the passed struct se_cmd list of tasks to the front of the list. -@@ -1899,7 +1909,7 @@ void target_execute_cmd(struct se_cmd *cmd) - return; - } - -- __target_execute_cmd(cmd); -+ __target_execute_cmd(cmd, true); - } - EXPORT_SYMBOL(target_execute_cmd); - -@@ -1923,7 +1933,7 @@ static void target_restart_delayed_cmds(struct se_device *dev) - list_del(&cmd->se_delayed_node); - spin_unlock(&dev->delayed_cmd_lock); - -- __target_execute_cmd(cmd); -+ __target_execute_cmd(cmd, true); - - if (cmd->sam_task_attr == TCM_ORDERED_TAG) - break; -@@ -1941,6 +1951,9 @@ static void transport_complete_task_attr(struct se_cmd *cmd) - if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) - return; - -+ if (!(cmd->se_cmd_flags & SCF_TASK_ATTR_SET)) -+ goto restart; -+ - if (cmd->sam_task_attr == TCM_SIMPLE_TAG) { - atomic_dec_mb(&dev->simple_cmds); - dev->dev_cur_ordered_id++; -@@ -1957,7 +1970,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd) - pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED\n", - dev->dev_cur_ordered_id); - } -- -+restart: - target_restart_delayed_cmds(dev); - } - -@@ -2557,15 +2570,10 @@ static void target_release_cmd_kref(struct kref *kref) - bool fabric_stop; - - spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); -- if (list_empty(&se_cmd->se_cmd_list)) { -- spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); -- target_free_cmd_mem(se_cmd); -- se_cmd->se_tfo->release_cmd(se_cmd); -- return; -- } - - spin_lock(&se_cmd->t_state_lock); -- fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP); -+ fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP) && -+ (se_cmd->transport_state & CMD_T_ABORTED); - spin_unlock(&se_cmd->t_state_lock); - - if (se_cmd->cmd_wait_set || fabric_stop) { -diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c -index 954941d..f9c798c 100644 ---- a/drivers/tty/serial/atmel_serial.c -+++ b/drivers/tty/serial/atmel_serial.c -@@ -482,19 +482,21 @@ static void atmel_start_tx(struct uart_port *port) - { - struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); - -- if (atmel_use_pdc_tx(port)) { -- if (atmel_uart_readl(port, ATMEL_PDC_PTSR) & ATMEL_PDC_TXTEN) -- /* The transmitter is already running. Yes, we -- really need this.*/ -- return; -+ if (atmel_use_pdc_tx(port) && (atmel_uart_readl(port, ATMEL_PDC_PTSR) -+ & ATMEL_PDC_TXTEN)) -+ /* The transmitter is already running. Yes, we -+ really need this.*/ -+ return; - -+ if (atmel_use_pdc_tx(port) || atmel_use_dma_tx(port)) - if ((port->rs485.flags & SER_RS485_ENABLED) && - !(port->rs485.flags & SER_RS485_RX_DURING_TX)) - atmel_stop_rx(port); - -+ if (atmel_use_pdc_tx(port)) - /* re-enable PDC transmit */ - atmel_uart_writel(port, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN); -- } -+ - /* Enable interrupts */ - atmel_uart_writel(port, ATMEL_US_IER, atmel_port->tx_done_mask); - } -diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c -index b7d80bd..7d62610 100644 ---- a/drivers/tty/serial/msm_serial.c -+++ b/drivers/tty/serial/msm_serial.c -@@ -726,7 +726,7 @@ static void msm_handle_tx(struct uart_port *port) - return; - } - -- pio_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); -+ pio_count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); - dma_count = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); - - dma_min = 1; /* Always DMA */ -diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c -index 99bb231..f0bd2ec 100644 ---- a/drivers/tty/serial/samsung.c -+++ b/drivers/tty/serial/samsung.c -@@ -1684,7 +1684,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, - return -ENODEV; - - if (port->mapbase != 0) -- return 0; -+ return -EINVAL; - - /* setup info for port */ - port->dev = &platdev->dev; -@@ -1738,22 +1738,25 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, - ourport->dma = devm_kzalloc(port->dev, - sizeof(*ourport->dma), - GFP_KERNEL); -- if (!ourport->dma) -- return -ENOMEM; -+ if (!ourport->dma) { -+ ret = -ENOMEM; -+ goto err; -+ } - } - - ourport->clk = clk_get(&platdev->dev, "uart"); - if (IS_ERR(ourport->clk)) { - pr_err("%s: Controller clock not found\n", - dev_name(&platdev->dev)); -- return PTR_ERR(ourport->clk); -+ ret = PTR_ERR(ourport->clk); -+ goto err; - } - - ret = clk_prepare_enable(ourport->clk); - if (ret) { - pr_err("uart: clock failed to prepare+enable: %d\n", ret); - clk_put(ourport->clk); -- return ret; -+ goto err; - } - - /* Keep all interrupts masked and cleared */ -@@ -1769,7 +1772,12 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, - - /* reset the fifos (and setup the uart) */ - s3c24xx_serial_resetport(port, cfg); -+ - return 0; -+ -+err: -+ port->mapbase = 0; -+ return ret; - } - - /* Device driver serial port probe */ -diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c -index 944a6dc..d2e50a2 100644 ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -128,6 +128,9 @@ static const struct usb_device_id usb_quirk_list[] = { - { USB_DEVICE(0x04f3, 0x016f), .driver_info = - USB_QUIRK_DEVICE_QUALIFIER }, - -+ { USB_DEVICE(0x04f3, 0x0381), .driver_info = -+ USB_QUIRK_NO_LPM }, -+ - { USB_DEVICE(0x04f3, 0x21b8), .driver_info = - USB_QUIRK_DEVICE_QUALIFIER }, - -diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c -index 07248ff..716f4f0 100644 ---- a/drivers/usb/dwc3/gadget.c -+++ b/drivers/usb/dwc3/gadget.c -@@ -258,11 +258,13 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, - * We will also set SUSPHY bit to what it was before returning as stated - * by the same section on Synopsys databook. - */ -- reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); -- if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) { -- susphy = true; -- reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; -- dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); -+ if (dwc->gadget.speed <= USB_SPEED_HIGH) { -+ reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); -+ if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) { -+ susphy = true; -+ reg &= ~DWC3_GUSB2PHYCFG_SUSPHY; -+ dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); -+ } - } - - if (cmd == DWC3_DEPCMD_STARTTRANSFER) { -@@ -2023,6 +2025,10 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, - return 1; - } - -+ if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) -+ if ((event->status & DEPEVT_STATUS_IOC) && -+ (trb->ctrl & DWC3_TRB_CTRL_IOC)) -+ return 0; - return 1; - } - -diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c -index 18569de..bb1f6c8 100644 ---- a/drivers/usb/gadget/udc/atmel_usba_udc.c -+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c -@@ -1920,6 +1920,8 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, - - udc->errata = match->data; - udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9g45-pmc"); -+ if (IS_ERR(udc->pmc)) -+ udc->pmc = syscon_regmap_lookup_by_compatible("atmel,at91sam9x5-pmc"); - if (udc->errata && IS_ERR(udc->pmc)) - return ERR_CAST(udc->pmc); - -diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c -index ebc51ec..7175142 100644 ---- a/drivers/usb/gadget/udc/pch_udc.c -+++ b/drivers/usb/gadget/udc/pch_udc.c -@@ -1477,11 +1477,11 @@ static void complete_req(struct pch_udc_ep *ep, struct pch_udc_request *req, - req->dma_mapped = 0; - } - ep->halted = 1; -- spin_lock(&dev->lock); -+ spin_unlock(&dev->lock); - if (!ep->in) - pch_udc_ep_clear_rrdy(ep); - usb_gadget_giveback_request(&ep->ep, &req->req); -- spin_unlock(&dev->lock); -+ spin_lock(&dev->lock); - ep->halted = halted; - } - -@@ -2573,9 +2573,9 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev) - empty_req_queue(ep); - } - if (dev->driver) { -- spin_lock(&dev->lock); -- usb_gadget_udc_reset(&dev->gadget, dev->driver); - spin_unlock(&dev->lock); -+ usb_gadget_udc_reset(&dev->gadget, dev->driver); -+ spin_lock(&dev->lock); - } - } - -@@ -2654,9 +2654,9 @@ static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev) - dev->ep[i].halted = 0; - } - dev->stall = 0; -- spin_lock(&dev->lock); -- dev->driver->setup(&dev->gadget, &dev->setup_data); - spin_unlock(&dev->lock); -+ dev->driver->setup(&dev->gadget, &dev->setup_data); -+ spin_lock(&dev->lock); - } - - /** -@@ -2691,9 +2691,9 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev) - dev->stall = 0; - - /* call gadget zero with setup data received */ -- spin_lock(&dev->lock); -- dev->driver->setup(&dev->gadget, &dev->setup_data); - spin_unlock(&dev->lock); -+ dev->driver->setup(&dev->gadget, &dev->setup_data); -+ spin_lock(&dev->lock); - } - - /** -diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c -index 7be4e7d..280ed5f 100644 ---- a/drivers/usb/renesas_usbhs/fifo.c -+++ b/drivers/usb/renesas_usbhs/fifo.c -@@ -810,20 +810,27 @@ static void xfer_work(struct work_struct *work) - { - struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); - struct usbhs_pipe *pipe = pkt->pipe; -- struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe); -+ struct usbhs_fifo *fifo; - struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); - struct dma_async_tx_descriptor *desc; -- struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt); -+ struct dma_chan *chan; - struct device *dev = usbhs_priv_to_dev(priv); - enum dma_transfer_direction dir; -+ unsigned long flags; - -+ usbhs_lock(priv, flags); -+ fifo = usbhs_pipe_to_fifo(pipe); -+ if (!fifo) -+ goto xfer_work_end; -+ -+ chan = usbhsf_dma_chan_get(fifo, pkt); - dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; - - desc = dmaengine_prep_slave_single(chan, pkt->dma + pkt->actual, - pkt->trans, dir, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc) -- return; -+ goto xfer_work_end; - - desc->callback = usbhsf_dma_complete; - desc->callback_param = pipe; -@@ -831,7 +838,7 @@ static void xfer_work(struct work_struct *work) - pkt->cookie = dmaengine_submit(desc); - if (pkt->cookie < 0) { - dev_err(dev, "Failed to submit dma descriptor\n"); -- return; -+ goto xfer_work_end; - } - - dev_dbg(dev, " %s %d (%d/ %d)\n", -@@ -842,6 +849,9 @@ static void xfer_work(struct work_struct *work) - usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); - dma_async_issue_pending(chan); - usbhs_pipe_enable(pipe); -+ -+xfer_work_end: -+ usbhs_unlock(priv, flags); - } - - /* -diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c -index 30345c2..50f3363 100644 ---- a/drivers/usb/renesas_usbhs/mod_gadget.c -+++ b/drivers/usb/renesas_usbhs/mod_gadget.c -@@ -585,6 +585,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep, - struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); - struct usbhs_pipe *pipe; - int ret = -EIO; -+ unsigned long flags; -+ -+ usbhs_lock(priv, flags); - - /* - * if it already have pipe, -@@ -593,7 +596,8 @@ static int usbhsg_ep_enable(struct usb_ep *ep, - if (uep->pipe) { - usbhs_pipe_clear(uep->pipe); - usbhs_pipe_sequence_data0(uep->pipe); -- return 0; -+ ret = 0; -+ goto usbhsg_ep_enable_end; - } - - pipe = usbhs_pipe_malloc(priv, -@@ -621,6 +625,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep, - ret = 0; - } - -+usbhsg_ep_enable_end: -+ usbhs_unlock(priv, flags); -+ - return ret; - } - -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index d96d423..8e07536 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -273,6 +273,7 @@ static void option_instat_callback(struct urb *urb); - #define TELIT_PRODUCT_LE922_USBCFG5 0x1045 - #define TELIT_PRODUCT_LE920 0x1200 - #define TELIT_PRODUCT_LE910 0x1201 -+#define TELIT_PRODUCT_LE910_USBCFG4 0x1206 - - /* ZTE PRODUCTS */ - #define ZTE_VENDOR_ID 0x19d2 -@@ -1198,6 +1199,8 @@ static const struct usb_device_id option_ids[] = { - .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), - .driver_info = (kernel_ulong_t)&telit_le910_blacklist }, -+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), -+ .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 }, - { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), - .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ -diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c -index 476c0e3..f6ea8f4 100644 ---- a/drivers/virtio/virtio_balloon.c -+++ b/drivers/virtio/virtio_balloon.c -@@ -202,6 +202,8 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num) - num = min(num, ARRAY_SIZE(vb->pfns)); - - mutex_lock(&vb->balloon_lock); -+ /* We can't release more pages than taken */ -+ num = min(num, (size_t)vb->num_pages); - for (vb->num_pfns = 0; vb->num_pfns < num; - vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) { - page = balloon_page_dequeue(vb_dev_info); -diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c -index a2eec97..bb09de6 100644 ---- a/drivers/w1/masters/omap_hdq.c -+++ b/drivers/w1/masters/omap_hdq.c -@@ -390,8 +390,6 @@ static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) - goto out; - } - -- hdq_data->hdq_irqstatus = 0; -- - if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { - hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, - OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO, -diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c -index 75533ad..92fe3f8 100644 ---- a/fs/btrfs/extent_io.c -+++ b/fs/btrfs/extent_io.c -@@ -2696,12 +2696,6 @@ struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask) - btrfs_bio->csum = NULL; - btrfs_bio->csum_allocated = NULL; - btrfs_bio->end_io = NULL; -- --#ifdef CONFIG_BLK_CGROUP -- /* FIXME, put this into bio_clone_bioset */ -- if (bio->bi_css) -- bio_associate_blkcg(new, bio->bi_css); --#endif - } - return new; - } -diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c -index 2234e88..b56887b 100644 ---- a/fs/btrfs/file.c -+++ b/fs/btrfs/file.c -@@ -1629,13 +1629,11 @@ again: - * managed to copy. - */ - if (num_sectors > dirty_sectors) { -- /* -- * we round down because we don't want to count -- * any partial blocks actually sent through the -- * IO machines -- */ -- release_bytes = round_down(release_bytes - copied, -- root->sectorsize); -+ -+ /* release everything except the sectors we dirtied */ -+ release_bytes -= dirty_sectors << -+ root->fs_info->sb->s_blocksize_bits; -+ - if (copied > 0) { - spin_lock(&BTRFS_I(inode)->lock); - BTRFS_I(inode)->outstanding_extents++; -diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c -index 4ae7500..3f7c2cd 100644 ---- a/fs/cachefiles/namei.c -+++ b/fs/cachefiles/namei.c -@@ -263,6 +263,8 @@ requeue: - void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, - struct cachefiles_object *object) - { -+ blkcnt_t i_blocks = d_backing_inode(object->dentry)->i_blocks; -+ - write_lock(&cache->active_lock); - rb_erase(&object->active_node, &cache->active_nodes); - clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags); -@@ -273,8 +275,7 @@ void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, - /* This object can now be culled, so we need to let the daemon know - * that there is something it can remove if it needs to. - */ -- atomic_long_add(d_backing_inode(object->dentry)->i_blocks, -- &cache->b_released); -+ atomic_long_add(i_blocks, &cache->b_released); - if (atomic_inc_return(&cache->f_released)) - cachefiles_state_changed(cache); - } -diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h -index 3182273..1418daa 100644 ---- a/fs/cifs/cifs_fs_sb.h -+++ b/fs/cifs/cifs_fs_sb.h -@@ -46,6 +46,9 @@ - #define CIFS_MOUNT_CIFS_BACKUPUID 0x200000 /* backup intent bit for a user */ - #define CIFS_MOUNT_CIFS_BACKUPGID 0x400000 /* backup intent bit for a group */ - #define CIFS_MOUNT_MAP_SFM_CHR 0x800000 /* SFM/MAC mapping for illegal chars */ -+#define CIFS_MOUNT_USE_PREFIX_PATH 0x1000000 /* make subpath with unaccessible -+ * root mountable -+ */ - - struct cifs_sb_info { - struct rb_root tlink_tree; -@@ -67,5 +70,6 @@ struct cifs_sb_info { - struct backing_dev_info bdi; - struct delayed_work prune_tlinks; - struct rcu_head rcu; -+ char *prepath; - }; - #endif /* _CIFS_FS_SB_H */ -diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c -index 6aeb8d4..8347c90 100644 ---- a/fs/cifs/cifsencrypt.c -+++ b/fs/cifs/cifsencrypt.c -@@ -743,24 +743,26 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) - - memcpy(ses->auth_key.response + baselen, tiblob, tilen); - -+ mutex_lock(&ses->server->srv_mutex); -+ - rc = crypto_hmacmd5_alloc(ses->server); - if (rc) { - cifs_dbg(VFS, "could not crypto alloc hmacmd5 rc %d\n", rc); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - /* calculate ntlmv2_hash */ - rc = calc_ntlmv2_hash(ses, ntlmv2_hash, nls_cp); - if (rc) { - cifs_dbg(VFS, "could not get v2 hash rc %d\n", rc); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - /* calculate first part of the client response (CR1) */ - rc = CalcNTLMv2_response(ses, ntlmv2_hash); - if (rc) { - cifs_dbg(VFS, "Could not calculate CR1 rc: %d\n", rc); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - /* now calculate the session key for NTLMv2 */ -@@ -769,13 +771,13 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) - if (rc) { - cifs_dbg(VFS, "%s: Could not set NTLMV2 Hash as a key\n", - __func__); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash); - if (rc) { - cifs_dbg(VFS, "%s: Could not init hmacmd5\n", __func__); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash, -@@ -783,7 +785,7 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) - CIFS_HMAC_MD5_HASH_SIZE); - if (rc) { - cifs_dbg(VFS, "%s: Could not update with response\n", __func__); -- goto setup_ntlmv2_rsp_ret; -+ goto unlock; - } - - rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash, -@@ -791,6 +793,8 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp) - if (rc) - cifs_dbg(VFS, "%s: Could not generate md5 hash\n", __func__); - -+unlock: -+ mutex_unlock(&ses->server->srv_mutex); - setup_ntlmv2_rsp_ret: - kfree(tiblob); - -diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c -index 5d841f3..6bbec5e 100644 ---- a/fs/cifs/cifsfs.c -+++ b/fs/cifs/cifsfs.c -@@ -689,6 +689,14 @@ cifs_do_mount(struct file_system_type *fs_type, - goto out_cifs_sb; - } - -+ if (volume_info->prepath) { -+ cifs_sb->prepath = kstrdup(volume_info->prepath, GFP_KERNEL); -+ if (cifs_sb->prepath == NULL) { -+ root = ERR_PTR(-ENOMEM); -+ goto out_cifs_sb; -+ } -+ } -+ - cifs_setup_cifs_sb(volume_info, cifs_sb); - - rc = cifs_mount(cifs_sb, volume_info); -@@ -727,7 +735,11 @@ cifs_do_mount(struct file_system_type *fs_type, - sb->s_flags |= MS_ACTIVE; - } - -- root = cifs_get_root(volume_info, sb); -+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) -+ root = dget(sb->s_root); -+ else -+ root = cifs_get_root(volume_info, sb); -+ - if (IS_ERR(root)) - goto out_super; - -diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c -index 7d2b15c..7ae0328 100644 ---- a/fs/cifs/connect.c -+++ b/fs/cifs/connect.c -@@ -1228,6 +1228,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, - vol->ops = &smb1_operations; - vol->vals = &smb1_values; - -+ vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT; -+ - if (!mountdata) - goto cifs_parse_mount_err; - -@@ -2049,7 +2051,7 @@ static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol) - if (!match_security(server, vol)) - return 0; - -- if (server->echo_interval != vol->echo_interval) -+ if (server->echo_interval != vol->echo_interval * HZ) - return 0; - - return 1; -@@ -3483,6 +3485,44 @@ cifs_get_volume_info(char *mount_data, const char *devname) - return volume_info; - } - -+static int -+cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, -+ unsigned int xid, -+ struct cifs_tcon *tcon, -+ struct cifs_sb_info *cifs_sb, -+ char *full_path) -+{ -+ int rc; -+ char *s; -+ char sep, tmp; -+ -+ sep = CIFS_DIR_SEP(cifs_sb); -+ s = full_path; -+ -+ rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, ""); -+ while (rc == 0) { -+ /* skip separators */ -+ while (*s == sep) -+ s++; -+ if (!*s) -+ break; -+ /* next separator */ -+ while (*s && *s != sep) -+ s++; -+ -+ /* -+ * temporarily null-terminate the path at the end of -+ * the current component -+ */ -+ tmp = *s; -+ *s = 0; -+ rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, -+ full_path); -+ *s = tmp; -+ } -+ return rc; -+} -+ - int - cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info) - { -@@ -3620,6 +3660,16 @@ remote_path_check: - kfree(full_path); - goto mount_fail_check; - } -+ -+ rc = cifs_are_all_path_components_accessible(server, -+ xid, tcon, cifs_sb, -+ full_path); -+ if (rc != 0) { -+ cifs_dbg(VFS, "cannot query dirs between root and final path, " -+ "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); -+ cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; -+ rc = 0; -+ } - kfree(full_path); - } - -@@ -3889,6 +3939,7 @@ cifs_umount(struct cifs_sb_info *cifs_sb) - - bdi_destroy(&cifs_sb->bdi); - kfree(cifs_sb->mountdata); -+ kfree(cifs_sb->prepath); - call_rcu(&cifs_sb->rcu, delayed_free); - } - -diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c -index fb0903f..6f7333d 100644 ---- a/fs/cifs/dir.c -+++ b/fs/cifs/dir.c -@@ -84,6 +84,7 @@ build_path_from_dentry(struct dentry *direntry) - struct dentry *temp; - int namelen; - int dfsplen; -+ int pplen = 0; - char *full_path; - char dirsep; - struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); -@@ -95,8 +96,12 @@ build_path_from_dentry(struct dentry *direntry) - dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1); - else - dfsplen = 0; -+ -+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) -+ pplen = cifs_sb->prepath ? strlen(cifs_sb->prepath) + 1 : 0; -+ - cifs_bp_rename_retry: -- namelen = dfsplen; -+ namelen = dfsplen + pplen; - seq = read_seqbegin(&rename_lock); - rcu_read_lock(); - for (temp = direntry; !IS_ROOT(temp);) { -@@ -137,7 +142,7 @@ cifs_bp_rename_retry: - } - } - rcu_read_unlock(); -- if (namelen != dfsplen || read_seqretry(&rename_lock, seq)) { -+ if (namelen != dfsplen + pplen || read_seqretry(&rename_lock, seq)) { - cifs_dbg(FYI, "did not end path lookup where expected. namelen=%ddfsplen=%d\n", - namelen, dfsplen); - /* presumably this is only possible if racing with a rename -@@ -153,6 +158,17 @@ cifs_bp_rename_retry: - those safely to '/' if any are found in the middle of the prepath */ - /* BB test paths to Windows with '/' in the midst of prepath */ - -+ if (pplen) { -+ int i; -+ -+ cifs_dbg(FYI, "using cifs_sb prepath <%s>\n", cifs_sb->prepath); -+ memcpy(full_path+dfsplen+1, cifs_sb->prepath, pplen-1); -+ full_path[dfsplen] = '\\'; -+ for (i = 0; i < pplen-1; i++) -+ if (full_path[dfsplen+1+i] == '/') -+ full_path[dfsplen+1+i] = CIFS_DIR_SEP(cifs_sb); -+ } -+ - if (dfsplen) { - strncpy(full_path, tcon->treeName, dfsplen); - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) { -@@ -229,6 +245,13 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, - goto cifs_create_get_file_info; - } - -+ if (S_ISDIR(newinode->i_mode)) { -+ CIFSSMBClose(xid, tcon, fid->netfid); -+ iput(newinode); -+ rc = -EISDIR; -+ goto out; -+ } -+ - if (!S_ISREG(newinode->i_mode)) { - /* - * The server may allow us to open things like -@@ -399,10 +422,14 @@ cifs_create_set_dentry: - if (rc != 0) { - cifs_dbg(FYI, "Create worked, get_inode_info failed rc = %d\n", - rc); -- if (server->ops->close) -- server->ops->close(xid, tcon, fid); -- goto out; -+ goto out_err; - } -+ -+ if (S_ISDIR(newinode->i_mode)) { -+ rc = -EISDIR; -+ goto out_err; -+ } -+ - d_drop(direntry); - d_add(direntry, newinode); - -@@ -410,6 +437,13 @@ out: - kfree(buf); - kfree(full_path); - return rc; -+ -+out_err: -+ if (server->ops->close) -+ server->ops->close(xid, tcon, fid); -+ if (newinode) -+ iput(newinode); -+ goto out; - } - - int -diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c -index 514dadb..b87efd0 100644 ---- a/fs/cifs/inode.c -+++ b/fs/cifs/inode.c -@@ -1002,10 +1002,26 @@ struct inode *cifs_root_iget(struct super_block *sb) - struct inode *inode = NULL; - long rc; - struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); -+ char *path = NULL; -+ int len; -+ -+ if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) -+ && cifs_sb->prepath) { -+ len = strlen(cifs_sb->prepath); -+ path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL); -+ if (path == NULL) -+ return ERR_PTR(-ENOMEM); -+ path[0] = '/'; -+ memcpy(path+1, cifs_sb->prepath, len); -+ } else { -+ path = kstrdup("", GFP_KERNEL); -+ if (path == NULL) -+ return ERR_PTR(-ENOMEM); -+ } - - xid = get_xid(); - if (tcon->unix_ext) { -- rc = cifs_get_inode_info_unix(&inode, "", sb, xid); -+ rc = cifs_get_inode_info_unix(&inode, path, sb, xid); - /* some servers mistakenly claim POSIX support */ - if (rc != -EOPNOTSUPP) - goto iget_no_retry; -@@ -1013,7 +1029,8 @@ struct inode *cifs_root_iget(struct super_block *sb) - tcon->unix_ext = false; - } - -- rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL); -+ convert_delimiter(path, CIFS_DIR_SEP(cifs_sb)); -+ rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL); - - iget_no_retry: - if (!inode) { -@@ -1042,6 +1059,7 @@ iget_no_retry: - } - - out: -+ kfree(path); - /* can not call macro free_xid here since in a void func - * TODO: This is no longer true - */ -diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c -index 3525ed7..505e6d6 100644 ---- a/fs/cifs/smb2ops.c -+++ b/fs/cifs/smb2ops.c -@@ -1044,6 +1044,9 @@ smb2_new_lease_key(struct cifs_fid *fid) - get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE); - } - -+#define SMB2_SYMLINK_STRUCT_SIZE \ -+ (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp)) -+ - static int - smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, - const char *full_path, char **target_path, -@@ -1056,7 +1059,10 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, - struct cifs_fid fid; - struct smb2_err_rsp *err_buf = NULL; - struct smb2_symlink_err_rsp *symlink; -- unsigned int sub_len, sub_offset; -+ unsigned int sub_len; -+ unsigned int sub_offset; -+ unsigned int print_len; -+ unsigned int print_offset; - - cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path); - -@@ -1077,11 +1083,33 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, - kfree(utf16_path); - return -ENOENT; - } -+ -+ if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) || -+ get_rfc1002_length(err_buf) + 4 < SMB2_SYMLINK_STRUCT_SIZE) { -+ kfree(utf16_path); -+ return -ENOENT; -+ } -+ - /* open must fail on symlink - reset rc */ - rc = 0; - symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData; - sub_len = le16_to_cpu(symlink->SubstituteNameLength); - sub_offset = le16_to_cpu(symlink->SubstituteNameOffset); -+ print_len = le16_to_cpu(symlink->PrintNameLength); -+ print_offset = le16_to_cpu(symlink->PrintNameOffset); -+ -+ if (get_rfc1002_length(err_buf) + 4 < -+ SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) { -+ kfree(utf16_path); -+ return -ENOENT; -+ } -+ -+ if (get_rfc1002_length(err_buf) + 4 < -+ SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) { -+ kfree(utf16_path); -+ return -ENOENT; -+ } -+ - *target_path = cifs_strndup_from_utf16( - (char *)symlink->PathBuffer + sub_offset, - sub_len, true, cifs_sb->local_nls); -diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c -index 7007809..78313ad 100644 ---- a/fs/jbd2/commit.c -+++ b/fs/jbd2/commit.c -@@ -124,7 +124,7 @@ static int journal_submit_commit_record(journal_t *journal, - struct commit_header *tmp; - struct buffer_head *bh; - int ret; -- struct timespec now = current_kernel_time(); -+ struct timespec64 now = current_kernel_time64(); - - *cbh = NULL; - -diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index ff416d0..7796bea 100644 ---- a/fs/nfs/nfs4proc.c -+++ b/fs/nfs/nfs4proc.c -@@ -427,6 +427,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server, - case -NFS4ERR_DELAY: - nfs_inc_server_stats(server, NFSIOS_DELAY); - case -NFS4ERR_GRACE: -+ case -NFS4ERR_LAYOUTTRYLATER: - case -NFS4ERR_RECALLCONFLICT: - exception->delay = 1; - return 0; -@@ -7869,11 +7870,13 @@ nfs4_layoutget_handle_exception(struct rpc_task *task, - struct inode *inode = lgp->args.inode; - struct nfs_server *server = NFS_SERVER(inode); - struct pnfs_layout_hdr *lo; -- int status = task->tk_status; -+ int nfs4err = task->tk_status; -+ int err, status = 0; -+ LIST_HEAD(head); - - dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status); - -- switch (status) { -+ switch (nfs4err) { - case 0: - goto out; - -@@ -7905,45 +7908,43 @@ nfs4_layoutget_handle_exception(struct rpc_task *task, - status = -EOVERFLOW; - goto out; - } -- /* Fallthrough */ -+ status = -EBUSY; -+ break; - case -NFS4ERR_RECALLCONFLICT: -- nfs4_handle_exception(server, -NFS4ERR_RECALLCONFLICT, -- exception); - status = -ERECALLCONFLICT; -- goto out; -+ break; - case -NFS4ERR_EXPIRED: - case -NFS4ERR_BAD_STATEID: - exception->timeout = 0; - spin_lock(&inode->i_lock); -- if (nfs4_stateid_match(&lgp->args.stateid, -+ lo = NFS_I(inode)->layout; -+ /* If the open stateid was bad, then recover it. */ -+ if (!lo || test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) || -+ nfs4_stateid_match_other(&lgp->args.stateid, - &lgp->args.ctx->state->stateid)) { - spin_unlock(&inode->i_lock); -- /* If the open stateid was bad, then recover it. */ - exception->state = lgp->args.ctx->state; - break; - } -- lo = NFS_I(inode)->layout; -- if (lo && !test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) && -- nfs4_stateid_match_other(&lgp->args.stateid, &lo->plh_stateid)) { -- LIST_HEAD(head); -- -- /* -- * Mark the bad layout state as invalid, then retry -- * with the current stateid. -- */ -- set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags); -- pnfs_mark_matching_lsegs_invalid(lo, &head, NULL, 0); -- spin_unlock(&inode->i_lock); -- pnfs_free_lseg_list(&head); -- status = -EAGAIN; -- goto out; -- } else -- spin_unlock(&inode->i_lock); -- } - -- status = nfs4_handle_exception(server, status, exception); -- if (exception->retry) -+ /* -+ * Mark the bad layout state as invalid, then retry -+ */ -+ set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags); -+ pnfs_mark_matching_lsegs_invalid(lo, &head, NULL, 0); -+ spin_unlock(&inode->i_lock); -+ pnfs_free_lseg_list(&head); - status = -EAGAIN; -+ goto out; -+ } -+ -+ err = nfs4_handle_exception(server, nfs4err, exception); -+ if (!status) { -+ if (exception->retry) -+ status = -EAGAIN; -+ else -+ status = err; -+ } - out: - dprintk("<-- %s\n", __func__); - return status; -diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c -index 0fbe734..7d99236 100644 ---- a/fs/nfs/pnfs.c -+++ b/fs/nfs/pnfs.c -@@ -1505,7 +1505,7 @@ pnfs_update_layout(struct inode *ino, - struct pnfs_layout_segment *lseg = NULL; - nfs4_stateid stateid; - long timeout = 0; -- unsigned long giveup = jiffies + rpc_get_timeout(server->client); -+ unsigned long giveup = jiffies + (clp->cl_lease_time << 1); - bool first; - - if (!pnfs_enabled_sb(NFS_SERVER(ino))) { -@@ -1645,33 +1645,44 @@ lookup_again: - lseg = send_layoutget(lo, ctx, &stateid, &arg, &timeout, gfp_flags); - trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg, - PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); -+ atomic_dec(&lo->plh_outstanding); - if (IS_ERR(lseg)) { - switch(PTR_ERR(lseg)) { -- case -ERECALLCONFLICT: -+ case -EBUSY: - if (time_after(jiffies, giveup)) - lseg = NULL; -- /* Fallthrough */ -- case -EAGAIN: -- pnfs_put_layout_hdr(lo); -- if (first) -- pnfs_clear_first_layoutget(lo); -- if (lseg) { -- trace_pnfs_update_layout(ino, pos, count, -- iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY); -- goto lookup_again; -+ break; -+ case -ERECALLCONFLICT: -+ /* Huh? We hold no layouts, how is there a recall? */ -+ if (first) { -+ lseg = NULL; -+ break; - } -+ /* Destroy the existing layout and start over */ -+ if (time_after(jiffies, giveup)) -+ pnfs_destroy_layout(NFS_I(ino)); - /* Fallthrough */ -+ case -EAGAIN: -+ break; - default: - if (!nfs_error_is_fatal(PTR_ERR(lseg))) { - pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); - lseg = NULL; - } -+ goto out_put_layout_hdr; -+ } -+ if (lseg) { -+ if (first) -+ pnfs_clear_first_layoutget(lo); -+ trace_pnfs_update_layout(ino, pos, count, -+ iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY); -+ pnfs_put_layout_hdr(lo); -+ goto lookup_again; - } - } else { - pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); - } - -- atomic_dec(&lo->plh_outstanding); - out_put_layout_hdr: - if (first) - pnfs_clear_first_layoutget(lo); -diff --git a/fs/nfs/write.c b/fs/nfs/write.c -index e1c74d3..649fa5e 100644 ---- a/fs/nfs/write.c -+++ b/fs/nfs/write.c -@@ -1289,6 +1289,9 @@ int nfs_updatepage(struct file *file, struct page *page, - dprintk("NFS: nfs_updatepage(%pD2 %d@%lld)\n", - file, count, (long long)(page_file_offset(page) + offset)); - -+ if (!count) -+ goto out; -+ - if (nfs_can_extend_write(file, page, inode)) { - count = max(count + offset, nfs_page_length(page)); - offset = 0; -@@ -1299,7 +1302,7 @@ int nfs_updatepage(struct file *file, struct page *page, - nfs_set_pageerror(page); - else - __set_page_dirty_nobuffers(page); -- -+out: - dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", - status, (long long)i_size_read(inode)); - return status; -diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c -index 70d0b9b..806eda1 100644 ---- a/fs/nfsd/nfs4state.c -+++ b/fs/nfsd/nfs4state.c -@@ -4906,6 +4906,32 @@ nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - return nfs_ok; - } - -+static __be32 -+nfsd4_free_lock_stateid(stateid_t *stateid, struct nfs4_stid *s) -+{ -+ struct nfs4_ol_stateid *stp = openlockstateid(s); -+ __be32 ret; -+ -+ mutex_lock(&stp->st_mutex); -+ -+ ret = check_stateid_generation(stateid, &s->sc_stateid, 1); -+ if (ret) -+ goto out; -+ -+ ret = nfserr_locks_held; -+ if (check_for_locks(stp->st_stid.sc_file, -+ lockowner(stp->st_stateowner))) -+ goto out; -+ -+ release_lock_stateid(stp); -+ ret = nfs_ok; -+ -+out: -+ mutex_unlock(&stp->st_mutex); -+ nfs4_put_stid(s); -+ return ret; -+} -+ - __be32 - nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - struct nfsd4_free_stateid *free_stateid) -@@ -4913,7 +4939,6 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - stateid_t *stateid = &free_stateid->fr_stateid; - struct nfs4_stid *s; - struct nfs4_delegation *dp; -- struct nfs4_ol_stateid *stp; - struct nfs4_client *cl = cstate->session->se_client; - __be32 ret = nfserr_bad_stateid; - -@@ -4932,18 +4957,9 @@ nfsd4_free_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - ret = nfserr_locks_held; - break; - case NFS4_LOCK_STID: -- ret = check_stateid_generation(stateid, &s->sc_stateid, 1); -- if (ret) -- break; -- stp = openlockstateid(s); -- ret = nfserr_locks_held; -- if (check_for_locks(stp->st_stid.sc_file, -- lockowner(stp->st_stateowner))) -- break; -- WARN_ON(!unhash_lock_stateid(stp)); -+ atomic_inc(&s->sc_count); - spin_unlock(&cl->cl_lock); -- nfs4_put_stid(s); -- ret = nfs_ok; -+ ret = nfsd4_free_lock_stateid(stateid, s); - goto out; - case NFS4_REVOKED_DELEG_STID: - dp = delegstateid(s); -@@ -5510,7 +5526,7 @@ static __be32 - lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, - struct nfs4_ol_stateid *ost, - struct nfsd4_lock *lock, -- struct nfs4_ol_stateid **lst, bool *new) -+ struct nfs4_ol_stateid **plst, bool *new) - { - __be32 status; - struct nfs4_file *fi = ost->st_stid.sc_file; -@@ -5518,7 +5534,9 @@ lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, - struct nfs4_client *cl = oo->oo_owner.so_client; - struct inode *inode = d_inode(cstate->current_fh.fh_dentry); - struct nfs4_lockowner *lo; -+ struct nfs4_ol_stateid *lst; - unsigned int strhashval; -+ bool hashed; - - lo = find_lockowner_str(cl, &lock->lk_new_owner); - if (!lo) { -@@ -5534,12 +5552,27 @@ lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, - goto out; - } - -- *lst = find_or_create_lock_stateid(lo, fi, inode, ost, new); -- if (*lst == NULL) { -+retry: -+ lst = find_or_create_lock_stateid(lo, fi, inode, ost, new); -+ if (lst == NULL) { - status = nfserr_jukebox; - goto out; - } -+ -+ mutex_lock(&lst->st_mutex); -+ -+ /* See if it's still hashed to avoid race with FREE_STATEID */ -+ spin_lock(&cl->cl_lock); -+ hashed = !list_empty(&lst->st_perfile); -+ spin_unlock(&cl->cl_lock); -+ -+ if (!hashed) { -+ mutex_unlock(&lst->st_mutex); -+ nfs4_put_stid(&lst->st_stid); -+ goto retry; -+ } - status = nfs_ok; -+ *plst = lst; - out: - nfs4_put_stateowner(&lo->lo_owner); - return status; -@@ -5606,8 +5639,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, - goto out; - status = lookup_or_create_lock_state(cstate, open_stp, lock, - &lock_stp, &new); -- if (status == nfs_ok) -- mutex_lock(&lock_stp->st_mutex); - } else { - status = nfs4_preprocess_seqid_op(cstate, - lock->lk_old_lock_seqid, -diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c -index 9a7693d..6db75cb 100644 ---- a/fs/overlayfs/super.c -+++ b/fs/overlayfs/super.c -@@ -404,7 +404,8 @@ static struct ovl_entry *ovl_alloc_entry(unsigned int numlower) - static bool ovl_dentry_remote(struct dentry *dentry) - { - return dentry->d_flags & -- (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE); -+ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE | -+ DCACHE_OP_REAL); - } - - static bool ovl_dentry_weird(struct dentry *dentry) -diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c -index 4c463b9..a36a5a4 100644 ---- a/fs/xfs/xfs_aops.c -+++ b/fs/xfs/xfs_aops.c -@@ -87,6 +87,12 @@ xfs_find_bdev_for_inode( - * We're now finished for good with this page. Update the page state via the - * associated buffer_heads, paying attention to the start and end offsets that - * we need to process on the page. -+ * -+ * Landmine Warning: bh->b_end_io() will call end_page_writeback() on the last -+ * buffer in the IO. Once it does this, it is unsafe to access the bufferhead or -+ * the page at all, as we may be racing with memory reclaim and it can free both -+ * the bufferhead chain and the page as it will see the page as clean and -+ * unused. - */ - static void - xfs_finish_page_writeback( -@@ -95,8 +101,9 @@ xfs_finish_page_writeback( - int error) - { - unsigned int end = bvec->bv_offset + bvec->bv_len - 1; -- struct buffer_head *head, *bh; -+ struct buffer_head *head, *bh, *next; - unsigned int off = 0; -+ unsigned int bsize; - - ASSERT(bvec->bv_offset < PAGE_SIZE); - ASSERT((bvec->bv_offset & ((1 << inode->i_blkbits) - 1)) == 0); -@@ -105,15 +112,17 @@ xfs_finish_page_writeback( - - bh = head = page_buffers(bvec->bv_page); - -+ bsize = bh->b_size; - do { -+ next = bh->b_this_page; - if (off < bvec->bv_offset) - goto next_bh; - if (off > end) - break; - bh->b_end_io(bh, !error); - next_bh: -- off += bh->b_size; -- } while ((bh = bh->b_this_page) != head); -+ off += bsize; -+ } while ((bh = next) != head); - } - - /* -diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h -index 3f10307..c357f27 100644 ---- a/include/linux/backing-dev-defs.h -+++ b/include/linux/backing-dev-defs.h -@@ -163,6 +163,7 @@ struct backing_dev_info { - wait_queue_head_t wb_waitq; - - struct device *dev; -+ struct device *owner; - - struct timer_list laptop_mode_wb_timer; - -diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h -index c82794f..89d3de3 100644 ---- a/include/linux/backing-dev.h -+++ b/include/linux/backing-dev.h -@@ -24,6 +24,7 @@ __printf(3, 4) - int bdi_register(struct backing_dev_info *bdi, struct device *parent, - const char *fmt, ...); - int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev); -+int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner); - void bdi_unregister(struct backing_dev_info *bdi); - - int __must_check bdi_setup_and_register(struct backing_dev_info *, char *); -diff --git a/include/linux/bio.h b/include/linux/bio.h -index 9faebf7..75fadd2 100644 ---- a/include/linux/bio.h -+++ b/include/linux/bio.h -@@ -527,11 +527,14 @@ extern unsigned int bvec_nr_vecs(unsigned short idx); - int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css); - int bio_associate_current(struct bio *bio); - void bio_disassociate_task(struct bio *bio); -+void bio_clone_blkcg_association(struct bio *dst, struct bio *src); - #else /* CONFIG_BLK_CGROUP */ - static inline int bio_associate_blkcg(struct bio *bio, - struct cgroup_subsys_state *blkcg_css) { return 0; } - static inline int bio_associate_current(struct bio *bio) { return -ENOENT; } - static inline void bio_disassociate_task(struct bio *bio) { } -+static inline void bio_clone_blkcg_association(struct bio *dst, -+ struct bio *src) { } - #endif /* CONFIG_BLK_CGROUP */ - - #ifdef CONFIG_HIGHMEM -diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h -index ab31081..7879bf4 100644 ---- a/include/linux/mlx5/qp.h -+++ b/include/linux/mlx5/qp.h -@@ -556,9 +556,9 @@ struct mlx5_destroy_qp_mbox_out { - struct mlx5_modify_qp_mbox_in { - struct mlx5_inbox_hdr hdr; - __be32 qpn; -- u8 rsvd1[4]; -- __be32 optparam; - u8 rsvd0[4]; -+ __be32 optparam; -+ u8 rsvd1[4]; - struct mlx5_qp_context ctx; - u8 rsvd2[16]; - }; -diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h -index 7e440d4..e694f02 100644 ---- a/include/rdma/ib_verbs.h -+++ b/include/rdma/ib_verbs.h -@@ -1428,6 +1428,10 @@ struct ib_srq { - } ext; - }; - -+/* -+ * @max_write_sge: Maximum SGE elements per RDMA WRITE request. -+ * @max_read_sge: Maximum SGE elements per RDMA READ request. -+ */ - struct ib_qp { - struct ib_device *device; - struct ib_pd *pd; -@@ -1449,6 +1453,8 @@ struct ib_qp { - void (*event_handler)(struct ib_event *, void *); - void *qp_context; - u32 qp_num; -+ u32 max_write_sge; -+ u32 max_read_sge; - enum ib_qp_type qp_type; - }; - -diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h -index d8ab510..f6f3bc5 100644 ---- a/include/target/target_core_backend.h -+++ b/include/target/target_core_backend.h -@@ -95,6 +95,6 @@ sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd, - bool target_sense_desc_format(struct se_device *dev); - sector_t target_to_linux_sector(struct se_device *dev, sector_t lb); - bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib, -- struct request_queue *q, int block_size); -+ struct request_queue *q); - - #endif /* TARGET_CORE_BACKEND_H */ -diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h -index b316b44..fb8e3b6 100644 ---- a/include/target/target_core_base.h -+++ b/include/target/target_core_base.h -@@ -142,6 +142,7 @@ enum se_cmd_flags_table { - SCF_PASSTHROUGH_PROT_SG_TO_MEM_NOALLOC = 0x00200000, - SCF_ACK_KREF = 0x00400000, - SCF_USE_CPUID = 0x00800000, -+ SCF_TASK_ATTR_SET = 0x01000000, - }; - - /* -diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h -index de44462..5cd6faa 100644 ---- a/include/target/target_core_fabric.h -+++ b/include/target/target_core_fabric.h -@@ -163,7 +163,6 @@ int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t); - void core_tmr_release_req(struct se_tmr_req *); - int transport_generic_handle_tmr(struct se_cmd *); - void transport_generic_request_failure(struct se_cmd *, sense_reason_t); --void __target_execute_cmd(struct se_cmd *); - int transport_lookup_tmr_lun(struct se_cmd *, u64); - void core_allocate_nexus_loss_ua(struct se_node_acl *acl); - -diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h -index 003dca9..5664ca0 100644 ---- a/include/trace/events/sunrpc.h -+++ b/include/trace/events/sunrpc.h -@@ -529,20 +529,27 @@ TRACE_EVENT(svc_xprt_do_enqueue, - - TP_STRUCT__entry( - __field(struct svc_xprt *, xprt) -- __field_struct(struct sockaddr_storage, ss) - __field(int, pid) - __field(unsigned long, flags) -+ __dynamic_array(unsigned char, addr, xprt != NULL ? -+ xprt->xpt_remotelen : 0) - ), - - TP_fast_assign( - __entry->xprt = xprt; -- xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); - __entry->pid = rqst? rqst->rq_task->pid : 0; -- __entry->flags = xprt ? xprt->xpt_flags : 0; -+ if (xprt) { -+ memcpy(__get_dynamic_array(addr), -+ &xprt->xpt_remote, -+ xprt->xpt_remotelen); -+ __entry->flags = xprt->xpt_flags; -+ } else -+ __entry->flags = 0; - ), - - TP_printk("xprt=0x%p addr=%pIScp pid=%d flags=%s", __entry->xprt, -- (struct sockaddr *)&__entry->ss, -+ __get_dynamic_array_len(addr) != 0 ? -+ (struct sockaddr *)__get_dynamic_array(addr) : NULL, - __entry->pid, show_svc_xprt_flags(__entry->flags)) - ); - -@@ -553,18 +560,25 @@ TRACE_EVENT(svc_xprt_dequeue, - - TP_STRUCT__entry( - __field(struct svc_xprt *, xprt) -- __field_struct(struct sockaddr_storage, ss) - __field(unsigned long, flags) -+ __dynamic_array(unsigned char, addr, xprt != NULL ? -+ xprt->xpt_remotelen : 0) - ), - - TP_fast_assign( -- __entry->xprt = xprt, -- xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); -- __entry->flags = xprt ? xprt->xpt_flags : 0; -+ __entry->xprt = xprt; -+ if (xprt) { -+ memcpy(__get_dynamic_array(addr), -+ &xprt->xpt_remote, -+ xprt->xpt_remotelen); -+ __entry->flags = xprt->xpt_flags; -+ } else -+ __entry->flags = 0; - ), - - TP_printk("xprt=0x%p addr=%pIScp flags=%s", __entry->xprt, -- (struct sockaddr *)&__entry->ss, -+ __get_dynamic_array_len(addr) != 0 ? -+ (struct sockaddr *)__get_dynamic_array(addr) : NULL, - show_svc_xprt_flags(__entry->flags)) - ); - -@@ -592,19 +606,26 @@ TRACE_EVENT(svc_handle_xprt, - TP_STRUCT__entry( - __field(struct svc_xprt *, xprt) - __field(int, len) -- __field_struct(struct sockaddr_storage, ss) - __field(unsigned long, flags) -+ __dynamic_array(unsigned char, addr, xprt != NULL ? -+ xprt->xpt_remotelen : 0) - ), - - TP_fast_assign( - __entry->xprt = xprt; -- xprt ? memcpy(&__entry->ss, &xprt->xpt_remote, sizeof(__entry->ss)) : memset(&__entry->ss, 0, sizeof(__entry->ss)); - __entry->len = len; -- __entry->flags = xprt ? xprt->xpt_flags : 0; -+ if (xprt) { -+ memcpy(__get_dynamic_array(addr), -+ &xprt->xpt_remote, -+ xprt->xpt_remotelen); -+ __entry->flags = xprt->xpt_flags; -+ } else -+ __entry->flags = 0; - ), - - TP_printk("xprt=0x%p addr=%pIScp len=%d flags=%s", __entry->xprt, -- (struct sockaddr *)&__entry->ss, -+ __get_dynamic_array_len(addr) != 0 ? -+ (struct sockaddr *)__get_dynamic_array(addr) : NULL, - __entry->len, show_svc_xprt_flags(__entry->flags)) - ); - #endif /* _TRACE_SUNRPC_H */ -diff --git a/kernel/auditsc.c b/kernel/auditsc.c -index 2672d10..b334128 100644 ---- a/kernel/auditsc.c -+++ b/kernel/auditsc.c -@@ -72,6 +72,7 @@ - #include <linux/compat.h> - #include <linux/ctype.h> - #include <linux/string.h> -+#include <linux/uaccess.h> - #include <uapi/linux/limits.h> - - #include "audit.h" -@@ -81,7 +82,8 @@ - #define AUDITSC_SUCCESS 1 - #define AUDITSC_FAILURE 2 - --/* no execve audit message should be longer than this (userspace limits) */ -+/* no execve audit message should be longer than this (userspace limits), -+ * see the note near the top of audit_log_execve_info() about this value */ - #define MAX_EXECVE_AUDIT_LEN 7500 - - /* max length to print of cmdline/proctitle value during audit */ -@@ -987,184 +989,178 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, - return rc; - } - --/* -- * to_send and len_sent accounting are very loose estimates. We aren't -- * really worried about a hard cap to MAX_EXECVE_AUDIT_LEN so much as being -- * within about 500 bytes (next page boundary) -- * -- * why snprintf? an int is up to 12 digits long. if we just assumed when -- * logging that a[%d]= was going to be 16 characters long we would be wasting -- * space in every audit message. In one 7500 byte message we can log up to -- * about 1000 min size arguments. That comes down to about 50% waste of space -- * if we didn't do the snprintf to find out how long arg_num_len was. -- */ --static int audit_log_single_execve_arg(struct audit_context *context, -- struct audit_buffer **ab, -- int arg_num, -- size_t *len_sent, -- const char __user *p, -- char *buf) -+static void audit_log_execve_info(struct audit_context *context, -+ struct audit_buffer **ab) - { -- char arg_num_len_buf[12]; -- const char __user *tmp_p = p; -- /* how many digits are in arg_num? 5 is the length of ' a=""' */ -- size_t arg_num_len = snprintf(arg_num_len_buf, 12, "%d", arg_num) + 5; -- size_t len, len_left, to_send; -- size_t max_execve_audit_len = MAX_EXECVE_AUDIT_LEN; -- unsigned int i, has_cntl = 0, too_long = 0; -- int ret; -- -- /* strnlen_user includes the null we don't want to send */ -- len_left = len = strnlen_user(p, MAX_ARG_STRLEN) - 1; -- -- /* -- * We just created this mm, if we can't find the strings -- * we just copied into it something is _very_ wrong. Similar -- * for strings that are too long, we should not have created -- * any. -- */ -- if (WARN_ON_ONCE(len < 0 || len > MAX_ARG_STRLEN - 1)) { -- send_sig(SIGKILL, current, 0); -- return -1; -+ long len_max; -+ long len_rem; -+ long len_full; -+ long len_buf; -+ long len_abuf; -+ long len_tmp; -+ bool require_data; -+ bool encode; -+ unsigned int iter; -+ unsigned int arg; -+ char *buf_head; -+ char *buf; -+ const char __user *p = (const char __user *)current->mm->arg_start; -+ -+ /* NOTE: this buffer needs to be large enough to hold all the non-arg -+ * data we put in the audit record for this argument (see the -+ * code below) ... at this point in time 96 is plenty */ -+ char abuf[96]; -+ -+ /* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the -+ * current value of 7500 is not as important as the fact that it -+ * is less than 8k, a setting of 7500 gives us plenty of wiggle -+ * room if we go over a little bit in the logging below */ -+ WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500); -+ len_max = MAX_EXECVE_AUDIT_LEN; -+ -+ /* scratch buffer to hold the userspace args */ -+ buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); -+ if (!buf_head) { -+ audit_panic("out of memory for argv string"); -+ return; - } -+ buf = buf_head; - -- /* walk the whole argument looking for non-ascii chars */ -+ audit_log_format(*ab, "argc=%d", context->execve.argc); -+ -+ len_rem = len_max; -+ len_buf = 0; -+ len_full = 0; -+ require_data = true; -+ encode = false; -+ iter = 0; -+ arg = 0; - do { -- if (len_left > MAX_EXECVE_AUDIT_LEN) -- to_send = MAX_EXECVE_AUDIT_LEN; -- else -- to_send = len_left; -- ret = copy_from_user(buf, tmp_p, to_send); -- /* -- * There is no reason for this copy to be short. We just -- * copied them here, and the mm hasn't been exposed to user- -- * space yet. -- */ -- if (ret) { -- WARN_ON(1); -- send_sig(SIGKILL, current, 0); -- return -1; -- } -- buf[to_send] = '\0'; -- has_cntl = audit_string_contains_control(buf, to_send); -- if (has_cntl) { -- /* -- * hex messages get logged as 2 bytes, so we can only -- * send half as much in each message -- */ -- max_execve_audit_len = MAX_EXECVE_AUDIT_LEN / 2; -- break; -- } -- len_left -= to_send; -- tmp_p += to_send; -- } while (len_left > 0); -- -- len_left = len; -- -- if (len > max_execve_audit_len) -- too_long = 1; -- -- /* rewalk the argument actually logging the message */ -- for (i = 0; len_left > 0; i++) { -- int room_left; -- -- if (len_left > max_execve_audit_len) -- to_send = max_execve_audit_len; -- else -- to_send = len_left; -- -- /* do we have space left to send this argument in this ab? */ -- room_left = MAX_EXECVE_AUDIT_LEN - arg_num_len - *len_sent; -- if (has_cntl) -- room_left -= (to_send * 2); -- else -- room_left -= to_send; -- if (room_left < 0) { -- *len_sent = 0; -- audit_log_end(*ab); -- *ab = audit_log_start(context, GFP_KERNEL, AUDIT_EXECVE); -- if (!*ab) -- return 0; -- } -+ /* NOTE: we don't ever want to trust this value for anything -+ * serious, but the audit record format insists we -+ * provide an argument length for really long arguments, -+ * e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but -+ * to use strncpy_from_user() to obtain this value for -+ * recording in the log, although we don't use it -+ * anywhere here to avoid a double-fetch problem */ -+ if (len_full == 0) -+ len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1; -+ -+ /* read more data from userspace */ -+ if (require_data) { -+ /* can we make more room in the buffer? */ -+ if (buf != buf_head) { -+ memmove(buf_head, buf, len_buf); -+ buf = buf_head; -+ } -+ -+ /* fetch as much as we can of the argument */ -+ len_tmp = strncpy_from_user(&buf_head[len_buf], p, -+ len_max - len_buf); -+ if (len_tmp == -EFAULT) { -+ /* unable to copy from userspace */ -+ send_sig(SIGKILL, current, 0); -+ goto out; -+ } else if (len_tmp == (len_max - len_buf)) { -+ /* buffer is not large enough */ -+ require_data = true; -+ /* NOTE: if we are going to span multiple -+ * buffers force the encoding so we stand -+ * a chance at a sane len_full value and -+ * consistent record encoding */ -+ encode = true; -+ len_full = len_full * 2; -+ p += len_tmp; -+ } else { -+ require_data = false; -+ if (!encode) -+ encode = audit_string_contains_control( -+ buf, len_tmp); -+ /* try to use a trusted value for len_full */ -+ if (len_full < len_max) -+ len_full = (encode ? -+ len_tmp * 2 : len_tmp); -+ p += len_tmp + 1; -+ } -+ len_buf += len_tmp; -+ buf_head[len_buf] = '\0'; - -- /* -- * first record needs to say how long the original string was -- * so we can be sure nothing was lost. -- */ -- if ((i == 0) && (too_long)) -- audit_log_format(*ab, " a%d_len=%zu", arg_num, -- has_cntl ? 2*len : len); -- -- /* -- * normally arguments are small enough to fit and we already -- * filled buf above when we checked for control characters -- * so don't bother with another copy_from_user -- */ -- if (len >= max_execve_audit_len) -- ret = copy_from_user(buf, p, to_send); -- else -- ret = 0; -- if (ret) { -- WARN_ON(1); -- send_sig(SIGKILL, current, 0); -- return -1; -+ /* length of the buffer in the audit record? */ -+ len_abuf = (encode ? len_buf * 2 : len_buf + 2); - } -- buf[to_send] = '\0'; -- -- /* actually log it */ -- audit_log_format(*ab, " a%d", arg_num); -- if (too_long) -- audit_log_format(*ab, "[%d]", i); -- audit_log_format(*ab, "="); -- if (has_cntl) -- audit_log_n_hex(*ab, buf, to_send); -- else -- audit_log_string(*ab, buf); -- -- p += to_send; -- len_left -= to_send; -- *len_sent += arg_num_len; -- if (has_cntl) -- *len_sent += to_send * 2; -- else -- *len_sent += to_send; -- } -- /* include the null we didn't log */ -- return len + 1; --} - --static void audit_log_execve_info(struct audit_context *context, -- struct audit_buffer **ab) --{ -- int i, len; -- size_t len_sent = 0; -- const char __user *p; -- char *buf; -+ /* write as much as we can to the audit log */ -+ if (len_buf > 0) { -+ /* NOTE: some magic numbers here - basically if we -+ * can't fit a reasonable amount of data into the -+ * existing audit buffer, flush it and start with -+ * a new buffer */ -+ if ((sizeof(abuf) + 8) > len_rem) { -+ len_rem = len_max; -+ audit_log_end(*ab); -+ *ab = audit_log_start(context, -+ GFP_KERNEL, AUDIT_EXECVE); -+ if (!*ab) -+ goto out; -+ } - -- p = (const char __user *)current->mm->arg_start; -+ /* create the non-arg portion of the arg record */ -+ len_tmp = 0; -+ if (require_data || (iter > 0) || -+ ((len_abuf + sizeof(abuf)) > len_rem)) { -+ if (iter == 0) { -+ len_tmp += snprintf(&abuf[len_tmp], -+ sizeof(abuf) - len_tmp, -+ " a%d_len=%lu", -+ arg, len_full); -+ } -+ len_tmp += snprintf(&abuf[len_tmp], -+ sizeof(abuf) - len_tmp, -+ " a%d[%d]=", arg, iter++); -+ } else -+ len_tmp += snprintf(&abuf[len_tmp], -+ sizeof(abuf) - len_tmp, -+ " a%d=", arg); -+ WARN_ON(len_tmp >= sizeof(abuf)); -+ abuf[sizeof(abuf) - 1] = '\0'; -+ -+ /* log the arg in the audit record */ -+ audit_log_format(*ab, "%s", abuf); -+ len_rem -= len_tmp; -+ len_tmp = len_buf; -+ if (encode) { -+ if (len_abuf > len_rem) -+ len_tmp = len_rem / 2; /* encoding */ -+ audit_log_n_hex(*ab, buf, len_tmp); -+ len_rem -= len_tmp * 2; -+ len_abuf -= len_tmp * 2; -+ } else { -+ if (len_abuf > len_rem) -+ len_tmp = len_rem - 2; /* quotes */ -+ audit_log_n_string(*ab, buf, len_tmp); -+ len_rem -= len_tmp + 2; -+ /* don't subtract the "2" because we still need -+ * to add quotes to the remaining string */ -+ len_abuf -= len_tmp; -+ } -+ len_buf -= len_tmp; -+ buf += len_tmp; -+ } - -- audit_log_format(*ab, "argc=%d", context->execve.argc); -+ /* ready to move to the next argument? */ -+ if ((len_buf == 0) && !require_data) { -+ arg++; -+ iter = 0; -+ len_full = 0; -+ require_data = true; -+ encode = false; -+ } -+ } while (arg < context->execve.argc); - -- /* -- * we need some kernel buffer to hold the userspace args. Just -- * allocate one big one rather than allocating one of the right size -- * for every single argument inside audit_log_single_execve_arg() -- * should be <8k allocation so should be pretty safe. -- */ -- buf = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); -- if (!buf) { -- audit_panic("out of memory for argv string"); -- return; -- } -+ /* NOTE: the caller handles the final audit_log_end() call */ - -- for (i = 0; i < context->execve.argc; i++) { -- len = audit_log_single_execve_arg(context, ab, i, -- &len_sent, p, buf); -- if (len <= 0) -- break; -- p += len; -- } -- kfree(buf); -+out: -+ kfree(buf_head); - } - - static void show_special(struct audit_context *context, int *call_panic) -diff --git a/kernel/cgroup.c b/kernel/cgroup.c -index 75c0ff0..e0be49f 100644 ---- a/kernel/cgroup.c -+++ b/kernel/cgroup.c -@@ -2215,12 +2215,8 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, - goto out_unlock; - } - -- /* -- * We know this subsystem has not yet been bound. Users in a non-init -- * user namespace may only mount hierarchies with no bound subsystems, -- * i.e. 'none,name=user1' -- */ -- if (!opts.none && !capable(CAP_SYS_ADMIN)) { -+ /* Hierarchies may only be created in the initial cgroup namespace. */ -+ if (ns != &init_cgroup_ns) { - ret = -EPERM; - goto out_unlock; - } -@@ -2962,6 +2958,7 @@ int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) - int retval = 0; - - mutex_lock(&cgroup_mutex); -+ percpu_down_write(&cgroup_threadgroup_rwsem); - for_each_root(root) { - struct cgroup *from_cgrp; - -@@ -2976,6 +2973,7 @@ int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) - if (retval) - break; - } -+ percpu_up_write(&cgroup_threadgroup_rwsem); - mutex_unlock(&cgroup_mutex); - - return retval; -@@ -4343,6 +4341,8 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) - - mutex_lock(&cgroup_mutex); - -+ percpu_down_write(&cgroup_threadgroup_rwsem); -+ - /* all tasks in @from are being moved, all csets are source */ - spin_lock_irq(&css_set_lock); - list_for_each_entry(link, &from->cset_links, cset_link) -@@ -4371,6 +4371,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) - } while (task && !ret); - out_err: - cgroup_migrate_finish(&preloaded_csets); -+ percpu_up_write(&cgroup_threadgroup_rwsem); - mutex_unlock(&cgroup_mutex); - return ret; - } -@@ -6309,14 +6310,11 @@ struct cgroup_namespace *copy_cgroup_ns(unsigned long flags, - if (!ns_capable(user_ns, CAP_SYS_ADMIN)) - return ERR_PTR(-EPERM); - -- mutex_lock(&cgroup_mutex); -+ /* It is not safe to take cgroup_mutex here */ - spin_lock_irq(&css_set_lock); -- - cset = task_css_set(current); - get_css_set(cset); -- - spin_unlock_irq(&css_set_lock); -- mutex_unlock(&cgroup_mutex); - - new_ns = alloc_cgroup_ns(); - if (IS_ERR(new_ns)) { -diff --git a/kernel/module.c b/kernel/module.c -index 5f71aa6..6458a2f 100644 ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -2687,13 +2687,18 @@ static inline void kmemleak_load_module(const struct module *mod, - #endif - - #ifdef CONFIG_MODULE_SIG --static int module_sig_check(struct load_info *info) -+static int module_sig_check(struct load_info *info, int flags) - { - int err = -ENOKEY; - const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1; - const void *mod = info->hdr; - -- if (info->len > markerlen && -+ /* -+ * Require flags == 0, as a module with version information -+ * removed is no longer the module that was signed -+ */ -+ if (flags == 0 && -+ info->len > markerlen && - memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) { - /* We truncate the module to discard the signature */ - info->len -= markerlen; -@@ -2712,7 +2717,7 @@ static int module_sig_check(struct load_info *info) - return err; - } - #else /* !CONFIG_MODULE_SIG */ --static int module_sig_check(struct load_info *info) -+static int module_sig_check(struct load_info *info, int flags) - { - return 0; - } -@@ -3498,7 +3503,7 @@ static int load_module(struct load_info *info, const char __user *uargs, - long err; - char *after_dashes; - -- err = module_sig_check(info); -+ err = module_sig_check(info, flags); - if (err) - goto free_copy; - -diff --git a/mm/backing-dev.c b/mm/backing-dev.c -index ed173b8..9269911 100644 ---- a/mm/backing-dev.c -+++ b/mm/backing-dev.c -@@ -825,6 +825,20 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev) - } - EXPORT_SYMBOL(bdi_register_dev); - -+int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner) -+{ -+ int rc; -+ -+ rc = bdi_register(bdi, NULL, "%u:%u", MAJOR(owner->devt), -+ MINOR(owner->devt)); -+ if (rc) -+ return rc; -+ bdi->owner = owner; -+ get_device(owner); -+ return 0; -+} -+EXPORT_SYMBOL(bdi_register_owner); -+ - /* - * Remove bdi from bdi_list, and ensure that it is no longer visible - */ -@@ -849,6 +863,11 @@ void bdi_unregister(struct backing_dev_info *bdi) - device_unregister(bdi->dev); - bdi->dev = NULL; - } -+ -+ if (bdi->owner) { -+ put_device(bdi->owner); -+ bdi->owner = NULL; -+ } - } - - void bdi_exit(struct backing_dev_info *bdi) -diff --git a/mm/hugetlb.c b/mm/hugetlb.c -index addfe4ac..d9ec1a5 100644 ---- a/mm/hugetlb.c -+++ b/mm/hugetlb.c -@@ -2214,6 +2214,10 @@ static unsigned long set_max_huge_pages(struct hstate *h, unsigned long count, - * and reducing the surplus. - */ - spin_unlock(&hugetlb_lock); -+ -+ /* yield cpu to avoid soft lockup */ -+ cond_resched(); -+ - if (hstate_is_gigantic(h)) - ret = alloc_fresh_gigantic_page(h, nodes_allowed); - else -diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c -index 388ee8b..1842141 100644 ---- a/net/bluetooth/l2cap_sock.c -+++ b/net/bluetooth/l2cap_sock.c -@@ -927,7 +927,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, - break; - } - -- if (get_user(opt, (u32 __user *) optval)) { -+ if (get_user(opt, (u16 __user *) optval)) { - err = -EFAULT; - break; - } -diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c -index 1325776..bd007a9 100644 ---- a/net/netlabel/netlabel_kapi.c -+++ b/net/netlabel/netlabel_kapi.c -@@ -824,7 +824,11 @@ socket_setattr_return: - */ - void netlbl_sock_delattr(struct sock *sk) - { -- cipso_v4_sock_delattr(sk); -+ switch (sk->sk_family) { -+ case AF_INET: -+ cipso_v4_sock_delattr(sk); -+ break; -+ } - } - - /** -@@ -987,7 +991,11 @@ req_setattr_return: - */ - void netlbl_req_delattr(struct request_sock *req) - { -- cipso_v4_req_delattr(req); -+ switch (req->rsk_ops->family) { -+ case AF_INET: -+ cipso_v4_req_delattr(req); -+ break; -+ } - } - - /** -diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c -index e1675927..42396a7 100644 ---- a/scripts/recordmcount.c -+++ b/scripts/recordmcount.c -@@ -33,10 +33,17 @@ - #include <string.h> - #include <unistd.h> - -+/* -+ * glibc synced up and added the metag number but didn't add the relocations. -+ * Work around this in a crude manner for now. -+ */ - #ifndef EM_METAG --/* Remove this when these make it to the standard system elf.h. */ - #define EM_METAG 174 -+#endif -+#ifndef R_METAG_ADDR32 - #define R_METAG_ADDR32 2 -+#endif -+#ifndef R_METAG_NONE - #define R_METAG_NONE 3 - #endif - -diff --git a/sound/hda/array.c b/sound/hda/array.c -index 516795b..5dfa610 100644 ---- a/sound/hda/array.c -+++ b/sound/hda/array.c -@@ -21,13 +21,15 @@ void *snd_array_new(struct snd_array *array) - return NULL; - if (array->used >= array->alloced) { - int num = array->alloced + array->alloc_align; -+ int oldsize = array->alloced * array->elem_size; - int size = (num + 1) * array->elem_size; - void *nlist; - if (snd_BUG_ON(num >= 4096)) - return NULL; -- nlist = krealloc(array->list, size, GFP_KERNEL | __GFP_ZERO); -+ nlist = krealloc(array->list, size, GFP_KERNEL); - if (!nlist) - return NULL; -+ memset(nlist + oldsize, 0, size - oldsize); - array->list = nlist; - array->alloced = num; - } -diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c -index 6f8ea13..89dacf9 100644 ---- a/sound/pci/hda/hda_intel.c -+++ b/sound/pci/hda/hda_intel.c -@@ -2265,6 +2265,8 @@ static const struct pci_device_id azx_ids[] = { - { PCI_DEVICE(0x1022, 0x780d), - .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, - /* ATI HDMI */ -+ { PCI_DEVICE(0x1002, 0x0002), -+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, - { PCI_DEVICE(0x1002, 0x1308), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, - { PCI_DEVICE(0x1002, 0x157a), -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index abcb5a6..f25479b 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -4674,6 +4674,22 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec, - } - } - -+static void alc298_fixup_speaker_volume(struct hda_codec *codec, -+ const struct hda_fixup *fix, int action) -+{ -+ if (action == HDA_FIXUP_ACT_PRE_PROBE) { -+ /* The speaker is routed to the Node 0x06 by a mistake, as a result -+ we can't adjust the speaker's volume since this node does not has -+ Amp-out capability. we change the speaker's route to: -+ Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 ( -+ Pin Complex), since Node 0x02 has Amp-out caps, we can adjust -+ speaker's volume now. */ -+ -+ hda_nid_t conn1[1] = { 0x0c }; -+ snd_hda_override_conn_list(codec, 0x17, 1, conn1); -+ } -+} -+ - /* Hook to update amp GPIO4 for automute */ - static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, - struct hda_jack_callback *jack) -@@ -4823,6 +4839,7 @@ enum { - ALC280_FIXUP_HP_HEADSET_MIC, - ALC221_FIXUP_HP_FRONT_MIC, - ALC292_FIXUP_TPT460, -+ ALC298_FIXUP_SPK_VOLUME, - }; - - static const struct hda_fixup alc269_fixups[] = { -@@ -5478,6 +5495,12 @@ static const struct hda_fixup alc269_fixups[] = { - .chained = true, - .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE, - }, -+ [ALC298_FIXUP_SPK_VOLUME] = { -+ .type = HDA_FIXUP_FUNC, -+ .v.func = alc298_fixup_speaker_volume, -+ .chained = true, -+ .chain_id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, -+ }, - }; - - static const struct snd_pci_quirk alc269_fixup_tbl[] = { -@@ -5524,6 +5547,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { - SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), - SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), - SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), -+ SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), - SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), - SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), - SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), -@@ -5799,6 +5823,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { - {0x1b, 0x01014020}, - {0x21, 0x0221103f}), - SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, -+ {0x14, 0x90170130}, -+ {0x1b, 0x02011020}, -+ {0x21, 0x0221103f}), -+ SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, - {0x14, 0x90170150}, - {0x1b, 0x02011020}, - {0x21, 0x0221105f}), -diff --git a/tools/objtool/.gitignore b/tools/objtool/.gitignore -index a0b3128..d3102c8 100644 ---- a/tools/objtool/.gitignore -+++ b/tools/objtool/.gitignore -@@ -1,2 +1,3 @@ - arch/x86/insn/inat-tables.c - objtool -+fixdep -diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c -index 48bd520..dd25346 100644 ---- a/virt/kvm/kvm_main.c -+++ b/virt/kvm/kvm_main.c -@@ -148,6 +148,7 @@ int vcpu_load(struct kvm_vcpu *vcpu) - put_cpu(); - return 0; - } -+EXPORT_SYMBOL_GPL(vcpu_load); - - void vcpu_put(struct kvm_vcpu *vcpu) - { -@@ -157,6 +158,7 @@ void vcpu_put(struct kvm_vcpu *vcpu) - preempt_enable(); - mutex_unlock(&vcpu->mutex); - } -+EXPORT_SYMBOL_GPL(vcpu_put); - - static void ack_flush(void *_completed) - { |