summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '4.6.5/1004_linux-4.6.5.patch')
-rw-r--r--4.6.5/1004_linux-4.6.5.patch7262
1 files changed, 0 insertions, 7262 deletions
diff --git a/4.6.5/1004_linux-4.6.5.patch b/4.6.5/1004_linux-4.6.5.patch
deleted file mode 100644
index 98b6b74..0000000
--- a/4.6.5/1004_linux-4.6.5.patch
+++ /dev/null
@@ -1,7262 +0,0 @@
-diff --git a/Documentation/ABI/testing/sysfs-bus-iio-proximity-as3935 b/Documentation/ABI/testing/sysfs-bus-iio-proximity-as3935
-index 6708c5e..33e96f7 100644
---- a/Documentation/ABI/testing/sysfs-bus-iio-proximity-as3935
-+++ b/Documentation/ABI/testing/sysfs-bus-iio-proximity-as3935
-@@ -1,4 +1,4 @@
--What /sys/bus/iio/devices/iio:deviceX/in_proximity_raw
-+What /sys/bus/iio/devices/iio:deviceX/in_proximity_input
- Date: March 2014
- KernelVersion: 3.15
- Contact: Matt Ranostay <mranostay@gmail.com>
-diff --git a/Documentation/scsi/scsi_eh.txt b/Documentation/scsi/scsi_eh.txt
-index 8638f61..37eca00 100644
---- a/Documentation/scsi/scsi_eh.txt
-+++ b/Documentation/scsi/scsi_eh.txt
-@@ -263,19 +263,23 @@ scmd->allowed.
-
- 3. scmd recovered
- ACTION: scsi_eh_finish_cmd() is invoked to EH-finish scmd
-- - shost->host_failed--
- - clear scmd->eh_eflags
- - scsi_setup_cmd_retry()
- - move from local eh_work_q to local eh_done_q
- LOCKING: none
-+ CONCURRENCY: at most one thread per separate eh_work_q to
-+ keep queue manipulation lockless
-
- 4. EH completes
- ACTION: scsi_eh_flush_done_q() retries scmds or notifies upper
-- layer of failure.
-+ layer of failure. May be called concurrently but must have
-+ a no more than one thread per separate eh_work_q to
-+ manipulate the queue locklessly
- - scmd is removed from eh_done_q and scmd->eh_entry is cleared
- - if retry is necessary, scmd is requeued using
- scsi_queue_insert()
- - otherwise, scsi_finish_command() is invoked for scmd
-+ - zero shost->host_failed
- LOCKING: queue or finish function performs appropriate locking
-
-
-diff --git a/Makefile b/Makefile
-index cd37442..7d693a8 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 6
--SUBLEVEL = 4
-+SUBLEVEL = 5
- EXTRAVERSION =
- NAME = Charred Weasel
-
-diff --git a/arch/arm/boot/dts/armada-385-linksys.dtsi b/arch/arm/boot/dts/armada-385-linksys.dtsi
-index 8450944..22f7a13 100644
---- a/arch/arm/boot/dts/armada-385-linksys.dtsi
-+++ b/arch/arm/boot/dts/armada-385-linksys.dtsi
-@@ -58,8 +58,8 @@
- soc {
- ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
- MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
-- MBUS_ID(0x09, 0x09) 0 0xf1100000 0x10000
-- MBUS_ID(0x09, 0x05) 0 0xf1110000 0x10000>;
-+ MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
-+ MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000>;
-
- internal-regs {
-
-diff --git a/arch/arm/boot/dts/sun5i-r8-chip.dts b/arch/arm/boot/dts/sun5i-r8-chip.dts
-index f6898c6..c937c85 100644
---- a/arch/arm/boot/dts/sun5i-r8-chip.dts
-+++ b/arch/arm/boot/dts/sun5i-r8-chip.dts
-@@ -52,7 +52,7 @@
-
- / {
- model = "NextThing C.H.I.P.";
-- compatible = "nextthing,chip", "allwinner,sun5i-r8";
-+ compatible = "nextthing,chip", "allwinner,sun5i-r8", "allwinner,sun5i-a13";
-
- aliases {
- i2c0 = &i2c0;
-diff --git a/arch/arm/boot/dts/sun6i-a31s-primo81.dts b/arch/arm/boot/dts/sun6i-a31s-primo81.dts
-index 68b479b..73c133f 100644
---- a/arch/arm/boot/dts/sun6i-a31s-primo81.dts
-+++ b/arch/arm/boot/dts/sun6i-a31s-primo81.dts
-@@ -176,8 +176,6 @@
- };
-
- &reg_dc1sw {
-- regulator-min-microvolt = <3000000>;
-- regulator-max-microvolt = <3000000>;
- regulator-name = "vcc-lcd";
- };
-
-diff --git a/arch/arm/boot/dts/sun6i-a31s-yones-toptech-bs1078-v2.dts b/arch/arm/boot/dts/sun6i-a31s-yones-toptech-bs1078-v2.dts
-index 360adfb..d6ad619 100644
---- a/arch/arm/boot/dts/sun6i-a31s-yones-toptech-bs1078-v2.dts
-+++ b/arch/arm/boot/dts/sun6i-a31s-yones-toptech-bs1078-v2.dts
-@@ -135,8 +135,6 @@
-
- &reg_dc1sw {
- regulator-name = "vcc-lcd-usb2";
-- regulator-min-microvolt = <3000000>;
-- regulator-max-microvolt = <3000000>;
- };
-
- &reg_dc5ldo {
-diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
-index aeddd28..92fd2c8 100644
---- a/arch/arm/include/asm/pgtable-2level.h
-+++ b/arch/arm/include/asm/pgtable-2level.h
-@@ -193,6 +193,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
-
- #define pmd_large(pmd) (pmd_val(pmd) & 2)
- #define pmd_bad(pmd) (pmd_val(pmd) & 2)
-+#define pmd_present(pmd) (pmd_val(pmd))
-
- #define copy_pmd(pmdpd,pmdps) \
- do { \
-diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
-index dc46398..7411466 100644
---- a/arch/arm/include/asm/pgtable-3level.h
-+++ b/arch/arm/include/asm/pgtable-3level.h
-@@ -211,6 +211,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
- : !!(pmd_val(pmd) & (val)))
- #define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
-
-+#define pmd_present(pmd) (pmd_isset((pmd), L_PMD_SECT_VALID))
- #define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
- #define pte_special(pte) (pte_isset((pte), L_PTE_SPECIAL))
- static inline pte_t pte_mkspecial(pte_t pte)
-@@ -249,10 +250,10 @@ PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
- #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
- #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot)
-
--/* represent a notpresent pmd by zero, this is used by pmdp_invalidate */
-+/* represent a notpresent pmd by faulting entry, this is used by pmdp_invalidate */
- static inline pmd_t pmd_mknotpresent(pmd_t pmd)
- {
-- return __pmd(0);
-+ return __pmd(pmd_val(pmd) & ~L_PMD_SECT_VALID);
- }
-
- static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
-diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
-index 348caab..d622040 100644
---- a/arch/arm/include/asm/pgtable.h
-+++ b/arch/arm/include/asm/pgtable.h
-@@ -182,7 +182,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
- #define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
-
- #define pmd_none(pmd) (!pmd_val(pmd))
--#define pmd_present(pmd) (pmd_val(pmd))
-
- static inline pte_t *pmd_page_vaddr(pmd_t pmd)
- {
-diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
-index dded1b7..72b11d9 100644
---- a/arch/arm/kvm/arm.c
-+++ b/arch/arm/kvm/arm.c
-@@ -267,6 +267,7 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
- kvm_timer_vcpu_terminate(vcpu);
- kvm_vgic_vcpu_destroy(vcpu);
- kvm_pmu_vcpu_destroy(vcpu);
-+ kvm_vcpu_uninit(vcpu);
- kmem_cache_free(kvm_vcpu_cache, vcpu);
- }
-
-diff --git a/arch/arm/mach-imx/mach-imx6ul.c b/arch/arm/mach-imx/mach-imx6ul.c
-index a38b16b..b56de4b 100644
---- a/arch/arm/mach-imx/mach-imx6ul.c
-+++ b/arch/arm/mach-imx/mach-imx6ul.c
-@@ -46,7 +46,7 @@ static int ksz8081_phy_fixup(struct phy_device *dev)
- static void __init imx6ul_enet_phy_init(void)
- {
- if (IS_BUILTIN(CONFIG_PHYLIB))
-- phy_register_fixup_for_uid(PHY_ID_KSZ8081, 0xffffffff,
-+ phy_register_fixup_for_uid(PHY_ID_KSZ8081, MICREL_PHY_ID_MASK,
- ksz8081_phy_fixup);
- }
-
-diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c
-index 7e989d6..474abff 100644
---- a/arch/arm/mach-mvebu/coherency.c
-+++ b/arch/arm/mach-mvebu/coherency.c
-@@ -162,22 +162,16 @@ exit:
- }
-
- /*
-- * This ioremap hook is used on Armada 375/38x to ensure that PCIe
-- * memory areas are mapped as MT_UNCACHED instead of MT_DEVICE. This
-- * is needed as a workaround for a deadlock issue between the PCIe
-- * interface and the cache controller.
-+ * This ioremap hook is used on Armada 375/38x to ensure that all MMIO
-+ * areas are mapped as MT_UNCACHED instead of MT_DEVICE. This is
-+ * needed for the HW I/O coherency mechanism to work properly without
-+ * deadlock.
- */
- static void __iomem *
--armada_pcie_wa_ioremap_caller(phys_addr_t phys_addr, size_t size,
-- unsigned int mtype, void *caller)
-+armada_wa_ioremap_caller(phys_addr_t phys_addr, size_t size,
-+ unsigned int mtype, void *caller)
- {
-- struct resource pcie_mem;
--
-- mvebu_mbus_get_pcie_mem_aperture(&pcie_mem);
--
-- if (pcie_mem.start <= phys_addr && (phys_addr + size) <= pcie_mem.end)
-- mtype = MT_UNCACHED;
--
-+ mtype = MT_UNCACHED;
- return __arm_ioremap_caller(phys_addr, size, mtype, caller);
- }
-
-@@ -186,7 +180,7 @@ static void __init armada_375_380_coherency_init(struct device_node *np)
- struct device_node *cache_dn;
-
- coherency_cpu_base = of_iomap(np, 0);
-- arch_ioremap_caller = armada_pcie_wa_ioremap_caller;
-+ arch_ioremap_caller = armada_wa_ioremap_caller;
-
- /*
- * We should switch the PL310 to I/O coherency mode only if
-diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h
-index a307eb6..7f94755 100644
---- a/arch/arm64/include/asm/ptrace.h
-+++ b/arch/arm64/include/asm/ptrace.h
-@@ -117,6 +117,8 @@ struct pt_regs {
- };
- u64 orig_x0;
- u64 syscallno;
-+ u64 orig_addr_limit;
-+ u64 unused; // maintain 16 byte alignment
- };
-
- #define arch_has_single_step() (1)
-diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
-index 3ae6b31..1abcd88 100644
---- a/arch/arm64/kernel/asm-offsets.c
-+++ b/arch/arm64/kernel/asm-offsets.c
-@@ -59,6 +59,7 @@ int main(void)
- DEFINE(S_PC, offsetof(struct pt_regs, pc));
- DEFINE(S_ORIG_X0, offsetof(struct pt_regs, orig_x0));
- DEFINE(S_SYSCALLNO, offsetof(struct pt_regs, syscallno));
-+ DEFINE(S_ORIG_ADDR_LIMIT, offsetof(struct pt_regs, orig_addr_limit));
- DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
- BLANK();
- DEFINE(MM_CONTEXT_ID, offsetof(struct mm_struct, context.id.counter));
-diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
-index 12e8d2b..6c3b734 100644
---- a/arch/arm64/kernel/entry.S
-+++ b/arch/arm64/kernel/entry.S
-@@ -28,6 +28,7 @@
- #include <asm/errno.h>
- #include <asm/esr.h>
- #include <asm/irq.h>
-+#include <asm/memory.h>
- #include <asm/thread_info.h>
- #include <asm/unistd.h>
-
-@@ -97,7 +98,14 @@
- mov x29, xzr // fp pointed to user-space
- .else
- add x21, sp, #S_FRAME_SIZE
-- .endif
-+ get_thread_info tsk
-+ /* Save the task's original addr_limit and set USER_DS (TASK_SIZE_64) */
-+ ldr x20, [tsk, #TI_ADDR_LIMIT]
-+ str x20, [sp, #S_ORIG_ADDR_LIMIT]
-+ mov x20, #TASK_SIZE_64
-+ str x20, [tsk, #TI_ADDR_LIMIT]
-+ ALTERNATIVE(nop, SET_PSTATE_UAO(0), ARM64_HAS_UAO, CONFIG_ARM64_UAO)
-+ .endif /* \el == 0 */
- mrs x22, elr_el1
- mrs x23, spsr_el1
- stp lr, x21, [sp, #S_LR]
-@@ -128,6 +136,14 @@
- .endm
-
- .macro kernel_exit, el
-+ .if \el != 0
-+ /* Restore the task's original addr_limit. */
-+ ldr x20, [sp, #S_ORIG_ADDR_LIMIT]
-+ str x20, [tsk, #TI_ADDR_LIMIT]
-+
-+ /* No need to restore UAO, it will be restored from SPSR_EL1 */
-+ .endif
-+
- ldp x21, x22, [sp, #S_PC] // load ELR, SPSR
- .if \el == 0
- ct_user_enter
-@@ -406,7 +422,6 @@ el1_irq:
- bl trace_hardirqs_off
- #endif
-
-- get_thread_info tsk
- irq_handler
-
- #ifdef CONFIG_PREEMPT
-diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
-index c539208..58651a9 100644
---- a/arch/arm64/kernel/traps.c
-+++ b/arch/arm64/kernel/traps.c
-@@ -64,8 +64,7 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
-
- /*
- * We need to switch to kernel mode so that we can use __get_user
-- * to safely read from kernel space. Note that we now dump the
-- * code first, just in case the backtrace kills us.
-+ * to safely read from kernel space.
- */
- fs = get_fs();
- set_fs(KERNEL_DS);
-@@ -111,21 +110,12 @@ static void dump_backtrace_entry(unsigned long where)
- print_ip_sym(where);
- }
-
--static void dump_instr(const char *lvl, struct pt_regs *regs)
-+static void __dump_instr(const char *lvl, struct pt_regs *regs)
- {
- unsigned long addr = instruction_pointer(regs);
-- mm_segment_t fs;
- char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str;
- int i;
-
-- /*
-- * We need to switch to kernel mode so that we can use __get_user
-- * to safely read from kernel space. Note that we now dump the
-- * code first, just in case the backtrace kills us.
-- */
-- fs = get_fs();
-- set_fs(KERNEL_DS);
--
- for (i = -4; i < 1; i++) {
- unsigned int val, bad;
-
-@@ -139,8 +129,18 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
- }
- }
- printk("%sCode: %s\n", lvl, str);
-+}
-
-- set_fs(fs);
-+static void dump_instr(const char *lvl, struct pt_regs *regs)
-+{
-+ if (!user_mode(regs)) {
-+ mm_segment_t fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ __dump_instr(lvl, regs);
-+ set_fs(fs);
-+ } else {
-+ __dump_instr(lvl, regs);
-+ }
- }
-
- static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
-diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
-index 10b79e9..e22849a9 100644
---- a/arch/arm64/mm/fault.c
-+++ b/arch/arm64/mm/fault.c
-@@ -284,7 +284,8 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
- }
-
- if (permission_fault(esr) && (addr < USER_DS)) {
-- if (get_fs() == KERNEL_DS)
-+ /* regs->orig_addr_limit may be 0 if we entered from EL0 */
-+ if (regs->orig_addr_limit == KERNEL_DS)
- die("Accessing user space memory with fs=KERNEL_DS", regs, esr);
-
- if (!search_exception_tables(regs->pc))
-diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c
-index dbd12ea..43a76b0 100644
---- a/arch/arm64/mm/flush.c
-+++ b/arch/arm64/mm/flush.c
-@@ -71,10 +71,6 @@ void __sync_icache_dcache(pte_t pte, unsigned long addr)
- {
- struct page *page = pte_page(pte);
-
-- /* no flushing needed for anonymous pages */
-- if (!page_mapping(page))
-- return;
--
- if (!test_and_set_bit(PG_dcache_clean, &page->flags))
- sync_icache_aliases(page_address(page),
- PAGE_SIZE << compound_order(page));
-diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h
-index 942b8f6..1907ab3 100644
---- a/arch/mips/include/asm/kvm_host.h
-+++ b/arch/mips/include/asm/kvm_host.h
-@@ -336,6 +336,7 @@ struct kvm_mips_tlb {
- #define KVM_MIPS_GUEST_TLB_SIZE 64
- struct kvm_vcpu_arch {
- void *host_ebase, *guest_ebase;
-+ int (*vcpu_run)(struct kvm_run *run, struct kvm_vcpu *vcpu);
- unsigned long host_stack;
- unsigned long host_gp;
-
-diff --git a/arch/mips/kvm/interrupt.h b/arch/mips/kvm/interrupt.h
-index 4ab4bdf..2143884 100644
---- a/arch/mips/kvm/interrupt.h
-+++ b/arch/mips/kvm/interrupt.h
-@@ -28,6 +28,7 @@
- #define MIPS_EXC_MAX 12
- /* XXXSL More to follow */
-
-+extern char __kvm_mips_vcpu_run_end[];
- extern char mips32_exception[], mips32_exceptionEnd[];
- extern char mips32_GuestException[], mips32_GuestExceptionEnd[];
-
-diff --git a/arch/mips/kvm/locore.S b/arch/mips/kvm/locore.S
-index 81687ab..fc93a08 100644
---- a/arch/mips/kvm/locore.S
-+++ b/arch/mips/kvm/locore.S
-@@ -227,6 +227,7 @@ FEXPORT(__kvm_mips_load_k0k1)
-
- /* Jump to guest */
- eret
-+EXPORT(__kvm_mips_vcpu_run_end)
-
- VECTOR(MIPSX(exception), unknown)
- /* Find out what mode we came from and jump to the proper handler. */
-diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
-index 70ef1a4..e223cb3 100644
---- a/arch/mips/kvm/mips.c
-+++ b/arch/mips/kvm/mips.c
-@@ -314,6 +314,15 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
- memcpy(gebase + offset, mips32_GuestException,
- mips32_GuestExceptionEnd - mips32_GuestException);
-
-+#ifdef MODULE
-+ offset += mips32_GuestExceptionEnd - mips32_GuestException;
-+ memcpy(gebase + offset, (char *)__kvm_mips_vcpu_run,
-+ __kvm_mips_vcpu_run_end - (char *)__kvm_mips_vcpu_run);
-+ vcpu->arch.vcpu_run = gebase + offset;
-+#else
-+ vcpu->arch.vcpu_run = __kvm_mips_vcpu_run;
-+#endif
-+
- /* Invalidate the icache for these ranges */
- local_flush_icache_range((unsigned long)gebase,
- (unsigned long)gebase + ALIGN(size, PAGE_SIZE));
-@@ -403,7 +412,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
- /* Disable hardware page table walking while in guest */
- htw_stop();
-
-- r = __kvm_mips_vcpu_run(run, vcpu);
-+ r = vcpu->arch.vcpu_run(run, vcpu);
-
- /* Re-enable HTW before enabling interrupts */
- htw_start();
-diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
-index b8500b4..bec85055 100644
---- a/arch/powerpc/kernel/process.c
-+++ b/arch/powerpc/kernel/process.c
-@@ -1501,6 +1501,16 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
- current->thread.regs = regs - 1;
- }
-
-+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-+ /*
-+ * Clear any transactional state, we're exec()ing. The cause is
-+ * not important as there will never be a recheckpoint so it's not
-+ * user visible.
-+ */
-+ if (MSR_TM_SUSPENDED(mfmsr()))
-+ tm_reclaim_current(0);
-+#endif
-+
- memset(regs->gpr, 0, sizeof(regs->gpr));
- regs->ctr = 0;
- regs->link = 0;
-diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
-index ccd2037..6ee4b72 100644
---- a/arch/powerpc/kernel/prom_init.c
-+++ b/arch/powerpc/kernel/prom_init.c
-@@ -719,7 +719,7 @@ unsigned char ibm_architecture_vec[] = {
- * must match by the macro below. Update the definition if
- * the structure layout changes.
- */
--#define IBM_ARCH_VEC_NRCORES_OFFSET 125
-+#define IBM_ARCH_VEC_NRCORES_OFFSET 133
- W(NR_CPUS), /* number of cores supported */
- 0,
- 0,
-diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
-index bd98ce2..3e8865b 100644
---- a/arch/powerpc/platforms/pseries/iommu.c
-+++ b/arch/powerpc/platforms/pseries/iommu.c
-@@ -912,7 +912,8 @@ machine_arch_initcall(pseries, find_existing_ddw_windows);
- static int query_ddw(struct pci_dev *dev, const u32 *ddw_avail,
- struct ddw_query_response *query)
- {
-- struct eeh_dev *edev;
-+ struct device_node *dn;
-+ struct pci_dn *pdn;
- u32 cfg_addr;
- u64 buid;
- int ret;
-@@ -923,11 +924,10 @@ static int query_ddw(struct pci_dev *dev, const u32 *ddw_avail,
- * Retrieve them from the pci device, not the node with the
- * dma-window property
- */
-- edev = pci_dev_to_eeh_dev(dev);
-- cfg_addr = edev->config_addr;
-- if (edev->pe_config_addr)
-- cfg_addr = edev->pe_config_addr;
-- buid = edev->phb->buid;
-+ dn = pci_device_to_OF_node(dev);
-+ pdn = PCI_DN(dn);
-+ buid = pdn->phb->buid;
-+ cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
-
- ret = rtas_call(ddw_avail[0], 3, 5, (u32 *)query,
- cfg_addr, BUID_HI(buid), BUID_LO(buid));
-@@ -941,7 +941,8 @@ static int create_ddw(struct pci_dev *dev, const u32 *ddw_avail,
- struct ddw_create_response *create, int page_shift,
- int window_shift)
- {
-- struct eeh_dev *edev;
-+ struct device_node *dn;
-+ struct pci_dn *pdn;
- u32 cfg_addr;
- u64 buid;
- int ret;
-@@ -952,11 +953,10 @@ static int create_ddw(struct pci_dev *dev, const u32 *ddw_avail,
- * Retrieve them from the pci device, not the node with the
- * dma-window property
- */
-- edev = pci_dev_to_eeh_dev(dev);
-- cfg_addr = edev->config_addr;
-- if (edev->pe_config_addr)
-- cfg_addr = edev->pe_config_addr;
-- buid = edev->phb->buid;
-+ dn = pci_device_to_OF_node(dev);
-+ pdn = PCI_DN(dn);
-+ buid = pdn->phb->buid;
-+ cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
-
- do {
- /* extra outputs are LIOBN and dma-addr (hi, lo) */
-diff --git a/arch/s390/include/asm/fpu/api.h b/arch/s390/include/asm/fpu/api.h
-index 5e04f3c..8ae236b0 100644
---- a/arch/s390/include/asm/fpu/api.h
-+++ b/arch/s390/include/asm/fpu/api.h
-@@ -22,7 +22,7 @@ static inline int test_fp_ctl(u32 fpc)
- " la %0,0\n"
- "1:\n"
- EX_TABLE(0b,1b)
-- : "=d" (rc), "=d" (orig_fpc)
-+ : "=d" (rc), "=&d" (orig_fpc)
- : "d" (fpc), "0" (-EINVAL));
- return rc;
- }
-diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
-index f20abdb..d14069d 100644
---- a/arch/s390/kernel/ipl.c
-+++ b/arch/s390/kernel/ipl.c
-@@ -2064,12 +2064,5 @@ void s390_reset_system(void)
- S390_lowcore.program_new_psw.addr =
- (unsigned long) s390_base_pgm_handler;
-
-- /*
-- * Clear subchannel ID and number to signal new kernel that no CCW or
-- * SCSI IPL has been done (for kexec and kdump)
-- */
-- S390_lowcore.subchannel_id = 0;
-- S390_lowcore.subchannel_nr = 0;
--
- do_reset_calls();
- }
-diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
-index 4324b87..9f0ce0e 100644
---- a/arch/s390/mm/pgtable.c
-+++ b/arch/s390/mm/pgtable.c
-@@ -437,7 +437,7 @@ void ptep_zap_unused(struct mm_struct *mm, unsigned long addr,
- pgste = pgste_get_lock(ptep);
- pgstev = pgste_val(pgste);
- pte = *ptep;
-- if (pte_swap(pte) &&
-+ if (!reset && pte_swap(pte) &&
- ((pgstev & _PGSTE_GPS_USAGE_MASK) == _PGSTE_GPS_USAGE_UNUSED ||
- (pgstev & _PGSTE_GPS_ZERO))) {
- ptep_zap_swap_entry(mm, pte_to_swp_entry(pte));
-diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
-index b1ef9e4..b67f9e8 100644
---- a/arch/x86/boot/Makefile
-+++ b/arch/x86/boot/Makefile
-@@ -171,6 +171,9 @@ isoimage: $(obj)/bzImage
- for i in lib lib64 share end ; do \
- if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \
- cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \
-+ if [ -f /usr/$$i/syslinux/ldlinux.c32 ]; then \
-+ cp /usr/$$i/syslinux/ldlinux.c32 $(obj)/isoimage ; \
-+ fi ; \
- break ; \
- fi ; \
- if [ $$i = end ] ; then exit 1 ; fi ; \
-diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
-index 041e442..7eb806c 100644
---- a/arch/x86/events/core.c
-+++ b/arch/x86/events/core.c
-@@ -2313,7 +2313,7 @@ void
- perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
- {
- struct stack_frame frame;
-- const void __user *fp;
-+ const unsigned long __user *fp;
-
- if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
- /* TODO: We don't support guest os callchain now */
-@@ -2326,7 +2326,7 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
- if (regs->flags & (X86_VM_MASK | PERF_EFLAGS_VM))
- return;
-
-- fp = (void __user *)regs->bp;
-+ fp = (unsigned long __user *)regs->bp;
-
- perf_callchain_store(entry, regs->ip);
-
-@@ -2339,16 +2339,17 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
- pagefault_disable();
- while (entry->nr < PERF_MAX_STACK_DEPTH) {
- unsigned long bytes;
-+
- frame.next_frame = NULL;
- frame.return_address = 0;
-
-- if (!access_ok(VERIFY_READ, fp, 16))
-+ if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2))
- break;
-
-- bytes = __copy_from_user_nmi(&frame.next_frame, fp, 8);
-+ bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp));
- if (bytes != 0)
- break;
-- bytes = __copy_from_user_nmi(&frame.return_address, fp+8, 8);
-+ bytes = __copy_from_user_nmi(&frame.return_address, fp + 1, sizeof(*fp));
- if (bytes != 0)
- break;
-
-diff --git a/arch/x86/events/intel/rapl.c b/arch/x86/events/intel/rapl.c
-index 1705c9d..78ee9eb 100644
---- a/arch/x86/events/intel/rapl.c
-+++ b/arch/x86/events/intel/rapl.c
-@@ -665,7 +665,7 @@ static void __init cleanup_rapl_pmus(void)
- int i;
-
- for (i = 0; i < rapl_pmus->maxpkg; i++)
-- kfree(rapl_pmus->pmus + i);
-+ kfree(rapl_pmus->pmus[i]);
- kfree(rapl_pmus);
- }
-
-diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
-index 7a79ee2..33c709c 100644
---- a/arch/x86/include/asm/msr.h
-+++ b/arch/x86/include/asm/msr.h
-@@ -112,7 +112,7 @@ static inline void native_write_msr(unsigned int msr,
- unsigned low, unsigned high)
- {
- asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high) : "memory");
-- if (msr_tracepoint_active(__tracepoint_read_msr))
-+ if (msr_tracepoint_active(__tracepoint_write_msr))
- do_trace_write_msr(msr, ((u64)high << 32 | low), 0);
- }
-
-@@ -131,7 +131,7 @@ notrace static inline int native_write_msr_safe(unsigned int msr,
- : "c" (msr), "0" (low), "d" (high),
- [fault] "i" (-EIO)
- : "memory");
-- if (msr_tracepoint_active(__tracepoint_read_msr))
-+ if (msr_tracepoint_active(__tracepoint_write_msr))
- do_trace_write_msr(msr, ((u64)high << 32 | low), err);
- return err;
- }
-diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c
-index a147e67..e991d5c 100644
---- a/arch/x86/kernel/amd_nb.c
-+++ b/arch/x86/kernel/amd_nb.c
-@@ -71,8 +71,8 @@ int amd_cache_northbridges(void)
- while ((misc = next_northbridge(misc, amd_nb_misc_ids)) != NULL)
- i++;
-
-- if (i == 0)
-- return 0;
-+ if (!i)
-+ return -ENODEV;
-
- nb = kzalloc(i * sizeof(struct amd_northbridge), GFP_KERNEL);
- if (!nb)
-diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
-index ae703ac..44bcd57 100644
---- a/arch/x86/kernel/kprobes/core.c
-+++ b/arch/x86/kernel/kprobes/core.c
-@@ -960,7 +960,19 @@ int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
- * normal page fault.
- */
- regs->ip = (unsigned long)cur->addr;
-+ /*
-+ * Trap flag (TF) has been set here because this fault
-+ * happened where the single stepping will be done.
-+ * So clear it by resetting the current kprobe:
-+ */
-+ regs->flags &= ~X86_EFLAGS_TF;
-+
-+ /*
-+ * If the TF flag was set before the kprobe hit,
-+ * don't touch it:
-+ */
- regs->flags |= kcb->kprobe_old_flags;
-+
- if (kcb->kprobe_status == KPROBE_REENTER)
- restore_previous_kprobe(kcb);
- else
-diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index faf52bac..c4217a2 100644
---- a/arch/x86/kvm/vmx.c
-+++ b/arch/x86/kvm/vmx.c
-@@ -2072,7 +2072,8 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)
- unsigned int dest;
-
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
-- !irq_remapping_cap(IRQ_POSTING_CAP))
-+ !irq_remapping_cap(IRQ_POSTING_CAP) ||
-+ !kvm_vcpu_apicv_active(vcpu))
- return;
-
- do {
-@@ -2180,7 +2181,8 @@ static void vmx_vcpu_pi_put(struct kvm_vcpu *vcpu)
- struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
-
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
-- !irq_remapping_cap(IRQ_POSTING_CAP))
-+ !irq_remapping_cap(IRQ_POSTING_CAP) ||
-+ !kvm_vcpu_apicv_active(vcpu))
- return;
-
- /* Set SN when the vCPU is preempted */
-@@ -6657,7 +6659,13 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu,
-
- /* Checks for #GP/#SS exceptions. */
- exn = false;
-- if (is_protmode(vcpu)) {
-+ if (is_long_mode(vcpu)) {
-+ /* Long mode: #GP(0)/#SS(0) if the memory address is in a
-+ * non-canonical form. This is the only check on the memory
-+ * destination for long mode!
-+ */
-+ exn = is_noncanonical_address(*ret);
-+ } else if (is_protmode(vcpu)) {
- /* Protected mode: apply checks for segment validity in the
- * following order:
- * - segment type check (#GP(0) may be thrown)
-@@ -6674,17 +6682,10 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu,
- * execute-only code segment
- */
- exn = ((s.type & 0xa) == 8);
-- }
-- if (exn) {
-- kvm_queue_exception_e(vcpu, GP_VECTOR, 0);
-- return 1;
-- }
-- if (is_long_mode(vcpu)) {
-- /* Long mode: #GP(0)/#SS(0) if the memory address is in a
-- * non-canonical form. This is an only check for long mode.
-- */
-- exn = is_noncanonical_address(*ret);
-- } else if (is_protmode(vcpu)) {
-+ if (exn) {
-+ kvm_queue_exception_e(vcpu, GP_VECTOR, 0);
-+ return 1;
-+ }
- /* Protected mode: #GP(0)/#SS(0) if the segment is unusable.
- */
- exn = (s.unusable != 0);
-@@ -10702,7 +10703,8 @@ static int vmx_pre_block(struct kvm_vcpu *vcpu)
- struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
-
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
-- !irq_remapping_cap(IRQ_POSTING_CAP))
-+ !irq_remapping_cap(IRQ_POSTING_CAP) ||
-+ !kvm_vcpu_apicv_active(vcpu))
- return 0;
-
- vcpu->pre_pcpu = vcpu->cpu;
-@@ -10768,7 +10770,8 @@ static void vmx_post_block(struct kvm_vcpu *vcpu)
- unsigned long flags;
-
- if (!kvm_arch_has_assigned_device(vcpu->kvm) ||
-- !irq_remapping_cap(IRQ_POSTING_CAP))
-+ !irq_remapping_cap(IRQ_POSTING_CAP) ||
-+ !kvm_vcpu_apicv_active(vcpu))
- return;
-
- do {
-@@ -10821,7 +10824,8 @@ static int vmx_update_pi_irte(struct kvm *kvm, unsigned int host_irq,
- int idx, ret = -EINVAL;
-
- if (!kvm_arch_has_assigned_device(kvm) ||
-- !irq_remapping_cap(IRQ_POSTING_CAP))
-+ !irq_remapping_cap(IRQ_POSTING_CAP) ||
-+ !kvm_vcpu_apicv_active(kvm->vcpus[0]))
- return 0;
-
- idx = srcu_read_lock(&kvm->irq_srcu);
-diff --git a/crypto/rsa-pkcs1pad.c b/crypto/rsa-pkcs1pad.c
-index ead8dc0..8ba4266 100644
---- a/crypto/rsa-pkcs1pad.c
-+++ b/crypto/rsa-pkcs1pad.c
-@@ -102,10 +102,10 @@ struct pkcs1pad_inst_ctx {
- };
-
- struct pkcs1pad_request {
-- struct akcipher_request child_req;
--
- struct scatterlist in_sg[3], out_sg[2];
- uint8_t *in_buf, *out_buf;
-+
-+ struct akcipher_request child_req;
- };
-
- static int pkcs1pad_set_pub_key(struct crypto_akcipher *tfm, const void *key,
-diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
-index 961acc7..91a9e6a 100644
---- a/drivers/ata/libata-eh.c
-+++ b/drivers/ata/libata-eh.c
-@@ -606,7 +606,7 @@ void ata_scsi_error(struct Scsi_Host *host)
- ata_scsi_port_error_handler(host, ap);
-
- /* finish or retry handled scmd's and clean up */
-- WARN_ON(host->host_failed || !list_empty(&eh_work_q));
-+ WARN_ON(!list_empty(&eh_work_q));
-
- DPRINTK("EXIT\n");
- }
-diff --git a/drivers/base/module.c b/drivers/base/module.c
-index db930d3..2a21578 100644
---- a/drivers/base/module.c
-+++ b/drivers/base/module.c
-@@ -24,10 +24,12 @@ static char *make_driver_name(struct device_driver *drv)
-
- static void module_create_drivers_dir(struct module_kobject *mk)
- {
-- if (!mk || mk->drivers_dir)
-- return;
-+ static DEFINE_MUTEX(drivers_dir_mutex);
-
-- mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
-+ mutex_lock(&drivers_dir_mutex);
-+ if (mk && !mk->drivers_dir)
-+ mk->drivers_dir = kobject_create_and_add("drivers", &mk->kobj);
-+ mutex_unlock(&drivers_dir_mutex);
- }
-
- void module_add_driver(struct module *mod, struct device_driver *drv)
-diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
-index 94fb407..44b1bd6 100644
---- a/drivers/char/ipmi/ipmi_msghandler.c
-+++ b/drivers/char/ipmi/ipmi_msghandler.c
-@@ -3820,6 +3820,7 @@ static void handle_new_recv_msgs(ipmi_smi_t intf)
- while (!list_empty(&intf->waiting_rcv_msgs)) {
- smi_msg = list_entry(intf->waiting_rcv_msgs.next,
- struct ipmi_smi_msg, link);
-+ list_del(&smi_msg->link);
- if (!run_to_completion)
- spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock,
- flags);
-@@ -3829,11 +3830,14 @@ static void handle_new_recv_msgs(ipmi_smi_t intf)
- if (rv > 0) {
- /*
- * To preserve message order, quit if we
-- * can't handle a message.
-+ * can't handle a message. Add the message
-+ * back at the head, this is safe because this
-+ * tasklet is the only thing that pulls the
-+ * messages.
- */
-+ list_add(&smi_msg->link, &intf->waiting_rcv_msgs);
- break;
- } else {
-- list_del(&smi_msg->link);
- if (rv == 0)
- /* Message handled */
- ipmi_free_smi_msg(smi_msg);
-diff --git a/drivers/crypto/qat/qat_common/Makefile b/drivers/crypto/qat/qat_common/Makefile
-index 29c7c53..92561c8 100644
---- a/drivers/crypto/qat/qat_common/Makefile
-+++ b/drivers/crypto/qat/qat_common/Makefile
-@@ -2,6 +2,7 @@ $(obj)/qat_rsapubkey-asn1.o: $(obj)/qat_rsapubkey-asn1.c \
- $(obj)/qat_rsapubkey-asn1.h
- $(obj)/qat_rsaprivkey-asn1.o: $(obj)/qat_rsaprivkey-asn1.c \
- $(obj)/qat_rsaprivkey-asn1.h
-+$(obj)/qat_asym_algs.o: $(obj)/qat_rsapubkey-asn1.h $(obj)/qat_rsaprivkey-asn1.h
-
- clean-files += qat_rsapubkey-asn1.c qat_rsapubkey-asn1.h
- clean-files += qat_rsaprivkey-asn1.c qat_rsaprivkey-asn1.h
-diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
-index 1472f48..ff51b51 100644
---- a/drivers/edac/edac_mc.c
-+++ b/drivers/edac/edac_mc.c
-@@ -565,7 +565,8 @@ void edac_mc_reset_delay_period(unsigned long value)
- list_for_each(item, &mc_devices) {
- mci = list_entry(item, struct mem_ctl_info, link);
-
-- edac_mod_work(&mci->work, value);
-+ if (mci->op_state == OP_RUNNING_POLL)
-+ edac_mod_work(&mci->work, value);
- }
- mutex_unlock(&mem_ctls_mutex);
- }
-diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
-index 8bf745d..b274fa2 100644
---- a/drivers/edac/sb_edac.c
-+++ b/drivers/edac/sb_edac.c
-@@ -239,8 +239,11 @@ static const u32 rir_offset[MAX_RIR_RANGES][MAX_RIR_WAY] = {
- { 0x1a0, 0x1a4, 0x1a8, 0x1ac, 0x1b0, 0x1b4, 0x1b8, 0x1bc },
- };
-
--#define RIR_RNK_TGT(reg) GET_BITFIELD(reg, 16, 19)
--#define RIR_OFFSET(reg) GET_BITFIELD(reg, 2, 14)
-+#define RIR_RNK_TGT(type, reg) (((type) == BROADWELL) ? \
-+ GET_BITFIELD(reg, 20, 23) : GET_BITFIELD(reg, 16, 19))
-+
-+#define RIR_OFFSET(type, reg) (((type) == HASWELL || (type) == BROADWELL) ? \
-+ GET_BITFIELD(reg, 2, 15) : GET_BITFIELD(reg, 2, 14))
-
- /* Device 16, functions 2-7 */
-
-@@ -1916,14 +1919,14 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
- pci_read_config_dword(pvt->pci_tad[i],
- rir_offset[j][k],
- &reg);
-- tmp_mb = RIR_OFFSET(reg) << 6;
-+ tmp_mb = RIR_OFFSET(pvt->info.type, reg) << 6;
-
- gb = div_u64_rem(tmp_mb, 1024, &mb);
- edac_dbg(0, "CH#%d RIR#%d INTL#%d, offset %u.%03u GB (0x%016Lx), tgt: %d, reg=0x%08x\n",
- i, j, k,
- gb, (mb*1000)/1024,
- ((u64)tmp_mb) << 20L,
-- (u32)RIR_RNK_TGT(reg),
-+ (u32)RIR_RNK_TGT(pvt->info.type, reg),
- reg);
- }
- }
-@@ -2256,7 +2259,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
- pci_read_config_dword(pvt->pci_tad[ch_add + base_ch],
- rir_offset[n_rir][idx],
- &reg);
-- *rank = RIR_RNK_TGT(reg);
-+ *rank = RIR_RNK_TGT(pvt->info.type, reg);
-
- edac_dbg(0, "RIR#%d: channel address 0x%08Lx < 0x%08Lx, RIR interleave %d, index %d\n",
- n_rir,
-diff --git a/drivers/extcon/extcon-palmas.c b/drivers/extcon/extcon-palmas.c
-index 8b3226d..caff46c 100644
---- a/drivers/extcon/extcon-palmas.c
-+++ b/drivers/extcon/extcon-palmas.c
-@@ -360,6 +360,8 @@ static int palmas_usb_probe(struct platform_device *pdev)
-
- palmas_enable_irq(palmas_usb);
- /* perform initial detection */
-+ if (palmas_usb->enable_gpio_vbus_detection)
-+ palmas_vbus_irq_handler(palmas_usb->gpio_vbus_irq, palmas_usb);
- palmas_gpio_id_detect(&palmas_usb->wq_detectid.work);
- device_set_wakeup_capable(&pdev->dev, true);
- return 0;
-diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
-index e85e753..eb43ae4 100644
---- a/drivers/gpio/gpio-sch.c
-+++ b/drivers/gpio/gpio-sch.c
-@@ -61,9 +61,8 @@ static unsigned sch_gpio_bit(struct sch_gpio *sch, unsigned gpio)
- return gpio % 8;
- }
-
--static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg)
-+static int sch_gpio_reg_get(struct sch_gpio *sch, unsigned gpio, unsigned reg)
- {
-- struct sch_gpio *sch = gpiochip_get_data(gc);
- unsigned short offset, bit;
- u8 reg_val;
-
-@@ -75,10 +74,9 @@ static int sch_gpio_reg_get(struct gpio_chip *gc, unsigned gpio, unsigned reg)
- return reg_val;
- }
-
--static void sch_gpio_reg_set(struct gpio_chip *gc, unsigned gpio, unsigned reg,
-+static void sch_gpio_reg_set(struct sch_gpio *sch, unsigned gpio, unsigned reg,
- int val)
- {
-- struct sch_gpio *sch = gpiochip_get_data(gc);
- unsigned short offset, bit;
- u8 reg_val;
-
-@@ -98,14 +96,15 @@ static int sch_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num)
- struct sch_gpio *sch = gpiochip_get_data(gc);
-
- spin_lock(&sch->lock);
-- sch_gpio_reg_set(gc, gpio_num, GIO, 1);
-+ sch_gpio_reg_set(sch, gpio_num, GIO, 1);
- spin_unlock(&sch->lock);
- return 0;
- }
-
- static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num)
- {
-- return sch_gpio_reg_get(gc, gpio_num, GLV);
-+ struct sch_gpio *sch = gpiochip_get_data(gc);
-+ return sch_gpio_reg_get(sch, gpio_num, GLV);
- }
-
- static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val)
-@@ -113,7 +112,7 @@ static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val)
- struct sch_gpio *sch = gpiochip_get_data(gc);
-
- spin_lock(&sch->lock);
-- sch_gpio_reg_set(gc, gpio_num, GLV, val);
-+ sch_gpio_reg_set(sch, gpio_num, GLV, val);
- spin_unlock(&sch->lock);
- }
-
-@@ -123,7 +122,7 @@ static int sch_gpio_direction_out(struct gpio_chip *gc, unsigned gpio_num,
- struct sch_gpio *sch = gpiochip_get_data(gc);
-
- spin_lock(&sch->lock);
-- sch_gpio_reg_set(gc, gpio_num, GIO, 0);
-+ sch_gpio_reg_set(sch, gpio_num, GIO, 0);
- spin_unlock(&sch->lock);
-
- /*
-@@ -182,13 +181,13 @@ static int sch_gpio_probe(struct platform_device *pdev)
- * GPIO7 is configured by the CMC as SLPIOVR
- * Enable GPIO[9:8] core powered gpios explicitly
- */
-- sch_gpio_reg_set(&sch->chip, 8, GEN, 1);
-- sch_gpio_reg_set(&sch->chip, 9, GEN, 1);
-+ sch_gpio_reg_set(sch, 8, GEN, 1);
-+ sch_gpio_reg_set(sch, 9, GEN, 1);
- /*
- * SUS_GPIO[2:0] enabled by default
- * Enable SUS_GPIO3 resume powered gpio explicitly
- */
-- sch_gpio_reg_set(&sch->chip, 13, GEN, 1);
-+ sch_gpio_reg_set(sch, 13, GEN, 1);
- break;
-
- case PCI_DEVICE_ID_INTEL_ITC_LPC:
-diff --git a/drivers/gpio/gpiolib-legacy.c b/drivers/gpio/gpiolib-legacy.c
-index 3a5c701..8b83099 100644
---- a/drivers/gpio/gpiolib-legacy.c
-+++ b/drivers/gpio/gpiolib-legacy.c
-@@ -28,6 +28,10 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
- if (!desc && gpio_is_valid(gpio))
- return -EPROBE_DEFER;
-
-+ err = gpiod_request(desc, label);
-+ if (err)
-+ return err;
-+
- if (flags & GPIOF_OPEN_DRAIN)
- set_bit(FLAG_OPEN_DRAIN, &desc->flags);
-
-@@ -37,10 +41,6 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
- if (flags & GPIOF_ACTIVE_LOW)
- set_bit(FLAG_ACTIVE_LOW, &desc->flags);
-
-- err = gpiod_request(desc, label);
-- if (err)
-- return err;
--
- if (flags & GPIOF_DIR_IN)
- err = gpiod_direction_input(desc);
- else
-diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
-index cf3e712..996a733 100644
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -1324,14 +1324,6 @@ static int __gpiod_request(struct gpio_desc *desc, const char *label)
- spin_lock_irqsave(&gpio_lock, flags);
- }
- done:
-- if (status < 0) {
-- /* Clear flags that might have been set by the caller before
-- * requesting the GPIO.
-- */
-- clear_bit(FLAG_ACTIVE_LOW, &desc->flags);
-- clear_bit(FLAG_OPEN_DRAIN, &desc->flags);
-- clear_bit(FLAG_OPEN_SOURCE, &desc->flags);
-- }
- spin_unlock_irqrestore(&gpio_lock, flags);
- return status;
- }
-@@ -1345,8 +1337,12 @@ done:
- #define VALIDATE_DESC(desc) do { \
- if (!desc) \
- return 0; \
-+ if (IS_ERR(desc)) { \
-+ pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \
-+ return PTR_ERR(desc); \
-+ } \
- if (!desc->gdev) { \
-- pr_warn("%s: invalid GPIO\n", __func__); \
-+ pr_warn("%s: invalid GPIO (no device)\n", __func__); \
- return -EINVAL; \
- } \
- if ( !desc->gdev->chip ) { \
-@@ -1358,8 +1354,12 @@ done:
- #define VALIDATE_DESC_VOID(desc) do { \
- if (!desc) \
- return; \
-+ if (IS_ERR(desc)) { \
-+ pr_warn("%s: invalid GPIO (errorpointer)\n", __func__); \
-+ return; \
-+ } \
- if (!desc->gdev) { \
-- pr_warn("%s: invalid GPIO\n", __func__); \
-+ pr_warn("%s: invalid GPIO (no device)\n", __func__); \
- return; \
- } \
- if (!desc->gdev->chip) { \
-@@ -2011,7 +2011,7 @@ int gpiod_to_irq(const struct gpio_desc *desc)
- * requires this function to not return zero on an invalid descriptor
- * but rather a negative error number.
- */
-- if (!desc || !desc->gdev || !desc->gdev->chip)
-+ if (!desc || IS_ERR(desc) || !desc->gdev || !desc->gdev->chip)
- return -EINVAL;
-
- chip = desc->gdev->chip;
-@@ -2507,28 +2507,13 @@ struct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
- }
- EXPORT_SYMBOL_GPL(gpiod_get_optional);
-
--/**
-- * gpiod_parse_flags - helper function to parse GPIO lookup flags
-- * @desc: gpio to be setup
-- * @lflags: gpio_lookup_flags - returned from of_find_gpio() or
-- * of_get_gpio_hog()
-- *
-- * Set the GPIO descriptor flags based on the given GPIO lookup flags.
-- */
--static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags)
--{
-- if (lflags & GPIO_ACTIVE_LOW)
-- set_bit(FLAG_ACTIVE_LOW, &desc->flags);
-- if (lflags & GPIO_OPEN_DRAIN)
-- set_bit(FLAG_OPEN_DRAIN, &desc->flags);
-- if (lflags & GPIO_OPEN_SOURCE)
-- set_bit(FLAG_OPEN_SOURCE, &desc->flags);
--}
-
- /**
- * gpiod_configure_flags - helper function to configure a given GPIO
- * @desc: gpio whose value will be assigned
- * @con_id: function within the GPIO consumer
-+ * @lflags: gpio_lookup_flags - returned from of_find_gpio() or
-+ * of_get_gpio_hog()
- * @dflags: gpiod_flags - optional GPIO initialization flags
- *
- * Return 0 on success, -ENOENT if no GPIO has been assigned to the
-@@ -2536,10 +2521,17 @@ static void gpiod_parse_flags(struct gpio_desc *desc, unsigned long lflags)
- * occurred while trying to acquire the GPIO.
- */
- static int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
-- enum gpiod_flags dflags)
-+ unsigned long lflags, enum gpiod_flags dflags)
- {
- int status;
-
-+ if (lflags & GPIO_ACTIVE_LOW)
-+ set_bit(FLAG_ACTIVE_LOW, &desc->flags);
-+ if (lflags & GPIO_OPEN_DRAIN)
-+ set_bit(FLAG_OPEN_DRAIN, &desc->flags);
-+ if (lflags & GPIO_OPEN_SOURCE)
-+ set_bit(FLAG_OPEN_SOURCE, &desc->flags);
-+
- /* No particular flag request, return here... */
- if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) {
- pr_debug("no flags found for %s\n", con_id);
-@@ -2606,13 +2598,11 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
- return desc;
- }
-
-- gpiod_parse_flags(desc, lookupflags);
--
- status = gpiod_request(desc, con_id);
- if (status < 0)
- return ERR_PTR(status);
-
-- status = gpiod_configure_flags(desc, con_id, flags);
-+ status = gpiod_configure_flags(desc, con_id, lookupflags, flags);
- if (status < 0) {
- dev_dbg(dev, "setup of GPIO %s failed\n", con_id);
- gpiod_put(desc);
-@@ -2668,6 +2658,10 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
- if (IS_ERR(desc))
- return desc;
-
-+ ret = gpiod_request(desc, NULL);
-+ if (ret)
-+ return ERR_PTR(ret);
-+
- if (active_low)
- set_bit(FLAG_ACTIVE_LOW, &desc->flags);
-
-@@ -2678,10 +2672,6 @@ struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
- set_bit(FLAG_OPEN_SOURCE, &desc->flags);
- }
-
-- ret = gpiod_request(desc, NULL);
-- if (ret)
-- return ERR_PTR(ret);
--
- return desc;
- }
- EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod);
-@@ -2734,8 +2724,6 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
- chip = gpiod_to_chip(desc);
- hwnum = gpio_chip_hwgpio(desc);
-
-- gpiod_parse_flags(desc, lflags);
--
- local_desc = gpiochip_request_own_desc(chip, hwnum, name);
- if (IS_ERR(local_desc)) {
- pr_err("requesting hog GPIO %s (chip %s, offset %d) failed\n",
-@@ -2743,7 +2731,7 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
- return PTR_ERR(local_desc);
- }
-
-- status = gpiod_configure_flags(desc, name, dflags);
-+ status = gpiod_configure_flags(desc, name, lflags, dflags);
- if (status < 0) {
- pr_err("setup of hog GPIO %s (chip %s, offset %d) failed\n",
- name, chip->label, hwnum);
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
-index 6043dc7..3e21732 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
-@@ -880,7 +880,7 @@ static int amdgpu_cgs_acpi_eval_object(void *cgs_device,
- struct cgs_acpi_method_argument *argument = NULL;
- uint32_t i, count;
- acpi_status status;
-- int result;
-+ int result = 0;
- uint32_t func_no = 0xFFFFFFFF;
-
- handle = ACPI_HANDLE(&adev->pdev->dev);
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-index b04337d..d78739d 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-@@ -448,7 +448,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
- dev_info.max_memory_clock = adev->pm.default_mclk * 10;
- }
- dev_info.enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask;
-- dev_info.num_rb_pipes = adev->gfx.config.num_rbs;
-+ dev_info.num_rb_pipes = adev->gfx.config.max_backends_per_se *
-+ adev->gfx.config.max_shader_engines;
- dev_info.num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts;
- dev_info._pad = 0;
- dev_info.ids_flags = 0;
-diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
-index bb8709066..d2216f8 100644
---- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
-+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
-@@ -5074,7 +5074,7 @@ static int gfx_v7_0_eop_irq(struct amdgpu_device *adev,
- case 2:
- for (i = 0; i < adev->gfx.num_compute_rings; i++) {
- ring = &adev->gfx.compute_ring[i];
-- if ((ring->me == me_id) & (ring->pipe == pipe_id))
-+ if ((ring->me == me_id) && (ring->pipe == pipe_id))
- amdgpu_fence_process(ring);
- }
- break;
-diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
-index ac00579..7708d90 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
-@@ -242,13 +242,19 @@ static void kfd_process_notifier_release(struct mmu_notifier *mn,
- pqm_uninit(&p->pqm);
-
- /* Iterate over all process device data structure and check
-- * if we should reset all wavefronts */
-- list_for_each_entry(pdd, &p->per_device_data, per_device_list)
-+ * if we should delete debug managers and reset all wavefronts
-+ */
-+ list_for_each_entry(pdd, &p->per_device_data, per_device_list) {
-+ if ((pdd->dev->dbgmgr) &&
-+ (pdd->dev->dbgmgr->pasid == p->pasid))
-+ kfd_dbgmgr_destroy(pdd->dev->dbgmgr);
-+
- if (pdd->reset_wavefronts) {
- pr_warn("amdkfd: Resetting all wave fronts\n");
- dbgdev_wave_reset_wavefronts(pdd->dev, p);
- pdd->reset_wavefronts = false;
- }
-+ }
-
- mutex_unlock(&p->mutex);
-
-@@ -404,42 +410,52 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
-
- idx = srcu_read_lock(&kfd_processes_srcu);
-
-+ /*
-+ * Look for the process that matches the pasid. If there is no such
-+ * process, we either released it in amdkfd's own notifier, or there
-+ * is a bug. Unfortunately, there is no way to tell...
-+ */
- hash_for_each_rcu(kfd_processes_table, i, p, kfd_processes)
-- if (p->pasid == pasid)
-- break;
-+ if (p->pasid == pasid) {
-
-- srcu_read_unlock(&kfd_processes_srcu, idx);
-+ srcu_read_unlock(&kfd_processes_srcu, idx);
-
-- BUG_ON(p->pasid != pasid);
-+ pr_debug("Unbinding process %d from IOMMU\n", pasid);
-
-- mutex_lock(&p->mutex);
-+ mutex_lock(&p->mutex);
-
-- if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
-- kfd_dbgmgr_destroy(dev->dbgmgr);
-+ if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
-+ kfd_dbgmgr_destroy(dev->dbgmgr);
-
-- pqm_uninit(&p->pqm);
-+ pqm_uninit(&p->pqm);
-
-- pdd = kfd_get_process_device_data(dev, p);
-+ pdd = kfd_get_process_device_data(dev, p);
-
-- if (!pdd) {
-- mutex_unlock(&p->mutex);
-- return;
-- }
-+ if (!pdd) {
-+ mutex_unlock(&p->mutex);
-+ return;
-+ }
-
-- if (pdd->reset_wavefronts) {
-- dbgdev_wave_reset_wavefronts(pdd->dev, p);
-- pdd->reset_wavefronts = false;
-- }
-+ if (pdd->reset_wavefronts) {
-+ dbgdev_wave_reset_wavefronts(pdd->dev, p);
-+ pdd->reset_wavefronts = false;
-+ }
-
-- /*
-- * Just mark pdd as unbound, because we still need it to call
-- * amd_iommu_unbind_pasid() in when the process exits.
-- * We don't call amd_iommu_unbind_pasid() here
-- * because the IOMMU called us.
-- */
-- pdd->bound = false;
-+ /*
-+ * Just mark pdd as unbound, because we still need it
-+ * to call amd_iommu_unbind_pasid() in when the
-+ * process exits.
-+ * We don't call amd_iommu_unbind_pasid() here
-+ * because the IOMMU called us.
-+ */
-+ pdd->bound = false;
-
-- mutex_unlock(&p->mutex);
-+ mutex_unlock(&p->mutex);
-+
-+ return;
-+ }
-+
-+ srcu_read_unlock(&kfd_processes_srcu, idx);
- }
-
- struct kfd_process_device *kfd_get_first_process_device_data(struct kfd_process *p)
-diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
-index fa208ad..efb77ed 100644
---- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
-+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
-@@ -306,10 +306,14 @@ int phm_store_dal_configuration_data(struct pp_hwmgr *hwmgr,
- {
- PHM_FUNC_CHECK(hwmgr);
-
-- if (hwmgr->hwmgr_func->store_cc6_data == NULL)
-+ if (display_config == NULL)
- return -EINVAL;
-
- hwmgr->display_config = *display_config;
-+
-+ if (hwmgr->hwmgr_func->store_cc6_data == NULL)
-+ return -EINVAL;
-+
- /* to do pass other display configuration in furture */
-
- if (hwmgr->hwmgr_func->store_cc6_data)
-diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c
-index 7b2d500..7cce483 100644
---- a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c
-+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c
-@@ -21,6 +21,20 @@ bool acpi_atcs_functions_supported(void *device, uint32_t index)
- return result == 0 ? (output_buf.function_bits & (1 << (index - 1))) != 0 : false;
- }
-
-+bool acpi_atcs_notify_pcie_device_ready(void *device)
-+{
-+ int32_t temp_buffer = 1;
-+
-+ return cgs_call_acpi_method(device, CGS_ACPI_METHOD_ATCS,
-+ ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION,
-+ &temp_buffer,
-+ NULL,
-+ 0,
-+ sizeof(temp_buffer),
-+ 0);
-+}
-+
-+
- int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise)
- {
- struct atcs_pref_req_input atcs_input;
-@@ -29,7 +43,7 @@ int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise)
- int result;
- struct cgs_system_info info = {0};
-
-- if (!acpi_atcs_functions_supported(device, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST))
-+ if( 0 != acpi_atcs_notify_pcie_device_ready(device))
- return -EINVAL;
-
- info.size = sizeof(struct cgs_system_info);
-@@ -54,7 +68,7 @@ int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise)
- ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST,
- &atcs_input,
- &atcs_output,
-- 0,
-+ 1,
- sizeof(atcs_input),
- sizeof(atcs_output));
- if (result != 0)
-diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
-index 0d5d837..aae2e8e 100644
---- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
-+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
-@@ -1298,7 +1298,7 @@ static int tonga_populate_smc_mvdd_table(struct pp_hwmgr *hwmgr,
- table->Smio[count] |=
- data->mvdd_voltage_table.entries[count].smio_low;
- }
-- table->SmioMask2 = data->vddci_voltage_table.mask_low;
-+ table->SmioMask2 = data->mvdd_voltage_table.mask_low;
-
- CONVERT_FROM_HOST_TO_SMC_UL(table->MvddLevelCount);
- }
-diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
-index b156481..17766e8 100644
---- a/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
-+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
-@@ -299,7 +299,7 @@ static int init_dpm_2_parameters(
- (((unsigned long)powerplay_table) + le16_to_cpu(powerplay_table->usPPMTableOffset));
-
- if (0 != powerplay_table->usPPMTableOffset) {
-- if (1 == get_platform_power_management_table(hwmgr, atom_ppm_table)) {
-+ if (get_platform_power_management_table(hwmgr, atom_ppm_table) == 0) {
- phm_cap_set(hwmgr->platform_descriptor.platformCaps,
- PHM_PlatformCaps_EnablePlatformPowerManagement);
- }
-diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h b/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h
-index 3bd5e69..3df5de2 100644
---- a/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h
-+++ b/drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h
-@@ -26,3 +26,4 @@ extern bool acpi_atcs_functions_supported(void *device,
- extern int acpi_pcie_perf_request(void *device,
- uint8_t perf_req,
- bool advertise);
-+extern bool acpi_atcs_notify_pcie_device_ready(void *device);
-diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
-index d65dcae..6d9c0f5 100644
---- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
-+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
-@@ -335,6 +335,8 @@ atmel_hlcdc_plane_update_pos_and_size(struct atmel_hlcdc_plane *plane,
-
- atmel_hlcdc_layer_update_cfg(&plane->layer, 13, 0xffffffff,
- factor_reg);
-+ } else {
-+ atmel_hlcdc_layer_update_cfg(&plane->layer, 13, 0xffffffff, 0);
- }
- }
-
-diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
-index d307d96..080a090 100644
---- a/drivers/gpu/drm/drm_atomic.c
-+++ b/drivers/gpu/drm/drm_atomic.c
-@@ -354,6 +354,8 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
- drm_property_unreference_blob(state->mode_blob);
- state->mode_blob = NULL;
-
-+ memset(&state->mode, 0, sizeof(state->mode));
-+
- if (blob) {
- if (blob->length != sizeof(struct drm_mode_modeinfo) ||
- drm_mode_convert_umode(&state->mode,
-@@ -366,7 +368,6 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
- DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n",
- state->mode.name, state);
- } else {
-- memset(&state->mode, 0, sizeof(state->mode));
- state->enable = false;
- DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n",
- state);
-@@ -1287,14 +1288,39 @@ EXPORT_SYMBOL(drm_atomic_add_affected_planes);
- */
- void drm_atomic_legacy_backoff(struct drm_atomic_state *state)
- {
-+ struct drm_device *dev = state->dev;
-+ unsigned crtc_mask = 0;
-+ struct drm_crtc *crtc;
- int ret;
-+ bool global = false;
-+
-+ drm_for_each_crtc(crtc, dev) {
-+ if (crtc->acquire_ctx != state->acquire_ctx)
-+ continue;
-+
-+ crtc_mask |= drm_crtc_mask(crtc);
-+ crtc->acquire_ctx = NULL;
-+ }
-+
-+ if (WARN_ON(dev->mode_config.acquire_ctx == state->acquire_ctx)) {
-+ global = true;
-+
-+ dev->mode_config.acquire_ctx = NULL;
-+ }
-
- retry:
- drm_modeset_backoff(state->acquire_ctx);
-
-- ret = drm_modeset_lock_all_ctx(state->dev, state->acquire_ctx);
-+ ret = drm_modeset_lock_all_ctx(dev, state->acquire_ctx);
- if (ret)
- goto retry;
-+
-+ drm_for_each_crtc(crtc, dev)
-+ if (drm_crtc_mask(crtc) & crtc_mask)
-+ crtc->acquire_ctx = state->acquire_ctx;
-+
-+ if (global)
-+ dev->mode_config.acquire_ctx = state->acquire_ctx;
- }
- EXPORT_SYMBOL(drm_atomic_legacy_backoff);
-
-diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
-index f30de80..691a1b9 100644
---- a/drivers/gpu/drm/drm_crtc.c
-+++ b/drivers/gpu/drm/drm_crtc.c
-@@ -2800,8 +2800,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
- goto out;
- }
-
-- drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
--
- /*
- * Check whether the primary plane supports the fb pixel format.
- * Drivers not implementing the universal planes API use a
-diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
-index 71ea052..ccfe7e7 100644
---- a/drivers/gpu/drm/drm_dp_mst_topology.c
-+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
-@@ -2908,11 +2908,9 @@ static void drm_dp_destroy_connector_work(struct work_struct *work)
- drm_dp_port_teardown_pdt(port, port->pdt);
-
- if (!port->input && port->vcpi.vcpi > 0) {
-- if (mgr->mst_state) {
-- drm_dp_mst_reset_vcpi_slots(mgr, port);
-- drm_dp_update_payload_part1(mgr);
-- drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
-- }
-+ drm_dp_mst_reset_vcpi_slots(mgr, port);
-+ drm_dp_update_payload_part1(mgr);
-+ drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
- }
-
- kref_put(&port->kref, drm_dp_free_mst_port);
-diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
-index bb88e3d..e619b00 100644
---- a/drivers/gpu/drm/drm_fb_cma_helper.c
-+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
-@@ -301,7 +301,7 @@ static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
- err_fb_info_destroy:
- drm_fb_helper_release_fbi(helper);
- err_gem_free_object:
-- dev->driver->gem_free_object(&obj->base);
-+ drm_gem_object_unreference_unlocked(&obj->base);
- return ret;
- }
-
-diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
-index 1f500a1..d988ca0 100644
---- a/drivers/gpu/drm/drm_gem_cma_helper.c
-+++ b/drivers/gpu/drm/drm_gem_cma_helper.c
-@@ -121,7 +121,7 @@ struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,
- return cma_obj;
-
- error:
-- drm->driver->gem_free_object(&cma_obj->base);
-+ drm_gem_object_unreference_unlocked(&cma_obj->base);
- return ERR_PTR(ret);
- }
- EXPORT_SYMBOL_GPL(drm_gem_cma_create);
-@@ -162,18 +162,12 @@ drm_gem_cma_create_with_handle(struct drm_file *file_priv,
- * and handle has the id what user can see.
- */
- ret = drm_gem_handle_create(file_priv, gem_obj, handle);
-- if (ret)
-- goto err_handle_create;
--
- /* drop reference from allocate - handle holds it now. */
- drm_gem_object_unreference_unlocked(gem_obj);
-+ if (ret)
-+ return ERR_PTR(ret);
-
- return cma_obj;
--
--err_handle_create:
-- drm->driver->gem_free_object(gem_obj);
--
-- return ERR_PTR(ret);
- }
-
- /**
-diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
-index f7448a5..5d0fc26 100644
---- a/drivers/gpu/drm/drm_modes.c
-+++ b/drivers/gpu/drm/drm_modes.c
-@@ -1518,6 +1518,8 @@ int drm_mode_convert_umode(struct drm_display_mode *out,
- if (out->status != MODE_OK)
- goto out;
-
-+ drm_mode_set_crtcinfo(out, CRTC_INTERLACE_HALVE_V);
-+
- ret = 0;
-
- out:
-diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-index e8d9337..77886f1 100644
---- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-@@ -40,9 +40,10 @@ static const struct regmap_config fsl_dcu_regmap_config = {
- .reg_bits = 32,
- .reg_stride = 4,
- .val_bits = 32,
-- .cache_type = REGCACHE_RBTREE,
-+ .cache_type = REGCACHE_FLAT,
-
- .volatile_reg = fsl_dcu_drm_is_volatile_reg,
-+ .max_register = 0x11fc,
- };
-
- static int fsl_dcu_drm_irq_init(struct drm_device *dev)
-diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
-index d3c473f..3af4061 100644
---- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
-+++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
-@@ -39,7 +39,7 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)
- if (!mutex_is_locked(mutex))
- return false;
-
--#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_MUTEXES)
-+#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)
- return mutex->owner == task;
- #else
- /* Since UP may be pre-empted, we cannot assume that we own the lock */
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 7741efb..e5db9e1 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -8229,12 +8229,14 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
- struct intel_encoder *encoder;
-+ int i;
- u32 val, final;
- bool has_lvds = false;
- bool has_cpu_edp = false;
- bool has_panel = false;
- bool has_ck505 = false;
- bool can_ssc = false;
-+ bool using_ssc_source = false;
-
- /* We need to take the global config into account */
- for_each_intel_encoder(dev, encoder) {
-@@ -8261,8 +8263,22 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
- can_ssc = true;
- }
-
-- DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d\n",
-- has_panel, has_lvds, has_ck505);
-+ /* Check if any DPLLs are using the SSC source */
-+ for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-+ u32 temp = I915_READ(PCH_DPLL(i));
-+
-+ if (!(temp & DPLL_VCO_ENABLE))
-+ continue;
-+
-+ if ((temp & PLL_REF_INPUT_MASK) ==
-+ PLLB_REF_INPUT_SPREADSPECTRUMIN) {
-+ using_ssc_source = true;
-+ break;
-+ }
-+ }
-+
-+ DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source %d\n",
-+ has_panel, has_lvds, has_ck505, using_ssc_source);
-
- /* Ironlake: try to setup display ref clock before DPLL
- * enabling. This is only under driver's control after
-@@ -8299,9 +8315,9 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
- final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
- } else
- final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
-- } else {
-- final |= DREF_SSC_SOURCE_DISABLE;
-- final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
-+ } else if (using_ssc_source) {
-+ final |= DREF_SSC_SOURCE_ENABLE;
-+ final |= DREF_SSC1_ENABLE;
- }
-
- if (final == val)
-@@ -8347,7 +8363,7 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
- POSTING_READ(PCH_DREF_CONTROL);
- udelay(200);
- } else {
-- DRM_DEBUG_KMS("Disabling SSC entirely\n");
-+ DRM_DEBUG_KMS("Disabling CPU source output\n");
-
- val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
-
-@@ -8358,16 +8374,20 @@ static void ironlake_init_pch_refclk(struct drm_device *dev)
- POSTING_READ(PCH_DREF_CONTROL);
- udelay(200);
-
-- /* Turn off the SSC source */
-- val &= ~DREF_SSC_SOURCE_MASK;
-- val |= DREF_SSC_SOURCE_DISABLE;
-+ if (!using_ssc_source) {
-+ DRM_DEBUG_KMS("Disabling SSC source\n");
-
-- /* Turn off SSC1 */
-- val &= ~DREF_SSC1_ENABLE;
-+ /* Turn off the SSC source */
-+ val &= ~DREF_SSC_SOURCE_MASK;
-+ val |= DREF_SSC_SOURCE_DISABLE;
-
-- I915_WRITE(PCH_DREF_CONTROL, val);
-- POSTING_READ(PCH_DREF_CONTROL);
-- udelay(200);
-+ /* Turn off SSC1 */
-+ val &= ~DREF_SSC1_ENABLE;
-+
-+ I915_WRITE(PCH_DREF_CONTROL, val);
-+ POSTING_READ(PCH_DREF_CONTROL);
-+ udelay(200);
-+ }
- }
-
- BUG_ON(val != final);
-diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index 412a34c..69054ef 100644
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -4942,13 +4942,15 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
-
- void intel_dp_encoder_reset(struct drm_encoder *encoder)
- {
-- struct intel_dp *intel_dp;
-+ struct drm_i915_private *dev_priv = to_i915(encoder->dev);
-+ struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-+
-+ if (!HAS_DDI(dev_priv))
-+ intel_dp->DP = I915_READ(intel_dp->output_reg);
-
- if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP)
- return;
-
-- intel_dp = enc_to_intel_dp(encoder);
--
- pps_lock(intel_dp);
-
- /*
-@@ -5020,9 +5022,6 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
- intel_display_power_get(dev_priv, power_domain);
-
- if (long_hpd) {
-- /* indicate that we need to restart link training */
-- intel_dp->train_set_valid = false;
--
- if (!intel_digital_port_connected(dev_priv, intel_dig_port))
- goto mst_fail;
-
-diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c
-index 0b8eefc..926a1e6 100644
---- a/drivers/gpu/drm/i915/intel_dp_link_training.c
-+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
-@@ -85,8 +85,7 @@ static bool
- intel_dp_reset_link_train(struct intel_dp *intel_dp,
- uint8_t dp_train_pat)
- {
-- if (!intel_dp->train_set_valid)
-- memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
-+ memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
- intel_dp_set_signal_levels(intel_dp);
- return intel_dp_set_link_train(intel_dp, dp_train_pat);
- }
-@@ -161,22 +160,6 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
- break;
- }
-
-- /*
-- * if we used previously trained voltage and pre-emphasis values
-- * and we don't get clock recovery, reset link training values
-- */
-- if (intel_dp->train_set_valid) {
-- DRM_DEBUG_KMS("clock recovery not ok, reset");
-- /* clear the flag as we are not reusing train set */
-- intel_dp->train_set_valid = false;
-- if (!intel_dp_reset_link_train(intel_dp,
-- DP_TRAINING_PATTERN_1 |
-- DP_LINK_SCRAMBLING_DISABLE)) {
-- DRM_ERROR("failed to enable link training\n");
-- return;
-- }
-- continue;
-- }
-
- /* Check to see if we've tried the max voltage */
- for (i = 0; i < intel_dp->lane_count; i++)
-@@ -284,7 +267,6 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
- /* Make sure clock is still ok */
- if (!drm_dp_clock_recovery_ok(link_status,
- intel_dp->lane_count)) {
-- intel_dp->train_set_valid = false;
- intel_dp_link_training_clock_recovery(intel_dp);
- intel_dp_set_link_train(intel_dp,
- training_pattern |
-@@ -301,7 +283,6 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
-
- /* Try 5 times, then try clock recovery if that fails */
- if (tries > 5) {
-- intel_dp->train_set_valid = false;
- intel_dp_link_training_clock_recovery(intel_dp);
- intel_dp_set_link_train(intel_dp,
- training_pattern |
-@@ -322,10 +303,8 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
-
- intel_dp_set_idle_link_train(intel_dp);
-
-- if (channel_eq) {
-- intel_dp->train_set_valid = true;
-+ if (channel_eq)
- DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
-- }
- }
-
- void intel_dp_stop_link_train(struct intel_dp *intel_dp)
-diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
-index 3a30b37..8dd2cc5 100644
---- a/drivers/gpu/drm/i915/intel_drv.h
-+++ b/drivers/gpu/drm/i915/intel_drv.h
-@@ -811,8 +811,6 @@ struct intel_dp {
- /* This is called before a link training is starterd */
- void (*prepare_link_retrain)(struct intel_dp *intel_dp);
-
-- bool train_set_valid;
--
- /* Displayport compliance testing */
- unsigned long compliance_test_type;
- unsigned long compliance_test_data;
-diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
-index 0f0492f..28f4407 100644
---- a/drivers/gpu/drm/i915/intel_fbc.c
-+++ b/drivers/gpu/drm/i915/intel_fbc.c
-@@ -823,8 +823,7 @@ static bool intel_fbc_can_choose(struct intel_crtc *crtc)
- {
- struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
- struct intel_fbc *fbc = &dev_priv->fbc;
-- bool enable_by_default = IS_HASWELL(dev_priv) ||
-- IS_BROADWELL(dev_priv);
-+ bool enable_by_default = IS_BROADWELL(dev_priv);
-
- if (intel_vgpu_active(dev_priv->dev)) {
- fbc->no_fbc_reason = "VGPU is active";
-diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
-index 14e64e0..d347dca 100644
---- a/drivers/gpu/drm/mgag200/mgag200_mode.c
-+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
-@@ -182,7 +182,7 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
- }
- }
-
-- fvv = pllreffreq * testn / testm;
-+ fvv = pllreffreq * (n + 1) / (m + 1);
- fvv = (fvv - 800000) / 50000;
-
- if (fvv > 15)
-@@ -202,6 +202,14 @@ static int mga_g200se_set_plls(struct mga_device *mdev, long clock)
- WREG_DAC(MGA1064_PIX_PLLC_M, m);
- WREG_DAC(MGA1064_PIX_PLLC_N, n);
- WREG_DAC(MGA1064_PIX_PLLC_P, p);
-+
-+ if (mdev->unique_rev_id >= 0x04) {
-+ WREG_DAC(0x1a, 0x09);
-+ msleep(20);
-+ WREG_DAC(0x1a, 0x01);
-+
-+ }
-+
- return 0;
- }
-
-diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h
-index db10c11..c5a6ebd 100644
---- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h
-+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/disp.h
-@@ -25,7 +25,8 @@ u16 nvbios_outp_match(struct nvkm_bios *, u16 type, u16 mask,
- u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_outp *);
-
- struct nvbios_ocfg {
-- u16 match;
-+ u8 proto;
-+ u8 flags;
- u16 clkcmp[2];
- };
-
-@@ -33,7 +34,7 @@ u16 nvbios_ocfg_entry(struct nvkm_bios *, u16 outp, u8 idx,
- u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
- u16 nvbios_ocfg_parse(struct nvkm_bios *, u16 outp, u8 idx,
- u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
--u16 nvbios_ocfg_match(struct nvkm_bios *, u16 outp, u16 type,
-+u16 nvbios_ocfg_match(struct nvkm_bios *, u16 outp, u8 proto, u8 flags,
- u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
- u16 nvbios_oclk_match(struct nvkm_bios *, u16 cmp, u32 khz);
- #endif
-diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-index 59f27e7..e40a1b0 100644
---- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-@@ -557,6 +557,8 @@ nouveau_fbcon_init(struct drm_device *dev)
- if (ret)
- goto fini;
-
-+ if (fbcon->helper.fbdev)
-+ fbcon->helper.fbdev->pixmap.buf_align = 4;
- return 0;
-
- fini:
-diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c
-index 789dc29..8f715fe 100644
---- a/drivers/gpu/drm/nouveau/nv04_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c
-@@ -82,7 +82,6 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- uint32_t fg;
- uint32_t bg;
- uint32_t dsize;
-- uint32_t width;
- uint32_t *data = (uint32_t *)image->data;
- int ret;
-
-@@ -93,9 +92,6 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- if (ret)
- return ret;
-
-- width = ALIGN(image->width, 8);
-- dsize = ALIGN(width * image->height, 32) >> 5;
--
- if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
- info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
- fg = ((uint32_t *) info->pseudo_palette)[image->fg_color];
-@@ -111,10 +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) | width);
-+ OUT_RING(chan, (image->height << 16) | image->width);
- 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;
- 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 e05499d..a4e259a 100644
---- a/drivers/gpu/drm/nouveau/nv50_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c
-@@ -95,7 +95,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- struct nouveau_fbdev *nfbdev = info->par;
- struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
- struct nouveau_channel *chan = drm->channel;
-- uint32_t width, dwords, *data = (uint32_t *)image->data;
-+ uint32_t dwords, *data = (uint32_t *)image->data;
- uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
- uint32_t *palette = info->pseudo_palette;
- int ret;
-@@ -107,9 +107,6 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- if (ret)
- return ret;
-
-- width = ALIGN(image->width, 32);
-- dwords = (width * image->height) >> 5;
--
- BEGIN_NV04(chan, NvSub2D, 0x0814, 2);
- if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
- info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
-@@ -128,6 +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;
- 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 c97395b..f28315e 100644
---- a/drivers/gpu/drm/nouveau/nvc0_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
-@@ -95,7 +95,7 @@ nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- struct nouveau_fbdev *nfbdev = info->par;
- struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
- struct nouveau_channel *chan = drm->channel;
-- uint32_t width, dwords, *data = (uint32_t *)image->data;
-+ uint32_t dwords, *data = (uint32_t *)image->data;
- uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
- uint32_t *palette = info->pseudo_palette;
- int ret;
-@@ -107,9 +107,6 @@ nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
- if (ret)
- return ret;
-
-- width = ALIGN(image->width, 32);
-- dwords = (width * image->height) >> 5;
--
- BEGIN_NVC0(chan, NvSub2D, 0x0814, 2);
- if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
- info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
-@@ -128,6 +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;
- while (dwords) {
- int push = dwords > 2047 ? 2047 : dwords;
-
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
-index 18fab397..62ad030 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
-@@ -1614,7 +1614,7 @@ nvkm_device_pci_func = {
- .fini = nvkm_device_pci_fini,
- .resource_addr = nvkm_device_pci_resource_addr,
- .resource_size = nvkm_device_pci_resource_size,
-- .cpu_coherent = !IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_ARM64),
-+ .cpu_coherent = !IS_ENABLED(CONFIG_ARM),
- };
-
- int
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
-index a74c5dd..e2a64ed 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/Kbuild
-@@ -18,6 +18,7 @@ nvkm-y += nvkm/engine/disp/piornv50.o
- nvkm-y += nvkm/engine/disp/sornv50.o
- nvkm-y += nvkm/engine/disp/sorg94.o
- nvkm-y += nvkm/engine/disp/sorgf119.o
-+nvkm-y += nvkm/engine/disp/sorgm107.o
- nvkm-y += nvkm/engine/disp/sorgm200.o
- nvkm-y += nvkm/engine/disp/dport.o
-
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
-index f031466..5dd3438 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
-@@ -76,6 +76,7 @@ exec_lookup(struct nv50_disp *disp, int head, int or, u32 ctrl,
- mask |= 0x0001 << or;
- mask |= 0x0100 << head;
-
-+
- list_for_each_entry(outp, &disp->base.outp, head) {
- if ((outp->info.hasht & 0xff) == type &&
- (outp->info.hashm & mask) == mask) {
-@@ -155,25 +156,21 @@ exec_clkcmp(struct nv50_disp *disp, int head, int id, u32 pclk, u32 *conf)
- if (!outp)
- return NULL;
-
-+ *conf = (ctrl & 0x00000f00) >> 8;
- switch (outp->info.type) {
- case DCB_OUTPUT_TMDS:
-- *conf = (ctrl & 0x00000f00) >> 8;
- if (*conf == 5)
- *conf |= 0x0100;
- break;
- case DCB_OUTPUT_LVDS:
-- *conf = disp->sor.lvdsconf;
-- break;
-- case DCB_OUTPUT_DP:
-- *conf = (ctrl & 0x00000f00) >> 8;
-+ *conf |= disp->sor.lvdsconf;
- break;
-- case DCB_OUTPUT_ANALOG:
- default:
-- *conf = 0x00ff;
- break;
- }
-
-- data = nvbios_ocfg_match(bios, data, *conf, &ver, &hdr, &cnt, &len, &info2);
-+ data = nvbios_ocfg_match(bios, data, *conf & 0xff, *conf >> 8,
-+ &ver, &hdr, &cnt, &len, &info2);
- if (data && id < 0xff) {
- data = nvbios_oclk_match(bios, info2.clkcmp[id], pclk);
- if (data) {
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
-index b694414..f4b9cf8 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.c
-@@ -36,7 +36,7 @@ gm107_disp = {
- .outp.internal.crt = nv50_dac_output_new,
- .outp.internal.tmds = nv50_sor_output_new,
- .outp.internal.lvds = nv50_sor_output_new,
-- .outp.internal.dp = gf119_sor_dp_new,
-+ .outp.internal.dp = gm107_sor_dp_new,
- .dac.nr = 3,
- .dac.power = nv50_dac_power,
- .dac.sense = nv50_dac_sense,
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
-index 4226d21..fcb1b0c 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
-@@ -387,22 +387,17 @@ exec_clkcmp(struct nv50_disp *disp, int head, int id, u32 pclk, u32 *conf)
- if (!outp)
- return NULL;
-
-+ *conf = (ctrl & 0x00000f00) >> 8;
- if (outp->info.location == 0) {
- switch (outp->info.type) {
- case DCB_OUTPUT_TMDS:
-- *conf = (ctrl & 0x00000f00) >> 8;
- if (*conf == 5)
- *conf |= 0x0100;
- break;
- case DCB_OUTPUT_LVDS:
-- *conf = disp->sor.lvdsconf;
-+ *conf |= disp->sor.lvdsconf;
- break;
-- case DCB_OUTPUT_DP:
-- *conf = (ctrl & 0x00000f00) >> 8;
-- break;
-- case DCB_OUTPUT_ANALOG:
- default:
-- *conf = 0x00ff;
- break;
- }
- } else {
-@@ -410,7 +405,8 @@ exec_clkcmp(struct nv50_disp *disp, int head, int id, u32 pclk, u32 *conf)
- pclk = pclk / 2;
- }
-
-- data = nvbios_ocfg_match(bios, data, *conf, &ver, &hdr, &cnt, &len, &info2);
-+ data = nvbios_ocfg_match(bios, data, *conf & 0xff, *conf >> 8,
-+ &ver, &hdr, &cnt, &len, &info2);
- if (data && id < 0xff) {
- data = nvbios_oclk_match(bios, info2.clkcmp[id], pclk);
- if (data) {
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
-index e9067ba..4e983f6 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/outpdp.h
-@@ -62,7 +62,12 @@ int g94_sor_dp_lnk_pwr(struct nvkm_output_dp *, int);
- int gf119_sor_dp_new(struct nvkm_disp *, int, struct dcb_output *,
- struct nvkm_output **);
- int gf119_sor_dp_lnk_ctl(struct nvkm_output_dp *, int, int, bool);
-+int gf119_sor_dp_drv_ctl(struct nvkm_output_dp *, int, int, int, int);
-
--int gm200_sor_dp_new(struct nvkm_disp *, int, struct dcb_output *,
-- struct nvkm_output **);
-+int gm107_sor_dp_new(struct nvkm_disp *, int, struct dcb_output *,
-+ struct nvkm_output **);
-+int gm107_sor_dp_pattern(struct nvkm_output_dp *, int);
-+
-+int gm200_sor_dp_new(struct nvkm_disp *, int, struct dcb_output *,
-+ struct nvkm_output **);
- #endif
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
-index b4b41b1..49bd5da 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgf119.c
-@@ -40,8 +40,8 @@ static int
- gf119_sor_dp_pattern(struct nvkm_output_dp *outp, int pattern)
- {
- struct nvkm_device *device = outp->base.disp->engine.subdev.device;
-- const u32 loff = gf119_sor_loff(outp);
-- nvkm_mask(device, 0x61c110 + loff, 0x0f0f0f0f, 0x01010101 * pattern);
-+ const u32 soff = gf119_sor_soff(outp);
-+ nvkm_mask(device, 0x61c110 + soff, 0x0f0f0f0f, 0x01010101 * pattern);
- return 0;
- }
-
-@@ -64,7 +64,7 @@ gf119_sor_dp_lnk_ctl(struct nvkm_output_dp *outp, int nr, int bw, bool ef)
- return 0;
- }
-
--static int
-+int
- gf119_sor_dp_drv_ctl(struct nvkm_output_dp *outp,
- int ln, int vs, int pe, int pc)
- {
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c
-new file mode 100644
-index 0000000..37790b2
---- /dev/null
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm107.c
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright 2016 Red Hat Inc.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ * Authors: Ben Skeggs <bskeggs@redhat.com>
-+ */
-+#include "nv50.h"
-+#include "outpdp.h"
-+
-+int
-+gm107_sor_dp_pattern(struct nvkm_output_dp *outp, int pattern)
-+{
-+ struct nvkm_device *device = outp->base.disp->engine.subdev.device;
-+ const u32 soff = outp->base.or * 0x800;
-+ const u32 data = 0x01010101 * pattern;
-+ if (outp->base.info.sorconf.link & 1)
-+ nvkm_mask(device, 0x61c110 + soff, 0x0f0f0f0f, data);
-+ else
-+ nvkm_mask(device, 0x61c12c + soff, 0x0f0f0f0f, data);
-+ return 0;
-+}
-+
-+static const struct nvkm_output_dp_func
-+gm107_sor_dp_func = {
-+ .pattern = gm107_sor_dp_pattern,
-+ .lnk_pwr = g94_sor_dp_lnk_pwr,
-+ .lnk_ctl = gf119_sor_dp_lnk_ctl,
-+ .drv_ctl = gf119_sor_dp_drv_ctl,
-+};
-+
-+int
-+gm107_sor_dp_new(struct nvkm_disp *disp, int index,
-+ struct dcb_output *dcbE, struct nvkm_output **poutp)
-+{
-+ return nvkm_output_dp_new_(&gm107_sor_dp_func, disp, index, dcbE, poutp);
-+}
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
-index 2cfbef9..c44fa7e 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/sorgm200.c
-@@ -57,19 +57,6 @@ gm200_sor_dp_lane_map(struct nvkm_device *device, u8 lane)
- }
-
- static int
--gm200_sor_dp_pattern(struct nvkm_output_dp *outp, int pattern)
--{
-- struct nvkm_device *device = outp->base.disp->engine.subdev.device;
-- const u32 soff = gm200_sor_soff(outp);
-- const u32 data = 0x01010101 * pattern;
-- if (outp->base.info.sorconf.link & 1)
-- nvkm_mask(device, 0x61c110 + soff, 0x0f0f0f0f, data);
-- else
-- nvkm_mask(device, 0x61c12c + soff, 0x0f0f0f0f, data);
-- return 0;
--}
--
--static int
- gm200_sor_dp_lnk_pwr(struct nvkm_output_dp *outp, int nr)
- {
- struct nvkm_device *device = outp->base.disp->engine.subdev.device;
-@@ -129,7 +116,7 @@ gm200_sor_dp_drv_ctl(struct nvkm_output_dp *outp,
-
- static const struct nvkm_output_dp_func
- gm200_sor_dp_func = {
-- .pattern = gm200_sor_dp_pattern,
-+ .pattern = gm107_sor_dp_pattern,
- .lnk_pwr = gm200_sor_dp_lnk_pwr,
- .lnk_ctl = gf119_sor_dp_lnk_ctl,
- .drv_ctl = gm200_sor_dp_drv_ctl,
-diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
-index b2de290..b0c7216 100644
---- a/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
-@@ -942,22 +942,41 @@ gf100_gr_trap_gpc_rop(struct gf100_gr *gr, int gpc)
- }
-
- static const struct nvkm_enum gf100_mp_warp_error[] = {
-- { 0x00, "NO_ERROR" },
-- { 0x01, "STACK_MISMATCH" },
-+ { 0x01, "STACK_ERROR" },
-+ { 0x02, "API_STACK_ERROR" },
-+ { 0x03, "RET_EMPTY_STACK_ERROR" },
-+ { 0x04, "PC_WRAP" },
- { 0x05, "MISALIGNED_PC" },
-- { 0x08, "MISALIGNED_GPR" },
-- { 0x09, "INVALID_OPCODE" },
-- { 0x0d, "GPR_OUT_OF_BOUNDS" },
-- { 0x0e, "MEM_OUT_OF_BOUNDS" },
-- { 0x0f, "UNALIGNED_MEM_ACCESS" },
-+ { 0x06, "PC_OVERFLOW" },
-+ { 0x07, "MISALIGNED_IMMC_ADDR" },
-+ { 0x08, "MISALIGNED_REG" },
-+ { 0x09, "ILLEGAL_INSTR_ENCODING" },
-+ { 0x0a, "ILLEGAL_SPH_INSTR_COMBO" },
-+ { 0x0b, "ILLEGAL_INSTR_PARAM" },
-+ { 0x0c, "INVALID_CONST_ADDR" },
-+ { 0x0d, "OOR_REG" },
-+ { 0x0e, "OOR_ADDR" },
-+ { 0x0f, "MISALIGNED_ADDR" },
- { 0x10, "INVALID_ADDR_SPACE" },
-- { 0x11, "INVALID_PARAM" },
-+ { 0x11, "ILLEGAL_INSTR_PARAM2" },
-+ { 0x12, "INVALID_CONST_ADDR_LDC" },
-+ { 0x13, "GEOMETRY_SM_ERROR" },
-+ { 0x14, "DIVERGENT" },
-+ { 0x15, "WARP_EXIT" },
- {}
- };
-
- static const struct nvkm_bitfield gf100_mp_global_error[] = {
-+ { 0x00000001, "SM_TO_SM_FAULT" },
-+ { 0x00000002, "L1_ERROR" },
- { 0x00000004, "MULTIPLE_WARP_ERRORS" },
-- { 0x00000008, "OUT_OF_STACK_SPACE" },
-+ { 0x00000008, "PHYSICAL_STACK_OVERFLOW" },
-+ { 0x00000010, "BPT_INT" },
-+ { 0x00000020, "BPT_PAUSE" },
-+ { 0x00000040, "SINGLE_STEP_COMPLETE" },
-+ { 0x20000000, "ECC_SEC_ERROR" },
-+ { 0x40000000, "ECC_DED_ERROR" },
-+ { 0x80000000, "TIMEOUT" },
- {}
- };
-
-diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c
-index a5e9213..9efb1b4 100644
---- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.c
-@@ -141,7 +141,8 @@ nvbios_ocfg_parse(struct nvkm_bios *bios, u16 outp, u8 idx,
- {
- u16 data = nvbios_ocfg_entry(bios, outp, idx, ver, hdr, cnt, len);
- if (data) {
-- info->match = nvbios_rd16(bios, data + 0x00);
-+ info->proto = nvbios_rd08(bios, data + 0x00);
-+ info->flags = nvbios_rd16(bios, data + 0x01);
- info->clkcmp[0] = nvbios_rd16(bios, data + 0x02);
- info->clkcmp[1] = nvbios_rd16(bios, data + 0x04);
- }
-@@ -149,12 +150,13 @@ nvbios_ocfg_parse(struct nvkm_bios *bios, u16 outp, u8 idx,
- }
-
- u16
--nvbios_ocfg_match(struct nvkm_bios *bios, u16 outp, u16 type,
-+nvbios_ocfg_match(struct nvkm_bios *bios, u16 outp, u8 proto, u8 flags,
- u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *info)
- {
- u16 data, idx = 0;
- while ((data = nvbios_ocfg_parse(bios, outp, idx++, ver, hdr, cnt, len, info))) {
-- if (info->match == type)
-+ if ((info->proto == proto || info->proto == 0xff) &&
-+ (info->flags == flags))
- break;
- }
- return data;
-diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c
-index e292f56..389fb13 100644
---- a/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.c
-@@ -69,11 +69,11 @@ gm107_ltc_zbc_clear_depth(struct nvkm_ltc *ltc, int i, const u32 depth)
- }
-
- static void
--gm107_ltc_lts_isr(struct nvkm_ltc *ltc, int c, int s)
-+gm107_ltc_intr_lts(struct nvkm_ltc *ltc, int c, int s)
- {
- struct nvkm_subdev *subdev = &ltc->subdev;
- struct nvkm_device *device = subdev->device;
-- u32 base = 0x140000 + (c * 0x2000) + (s * 0x200);
-+ u32 base = 0x140400 + (c * 0x2000) + (s * 0x200);
- u32 stat = nvkm_rd32(device, base + 0x00c);
-
- if (stat) {
-@@ -92,7 +92,7 @@ gm107_ltc_intr(struct nvkm_ltc *ltc)
- while (mask) {
- u32 s, c = __ffs(mask);
- for (s = 0; s < ltc->lts_nr; s++)
-- gm107_ltc_lts_isr(ltc, c, s);
-+ gm107_ltc_intr_lts(ltc, c, s);
- mask &= ~(1 << c);
- }
- }
-diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c b/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c
-index 2a29bfd..e18e0dc 100644
---- a/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.c
-@@ -46,7 +46,7 @@ static const struct nvkm_ltc_func
- gm200_ltc = {
- .oneinit = gm200_ltc_oneinit,
- .init = gm200_ltc_init,
-- .intr = gm107_ltc_intr, /*XXX: not validated */
-+ .intr = gm107_ltc_intr,
- .cbc_clear = gm107_ltc_cbc_clear,
- .cbc_wait = gm107_ltc_cbc_wait,
- .zbc = 16,
-diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
-index d0826fb..cb29868 100644
---- a/drivers/gpu/drm/radeon/radeon_device.c
-+++ b/drivers/gpu/drm/radeon/radeon_device.c
-@@ -630,6 +630,23 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
- /*
- * GPU helpers function.
- */
-+
-+/**
-+ * radeon_device_is_virtual - check if we are running is a virtual environment
-+ *
-+ * Check if the asic has been passed through to a VM (all asics).
-+ * Used at driver startup.
-+ * Returns true if virtual or false if not.
-+ */
-+static bool radeon_device_is_virtual(void)
-+{
-+#ifdef CONFIG_X86
-+ return boot_cpu_has(X86_FEATURE_HYPERVISOR);
-+#else
-+ return false;
-+#endif
-+}
-+
- /**
- * radeon_card_posted - check if the hw has already been initialized
- *
-@@ -643,6 +660,10 @@ bool radeon_card_posted(struct radeon_device *rdev)
- {
- uint32_t reg;
-
-+ /* for pass through, always force asic_init */
-+ if (radeon_device_is_virtual())
-+ return false;
-+
- /* required for EFI mode on macbook2,1 which uses an r5xx asic */
- if (efi_enabled(EFI_BOOT) &&
- (rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) &&
-diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
-index e3daafa..3e7c9ac 100644
---- a/drivers/gpu/drm/ttm/ttm_bo.c
-+++ b/drivers/gpu/drm/ttm/ttm_bo.c
-@@ -1016,9 +1016,9 @@ out_unlock:
- return ret;
- }
-
--static bool ttm_bo_mem_compat(struct ttm_placement *placement,
-- struct ttm_mem_reg *mem,
-- uint32_t *new_flags)
-+bool ttm_bo_mem_compat(struct ttm_placement *placement,
-+ struct ttm_mem_reg *mem,
-+ uint32_t *new_flags)
- {
- int i;
-
-@@ -1050,6 +1050,7 @@ static bool ttm_bo_mem_compat(struct ttm_placement *placement,
-
- return false;
- }
-+EXPORT_SYMBOL(ttm_bo_mem_compat);
-
- int ttm_bo_validate(struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
-index 299925a..eadc981 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
-@@ -49,6 +49,7 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
- {
- struct ttm_buffer_object *bo = &buf->base;
- int ret;
-+ uint32_t new_flags;
-
- ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
- if (unlikely(ret != 0))
-@@ -60,7 +61,12 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
- if (unlikely(ret != 0))
- goto err;
-
-- ret = ttm_bo_validate(bo, placement, interruptible, false);
-+ if (buf->pin_count > 0)
-+ ret = ttm_bo_mem_compat(placement, &bo->mem,
-+ &new_flags) == true ? 0 : -EINVAL;
-+ else
-+ ret = ttm_bo_validate(bo, placement, interruptible, false);
-+
- if (!ret)
- vmw_bo_pin_reserved(buf, true);
-
-@@ -91,6 +97,7 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
- {
- struct ttm_buffer_object *bo = &buf->base;
- int ret;
-+ uint32_t new_flags;
-
- ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
- if (unlikely(ret != 0))
-@@ -102,6 +109,12 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
- if (unlikely(ret != 0))
- goto err;
-
-+ if (buf->pin_count > 0) {
-+ ret = ttm_bo_mem_compat(&vmw_vram_gmr_placement, &bo->mem,
-+ &new_flags) == true ? 0 : -EINVAL;
-+ goto out_unreserve;
-+ }
-+
- ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, interruptible,
- false);
- if (likely(ret == 0) || ret == -ERESTARTSYS)
-@@ -161,6 +174,7 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
- struct ttm_placement placement;
- struct ttm_place place;
- int ret = 0;
-+ uint32_t new_flags;
-
- place = vmw_vram_placement.placement[0];
- place.lpfn = bo->num_pages;
-@@ -185,10 +199,15 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
- */
- if (bo->mem.mem_type == TTM_PL_VRAM &&
- bo->mem.start < bo->num_pages &&
-- bo->mem.start > 0)
-+ bo->mem.start > 0 &&
-+ buf->pin_count == 0)
- (void) ttm_bo_validate(bo, &vmw_sys_placement, false, false);
-
-- ret = ttm_bo_validate(bo, &placement, interruptible, false);
-+ if (buf->pin_count > 0)
-+ ret = ttm_bo_mem_compat(&placement, &bo->mem,
-+ &new_flags) == true ? 0 : -EINVAL;
-+ else
-+ ret = ttm_bo_validate(bo, &placement, interruptible, false);
-
- /* For some reason we didn't end up at the start of vram */
- WARN_ON(ret == 0 && bo->offset != 0);
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
-index f2cf923..2a50546 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
-@@ -227,6 +227,7 @@ static int vmw_force_iommu;
- static int vmw_restrict_iommu;
- static int vmw_force_coherent;
- static int vmw_restrict_dma_mask;
-+static int vmw_assume_16bpp;
-
- static int vmw_probe(struct pci_dev *, const struct pci_device_id *);
- static void vmw_master_init(struct vmw_master *);
-@@ -243,6 +244,8 @@ MODULE_PARM_DESC(force_coherent, "Force coherent TTM pages");
- module_param_named(force_coherent, vmw_force_coherent, int, 0600);
- MODULE_PARM_DESC(restrict_dma_mask, "Restrict DMA mask to 44 bits with IOMMU");
- module_param_named(restrict_dma_mask, vmw_restrict_dma_mask, int, 0600);
-+MODULE_PARM_DESC(assume_16bpp, "Assume 16-bpp when filtering modes");
-+module_param_named(assume_16bpp, vmw_assume_16bpp, int, 0600);
-
-
- static void vmw_print_capabilities(uint32_t capabilities)
-@@ -653,6 +656,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
- dev_priv->vram_start = pci_resource_start(dev->pdev, 1);
- dev_priv->mmio_start = pci_resource_start(dev->pdev, 2);
-
-+ dev_priv->assume_16bpp = !!vmw_assume_16bpp;
-+
- dev_priv->enable_fb = enable_fbdev;
-
- vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2);
-@@ -699,6 +704,13 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
- vmw_read(dev_priv,
- SVGA_REG_SUGGESTED_GBOBJECT_MEM_SIZE_KB);
-
-+ /*
-+ * Workaround for low memory 2D VMs to compensate for the
-+ * allocation taken by fbdev
-+ */
-+ if (!(dev_priv->capabilities & SVGA_CAP_3D))
-+ mem_size *= 2;
-+
- dev_priv->max_mob_pages = mem_size * 1024 / PAGE_SIZE;
- dev_priv->prim_bb_mem =
- vmw_read(dev_priv,
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
-index 6db358a..cab0c54 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
-@@ -386,6 +386,7 @@ struct vmw_private {
- spinlock_t hw_lock;
- spinlock_t cap_lock;
- bool has_dx;
-+ bool assume_16bpp;
-
- /*
- * VGA registers.
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
-index 679a4cb..d2d9395 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
-@@ -517,28 +517,6 @@ static int vmw_fb_kms_framebuffer(struct fb_info *info)
-
- par->set_fb = &vfb->base;
-
-- if (!par->bo_ptr) {
-- /*
-- * Pin before mapping. Since we don't know in what placement
-- * to pin, call into KMS to do it for us.
-- */
-- ret = vfb->pin(vfb);
-- if (ret) {
-- DRM_ERROR("Could not pin the fbdev framebuffer.\n");
-- return ret;
-- }
--
-- ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
-- par->vmw_bo->base.num_pages, &par->map);
-- if (ret) {
-- vfb->unpin(vfb);
-- DRM_ERROR("Could not map the fbdev framebuffer.\n");
-- return ret;
-- }
--
-- par->bo_ptr = ttm_kmap_obj_virtual(&par->map, &par->bo_iowrite);
-- }
--
- return 0;
- }
-
-@@ -601,6 +579,31 @@ static int vmw_fb_set_par(struct fb_info *info)
- if (ret)
- goto out_unlock;
-
-+ if (!par->bo_ptr) {
-+ struct vmw_framebuffer *vfb = vmw_framebuffer_to_vfb(set.fb);
-+
-+ /*
-+ * Pin before mapping. Since we don't know in what placement
-+ * to pin, call into KMS to do it for us.
-+ */
-+ ret = vfb->pin(vfb);
-+ if (ret) {
-+ DRM_ERROR("Could not pin the fbdev framebuffer.\n");
-+ goto out_unlock;
-+ }
-+
-+ ret = ttm_bo_kmap(&par->vmw_bo->base, 0,
-+ par->vmw_bo->base.num_pages, &par->map);
-+ if (ret) {
-+ vfb->unpin(vfb);
-+ DRM_ERROR("Could not map the fbdev framebuffer.\n");
-+ goto out_unlock;
-+ }
-+
-+ par->bo_ptr = ttm_kmap_obj_virtual(&par->map, &par->bo_iowrite);
-+ }
-+
-+
- vmw_fb_dirty_mark(par, par->fb_x, par->fb_y,
- par->set_fb->width, par->set_fb->height);
-
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
-index b07543b..6ccd61d 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
-@@ -1553,14 +1553,10 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC)
- };
- int i;
-- u32 assumed_bpp = 2;
-+ u32 assumed_bpp = 4;
-
-- /*
-- * If using screen objects, then assume 32-bpp because that's what the
-- * SVGA device is assuming
-- */
-- if (dev_priv->active_display_unit == vmw_du_screen_object)
-- assumed_bpp = 4;
-+ if (dev_priv->assume_16bpp)
-+ assumed_bpp = 2;
-
- if (dev_priv->active_display_unit == vmw_du_screen_target) {
- max_width = min(max_width, dev_priv->stdu_max_width);
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
-index 9ca818f..41932a7 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
-@@ -399,8 +399,10 @@ static int vmw_stdu_bind_fb(struct vmw_private *dev_priv,
-
- WARN_ON_ONCE(!stdu->defined);
-
-- if (!vfb->dmabuf && new_fb->width == mode->hdisplay &&
-- new_fb->height == mode->vdisplay)
-+ new_vfbs = (vfb->dmabuf) ? NULL : vmw_framebuffer_to_vfbs(new_fb);
-+
-+ if (new_vfbs && new_vfbs->surface->base_size.width == mode->hdisplay &&
-+ new_vfbs->surface->base_size.height == mode->vdisplay)
- new_content_type = SAME_AS_DISPLAY;
- else if (vfb->dmabuf)
- new_content_type = SEPARATE_DMA;
-@@ -444,7 +446,6 @@ static int vmw_stdu_bind_fb(struct vmw_private *dev_priv,
- content_srf.mip_levels[0] = 1;
- content_srf.multisample_count = 0;
- } else {
-- new_vfbs = vmw_framebuffer_to_vfbs(new_fb);
- content_srf = *new_vfbs->surface;
- }
-
-@@ -464,7 +465,6 @@ static int vmw_stdu_bind_fb(struct vmw_private *dev_priv,
- return ret;
- }
- } else if (new_content_type == SAME_AS_DISPLAY) {
-- new_vfbs = vmw_framebuffer_to_vfbs(new_fb);
- new_display_srf = vmw_surface_reference(new_vfbs->surface);
- }
-
-diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c
-index aad8c16..0cd4f72 100644
---- a/drivers/hid/hid-elo.c
-+++ b/drivers/hid/hid-elo.c
-@@ -261,7 +261,7 @@ static void elo_remove(struct hid_device *hdev)
- struct elo_priv *priv = hid_get_drvdata(hdev);
-
- hid_hw_stop(hdev);
-- flush_workqueue(wq);
-+ cancel_delayed_work_sync(&priv->work);
- kfree(priv);
- }
-
-diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
-index c741f5e..0088979 100644
---- a/drivers/hid/hid-multitouch.c
-+++ b/drivers/hid/hid-multitouch.c
-@@ -61,6 +61,7 @@ MODULE_LICENSE("GPL");
- #define MT_QUIRK_ALWAYS_VALID (1 << 4)
- #define MT_QUIRK_VALID_IS_INRANGE (1 << 5)
- #define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6)
-+#define MT_QUIRK_CONFIDENCE (1 << 7)
- #define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8)
- #define MT_QUIRK_NO_AREA (1 << 9)
- #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10)
-@@ -78,6 +79,7 @@ struct mt_slot {
- __s32 contactid; /* the device ContactID assigned to this slot */
- bool touch_state; /* is the touch valid? */
- bool inrange_state; /* is the finger in proximity of the sensor? */
-+ bool confidence_state; /* is the touch made by a finger? */
- };
-
- struct mt_class {
-@@ -503,10 +505,8 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
- return 1;
- case HID_DG_CONFIDENCE:
- if (cls->name == MT_CLS_WIN_8 &&
-- field->application == HID_DG_TOUCHPAD) {
-- cls->quirks &= ~MT_QUIRK_ALWAYS_VALID;
-- cls->quirks |= MT_QUIRK_VALID_IS_CONFIDENCE;
-- }
-+ field->application == HID_DG_TOUCHPAD)
-+ cls->quirks |= MT_QUIRK_CONFIDENCE;
- mt_store_field(usage, td, hi);
- return 1;
- case HID_DG_TIPSWITCH:
-@@ -619,6 +619,7 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
- return;
-
- if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) {
-+ int active;
- int slotnum = mt_compute_slot(td, input);
- struct mt_slot *s = &td->curdata;
- struct input_mt *mt = input->mt;
-@@ -633,10 +634,14 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
- return;
- }
-
-+ if (!(td->mtclass.quirks & MT_QUIRK_CONFIDENCE))
-+ s->confidence_state = 1;
-+ active = (s->touch_state || s->inrange_state) &&
-+ s->confidence_state;
-+
- input_mt_slot(input, slotnum);
-- input_mt_report_slot_state(input, MT_TOOL_FINGER,
-- s->touch_state || s->inrange_state);
-- if (s->touch_state || s->inrange_state) {
-+ input_mt_report_slot_state(input, MT_TOOL_FINGER, active);
-+ if (active) {
- /* this finger is in proximity of the sensor */
- int wide = (s->w > s->h);
- /* divided by two to match visual scale of touch */
-@@ -701,6 +706,8 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
- td->curdata.touch_state = value;
- break;
- case HID_DG_CONFIDENCE:
-+ if (quirks & MT_QUIRK_CONFIDENCE)
-+ td->curdata.confidence_state = value;
- if (quirks & MT_QUIRK_VALID_IS_CONFIDENCE)
- td->curvalid = value;
- break;
-diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
-index 2f1ddca..700145b 100644
---- a/drivers/hid/usbhid/hiddev.c
-+++ b/drivers/hid/usbhid/hiddev.c
-@@ -516,13 +516,13 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
- goto inval;
- } else if (uref->usage_index >= field->report_count)
- goto inval;
--
-- else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
-- (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
-- uref->usage_index + uref_multi->num_values > field->report_count))
-- goto inval;
- }
-
-+ if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
-+ (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
-+ uref->usage_index + uref_multi->num_values > field->report_count))
-+ goto inval;
-+
- switch (cmd) {
- case HIDIOCGUSAGE:
- uref->value = field->value[uref->usage_index];
-diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c
-index c43318d..a9356a3 100644
---- a/drivers/hwmon/dell-smm-hwmon.c
-+++ b/drivers/hwmon/dell-smm-hwmon.c
-@@ -66,11 +66,13 @@
-
- static DEFINE_MUTEX(i8k_mutex);
- static char bios_version[4];
-+static char bios_machineid[16];
- static struct device *i8k_hwmon_dev;
- static u32 i8k_hwmon_flags;
- static uint i8k_fan_mult = I8K_FAN_MULT;
- static uint i8k_pwm_mult;
- static uint i8k_fan_max = I8K_FAN_HIGH;
-+static bool disallow_fan_type_call;
-
- #define I8K_HWMON_HAVE_TEMP1 (1 << 0)
- #define I8K_HWMON_HAVE_TEMP2 (1 << 1)
-@@ -94,13 +96,13 @@ module_param(ignore_dmi, bool, 0);
- MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match");
-
- #if IS_ENABLED(CONFIG_I8K)
--static bool restricted;
-+static bool restricted = true;
- module_param(restricted, bool, 0);
--MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set");
-+MODULE_PARM_DESC(restricted, "Restrict fan control and serial number to CAP_SYS_ADMIN (default: 1)");
-
- static bool power_status;
- module_param(power_status, bool, 0600);
--MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k");
-+MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k (default: 0)");
- #endif
-
- static uint fan_mult;
-@@ -235,14 +237,28 @@ static int i8k_get_fan_speed(int fan)
- /*
- * Read the fan type.
- */
--static int i8k_get_fan_type(int fan)
-+static int _i8k_get_fan_type(int fan)
- {
- struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, };
-
-+ if (disallow_fan_type_call)
-+ return -EINVAL;
-+
- regs.ebx = fan & 0xff;
- return i8k_smm(&regs) ? : regs.eax & 0xff;
- }
-
-+static int i8k_get_fan_type(int fan)
-+{
-+ /* I8K_SMM_GET_FAN_TYPE SMM call is expensive, so cache values */
-+ static int types[2] = { INT_MIN, INT_MIN };
-+
-+ if (types[fan] == INT_MIN)
-+ types[fan] = _i8k_get_fan_type(fan);
-+
-+ return types[fan];
-+}
-+
- /*
- * Read the fan nominal rpm for specific fan speed.
- */
-@@ -392,9 +408,11 @@ i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
- break;
-
- case I8K_MACHINE_ID:
-- memset(buff, 0, 16);
-- strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
-- sizeof(buff));
-+ if (restricted && !capable(CAP_SYS_ADMIN))
-+ return -EPERM;
-+
-+ memset(buff, 0, sizeof(buff));
-+ strlcpy(buff, bios_machineid, sizeof(buff));
- break;
-
- case I8K_FN_STATUS:
-@@ -511,7 +529,7 @@ static int i8k_proc_show(struct seq_file *seq, void *offset)
- seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n",
- I8K_PROC_FMT,
- bios_version,
-- i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
-+ (restricted && !capable(CAP_SYS_ADMIN)) ? "-1" : bios_machineid,
- cpu_temp,
- left_fan, right_fan, left_speed, right_speed,
- ac_power, fn_key);
-@@ -718,6 +736,9 @@ static struct attribute *i8k_attrs[] = {
- static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr,
- int index)
- {
-+ if (disallow_fan_type_call &&
-+ (index == 9 || index == 12))
-+ return 0;
- if (index >= 0 && index <= 1 &&
- !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1))
- return 0;
-@@ -767,13 +788,17 @@ static int __init i8k_init_hwmon(void)
- if (err >= 0)
- i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4;
-
-- /* First fan attributes, if fan type is OK */
-- err = i8k_get_fan_type(0);
-+ /* First fan attributes, if fan status or type is OK */
-+ err = i8k_get_fan_status(0);
-+ if (err < 0)
-+ err = i8k_get_fan_type(0);
- if (err >= 0)
- i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1;
-
-- /* Second fan attributes, if fan type is OK */
-- err = i8k_get_fan_type(1);
-+ /* Second fan attributes, if fan status or type is OK */
-+ err = i8k_get_fan_status(1);
-+ if (err < 0)
-+ err = i8k_get_fan_type(1);
- if (err >= 0)
- i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2;
-
-@@ -929,12 +954,14 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = {
-
- MODULE_DEVICE_TABLE(dmi, i8k_dmi_table);
-
--static struct dmi_system_id i8k_blacklist_dmi_table[] __initdata = {
-+/*
-+ * On some machines once I8K_SMM_GET_FAN_TYPE is issued then CPU fan speed
-+ * randomly going up and down due to bug in Dell SMM or BIOS. Here is blacklist
-+ * of affected Dell machines for which we disallow I8K_SMM_GET_FAN_TYPE call.
-+ * See bug: https://bugzilla.kernel.org/show_bug.cgi?id=100121
-+ */
-+static struct dmi_system_id i8k_blacklist_fan_type_dmi_table[] __initdata = {
- {
-- /*
-- * CPU fan speed going up and down on Dell Studio XPS 8000
-- * for unknown reasons.
-- */
- .ident = "Dell Studio XPS 8000",
- .matches = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-@@ -942,16 +969,19 @@ static struct dmi_system_id i8k_blacklist_dmi_table[] __initdata = {
- },
- },
- {
-- /*
-- * CPU fan speed going up and down on Dell Studio XPS 8100
-- * for unknown reasons.
-- */
- .ident = "Dell Studio XPS 8100",
- .matches = {
- DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Studio XPS 8100"),
- },
- },
-+ {
-+ .ident = "Dell Inspiron 580",
-+ .matches = {
-+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Inspiron 580 "),
-+ },
-+ },
- { }
- };
-
-@@ -966,8 +996,7 @@ static int __init i8k_probe(void)
- /*
- * Get DMI information
- */
-- if (!dmi_check_system(i8k_dmi_table) ||
-- dmi_check_system(i8k_blacklist_dmi_table)) {
-+ if (!dmi_check_system(i8k_dmi_table)) {
- if (!ignore_dmi && !force)
- return -ENODEV;
-
-@@ -978,8 +1007,13 @@ static int __init i8k_probe(void)
- i8k_get_dmi_data(DMI_BIOS_VERSION));
- }
-
-+ if (dmi_check_system(i8k_blacklist_fan_type_dmi_table))
-+ disallow_fan_type_call = true;
-+
- strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION),
- sizeof(bios_version));
-+ strlcpy(bios_machineid, i8k_get_dmi_data(DMI_PRODUCT_SERIAL),
-+ sizeof(bios_machineid));
-
- /*
- * Get SMM Dell signature
-diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
-index 923f565..3a9f106 100644
---- a/drivers/iio/accel/kxsd9.c
-+++ b/drivers/iio/accel/kxsd9.c
-@@ -81,7 +81,7 @@ static int kxsd9_write_scale(struct iio_dev *indio_dev, int micro)
-
- mutex_lock(&st->buf_lock);
- ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
-- if (ret)
-+ if (ret < 0)
- goto error_ret;
- st->tx[0] = KXSD9_WRITE(KXSD9_REG_CTRL_C);
- st->tx[1] = (ret & ~KXSD9_FS_MASK) | i;
-@@ -163,7 +163,7 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev,
- break;
- case IIO_CHAN_INFO_SCALE:
- ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
-- if (ret)
-+ if (ret < 0)
- goto error_ret;
- *val2 = kxsd9_micro_scales[ret & KXSD9_FS_MASK];
- ret = IIO_VAL_INT_PLUS_MICRO;
-diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c
-index 21e19b6..2123f0a 100644
---- a/drivers/iio/adc/ad7266.c
-+++ b/drivers/iio/adc/ad7266.c
-@@ -396,8 +396,8 @@ static int ad7266_probe(struct spi_device *spi)
-
- st = iio_priv(indio_dev);
-
-- st->reg = devm_regulator_get(&spi->dev, "vref");
-- if (!IS_ERR_OR_NULL(st->reg)) {
-+ st->reg = devm_regulator_get_optional(&spi->dev, "vref");
-+ if (!IS_ERR(st->reg)) {
- ret = regulator_enable(st->reg);
- if (ret)
- return ret;
-@@ -408,6 +408,9 @@ static int ad7266_probe(struct spi_device *spi)
-
- st->vref_mv = ret / 1000;
- } else {
-+ /* Any other error indicates that the regulator does exist */
-+ if (PTR_ERR(st->reg) != -ENODEV)
-+ return PTR_ERR(st->reg);
- /* Use internal reference */
- st->vref_mv = 2500;
- }
-diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c
-index fa47676..a03832a 100644
---- a/drivers/iio/humidity/hdc100x.c
-+++ b/drivers/iio/humidity/hdc100x.c
-@@ -55,7 +55,7 @@ static const struct {
- },
- { /* IIO_HUMIDITYRELATIVE channel */
- .shift = 8,
-- .mask = 2,
-+ .mask = 3,
- },
- };
-
-@@ -164,14 +164,14 @@ static int hdc100x_get_measurement(struct hdc100x_data *data,
- dev_err(&client->dev, "cannot read high byte measurement");
- return ret;
- }
-- val = ret << 6;
-+ val = ret << 8;
-
- ret = i2c_smbus_read_byte(client);
- if (ret < 0) {
- dev_err(&client->dev, "cannot read low byte measurement");
- return ret;
- }
-- val |= ret >> 2;
-+ val |= ret;
-
- return val;
- }
-@@ -211,18 +211,18 @@ static int hdc100x_read_raw(struct iio_dev *indio_dev,
- return IIO_VAL_INT_PLUS_MICRO;
- case IIO_CHAN_INFO_SCALE:
- if (chan->type == IIO_TEMP) {
-- *val = 165;
-- *val2 = 65536 >> 2;
-+ *val = 165000;
-+ *val2 = 65536;
- return IIO_VAL_FRACTIONAL;
- } else {
-- *val = 0;
-- *val2 = 10000;
-- return IIO_VAL_INT_PLUS_MICRO;
-+ *val = 100;
-+ *val2 = 65536;
-+ return IIO_VAL_FRACTIONAL;
- }
- break;
- case IIO_CHAN_INFO_OFFSET:
-- *val = -3971;
-- *val2 = 879096;
-+ *val = -15887;
-+ *val2 = 515151;
- return IIO_VAL_INT_PLUS_MICRO;
- default:
- return -EINVAL;
-diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
-index ae2806a..0c52dfe 100644
---- a/drivers/iio/industrialio-trigger.c
-+++ b/drivers/iio/industrialio-trigger.c
-@@ -210,22 +210,35 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
-
- /* Prevent the module from being removed whilst attached to a trigger */
- __module_get(pf->indio_dev->info->driver_module);
-+
-+ /* Get irq number */
- pf->irq = iio_trigger_get_irq(trig);
-+ if (pf->irq < 0)
-+ goto out_put_module;
-+
-+ /* Request irq */
- ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
- pf->type, pf->name,
- pf);
-- if (ret < 0) {
-- module_put(pf->indio_dev->info->driver_module);
-- return ret;
-- }
-+ if (ret < 0)
-+ goto out_put_irq;
-
-+ /* Enable trigger in driver */
- if (trig->ops && trig->ops->set_trigger_state && notinuse) {
- ret = trig->ops->set_trigger_state(trig, true);
- if (ret < 0)
-- module_put(pf->indio_dev->info->driver_module);
-+ goto out_free_irq;
- }
-
- return ret;
-+
-+out_free_irq:
-+ free_irq(pf->irq, pf);
-+out_put_irq:
-+ iio_trigger_put_irq(trig, pf->irq);
-+out_put_module:
-+ module_put(pf->indio_dev->info->driver_module);
-+ return ret;
- }
-
- static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
-diff --git a/drivers/iio/light/apds9960.c b/drivers/iio/light/apds9960.c
-index a6af56a..6443aad 100644
---- a/drivers/iio/light/apds9960.c
-+++ b/drivers/iio/light/apds9960.c
-@@ -1006,6 +1006,7 @@ static int apds9960_probe(struct i2c_client *client,
-
- iio_device_attach_buffer(indio_dev, buffer);
-
-+ indio_dev->dev.parent = &client->dev;
- indio_dev->info = &apds9960_info;
- indio_dev->name = APDS9960_DRV_NAME;
- indio_dev->channels = apds9960_channels;
-diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
-index 172393a..d3ca320 100644
---- a/drivers/iio/pressure/st_pressure_core.c
-+++ b/drivers/iio/pressure/st_pressure_core.c
-@@ -28,15 +28,21 @@
- #include <linux/iio/common/st_sensors.h>
- #include "st_pressure.h"
-
-+#define MCELSIUS_PER_CELSIUS 1000
-+
-+/* Default pressure sensitivity */
- #define ST_PRESS_LSB_PER_MBAR 4096UL
- #define ST_PRESS_KPASCAL_NANO_SCALE (100000000UL / \
- ST_PRESS_LSB_PER_MBAR)
-+
-+/* Default temperature sensitivity */
- #define ST_PRESS_LSB_PER_CELSIUS 480UL
--#define ST_PRESS_CELSIUS_NANO_SCALE (1000000000UL / \
-- ST_PRESS_LSB_PER_CELSIUS)
-+#define ST_PRESS_MILLI_CELSIUS_OFFSET 42500UL
-+
- #define ST_PRESS_NUMBER_DATA_CHANNELS 1
-
- /* FULLSCALE */
-+#define ST_PRESS_FS_AVL_1100MB 1100
- #define ST_PRESS_FS_AVL_1260MB 1260
-
- #define ST_PRESS_1_OUT_XL_ADDR 0x28
-@@ -54,9 +60,6 @@
- #define ST_PRESS_LPS331AP_PW_MASK 0x80
- #define ST_PRESS_LPS331AP_FS_ADDR 0x23
- #define ST_PRESS_LPS331AP_FS_MASK 0x30
--#define ST_PRESS_LPS331AP_FS_AVL_1260_VAL 0x00
--#define ST_PRESS_LPS331AP_FS_AVL_1260_GAIN ST_PRESS_KPASCAL_NANO_SCALE
--#define ST_PRESS_LPS331AP_FS_AVL_TEMP_GAIN ST_PRESS_CELSIUS_NANO_SCALE
- #define ST_PRESS_LPS331AP_BDU_ADDR 0x20
- #define ST_PRESS_LPS331AP_BDU_MASK 0x04
- #define ST_PRESS_LPS331AP_DRDY_IRQ_ADDR 0x22
-@@ -65,9 +68,14 @@
- #define ST_PRESS_LPS331AP_IHL_IRQ_ADDR 0x22
- #define ST_PRESS_LPS331AP_IHL_IRQ_MASK 0x80
- #define ST_PRESS_LPS331AP_MULTIREAD_BIT true
--#define ST_PRESS_LPS331AP_TEMP_OFFSET 42500
-
- /* CUSTOM VALUES FOR LPS001WP SENSOR */
-+
-+/* LPS001WP pressure resolution */
-+#define ST_PRESS_LPS001WP_LSB_PER_MBAR 16UL
-+/* LPS001WP temperature resolution */
-+#define ST_PRESS_LPS001WP_LSB_PER_CELSIUS 64UL
-+
- #define ST_PRESS_LPS001WP_WAI_EXP 0xba
- #define ST_PRESS_LPS001WP_ODR_ADDR 0x20
- #define ST_PRESS_LPS001WP_ODR_MASK 0x30
-@@ -76,6 +84,8 @@
- #define ST_PRESS_LPS001WP_ODR_AVL_13HZ_VAL 0x03
- #define ST_PRESS_LPS001WP_PW_ADDR 0x20
- #define ST_PRESS_LPS001WP_PW_MASK 0x40
-+#define ST_PRESS_LPS001WP_FS_AVL_PRESS_GAIN \
-+ (100000000UL / ST_PRESS_LPS001WP_LSB_PER_MBAR)
- #define ST_PRESS_LPS001WP_BDU_ADDR 0x20
- #define ST_PRESS_LPS001WP_BDU_MASK 0x04
- #define ST_PRESS_LPS001WP_MULTIREAD_BIT true
-@@ -92,11 +102,6 @@
- #define ST_PRESS_LPS25H_ODR_AVL_25HZ_VAL 0x04
- #define ST_PRESS_LPS25H_PW_ADDR 0x20
- #define ST_PRESS_LPS25H_PW_MASK 0x80
--#define ST_PRESS_LPS25H_FS_ADDR 0x00
--#define ST_PRESS_LPS25H_FS_MASK 0x00
--#define ST_PRESS_LPS25H_FS_AVL_1260_VAL 0x00
--#define ST_PRESS_LPS25H_FS_AVL_1260_GAIN ST_PRESS_KPASCAL_NANO_SCALE
--#define ST_PRESS_LPS25H_FS_AVL_TEMP_GAIN ST_PRESS_CELSIUS_NANO_SCALE
- #define ST_PRESS_LPS25H_BDU_ADDR 0x20
- #define ST_PRESS_LPS25H_BDU_MASK 0x04
- #define ST_PRESS_LPS25H_DRDY_IRQ_ADDR 0x23
-@@ -105,7 +110,6 @@
- #define ST_PRESS_LPS25H_IHL_IRQ_ADDR 0x22
- #define ST_PRESS_LPS25H_IHL_IRQ_MASK 0x80
- #define ST_PRESS_LPS25H_MULTIREAD_BIT true
--#define ST_PRESS_LPS25H_TEMP_OFFSET 42500
- #define ST_PRESS_LPS25H_OUT_XL_ADDR 0x28
- #define ST_TEMP_LPS25H_OUT_L_ADDR 0x2b
-
-@@ -157,7 +161,9 @@ static const struct iio_chan_spec st_press_lps001wp_channels[] = {
- .storagebits = 16,
- .endianness = IIO_LE,
- },
-- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
-+ .info_mask_separate =
-+ BIT(IIO_CHAN_INFO_RAW) |
-+ BIT(IIO_CHAN_INFO_SCALE),
- .modified = 0,
- },
- {
-@@ -173,7 +179,7 @@ static const struct iio_chan_spec st_press_lps001wp_channels[] = {
- },
- .info_mask_separate =
- BIT(IIO_CHAN_INFO_RAW) |
-- BIT(IIO_CHAN_INFO_OFFSET),
-+ BIT(IIO_CHAN_INFO_SCALE),
- .modified = 0,
- },
- IIO_CHAN_SOFT_TIMESTAMP(1)
-@@ -208,11 +214,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
- .addr = ST_PRESS_LPS331AP_FS_ADDR,
- .mask = ST_PRESS_LPS331AP_FS_MASK,
- .fs_avl = {
-+ /*
-+ * Pressure and temperature sensitivity values
-+ * as defined in table 3 of LPS331AP datasheet.
-+ */
- [0] = {
- .num = ST_PRESS_FS_AVL_1260MB,
-- .value = ST_PRESS_LPS331AP_FS_AVL_1260_VAL,
-- .gain = ST_PRESS_LPS331AP_FS_AVL_1260_GAIN,
-- .gain2 = ST_PRESS_LPS331AP_FS_AVL_TEMP_GAIN,
-+ .gain = ST_PRESS_KPASCAL_NANO_SCALE,
-+ .gain2 = ST_PRESS_LSB_PER_CELSIUS,
- },
- },
- },
-@@ -254,7 +263,17 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
- .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
- },
- .fs = {
-- .addr = 0,
-+ .fs_avl = {
-+ /*
-+ * Pressure and temperature resolution values
-+ * as defined in table 3 of LPS001WP datasheet.
-+ */
-+ [0] = {
-+ .num = ST_PRESS_FS_AVL_1100MB,
-+ .gain = ST_PRESS_LPS001WP_FS_AVL_PRESS_GAIN,
-+ .gain2 = ST_PRESS_LPS001WP_LSB_PER_CELSIUS,
-+ },
-+ },
- },
- .bdu = {
- .addr = ST_PRESS_LPS001WP_BDU_ADDR,
-@@ -291,14 +310,15 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
- .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
- },
- .fs = {
-- .addr = ST_PRESS_LPS25H_FS_ADDR,
-- .mask = ST_PRESS_LPS25H_FS_MASK,
- .fs_avl = {
-+ /*
-+ * Pressure and temperature sensitivity values
-+ * as defined in table 3 of LPS25H datasheet.
-+ */
- [0] = {
- .num = ST_PRESS_FS_AVL_1260MB,
-- .value = ST_PRESS_LPS25H_FS_AVL_1260_VAL,
-- .gain = ST_PRESS_LPS25H_FS_AVL_1260_GAIN,
-- .gain2 = ST_PRESS_LPS25H_FS_AVL_TEMP_GAIN,
-+ .gain = ST_PRESS_KPASCAL_NANO_SCALE,
-+ .gain2 = ST_PRESS_LSB_PER_CELSIUS,
- },
- },
- },
-@@ -354,26 +374,26 @@ static int st_press_read_raw(struct iio_dev *indio_dev,
-
- return IIO_VAL_INT;
- case IIO_CHAN_INFO_SCALE:
-- *val = 0;
--
- switch (ch->type) {
- case IIO_PRESSURE:
-+ *val = 0;
- *val2 = press_data->current_fullscale->gain;
-- break;
-+ return IIO_VAL_INT_PLUS_NANO;
- case IIO_TEMP:
-+ *val = MCELSIUS_PER_CELSIUS;
- *val2 = press_data->current_fullscale->gain2;
-- break;
-+ return IIO_VAL_FRACTIONAL;
- default:
- err = -EINVAL;
- goto read_error;
- }
-
-- return IIO_VAL_INT_PLUS_NANO;
- case IIO_CHAN_INFO_OFFSET:
- switch (ch->type) {
- case IIO_TEMP:
-- *val = 425;
-- *val2 = 10;
-+ *val = ST_PRESS_MILLI_CELSIUS_OFFSET *
-+ press_data->current_fullscale->gain2;
-+ *val2 = MCELSIUS_PER_CELSIUS;
- break;
- default:
- err = -EINVAL;
-diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c
-index f4d29d5..e2f926c 100644
---- a/drivers/iio/proximity/as3935.c
-+++ b/drivers/iio/proximity/as3935.c
-@@ -64,6 +64,7 @@ struct as3935_state {
- struct delayed_work work;
-
- u32 tune_cap;
-+ u8 buffer[16]; /* 8-bit data + 56-bit padding + 64-bit timestamp */
- u8 buf[2] ____cacheline_aligned;
- };
-
-@@ -72,7 +73,8 @@ static const struct iio_chan_spec as3935_channels[] = {
- .type = IIO_PROXIMITY,
- .info_mask_separate =
- BIT(IIO_CHAN_INFO_RAW) |
-- BIT(IIO_CHAN_INFO_PROCESSED),
-+ BIT(IIO_CHAN_INFO_PROCESSED) |
-+ BIT(IIO_CHAN_INFO_SCALE),
- .scan_index = 0,
- .scan_type = {
- .sign = 'u',
-@@ -181,7 +183,12 @@ static int as3935_read_raw(struct iio_dev *indio_dev,
- /* storm out of range */
- if (*val == AS3935_DATA_MASK)
- return -EINVAL;
-- *val *= 1000;
-+
-+ if (m == IIO_CHAN_INFO_PROCESSED)
-+ *val *= 1000;
-+ break;
-+ case IIO_CHAN_INFO_SCALE:
-+ *val = 1000;
- break;
- default:
- return -EINVAL;
-@@ -206,10 +213,10 @@ static irqreturn_t as3935_trigger_handler(int irq, void *private)
- ret = as3935_read(st, AS3935_DATA, &val);
- if (ret)
- goto err_read;
-- val &= AS3935_DATA_MASK;
-- val *= 1000;
-
-- iio_push_to_buffers_with_timestamp(indio_dev, &val, pf->timestamp);
-+ st->buffer[0] = val & AS3935_DATA_MASK;
-+ iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
-+ pf->timestamp);
- err_read:
- iio_trigger_notify_done(indio_dev->trig);
-
-diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
-index 1d92e09..c995255 100644
---- a/drivers/infiniband/core/cm.c
-+++ b/drivers/infiniband/core/cm.c
-@@ -3452,14 +3452,14 @@ static int cm_establish(struct ib_cm_id *cm_id)
- work->cm_event.event = IB_CM_USER_ESTABLISHED;
-
- /* Check if the device started its remove_one */
-- spin_lock_irq(&cm.lock);
-+ spin_lock_irqsave(&cm.lock, flags);
- if (!cm_dev->going_down) {
- queue_delayed_work(cm.wq, &work->work, 0);
- } else {
- kfree(work);
- ret = -ENODEV;
- }
-- spin_unlock_irq(&cm.lock);
-+ spin_unlock_irqrestore(&cm.lock, flags);
-
- out:
- return ret;
-diff --git a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c
-index 105246f..5fc6233 100644
---- a/drivers/infiniband/hw/mlx4/ah.c
-+++ b/drivers/infiniband/hw/mlx4/ah.c
-@@ -47,6 +47,7 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
-
- ah->av.ib.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
- ah->av.ib.g_slid = ah_attr->src_path_bits;
-+ ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
- if (ah_attr->ah_flags & IB_AH_GRH) {
- ah->av.ib.g_slid |= 0x80;
- ah->av.ib.gid_index = ah_attr->grh.sgid_index;
-@@ -64,7 +65,6 @@ static struct ib_ah *create_ib_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
- !(1 << ah->av.ib.stat_rate & dev->caps.stat_rate_support))
- --ah->av.ib.stat_rate;
- }
-- ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28);
-
- return &ah->ibah;
- }
-diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c
-index a9e3bcc..a0ecf08 100644
---- a/drivers/infiniband/sw/rdmavt/qp.c
-+++ b/drivers/infiniband/sw/rdmavt/qp.c
-@@ -683,8 +683,10 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
- * initialization that is needed.
- */
- priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp);
-- if (!priv)
-+ if (IS_ERR(priv)) {
-+ ret = priv;
- goto bail_qp;
-+ }
- qp->priv = priv;
- qp->timeout_jiffies =
- usecs_to_jiffies((4096UL * (1UL << qp->timeout)) /
-diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
-index bf4959f..94f1bf7 100644
---- a/drivers/iommu/amd_iommu_init.c
-+++ b/drivers/iommu/amd_iommu_init.c
-@@ -1363,13 +1363,23 @@ static int __init amd_iommu_init_pci(void)
- break;
- }
-
-+ /*
-+ * Order is important here to make sure any unity map requirements are
-+ * fulfilled. The unity mappings are created and written to the device
-+ * table during the amd_iommu_init_api() call.
-+ *
-+ * After that we call init_device_table_dma() to make sure any
-+ * uninitialized DTE will block DMA, and in the end we flush the caches
-+ * of all IOMMUs to make sure the changes to the device table are
-+ * active.
-+ */
-+ ret = amd_iommu_init_api();
-+
- init_device_table_dma();
-
- for_each_iommu(iommu)
- iommu_flush_all_caches(iommu);
-
-- ret = amd_iommu_init_api();
--
- if (!ret)
- print_iommu_info();
-
-diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
-index 4ff73ff..3e20208 100644
---- a/drivers/iommu/arm-smmu-v3.c
-+++ b/drivers/iommu/arm-smmu-v3.c
-@@ -1942,6 +1942,7 @@ static struct iommu_ops arm_smmu_ops = {
- .attach_dev = arm_smmu_attach_dev,
- .map = arm_smmu_map,
- .unmap = arm_smmu_unmap,
-+ .map_sg = default_iommu_map_sg,
- .iova_to_phys = arm_smmu_iova_to_phys,
- .add_device = arm_smmu_add_device,
- .remove_device = arm_smmu_remove_device,
-diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
-index e1852e8..ae364e0 100644
---- a/drivers/iommu/intel-iommu.c
-+++ b/drivers/iommu/intel-iommu.c
-@@ -3169,11 +3169,6 @@ static int __init init_dmars(void)
- }
- }
-
-- iommu_flush_write_buffer(iommu);
-- iommu_set_root_entry(iommu);
-- iommu->flush.flush_context(iommu, 0, 0, 0, DMA_CCMD_GLOBAL_INVL);
-- iommu->flush.flush_iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH);
--
- if (!ecap_pass_through(iommu->ecap))
- hw_pass_through = 0;
- #ifdef CONFIG_INTEL_IOMMU_SVM
-@@ -3182,6 +3177,18 @@ static int __init init_dmars(void)
- #endif
- }
-
-+ /*
-+ * Now that qi is enabled on all iommus, set the root entry and flush
-+ * caches. This is required on some Intel X58 chipsets, otherwise the
-+ * flush_context function will loop forever and the boot hangs.
-+ */
-+ for_each_active_iommu(iommu, drhd) {
-+ iommu_flush_write_buffer(iommu);
-+ iommu_set_root_entry(iommu);
-+ iommu->flush.flush_context(iommu, 0, 0, 0, DMA_CCMD_GLOBAL_INVL);
-+ iommu->flush.flush_iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH);
-+ }
-+
- if (iommu_pass_through)
- iommu_identity_mapping |= IDENTMAP_ALL;
-
-diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
-index 5710a06..0ea8d9a 100644
---- a/drivers/iommu/rockchip-iommu.c
-+++ b/drivers/iommu/rockchip-iommu.c
-@@ -815,7 +815,7 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,
- dte_addr = virt_to_phys(rk_domain->dt);
- for (i = 0; i < iommu->num_mmu; i++) {
- rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR, dte_addr);
-- rk_iommu_command(iommu->bases[i], RK_MMU_CMD_ZAP_CACHE);
-+ rk_iommu_base_command(iommu->bases[i], RK_MMU_CMD_ZAP_CACHE);
- rk_iommu_write(iommu->bases[i], RK_MMU_INT_MASK, RK_MMU_IRQ_MASK);
- }
-
-diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
-index 4dffccf..40fb120 100644
---- a/drivers/irqchip/irq-mips-gic.c
-+++ b/drivers/irqchip/irq-mips-gic.c
-@@ -734,6 +734,12 @@ static int gic_irq_domain_alloc(struct irq_domain *d, unsigned int virq,
- /* verify that it doesn't conflict with an IPI irq */
- if (test_bit(spec->hwirq, ipi_resrv))
- return -EBUSY;
-+
-+ hwirq = GIC_SHARED_TO_HWIRQ(spec->hwirq);
-+
-+ return irq_domain_set_hwirq_and_chip(d, virq, hwirq,
-+ &gic_level_irq_controller,
-+ NULL);
- } else {
- base_hwirq = find_first_bit(ipi_resrv, gic_shared_intrs);
- if (base_hwirq == gic_shared_intrs) {
-@@ -855,10 +861,14 @@ static int gic_dev_domain_alloc(struct irq_domain *d, unsigned int virq,
- &gic_level_irq_controller,
- NULL);
- if (ret)
-- return ret;
-+ goto error;
- }
-
- return 0;
-+
-+error:
-+ irq_domain_free_irqs_parent(d, virq, nr_irqs);
-+ return ret;
- }
-
- void gic_dev_domain_free(struct irq_domain *d, unsigned int virq,
-diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
-index d7723ce..12690c1 100644
---- a/drivers/media/usb/uvc/uvc_v4l2.c
-+++ b/drivers/media/usb/uvc/uvc_v4l2.c
-@@ -1408,47 +1408,44 @@ static int uvc_v4l2_put_xu_query(const struct uvc_xu_control_query *kp,
- static long uvc_v4l2_compat_ioctl32(struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-+ struct uvc_fh *handle = file->private_data;
- union {
- struct uvc_xu_control_mapping xmap;
- struct uvc_xu_control_query xqry;
- } karg;
- void __user *up = compat_ptr(arg);
-- mm_segment_t old_fs;
- long ret;
-
- switch (cmd) {
- case UVCIOC_CTRL_MAP32:
-- cmd = UVCIOC_CTRL_MAP;
- ret = uvc_v4l2_get_xu_mapping(&karg.xmap, up);
-+ if (ret)
-+ return ret;
-+ ret = uvc_ioctl_ctrl_map(handle->chain, &karg.xmap);
-+ if (ret)
-+ return ret;
-+ ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up);
-+ if (ret)
-+ return ret;
-+
- break;
-
- case UVCIOC_CTRL_QUERY32:
-- cmd = UVCIOC_CTRL_QUERY;
- ret = uvc_v4l2_get_xu_query(&karg.xqry, up);
-+ if (ret)
-+ return ret;
-+ ret = uvc_xu_ctrl_query(handle->chain, &karg.xqry);
-+ if (ret)
-+ return ret;
-+ ret = uvc_v4l2_put_xu_query(&karg.xqry, up);
-+ if (ret)
-+ return ret;
- break;
-
- default:
- return -ENOIOCTLCMD;
- }
-
-- old_fs = get_fs();
-- set_fs(KERNEL_DS);
-- ret = video_ioctl2(file, cmd, (unsigned long)&karg);
-- set_fs(old_fs);
--
-- if (ret < 0)
-- return ret;
--
-- switch (cmd) {
-- case UVCIOC_CTRL_MAP:
-- ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up);
-- break;
--
-- case UVCIOC_CTRL_QUERY:
-- ret = uvc_v4l2_put_xu_query(&karg.xqry, up);
-- break;
-- }
--
- return ret;
- }
- #endif
-diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c
-index 21825dd..859b4a1 100644
---- a/drivers/memory/omap-gpmc.c
-+++ b/drivers/memory/omap-gpmc.c
-@@ -394,7 +394,7 @@ static void gpmc_cs_bool_timings(int cs, const struct gpmc_bool_timings *p)
- gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4,
- GPMC_CONFIG4_OEEXTRADELAY, p->oe_extra_delay);
- gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4,
-- GPMC_CONFIG4_OEEXTRADELAY, p->we_extra_delay);
-+ GPMC_CONFIG4_WEEXTRADELAY, p->we_extra_delay);
- gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6,
- GPMC_CONFIG6_CYCLE2CYCLESAMECSEN,
- p->cycle2cyclesamecsen);
-diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
-index 96fddb0..4dd0391 100644
---- a/drivers/mtd/ubi/eba.c
-+++ b/drivers/mtd/ubi/eba.c
-@@ -575,6 +575,7 @@ static int recover_peb(struct ubi_device *ubi, int pnum, int vol_id, int lnum,
- int err, idx = vol_id2idx(ubi, vol_id), new_pnum, data_size, tries = 0;
- struct ubi_volume *vol = ubi->volumes[idx];
- struct ubi_vid_hdr *vid_hdr;
-+ uint32_t crc;
-
- vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS);
- if (!vid_hdr)
-@@ -599,14 +600,8 @@ retry:
- goto out_put;
- }
-
-- vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
-- err = ubi_io_write_vid_hdr(ubi, new_pnum, vid_hdr);
-- if (err) {
-- up_read(&ubi->fm_eba_sem);
-- goto write_error;
-- }
-+ ubi_assert(vid_hdr->vol_type == UBI_VID_DYNAMIC);
-
-- data_size = offset + len;
- mutex_lock(&ubi->buf_mutex);
- memset(ubi->peb_buf + offset, 0xFF, len);
-
-@@ -621,6 +616,19 @@ retry:
-
- memcpy(ubi->peb_buf + offset, buf, len);
-
-+ data_size = offset + len;
-+ crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size);
-+ vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
-+ vid_hdr->copy_flag = 1;
-+ vid_hdr->data_size = cpu_to_be32(data_size);
-+ vid_hdr->data_crc = cpu_to_be32(crc);
-+ err = ubi_io_write_vid_hdr(ubi, new_pnum, vid_hdr);
-+ if (err) {
-+ mutex_unlock(&ubi->buf_mutex);
-+ up_read(&ubi->fm_eba_sem);
-+ goto write_error;
-+ }
-+
- err = ubi_io_write_data(ubi, ubi->peb_buf, new_pnum, 0, data_size);
- if (err) {
- mutex_unlock(&ubi->buf_mutex);
-diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
-index 9fcb489..c70e515 100644
---- a/drivers/net/geneve.c
-+++ b/drivers/net/geneve.c
-@@ -1092,12 +1092,17 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
-
- static int __geneve_change_mtu(struct net_device *dev, int new_mtu, bool strict)
- {
-+ struct geneve_dev *geneve = netdev_priv(dev);
- /* The max_mtu calculation does not take account of GENEVE
- * options, to avoid excluding potentially valid
- * configurations.
- */
-- int max_mtu = IP_MAX_MTU - GENEVE_BASE_HLEN - sizeof(struct iphdr)
-- - dev->hard_header_len;
-+ int max_mtu = IP_MAX_MTU - GENEVE_BASE_HLEN - dev->hard_header_len;
-+
-+ if (geneve->remote.sa.sa_family == AF_INET6)
-+ max_mtu -= sizeof(struct ipv6hdr);
-+ else
-+ max_mtu -= sizeof(struct iphdr);
-
- if (new_mtu < 68)
- return -EINVAL;
-diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
-index 9e803bb..8f3c55d 100644
---- a/drivers/net/macsec.c
-+++ b/drivers/net/macsec.c
-@@ -2564,6 +2564,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
- u64_stats_update_begin(&secy_stats->syncp);
- secy_stats->stats.OutPktsUntagged++;
- u64_stats_update_end(&secy_stats->syncp);
-+ skb->dev = macsec->real_dev;
- len = skb->len;
- ret = dev_queue_xmit(skb);
- count_tx(dev, ret, len);
-diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
-index 2fb31ed..d4425c56 100644
---- a/drivers/net/usb/cdc_ncm.c
-+++ b/drivers/net/usb/cdc_ncm.c
-@@ -852,6 +852,13 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
- if (cdc_ncm_init(dev))
- goto error2;
-
-+ /* Some firmwares need a pause here or they will silently fail
-+ * to set up the interface properly. This value was decided
-+ * empirically on a Sierra Wireless MC7455 running 02.08.02.00
-+ * firmware.
-+ */
-+ usleep_range(10000, 20000);
-+
- /* configure data interface */
- temp = usb_set_interface(dev->udev, iface_no, data_altsetting);
- if (temp) {
-diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
-index e85e073..06664ba 100644
---- a/drivers/net/wireless/mac80211_hwsim.c
-+++ b/drivers/net/wireless/mac80211_hwsim.c
-@@ -2771,6 +2771,7 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
- if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] ||
- !info->attrs[HWSIM_ATTR_FLAGS] ||
- !info->attrs[HWSIM_ATTR_COOKIE] ||
-+ !info->attrs[HWSIM_ATTR_SIGNAL] ||
- !info->attrs[HWSIM_ATTR_TX_INFO])
- goto out;
-
-diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
-index 0f48048..3a0faa8 100644
---- a/drivers/net/wireless/realtek/rtlwifi/core.c
-+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
-@@ -54,7 +54,7 @@ EXPORT_SYMBOL(channel5g_80m);
- void rtl_addr_delay(u32 addr)
- {
- if (addr == 0xfe)
-- msleep(50);
-+ mdelay(50);
- else if (addr == 0xfd)
- msleep(5);
- else if (addr == 0xfc)
-@@ -75,7 +75,7 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
- rtl_addr_delay(addr);
- } else {
- rtl_set_rfreg(hw, rfpath, addr, mask, data);
-- usleep_range(1, 2);
-+ udelay(1);
- }
- }
- EXPORT_SYMBOL(rtl_rfreg_delay);
-@@ -86,7 +86,7 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
- rtl_addr_delay(addr);
- } else {
- rtl_set_bbreg(hw, addr, MASKDWORD, data);
-- usleep_range(1, 2);
-+ udelay(1);
- }
- }
- EXPORT_SYMBOL(rtl_bb_delay);
-diff --git a/drivers/of/irq.c b/drivers/of/irq.c
-index e7bfc17..6ec743f 100644
---- a/drivers/of/irq.c
-+++ b/drivers/of/irq.c
-@@ -386,13 +386,13 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
- EXPORT_SYMBOL_GPL(of_irq_to_resource);
-
- /**
-- * of_irq_get - Decode a node's IRQ and return it as a Linux irq number
-+ * of_irq_get - Decode a node's IRQ and return it as a Linux IRQ number
- * @dev: pointer to device tree node
-- * @index: zero-based index of the irq
-- *
-- * Returns Linux irq number on success, or -EPROBE_DEFER if the irq domain
-- * is not yet created.
-+ * @index: zero-based index of the IRQ
- *
-+ * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
-+ * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
-+ * of any other failure.
- */
- int of_irq_get(struct device_node *dev, int index)
- {
-@@ -413,12 +413,13 @@ int of_irq_get(struct device_node *dev, int index)
- EXPORT_SYMBOL_GPL(of_irq_get);
-
- /**
-- * of_irq_get_byname - Decode a node's IRQ and return it as a Linux irq number
-+ * of_irq_get_byname - Decode a node's IRQ and return it as a Linux IRQ number
- * @dev: pointer to device tree node
-- * @name: irq name
-+ * @name: IRQ name
- *
-- * Returns Linux irq number on success, or -EPROBE_DEFER if the irq domain
-- * is not yet created, or error code in case of any other failure.
-+ * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
-+ * -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
-+ * of any other failure.
- */
- int of_irq_get_byname(struct device_node *dev, const char *name)
- {
-diff --git a/drivers/pci/vc.c b/drivers/pci/vc.c
-index dfbab61..1fa3a32 100644
---- a/drivers/pci/vc.c
-+++ b/drivers/pci/vc.c
-@@ -221,9 +221,9 @@ static int pci_vc_do_save_buffer(struct pci_dev *dev, int pos,
- else
- pci_write_config_word(dev, pos + PCI_VC_PORT_CTRL,
- *(u16 *)buf);
-- buf += 2;
-+ buf += 4;
- }
-- len += 2;
-+ len += 4;
-
- /*
- * If we have any Low Priority VCs and a VC Arbitration Table Offset
-diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c
-index 56a17ec..6c7fe477 100644
---- a/drivers/regulator/qcom_smd-regulator.c
-+++ b/drivers/regulator/qcom_smd-regulator.c
-@@ -140,6 +140,18 @@ static const struct regulator_ops rpm_smps_ldo_ops = {
- .enable = rpm_reg_enable,
- .disable = rpm_reg_disable,
- .is_enabled = rpm_reg_is_enabled,
-+ .list_voltage = regulator_list_voltage_linear_range,
-+
-+ .get_voltage = rpm_reg_get_voltage,
-+ .set_voltage = rpm_reg_set_voltage,
-+
-+ .set_load = rpm_reg_set_load,
-+};
-+
-+static const struct regulator_ops rpm_smps_ldo_ops_fixed = {
-+ .enable = rpm_reg_enable,
-+ .disable = rpm_reg_disable,
-+ .is_enabled = rpm_reg_is_enabled,
-
- .get_voltage = rpm_reg_get_voltage,
- .set_voltage = rpm_reg_set_voltage,
-@@ -247,7 +259,7 @@ static const struct regulator_desc pm8941_nldo = {
- static const struct regulator_desc pm8941_lnldo = {
- .fixed_uV = 1740000,
- .n_voltages = 1,
-- .ops = &rpm_smps_ldo_ops,
-+ .ops = &rpm_smps_ldo_ops_fixed,
- };
-
- static const struct regulator_desc pm8941_switch = {
-diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
-index d4c2856..3ddc85e 100644
---- a/drivers/scsi/53c700.c
-+++ b/drivers/scsi/53c700.c
-@@ -1122,7 +1122,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
- } else {
- struct scsi_cmnd *SCp;
-
-- SCp = scsi_host_find_tag(SDp->host, SCSI_NO_TAG);
-+ SCp = SDp->current_cmnd;
- if(unlikely(SCp == NULL)) {
- sdev_printk(KERN_ERR, SDp,
- "no saved request for untagged cmd\n");
-@@ -1826,7 +1826,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)
- slot->tag, slot);
- } else {
- slot->tag = SCSI_NO_TAG;
-- /* must populate current_cmnd for scsi_host_find_tag to work */
-+ /* save current command for reselection */
- SCp->device->current_cmnd = SCp;
- }
- /* sanity check: some of the commands generated by the mid-layer
-diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
-index 984ddcb..1b9c049 100644
---- a/drivers/scsi/scsi_error.c
-+++ b/drivers/scsi/scsi_error.c
-@@ -1127,7 +1127,6 @@ static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn)
- */
- void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q)
- {
-- scmd->device->host->host_failed--;
- scmd->eh_eflags = 0;
- list_move_tail(&scmd->eh_entry, done_q);
- }
-@@ -2226,6 +2225,9 @@ int scsi_error_handler(void *data)
- else
- scsi_unjam_host(shost);
-
-+ /* All scmds have been handled */
-+ shost->host_failed = 0;
-+
- /*
- * Note - if the above fails completely, the action is to take
- * individual devices offline and flush the queue of any
-diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
-index f52b74c..41c3a2c 100644
---- a/drivers/scsi/sd.c
-+++ b/drivers/scsi/sd.c
-@@ -2862,10 +2862,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
- if (sdkp->opt_xfer_blocks &&
- sdkp->opt_xfer_blocks <= dev_max &&
- sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS &&
-- sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_SIZE)
-- rw_max = q->limits.io_opt =
-- sdkp->opt_xfer_blocks * sdp->sector_size;
-- else
-+ logical_to_bytes(sdp, sdkp->opt_xfer_blocks) >= PAGE_SIZE) {
-+ q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
-+ rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
-+ } else
- rw_max = BLK_DEF_MAX_SECTORS;
-
- /* Combine with controller limits */
-diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
-index 654630b..765a6f1 100644
---- a/drivers/scsi/sd.h
-+++ b/drivers/scsi/sd.h
-@@ -151,6 +151,11 @@ static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blo
- return blocks << (ilog2(sdev->sector_size) - 9);
- }
-
-+static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks)
-+{
-+ return blocks * sdev->sector_size;
-+}
-+
- /*
- * A DIF-capable target device can be formatted with different
- * protection schemes. Currently 0 through 3 are defined:
-diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c
-index a8f533a..ec12181 100644
---- a/drivers/staging/iio/accel/sca3000_core.c
-+++ b/drivers/staging/iio/accel/sca3000_core.c
-@@ -594,7 +594,7 @@ static ssize_t sca3000_read_frequency(struct device *dev,
- goto error_ret_mut;
- ret = sca3000_read_ctrl_reg(st, SCA3000_REG_CTRL_SEL_OUT_CTRL);
- mutex_unlock(&st->lock);
-- if (ret)
-+ if (ret < 0)
- goto error_ret;
- val = ret;
- if (base_freq > 0)
-diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
-index 6ceac4f..5b4b47e 100644
---- a/drivers/thermal/cpu_cooling.c
-+++ b/drivers/thermal/cpu_cooling.c
-@@ -857,14 +857,6 @@ __cpufreq_cooling_register(struct device_node *np,
- goto free_power_table;
- }
-
-- snprintf(dev_name, sizeof(dev_name), "thermal-cpufreq-%d",
-- cpufreq_dev->id);
--
-- cool_dev = thermal_of_cooling_device_register(np, dev_name, cpufreq_dev,
-- &cpufreq_cooling_ops);
-- if (IS_ERR(cool_dev))
-- goto remove_idr;
--
- /* Fill freq-table in descending order of frequencies */
- for (i = 0, freq = -1; i <= cpufreq_dev->max_level; i++) {
- freq = find_next_max(table, freq);
-@@ -877,6 +869,14 @@ __cpufreq_cooling_register(struct device_node *np,
- pr_debug("%s: freq:%u KHz\n", __func__, freq);
- }
-
-+ snprintf(dev_name, sizeof(dev_name), "thermal-cpufreq-%d",
-+ cpufreq_dev->id);
-+
-+ cool_dev = thermal_of_cooling_device_register(np, dev_name, cpufreq_dev,
-+ &cpufreq_cooling_ops);
-+ if (IS_ERR(cool_dev))
-+ goto remove_idr;
-+
- cpufreq_dev->clipped_freq = cpufreq_dev->freq_table[0];
- cpufreq_dev->cool_dev = cool_dev;
-
-diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
-index f973bfc..1e93a37 100644
---- a/drivers/tty/vt/keyboard.c
-+++ b/drivers/tty/vt/keyboard.c
-@@ -366,34 +366,22 @@ static void to_utf8(struct vc_data *vc, uint c)
-
- static void do_compute_shiftstate(void)
- {
-- unsigned int i, j, k, sym, val;
-+ unsigned int k, sym, val;
-
- shift_state = 0;
- memset(shift_down, 0, sizeof(shift_down));
-
-- for (i = 0; i < ARRAY_SIZE(key_down); i++) {
--
-- if (!key_down[i])
-+ for_each_set_bit(k, key_down, min(NR_KEYS, KEY_CNT)) {
-+ sym = U(key_maps[0][k]);
-+ if (KTYP(sym) != KT_SHIFT && KTYP(sym) != KT_SLOCK)
- continue;
-
-- k = i * BITS_PER_LONG;
--
-- for (j = 0; j < BITS_PER_LONG; j++, k++) {
--
-- if (!test_bit(k, key_down))
-- continue;
-+ val = KVAL(sym);
-+ if (val == KVAL(K_CAPSSHIFT))
-+ val = KVAL(K_SHIFT);
-
-- sym = U(key_maps[0][k]);
-- if (KTYP(sym) != KT_SHIFT && KTYP(sym) != KT_SLOCK)
-- continue;
--
-- val = KVAL(sym);
-- if (val == KVAL(K_CAPSSHIFT))
-- val = KVAL(K_SHIFT);
--
-- shift_down[val]++;
-- shift_state |= (1 << val);
-- }
-+ shift_down[val]++;
-+ shift_state |= BIT(val);
- }
- }
-
-diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
-index bd523ad..e9e29de 100644
---- a/drivers/tty/vt/vt.c
-+++ b/drivers/tty/vt/vt.c
-@@ -750,6 +750,7 @@ static void visual_init(struct vc_data *vc, int num, int init)
- vc->vc_complement_mask = 0;
- vc->vc_can_do_color = 0;
- vc->vc_panic_force_write = false;
-+ vc->vc_cur_blink_ms = DEFAULT_CURSOR_BLINK_MS;
- vc->vc_sw->con_init(vc, init);
- if (!vc->vc_complement_mask)
- vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
-diff --git a/drivers/usb/common/usb-otg-fsm.c b/drivers/usb/common/usb-otg-fsm.c
-index 504708f..6c6040c 100644
---- a/drivers/usb/common/usb-otg-fsm.c
-+++ b/drivers/usb/common/usb-otg-fsm.c
-@@ -21,6 +21,7 @@
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-+#include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/mutex.h>
-@@ -452,3 +453,4 @@ int otg_statemachine(struct otg_fsm *fsm)
- return state_changed;
- }
- EXPORT_SYMBOL_GPL(otg_statemachine);
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
-index 980fc57..2d107d0 100644
---- a/drivers/usb/core/hcd.c
-+++ b/drivers/usb/core/hcd.c
-@@ -2597,26 +2597,23 @@ EXPORT_SYMBOL_GPL(usb_create_hcd);
- * Don't deallocate the bandwidth_mutex until the last shared usb_hcd is
- * deallocated.
- *
-- * Make sure to only deallocate the bandwidth_mutex when the primary HCD is
-- * freed. When hcd_release() is called for either hcd in a peer set
-- * invalidate the peer's ->shared_hcd and ->primary_hcd pointers to
-- * block new peering attempts
-+ * Make sure to deallocate the bandwidth_mutex only when the last HCD is
-+ * freed. When hcd_release() is called for either hcd in a peer set,
-+ * invalidate the peer's ->shared_hcd and ->primary_hcd pointers.
- */
- static void hcd_release(struct kref *kref)
- {
- struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref);
-
- mutex_lock(&usb_port_peer_mutex);
-- if (usb_hcd_is_primary_hcd(hcd)) {
-- kfree(hcd->address0_mutex);
-- kfree(hcd->bandwidth_mutex);
-- }
- if (hcd->shared_hcd) {
- struct usb_hcd *peer = hcd->shared_hcd;
-
- peer->shared_hcd = NULL;
-- if (peer->primary_hcd == hcd)
-- peer->primary_hcd = NULL;
-+ peer->primary_hcd = NULL;
-+ } else {
-+ kfree(hcd->address0_mutex);
-+ kfree(hcd->bandwidth_mutex);
- }
- mutex_unlock(&usb_port_peer_mutex);
- kfree(hcd);
-diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
-index 3c58d63..dec0b21 100644
---- a/drivers/usb/dwc2/core.h
-+++ b/drivers/usb/dwc2/core.h
-@@ -64,6 +64,17 @@
- DWC2_TRACE_SCHEDULER_VB(pr_fmt("%s: SCH: " fmt), \
- dev_name(hsotg->dev), ##__VA_ARGS__)
-
-+#ifdef CONFIG_MIPS
-+/*
-+ * There are some MIPS machines that can run in either big-endian
-+ * or little-endian mode and that use the dwc2 register without
-+ * a byteswap in both ways.
-+ * Unlike other architectures, MIPS apparently does not require a
-+ * barrier before the __raw_writel() to synchronize with DMA but does
-+ * require the barrier after the __raw_writel() to serialize a set of
-+ * writes. This set of operations was added specifically for MIPS and
-+ * should only be used there.
-+ */
- static inline u32 dwc2_readl(const void __iomem *addr)
- {
- u32 value = __raw_readl(addr);
-@@ -90,6 +101,22 @@ static inline void dwc2_writel(u32 value, void __iomem *addr)
- pr_info("INFO:: wrote %08x to %p\n", value, addr);
- #endif
- }
-+#else
-+/* Normal architectures just use readl/write */
-+static inline u32 dwc2_readl(const void __iomem *addr)
-+{
-+ return readl(addr);
-+}
-+
-+static inline void dwc2_writel(u32 value, void __iomem *addr)
-+{
-+ writel(value, addr);
-+
-+#ifdef DWC2_LOG_WRITES
-+ pr_info("info:: wrote %08x to %p\n", value, addr);
-+#endif
-+}
-+#endif
-
- /* Maximum number of Endpoints/HostChannels */
- #define MAX_EPS_CHANNELS 16
-diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
-index 7b6d74f..476c0e3 100644
---- a/drivers/virtio/virtio_balloon.c
-+++ b/drivers/virtio/virtio_balloon.c
-@@ -75,7 +75,7 @@ struct virtio_balloon {
-
- /* The array of pfns we tell the Host about. */
- unsigned int num_pfns;
-- u32 pfns[VIRTIO_BALLOON_ARRAY_PFNS_MAX];
-+ __virtio32 pfns[VIRTIO_BALLOON_ARRAY_PFNS_MAX];
-
- /* Memory statistics */
- struct virtio_balloon_stat stats[VIRTIO_BALLOON_S_NR];
-@@ -127,14 +127,16 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq)
-
- }
-
--static void set_page_pfns(u32 pfns[], struct page *page)
-+static void set_page_pfns(struct virtio_balloon *vb,
-+ __virtio32 pfns[], struct page *page)
- {
- unsigned int i;
-
- /* Set balloon pfns pointing at this page.
- * Note that the first pfn points at start of the page. */
- for (i = 0; i < VIRTIO_BALLOON_PAGES_PER_PAGE; i++)
-- pfns[i] = page_to_balloon_pfn(page) + i;
-+ pfns[i] = cpu_to_virtio32(vb->vdev,
-+ page_to_balloon_pfn(page) + i);
- }
-
- static unsigned fill_balloon(struct virtio_balloon *vb, size_t num)
-@@ -158,7 +160,7 @@ static unsigned fill_balloon(struct virtio_balloon *vb, size_t num)
- msleep(200);
- break;
- }
-- set_page_pfns(vb->pfns + vb->num_pfns, page);
-+ set_page_pfns(vb, vb->pfns + vb->num_pfns, page);
- vb->num_pages += VIRTIO_BALLOON_PAGES_PER_PAGE;
- if (!virtio_has_feature(vb->vdev,
- VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
-@@ -177,10 +179,12 @@ static unsigned fill_balloon(struct virtio_balloon *vb, size_t num)
- static void release_pages_balloon(struct virtio_balloon *vb)
- {
- unsigned int i;
-+ struct page *page;
-
- /* Find pfns pointing at start of each page, get pages and free them. */
- for (i = 0; i < vb->num_pfns; i += VIRTIO_BALLOON_PAGES_PER_PAGE) {
-- struct page *page = balloon_pfn_to_page(vb->pfns[i]);
-+ page = balloon_pfn_to_page(virtio32_to_cpu(vb->vdev,
-+ vb->pfns[i]));
- if (!virtio_has_feature(vb->vdev,
- VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
- adjust_managed_page_count(page, 1);
-@@ -203,7 +207,7 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
- page = balloon_page_dequeue(vb_dev_info);
- if (!page)
- break;
-- set_page_pfns(vb->pfns + vb->num_pfns, page);
-+ set_page_pfns(vb, vb->pfns + vb->num_pfns, page);
- vb->num_pages -= VIRTIO_BALLOON_PAGES_PER_PAGE;
- }
-
-@@ -471,13 +475,13 @@ static int virtballoon_migratepage(struct balloon_dev_info *vb_dev_info,
- __count_vm_event(BALLOON_MIGRATE);
- spin_unlock_irqrestore(&vb_dev_info->pages_lock, flags);
- vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE;
-- set_page_pfns(vb->pfns, newpage);
-+ set_page_pfns(vb, vb->pfns, newpage);
- tell_host(vb, vb->inflate_vq);
-
- /* balloon's page migration 2nd step -- deflate "page" */
- balloon_page_delete(page);
- vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE;
-- set_page_pfns(vb->pfns, page);
-+ set_page_pfns(vb, vb->pfns, page);
- tell_host(vb, vb->deflate_vq);
-
- mutex_unlock(&vb->balloon_lock);
-diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
-index d46839f..e4db19e 100644
---- a/drivers/xen/balloon.c
-+++ b/drivers/xen/balloon.c
-@@ -151,8 +151,6 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
- static void balloon_process(struct work_struct *work);
- static DECLARE_DELAYED_WORK(balloon_worker, balloon_process);
-
--static void release_memory_resource(struct resource *resource);
--
- /* When ballooning out (allocating memory to return to Xen) we don't really
- want the kernel to try too hard since that can trigger the oom killer. */
- #define GFP_BALLOON \
-@@ -248,6 +246,19 @@ static enum bp_state update_schedule(enum bp_state state)
- }
-
- #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-+static void release_memory_resource(struct resource *resource)
-+{
-+ if (!resource)
-+ return;
-+
-+ /*
-+ * No need to reset region to identity mapped since we now
-+ * know that no I/O can be in this region
-+ */
-+ release_resource(resource);
-+ kfree(resource);
-+}
-+
- static struct resource *additional_memory_resource(phys_addr_t size)
- {
- struct resource *res;
-@@ -286,19 +297,6 @@ static struct resource *additional_memory_resource(phys_addr_t size)
- return res;
- }
-
--static void release_memory_resource(struct resource *resource)
--{
-- if (!resource)
-- return;
--
-- /*
-- * No need to reset region to identity mapped since we now
-- * know that no I/O can be in this region
-- */
-- release_resource(resource);
-- kfree(resource);
--}
--
- static enum bp_state reserve_additional_memory(void)
- {
- long credit;
-diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c
-index 076970a..4ce10bc 100644
---- a/drivers/xen/xen-acpi-processor.c
-+++ b/drivers/xen/xen-acpi-processor.c
-@@ -423,36 +423,7 @@ upload:
-
- return 0;
- }
--static int __init check_prereq(void)
--{
-- struct cpuinfo_x86 *c = &cpu_data(0);
--
-- if (!xen_initial_domain())
-- return -ENODEV;
--
-- if (!acpi_gbl_FADT.smi_command)
-- return -ENODEV;
--
-- if (c->x86_vendor == X86_VENDOR_INTEL) {
-- if (!cpu_has(c, X86_FEATURE_EST))
-- return -ENODEV;
-
-- return 0;
-- }
-- if (c->x86_vendor == X86_VENDOR_AMD) {
-- /* Copied from powernow-k8.h, can't include ../cpufreq/powernow
-- * as we get compile warnings for the static functions.
-- */
--#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
--#define USE_HW_PSTATE 0x00000080
-- u32 eax, ebx, ecx, edx;
-- cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
-- if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE)
-- return -ENODEV;
-- return 0;
-- }
-- return -ENODEV;
--}
- /* acpi_perf_data is a pointer to percpu data. */
- static struct acpi_processor_performance __percpu *acpi_perf_data;
-
-@@ -509,10 +480,10 @@ struct notifier_block xen_acpi_processor_resume_nb = {
- static int __init xen_acpi_processor_init(void)
- {
- unsigned int i;
-- int rc = check_prereq();
-+ int rc;
-
-- if (rc)
-- return rc;
-+ if (!xen_initial_domain())
-+ return -ENODEV;
-
- nr_acpi_bits = get_max_acpi_id() + 1;
- acpi_ids_done = kcalloc(BITS_TO_LONGS(nr_acpi_bits), sizeof(unsigned long), GFP_KERNEL);
-diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
-index ec7928a..234707c 100644
---- a/fs/btrfs/ctree.c
-+++ b/fs/btrfs/ctree.c
-@@ -1552,6 +1552,7 @@ noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,
- trans->transid, root->fs_info->generation);
-
- if (!should_cow_block(trans, root, buf)) {
-+ trans->dirty = true;
- *cow_ret = buf;
- return 0;
- }
-@@ -2773,8 +2774,10 @@ again:
- * then we don't want to set the path blocking,
- * so we test it here
- */
-- if (!should_cow_block(trans, root, b))
-+ if (!should_cow_block(trans, root, b)) {
-+ trans->dirty = true;
- goto cow_done;
-+ }
-
- /*
- * must have write locks on this node and the
-diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
-index 84e060e..78f1b57 100644
---- a/fs/btrfs/extent-tree.c
-+++ b/fs/btrfs/extent-tree.c
-@@ -7929,7 +7929,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
- set_extent_dirty(&trans->transaction->dirty_pages, buf->start,
- buf->start + buf->len - 1, GFP_NOFS);
- }
-- trans->blocks_used++;
-+ trans->dirty = true;
- /* this returns a buffer locked for blocking */
- return buf;
- }
-diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
-index 00b8f37..d7c138f 100644
---- a/fs/btrfs/super.c
-+++ b/fs/btrfs/super.c
-@@ -239,7 +239,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
- trans->aborted = errno;
- /* Nothing used. The other threads that have joined this
- * transaction may be able to continue. */
-- if (!trans->blocks_used && list_empty(&trans->new_bgs)) {
-+ if (!trans->dirty && list_empty(&trans->new_bgs)) {
- const char *errstr;
-
- errstr = btrfs_decode_error(errno);
-diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h
-index 72be51f..c0b501a 100644
---- a/fs/btrfs/transaction.h
-+++ b/fs/btrfs/transaction.h
-@@ -110,7 +110,6 @@ struct btrfs_trans_handle {
- u64 chunk_bytes_reserved;
- unsigned long use_count;
- unsigned long blocks_reserved;
-- unsigned long blocks_used;
- unsigned long delayed_ref_updates;
- struct btrfs_transaction *transaction;
- struct btrfs_block_rsv *block_rsv;
-@@ -121,6 +120,7 @@ struct btrfs_trans_handle {
- bool can_flush_pending_bgs;
- bool reloc_reserved;
- bool sync;
-+ bool dirty;
- unsigned int type;
- /*
- * this root is only needed to validate that the root passed to
-diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
-index 5a53ac6..02b071bf 100644
---- a/fs/cifs/cifs_unicode.c
-+++ b/fs/cifs/cifs_unicode.c
-@@ -101,6 +101,12 @@ convert_sfm_char(const __u16 src_char, char *target)
- case SFM_SLASH:
- *target = '\\';
- break;
-+ case SFM_SPACE:
-+ *target = ' ';
-+ break;
-+ case SFM_PERIOD:
-+ *target = '.';
-+ break;
- default:
- return false;
- }
-@@ -404,7 +410,7 @@ static __le16 convert_to_sfu_char(char src_char)
- return dest_char;
- }
-
--static __le16 convert_to_sfm_char(char src_char)
-+static __le16 convert_to_sfm_char(char src_char, bool end_of_string)
- {
- __le16 dest_char;
-
-@@ -427,6 +433,18 @@ static __le16 convert_to_sfm_char(char src_char)
- case '|':
- dest_char = cpu_to_le16(SFM_PIPE);
- break;
-+ case '.':
-+ if (end_of_string)
-+ dest_char = cpu_to_le16(SFM_PERIOD);
-+ else
-+ dest_char = 0;
-+ break;
-+ case ' ':
-+ if (end_of_string)
-+ dest_char = cpu_to_le16(SFM_SPACE);
-+ else
-+ dest_char = 0;
-+ break;
- default:
- dest_char = 0;
- }
-@@ -469,9 +487,16 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
- /* see if we must remap this char */
- if (map_chars == SFU_MAP_UNI_RSVD)
- dst_char = convert_to_sfu_char(src_char);
-- else if (map_chars == SFM_MAP_UNI_RSVD)
-- dst_char = convert_to_sfm_char(src_char);
-- else
-+ else if (map_chars == SFM_MAP_UNI_RSVD) {
-+ bool end_of_string;
-+
-+ if (i == srclen - 1)
-+ end_of_string = true;
-+ else
-+ end_of_string = false;
-+
-+ dst_char = convert_to_sfm_char(src_char, end_of_string);
-+ } else
- dst_char = 0;
- /*
- * FIXME: We can not handle remapping backslash (UNI_SLASH)
-diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h
-index bdc52cb..479bc0a 100644
---- a/fs/cifs/cifs_unicode.h
-+++ b/fs/cifs/cifs_unicode.h
-@@ -64,6 +64,8 @@
- #define SFM_LESSTHAN ((__u16) 0xF023)
- #define SFM_PIPE ((__u16) 0xF027)
- #define SFM_SLASH ((__u16) 0xF026)
-+#define SFM_PERIOD ((__u16) 0xF028)
-+#define SFM_SPACE ((__u16) 0xF029)
-
- /*
- * Mapping mechanism to use when one of the seven reserved characters is
-diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
-index 6f62ac8..34cbc58 100644
---- a/fs/cifs/connect.c
-+++ b/fs/cifs/connect.c
-@@ -428,7 +428,9 @@ cifs_echo_request(struct work_struct *work)
- * server->ops->need_neg() == true. Also, no need to ping if
- * we got a response recently.
- */
-- if (!server->ops->need_neg || server->ops->need_neg(server) ||
-+
-+ if (server->tcpStatus == CifsNeedReconnect ||
-+ server->tcpStatus == CifsExiting || server->tcpStatus == CifsNew ||
- (server->ops->can_echo && !server->ops->can_echo(server)) ||
- time_before(jiffies, server->lstrp + echo_interval - HZ))
- goto requeue_echo;
-diff --git a/fs/cifs/ntlmssp.h b/fs/cifs/ntlmssp.h
-index 848249f..3079b38 100644
---- a/fs/cifs/ntlmssp.h
-+++ b/fs/cifs/ntlmssp.h
-@@ -133,6 +133,6 @@ typedef struct _AUTHENTICATE_MESSAGE {
-
- int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len, struct cifs_ses *ses);
- void build_ntlmssp_negotiate_blob(unsigned char *pbuffer, struct cifs_ses *ses);
--int build_ntlmssp_auth_blob(unsigned char *pbuffer, u16 *buflen,
-+int build_ntlmssp_auth_blob(unsigned char **pbuffer, u16 *buflen,
- struct cifs_ses *ses,
- const struct nls_table *nls_cp);
-diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
-index af0ec2d..e88ffe1 100644
---- a/fs/cifs/sess.c
-+++ b/fs/cifs/sess.c
-@@ -364,19 +364,43 @@ void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
- sec_blob->DomainName.MaximumLength = 0;
- }
-
--/* We do not malloc the blob, it is passed in pbuffer, because its
-- maximum possible size is fixed and small, making this approach cleaner.
-- This function returns the length of the data in the blob */
--int build_ntlmssp_auth_blob(unsigned char *pbuffer,
-+static int size_of_ntlmssp_blob(struct cifs_ses *ses)
-+{
-+ int sz = sizeof(AUTHENTICATE_MESSAGE) + ses->auth_key.len
-+ - CIFS_SESS_KEY_SIZE + CIFS_CPHTXT_SIZE + 2;
-+
-+ if (ses->domainName)
-+ sz += 2 * strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
-+ else
-+ sz += 2;
-+
-+ if (ses->user_name)
-+ sz += 2 * strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
-+ else
-+ sz += 2;
-+
-+ return sz;
-+}
-+
-+int build_ntlmssp_auth_blob(unsigned char **pbuffer,
- u16 *buflen,
- struct cifs_ses *ses,
- const struct nls_table *nls_cp)
- {
- int rc;
-- AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer;
-+ AUTHENTICATE_MESSAGE *sec_blob;
- __u32 flags;
- unsigned char *tmp;
-
-+ rc = setup_ntlmv2_rsp(ses, nls_cp);
-+ if (rc) {
-+ cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
-+ *buflen = 0;
-+ goto setup_ntlmv2_ret;
-+ }
-+ *pbuffer = kmalloc(size_of_ntlmssp_blob(ses), GFP_KERNEL);
-+ sec_blob = (AUTHENTICATE_MESSAGE *)*pbuffer;
-+
- memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
- sec_blob->MessageType = NtLmAuthenticate;
-
-@@ -391,7 +415,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
- }
-
-- tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
-+ tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE);
- sec_blob->NegotiateFlags = cpu_to_le32(flags);
-
- sec_blob->LmChallengeResponse.BufferOffset =
-@@ -399,13 +423,9 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- sec_blob->LmChallengeResponse.Length = 0;
- sec_blob->LmChallengeResponse.MaximumLength = 0;
-
-- sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->NtChallengeResponse.BufferOffset =
-+ cpu_to_le32(tmp - *pbuffer);
- if (ses->user_name != NULL) {
-- rc = setup_ntlmv2_rsp(ses, nls_cp);
-- if (rc) {
-- cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
-- goto setup_ntlmv2_ret;
-- }
- memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
- ses->auth_key.len - CIFS_SESS_KEY_SIZE);
- tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
-@@ -423,7 +443,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- }
-
- if (ses->domainName == NULL) {
-- sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->DomainName.Length = 0;
- sec_blob->DomainName.MaximumLength = 0;
- tmp += 2;
-@@ -432,14 +452,14 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
- CIFS_MAX_USERNAME_LEN, nls_cp);
- len *= 2; /* unicode is 2 bytes each */
-- sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->DomainName.Length = cpu_to_le16(len);
- sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
- tmp += len;
- }
-
- if (ses->user_name == NULL) {
-- sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->UserName.Length = 0;
- sec_blob->UserName.MaximumLength = 0;
- tmp += 2;
-@@ -448,13 +468,13 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
- CIFS_MAX_USERNAME_LEN, nls_cp);
- len *= 2; /* unicode is 2 bytes each */
-- sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->UserName.Length = cpu_to_le16(len);
- sec_blob->UserName.MaximumLength = cpu_to_le16(len);
- tmp += len;
- }
-
-- sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->WorkstationName.Length = 0;
- sec_blob->WorkstationName.MaximumLength = 0;
- tmp += 2;
-@@ -463,19 +483,19 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
- (ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
- && !calc_seckey(ses)) {
- memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
-- sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
- sec_blob->SessionKey.MaximumLength =
- cpu_to_le16(CIFS_CPHTXT_SIZE);
- tmp += CIFS_CPHTXT_SIZE;
- } else {
-- sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
-+ sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - *pbuffer);
- sec_blob->SessionKey.Length = 0;
- sec_blob->SessionKey.MaximumLength = 0;
- }
-
-+ *buflen = tmp - *pbuffer;
- setup_ntlmv2_ret:
-- *buflen = tmp - pbuffer;
- return rc;
- }
-
-@@ -1266,7 +1286,7 @@ sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
- struct cifs_ses *ses = sess_data->ses;
- __u16 bytes_remaining;
- char *bcc_ptr;
-- char *ntlmsspblob = NULL;
-+ unsigned char *ntlmsspblob = NULL;
- u16 blob_len;
-
- cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
-@@ -1279,19 +1299,7 @@ sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
- /* Build security blob before we assemble the request */
- pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
- smb_buf = (struct smb_hdr *)pSMB;
-- /*
-- * 5 is an empirical value, large enough to hold
-- * authenticate message plus max 10 of av paris,
-- * domain, user, workstation names, flags, etc.
-- */
-- ntlmsspblob = kzalloc(5*sizeof(struct _AUTHENTICATE_MESSAGE),
-- GFP_KERNEL);
-- if (!ntlmsspblob) {
-- rc = -ENOMEM;
-- goto out;
-- }
--
-- rc = build_ntlmssp_auth_blob(ntlmsspblob,
-+ rc = build_ntlmssp_auth_blob(&ntlmsspblob,
- &blob_len, ses, sess_data->nls_cp);
- if (rc)
- goto out_free_ntlmsspblob;
-diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
-index 8f38e33..29e06db 100644
---- a/fs/cifs/smb2pdu.c
-+++ b/fs/cifs/smb2pdu.c
-@@ -588,7 +588,7 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,
- u16 blob_length = 0;
- struct key *spnego_key = NULL;
- char *security_blob = NULL;
-- char *ntlmssp_blob = NULL;
-+ unsigned char *ntlmssp_blob = NULL;
- bool use_spnego = false; /* else use raw ntlmssp */
-
- cifs_dbg(FYI, "Session Setup\n");
-@@ -713,13 +713,7 @@ ssetup_ntlmssp_authenticate:
- iov[1].iov_len = blob_length;
- } else if (phase == NtLmAuthenticate) {
- req->hdr.SessionId = ses->Suid;
-- ntlmssp_blob = kzalloc(sizeof(struct _NEGOTIATE_MESSAGE) + 500,
-- GFP_KERNEL);
-- if (ntlmssp_blob == NULL) {
-- rc = -ENOMEM;
-- goto ssetup_exit;
-- }
-- rc = build_ntlmssp_auth_blob(ntlmssp_blob, &blob_length, ses,
-+ rc = build_ntlmssp_auth_blob(&ntlmssp_blob, &blob_length, ses,
- nls_cp);
- if (rc) {
- cifs_dbg(FYI, "build_ntlmssp_auth_blob failed %d\n",
-@@ -1818,6 +1812,33 @@ SMB2_echo(struct TCP_Server_Info *server)
-
- cifs_dbg(FYI, "In echo request\n");
-
-+ if (server->tcpStatus == CifsNeedNegotiate) {
-+ struct list_head *tmp, *tmp2;
-+ struct cifs_ses *ses;
-+ struct cifs_tcon *tcon;
-+
-+ cifs_dbg(FYI, "Need negotiate, reconnecting tcons\n");
-+ spin_lock(&cifs_tcp_ses_lock);
-+ list_for_each(tmp, &server->smb_ses_list) {
-+ ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
-+ list_for_each(tmp2, &ses->tcon_list) {
-+ tcon = list_entry(tmp2, struct cifs_tcon,
-+ tcon_list);
-+ /* add check for persistent handle reconnect */
-+ if (tcon && tcon->need_reconnect) {
-+ spin_unlock(&cifs_tcp_ses_lock);
-+ rc = smb2_reconnect(SMB2_ECHO, tcon);
-+ spin_lock(&cifs_tcp_ses_lock);
-+ }
-+ }
-+ }
-+ spin_unlock(&cifs_tcp_ses_lock);
-+ }
-+
-+ /* if no session, renegotiate failed above */
-+ if (server->tcpStatus == CifsNeedNegotiate)
-+ return -EIO;
-+
- rc = small_smb2_init(SMB2_ECHO, NULL, (void **)&req);
- if (rc)
- return rc;
-diff --git a/fs/namei.c b/fs/namei.c
-index 30145f8..aaa3b69 100644
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -3173,6 +3173,10 @@ retry_lookup:
- got_write = false;
- }
-
-+ error = follow_managed(&path, nd);
-+ if (unlikely(error < 0))
-+ return error;
-+
- if (unlikely(d_is_negative(path.dentry))) {
- path_to_nameidata(&path, nd);
- return -ENOENT;
-@@ -3188,10 +3192,6 @@ retry_lookup:
- return -EEXIST;
- }
-
-- error = follow_managed(&path, nd);
-- if (unlikely(error < 0))
-- return error;
--
- seq = 0; /* out of RCU mode, so the value doesn't matter */
- inode = d_backing_inode(path.dentry);
- finish_lookup:
-diff --git a/fs/namespace.c b/fs/namespace.c
-index 4fb1691..783004a 100644
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -2409,8 +2409,10 @@ static int do_new_mount(struct path *path, const char *fstype, int flags,
- mnt_flags |= MNT_NODEV | MNT_LOCK_NODEV;
- }
- if (type->fs_flags & FS_USERNS_VISIBLE) {
-- if (!fs_fully_visible(type, &mnt_flags))
-+ if (!fs_fully_visible(type, &mnt_flags)) {
-+ put_filesystem(type);
- return -EPERM;
-+ }
- }
- }
-
-@@ -3245,6 +3247,10 @@ static bool fs_fully_visible(struct file_system_type *type, int *new_mnt_flags)
- if (mnt->mnt.mnt_sb->s_iflags & SB_I_NOEXEC)
- mnt_flags &= ~(MNT_LOCK_NOSUID | MNT_LOCK_NOEXEC);
-
-+ /* Don't miss readonly hidden in the superblock flags */
-+ if (mnt->mnt.mnt_sb->s_flags & MS_RDONLY)
-+ mnt_flags |= MNT_LOCK_READONLY;
-+
- /* Verify the mount flags are equal to or more permissive
- * than the proposed new mount.
- */
-@@ -3271,7 +3277,7 @@ static bool fs_fully_visible(struct file_system_type *type, int *new_mnt_flags)
- list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
- struct inode *inode = child->mnt_mountpoint->d_inode;
- /* Only worry about locked mounts */
-- if (!(mnt_flags & MNT_LOCKED))
-+ if (!(child->mnt.mnt_flags & MNT_LOCKED))
- continue;
- /* Is the directory permanetly empty? */
- if (!is_empty_dir_inode(inode))
-diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
-index 33eb817..a7dd1fe 100644
---- a/fs/nfs/dir.c
-+++ b/fs/nfs/dir.c
-@@ -1527,9 +1527,9 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
- err = PTR_ERR(inode);
- trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
- put_nfs_open_context(ctx);
-+ d_drop(dentry);
- switch (err) {
- case -ENOENT:
-- d_drop(dentry);
- d_add(dentry, NULL);
- nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
- break;
-diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
-index 327b8c3..de2523f 100644
---- a/fs/nfs/nfs4proc.c
-+++ b/fs/nfs/nfs4proc.c
-@@ -2860,12 +2860,11 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
- call_close |= is_wronly;
- else if (is_wronly)
- calldata->arg.fmode |= FMODE_WRITE;
-+ if (calldata->arg.fmode != (FMODE_READ|FMODE_WRITE))
-+ call_close |= is_rdwr;
- } else if (is_rdwr)
- calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
-
-- if (calldata->arg.fmode == 0)
-- call_close |= is_rdwr;
--
- if (!nfs4_valid_open_stateid(state))
- call_close = 0;
- spin_unlock(&state->owner->so_lock);
-diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
-index 776dccb..dcb7000 100644
---- a/fs/nfs/pnfs_nfs.c
-+++ b/fs/nfs/pnfs_nfs.c
-@@ -247,7 +247,11 @@ void pnfs_fetch_commit_bucket_list(struct list_head *pages,
- }
-
- /* Helper function for pnfs_generic_commit_pagelist to catch an empty
-- * page list. This can happen when two commits race. */
-+ * page list. This can happen when two commits race.
-+ *
-+ * This must be called instead of nfs_init_commit - call one or the other, but
-+ * not both!
-+ */
- static bool
- pnfs_generic_commit_cancel_empty_pagelist(struct list_head *pages,
- struct nfs_commit_data *data,
-@@ -256,7 +260,11 @@ pnfs_generic_commit_cancel_empty_pagelist(struct list_head *pages,
- if (list_empty(pages)) {
- if (atomic_dec_and_test(&cinfo->mds->rpcs_out))
- wake_up_atomic_t(&cinfo->mds->rpcs_out);
-- nfs_commitdata_release(data);
-+ /* don't call nfs_commitdata_release - it tries to put
-+ * the open_context which is not acquired until nfs_init_commit
-+ * which has not been called on @data */
-+ WARN_ON_ONCE(data->context);
-+ nfs_commit_free(data);
- return true;
- }
-
-diff --git a/fs/nfs/read.c b/fs/nfs/read.c
-index 6776d7a..572e5b3 100644
---- a/fs/nfs/read.c
-+++ b/fs/nfs/read.c
-@@ -367,13 +367,13 @@ readpage_async_filler(void *data, struct page *page)
- nfs_list_remove_request(new);
- nfs_readpage_release(new);
- error = desc->pgio->pg_error;
-- goto out_unlock;
-+ goto out;
- }
- return 0;
- out_error:
- error = PTR_ERR(new);
--out_unlock:
- unlock_page(page);
-+out:
- return error;
- }
-
-diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c
-index 1580ea6..d08cd88 100644
---- a/fs/nfsd/nfs2acl.c
-+++ b/fs/nfsd/nfs2acl.c
-@@ -104,22 +104,21 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,
- goto out;
-
- inode = d_inode(fh->fh_dentry);
-- if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
-- error = -EOPNOTSUPP;
-- goto out_errno;
-- }
-
- error = fh_want_write(fh);
- if (error)
- goto out_errno;
-
-- error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
-+ fh_lock(fh);
-+
-+ error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
- if (error)
-- goto out_drop_write;
-- error = inode->i_op->set_acl(inode, argp->acl_default,
-- ACL_TYPE_DEFAULT);
-+ goto out_drop_lock;
-+ error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
- if (error)
-- goto out_drop_write;
-+ goto out_drop_lock;
-+
-+ fh_unlock(fh);
-
- fh_drop_write(fh);
-
-@@ -131,7 +130,8 @@ out:
- posix_acl_release(argp->acl_access);
- posix_acl_release(argp->acl_default);
- return nfserr;
--out_drop_write:
-+out_drop_lock:
-+ fh_unlock(fh);
- fh_drop_write(fh);
- out_errno:
- nfserr = nfserrno(error);
-diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c
-index 01df4cd..0c89034 100644
---- a/fs/nfsd/nfs3acl.c
-+++ b/fs/nfsd/nfs3acl.c
-@@ -95,22 +95,20 @@ static __be32 nfsd3_proc_setacl(struct svc_rqst * rqstp,
- goto out;
-
- inode = d_inode(fh->fh_dentry);
-- if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
-- error = -EOPNOTSUPP;
-- goto out_errno;
-- }
-
- error = fh_want_write(fh);
- if (error)
- goto out_errno;
-
-- error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
-+ fh_lock(fh);
-+
-+ error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
- if (error)
-- goto out_drop_write;
-- error = inode->i_op->set_acl(inode, argp->acl_default,
-- ACL_TYPE_DEFAULT);
-+ goto out_drop_lock;
-+ error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
-
--out_drop_write:
-+out_drop_lock:
-+ fh_unlock(fh);
- fh_drop_write(fh);
- out_errno:
- nfserr = nfserrno(error);
-diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
-index 6adabd6..71292a0 100644
---- a/fs/nfsd/nfs4acl.c
-+++ b/fs/nfsd/nfs4acl.c
-@@ -770,9 +770,6 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh *fhp,
- dentry = fhp->fh_dentry;
- inode = d_inode(dentry);
-
-- if (!inode->i_op->set_acl || !IS_POSIXACL(inode))
-- return nfserr_attrnotsupp;
--
- if (S_ISDIR(inode->i_mode))
- flags = NFS4_ACL_DIR;
-
-@@ -782,16 +779,19 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh *fhp,
- if (host_error < 0)
- goto out_nfserr;
-
-- host_error = inode->i_op->set_acl(inode, pacl, ACL_TYPE_ACCESS);
-+ fh_lock(fhp);
-+
-+ host_error = set_posix_acl(inode, ACL_TYPE_ACCESS, pacl);
- if (host_error < 0)
-- goto out_release;
-+ goto out_drop_lock;
-
- if (S_ISDIR(inode->i_mode)) {
-- host_error = inode->i_op->set_acl(inode, dpacl,
-- ACL_TYPE_DEFAULT);
-+ host_error = set_posix_acl(inode, ACL_TYPE_DEFAULT, dpacl);
- }
-
--out_release:
-+out_drop_lock:
-+ fh_unlock(fhp);
-+
- posix_acl_release(pacl);
- posix_acl_release(dpacl);
- out_nfserr:
-diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
-index 7389cb1..04c68d9 100644
---- a/fs/nfsd/nfs4callback.c
-+++ b/fs/nfsd/nfs4callback.c
-@@ -710,22 +710,6 @@ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc
- }
- }
-
--static struct rpc_clnt *create_backchannel_client(struct rpc_create_args *args)
--{
-- struct rpc_xprt *xprt;
--
-- if (args->protocol != XPRT_TRANSPORT_BC_TCP)
-- return rpc_create(args);
--
-- xprt = args->bc_xprt->xpt_bc_xprt;
-- if (xprt) {
-- xprt_get(xprt);
-- return rpc_create_xprt(args, xprt);
-- }
--
-- return rpc_create(args);
--}
--
- static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses)
- {
- int maxtime = max_cb_time(clp->net);
-@@ -768,7 +752,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
- args.authflavor = ses->se_cb_sec.flavor;
- }
- /* Create RPC client */
-- client = create_backchannel_client(&args);
-+ client = rpc_create(&args);
- if (IS_ERR(client)) {
- dprintk("NFSD: couldn't create callback client: %ld\n",
- PTR_ERR(client));
-diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
-index 0462eed..9e04e49 100644
---- a/fs/nfsd/nfs4state.c
-+++ b/fs/nfsd/nfs4state.c
-@@ -3487,6 +3487,10 @@ init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp,
- struct nfs4_openowner *oo = open->op_openowner;
- struct nfs4_ol_stateid *retstp = NULL;
-
-+ /* We are moving these outside of the spinlocks to avoid the warnings */
-+ mutex_init(&stp->st_mutex);
-+ mutex_lock(&stp->st_mutex);
-+
- spin_lock(&oo->oo_owner.so_client->cl_lock);
- spin_lock(&fp->fi_lock);
-
-@@ -3502,13 +3506,17 @@ init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp,
- stp->st_access_bmap = 0;
- stp->st_deny_bmap = 0;
- stp->st_openstp = NULL;
-- init_rwsem(&stp->st_rwsem);
- list_add(&stp->st_perstateowner, &oo->oo_owner.so_stateids);
- list_add(&stp->st_perfile, &fp->fi_stateids);
-
- out_unlock:
- spin_unlock(&fp->fi_lock);
- spin_unlock(&oo->oo_owner.so_client->cl_lock);
-+ if (retstp) {
-+ mutex_lock(&retstp->st_mutex);
-+ /* Not that we need to, just for neatness */
-+ mutex_unlock(&stp->st_mutex);
-+ }
- return retstp;
- }
-
-@@ -4335,32 +4343,34 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
- */
- if (stp) {
- /* Stateid was found, this is an OPEN upgrade */
-- down_read(&stp->st_rwsem);
-+ mutex_lock(&stp->st_mutex);
- status = nfs4_upgrade_open(rqstp, fp, current_fh, stp, open);
- if (status) {
-- up_read(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- goto out;
- }
- } else {
- stp = open->op_stp;
- open->op_stp = NULL;
-+ /*
-+ * init_open_stateid() either returns a locked stateid
-+ * it found, or initializes and locks the new one we passed in
-+ */
- swapstp = init_open_stateid(stp, fp, open);
- if (swapstp) {
- nfs4_put_stid(&stp->st_stid);
- stp = swapstp;
-- down_read(&stp->st_rwsem);
- status = nfs4_upgrade_open(rqstp, fp, current_fh,
- stp, open);
- if (status) {
-- up_read(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- goto out;
- }
- goto upgrade_out;
- }
-- down_read(&stp->st_rwsem);
- status = nfs4_get_vfs_file(rqstp, fp, current_fh, stp, open);
- if (status) {
-- up_read(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- release_open_stateid(stp);
- goto out;
- }
-@@ -4372,7 +4382,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
- }
- upgrade_out:
- nfs4_inc_and_copy_stateid(&open->op_stateid, &stp->st_stid);
-- up_read(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
-
- if (nfsd4_has_session(&resp->cstate)) {
- if (open->op_deleg_want & NFS4_SHARE_WANT_NO_DELEG) {
-@@ -4983,12 +4993,12 @@ static __be32 nfs4_seqid_op_checks(struct nfsd4_compound_state *cstate, stateid_
- * revoked delegations are kept only for free_stateid.
- */
- return nfserr_bad_stateid;
-- down_write(&stp->st_rwsem);
-+ mutex_lock(&stp->st_mutex);
- status = check_stateid_generation(stateid, &stp->st_stid.sc_stateid, nfsd4_has_session(cstate));
- if (status == nfs_ok)
- status = nfs4_check_fh(current_fh, &stp->st_stid);
- if (status != nfs_ok)
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- return status;
- }
-
-@@ -5036,7 +5046,7 @@ static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cs
- return status;
- oo = openowner(stp->st_stateowner);
- if (!(oo->oo_flags & NFS4_OO_CONFIRMED)) {
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- nfs4_put_stid(&stp->st_stid);
- return nfserr_bad_stateid;
- }
-@@ -5068,12 +5078,12 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
- oo = openowner(stp->st_stateowner);
- status = nfserr_bad_stateid;
- if (oo->oo_flags & NFS4_OO_CONFIRMED) {
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- goto put_stateid;
- }
- oo->oo_flags |= NFS4_OO_CONFIRMED;
- nfs4_inc_and_copy_stateid(&oc->oc_resp_stateid, &stp->st_stid);
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- dprintk("NFSD: %s: success, seqid=%d stateid=" STATEID_FMT "\n",
- __func__, oc->oc_seqid, STATEID_VAL(&stp->st_stid.sc_stateid));
-
-@@ -5149,7 +5159,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
- nfs4_inc_and_copy_stateid(&od->od_stateid, &stp->st_stid);
- status = nfs_ok;
- put_stateid:
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- nfs4_put_stid(&stp->st_stid);
- out:
- nfsd4_bump_seqid(cstate, status);
-@@ -5202,7 +5212,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
- if (status)
- goto out;
- nfs4_inc_and_copy_stateid(&close->cl_stateid, &stp->st_stid);
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
-
- nfsd4_close_open_stateid(stp);
-
-@@ -5428,7 +5438,7 @@ init_lock_stateid(struct nfs4_ol_stateid *stp, struct nfs4_lockowner *lo,
- stp->st_access_bmap = 0;
- stp->st_deny_bmap = open_stp->st_deny_bmap;
- stp->st_openstp = open_stp;
-- init_rwsem(&stp->st_rwsem);
-+ mutex_init(&stp->st_mutex);
- list_add(&stp->st_locks, &open_stp->st_locks);
- list_add(&stp->st_perstateowner, &lo->lo_owner.so_stateids);
- spin_lock(&fp->fi_lock);
-@@ -5597,7 +5607,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
- &open_stp, nn);
- if (status)
- goto out;
-- up_write(&open_stp->st_rwsem);
-+ mutex_unlock(&open_stp->st_mutex);
- open_sop = openowner(open_stp->st_stateowner);
- status = nfserr_bad_stateid;
- if (!same_clid(&open_sop->oo_owner.so_client->cl_clientid,
-@@ -5606,7 +5616,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
- status = lookup_or_create_lock_state(cstate, open_stp, lock,
- &lock_stp, &new);
- if (status == nfs_ok)
-- down_write(&lock_stp->st_rwsem);
-+ mutex_lock(&lock_stp->st_mutex);
- } else {
- status = nfs4_preprocess_seqid_op(cstate,
- lock->lk_old_lock_seqid,
-@@ -5710,7 +5720,7 @@ out:
- seqid_mutating_err(ntohl(status)))
- lock_sop->lo_owner.so_seqid++;
-
-- up_write(&lock_stp->st_rwsem);
-+ mutex_unlock(&lock_stp->st_mutex);
-
- /*
- * If this is a new, never-before-used stateid, and we are
-@@ -5880,7 +5890,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
- fput:
- fput(filp);
- put_stateid:
-- up_write(&stp->st_rwsem);
-+ mutex_unlock(&stp->st_mutex);
- nfs4_put_stid(&stp->st_stid);
- out:
- nfsd4_bump_seqid(cstate, status);
-diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
-index c050c53..c89d7b5 100644
---- a/fs/nfsd/state.h
-+++ b/fs/nfsd/state.h
-@@ -535,7 +535,7 @@ struct nfs4_ol_stateid {
- unsigned char st_access_bmap;
- unsigned char st_deny_bmap;
- struct nfs4_ol_stateid *st_openstp;
-- struct rw_semaphore st_rwsem;
-+ struct mutex st_mutex;
- };
-
- static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
-diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
-index b3fc0a3..fb35aa2 100644
---- a/fs/overlayfs/dir.c
-+++ b/fs/overlayfs/dir.c
-@@ -511,6 +511,7 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
- struct dentry *upper;
- struct dentry *opaquedir = NULL;
- int err;
-+ int flags = 0;
-
- if (WARN_ON(!workdir))
- return -EROFS;
-@@ -540,46 +541,39 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
- if (err)
- goto out_dput;
-
-- whiteout = ovl_whiteout(workdir, dentry);
-- err = PTR_ERR(whiteout);
-- if (IS_ERR(whiteout))
-+ upper = lookup_one_len(dentry->d_name.name, upperdir,
-+ dentry->d_name.len);
-+ err = PTR_ERR(upper);
-+ if (IS_ERR(upper))
- goto out_unlock;
-
-- upper = ovl_dentry_upper(dentry);
-- if (!upper) {
-- upper = lookup_one_len(dentry->d_name.name, upperdir,
-- dentry->d_name.len);
-- err = PTR_ERR(upper);
-- if (IS_ERR(upper))
-- goto kill_whiteout;
--
-- err = ovl_do_rename(wdir, whiteout, udir, upper, 0);
-- dput(upper);
-- if (err)
-- goto kill_whiteout;
-- } else {
-- int flags = 0;
-+ err = -ESTALE;
-+ if ((opaquedir && upper != opaquedir) ||
-+ (!opaquedir && ovl_dentry_upper(dentry) &&
-+ upper != ovl_dentry_upper(dentry))) {
-+ goto out_dput_upper;
-+ }
-
-- if (opaquedir)
-- upper = opaquedir;
-- err = -ESTALE;
-- if (upper->d_parent != upperdir)
-- goto kill_whiteout;
-+ whiteout = ovl_whiteout(workdir, dentry);
-+ err = PTR_ERR(whiteout);
-+ if (IS_ERR(whiteout))
-+ goto out_dput_upper;
-
-- if (is_dir)
-- flags |= RENAME_EXCHANGE;
-+ if (d_is_dir(upper))
-+ flags = RENAME_EXCHANGE;
-
-- err = ovl_do_rename(wdir, whiteout, udir, upper, flags);
-- if (err)
-- goto kill_whiteout;
-+ err = ovl_do_rename(wdir, whiteout, udir, upper, flags);
-+ if (err)
-+ goto kill_whiteout;
-+ if (flags)
-+ ovl_cleanup(wdir, upper);
-
-- if (is_dir)
-- ovl_cleanup(wdir, upper);
-- }
- ovl_dentry_version_inc(dentry->d_parent);
- out_d_drop:
- d_drop(dentry);
- dput(whiteout);
-+out_dput_upper:
-+ dput(upper);
- out_unlock:
- unlock_rename(workdir, upperdir);
- out_dput:
-diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
-index a4ff5d0..d46fa60 100644
---- a/fs/overlayfs/inode.c
-+++ b/fs/overlayfs/inode.c
-@@ -59,16 +59,40 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
- if (err)
- goto out;
-
-+ if (attr->ia_valid & ATTR_SIZE) {
-+ struct inode *realinode = d_inode(ovl_dentry_real(dentry));
-+
-+ err = -ETXTBSY;
-+ if (atomic_read(&realinode->i_writecount) < 0)
-+ goto out_drop_write;
-+ }
-+
- err = ovl_copy_up(dentry);
- if (!err) {
-+ struct inode *winode = NULL;
-+
- upperdentry = ovl_dentry_upper(dentry);
-
-+ if (attr->ia_valid & ATTR_SIZE) {
-+ winode = d_inode(upperdentry);
-+ err = get_write_access(winode);
-+ if (err)
-+ goto out_drop_write;
-+ }
-+
-+ if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
-+ attr->ia_valid &= ~ATTR_MODE;
-+
- inode_lock(upperdentry->d_inode);
- err = notify_change(upperdentry, attr, NULL);
- if (!err)
- ovl_copyattr(upperdentry->d_inode, dentry->d_inode);
- inode_unlock(upperdentry->d_inode);
-+
-+ if (winode)
-+ put_write_access(winode);
- }
-+out_drop_write:
- ovl_drop_write(dentry);
- out:
- return err;
-@@ -121,16 +145,18 @@ int ovl_permission(struct inode *inode, int mask)
-
- err = vfs_getattr(&realpath, &stat);
- if (err)
-- return err;
-+ goto out_dput;
-
-+ err = -ESTALE;
- if ((stat.mode ^ inode->i_mode) & S_IFMT)
-- return -ESTALE;
-+ goto out_dput;
-
- inode->i_mode = stat.mode;
- inode->i_uid = stat.uid;
- inode->i_gid = stat.gid;
-
-- return generic_permission(inode, mask);
-+ err = generic_permission(inode, mask);
-+ goto out_dput;
- }
-
- /* Careful in RCU walk mode */
-@@ -400,12 +426,11 @@ struct inode *ovl_new_inode(struct super_block *sb, umode_t mode,
- if (!inode)
- return NULL;
-
-- mode &= S_IFMT;
--
- inode->i_ino = get_next_ino();
- inode->i_mode = mode;
- inode->i_flags |= S_NOATIME | S_NOCMTIME;
-
-+ mode &= S_IFMT;
- switch (mode) {
- case S_IFDIR:
- inode->i_private = oe;
-diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
-index 6a7090f..294ccc0 100644
---- a/fs/overlayfs/overlayfs.h
-+++ b/fs/overlayfs/overlayfs.h
-@@ -185,6 +185,7 @@ static inline void ovl_copyattr(struct inode *from, struct inode *to)
- {
- to->i_uid = from->i_uid;
- to->i_gid = from->i_gid;
-+ to->i_mode = from->i_mode;
- }
-
- /* dir.c */
-diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
-index 791235e..7952a50f 100644
---- a/fs/overlayfs/super.c
-+++ b/fs/overlayfs/super.c
-@@ -1064,16 +1064,21 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
- /*
- * Upper should support d_type, else whiteouts are visible.
- * Given workdir and upper are on same fs, we can do
-- * iterate_dir() on workdir.
-+ * iterate_dir() on workdir. This check requires successful
-+ * creation of workdir in previous step.
- */
-- err = ovl_check_d_type_supported(&workpath);
-- if (err < 0)
-- goto out_put_workdir;
-+ if (ufs->workdir) {
-+ err = ovl_check_d_type_supported(&workpath);
-+ if (err < 0)
-+ goto out_put_workdir;
-
-- if (!err) {
-- pr_err("overlayfs: upper fs needs to support d_type.\n");
-- err = -EINVAL;
-- goto out_put_workdir;
-+ /*
-+ * We allowed this configuration and don't want to
-+ * break users over kernel upgrade. So warn instead
-+ * of erroring out.
-+ */
-+ if (!err)
-+ pr_warn("overlayfs: upper fs needs to support d_type.\n");
- }
- }
-
-diff --git a/fs/posix_acl.c b/fs/posix_acl.c
-index 711dd51..e11ea5f 100644
---- a/fs/posix_acl.c
-+++ b/fs/posix_acl.c
-@@ -786,39 +786,43 @@ posix_acl_xattr_get(const struct xattr_handler *handler,
- return error;
- }
-
--static int
--posix_acl_xattr_set(const struct xattr_handler *handler,
-- struct dentry *dentry, const char *name,
-- const void *value, size_t size, int flags)
-+int
-+set_posix_acl(struct inode *inode, int type, struct posix_acl *acl)
- {
-- struct inode *inode = d_backing_inode(dentry);
-- struct posix_acl *acl = NULL;
-- int ret;
--
- if (!IS_POSIXACL(inode))
- return -EOPNOTSUPP;
- if (!inode->i_op->set_acl)
- return -EOPNOTSUPP;
-
-- if (handler->flags == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode))
-- return value ? -EACCES : 0;
-+ if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode))
-+ return acl ? -EACCES : 0;
- if (!inode_owner_or_capable(inode))
- return -EPERM;
-
-+ if (acl) {
-+ int ret = posix_acl_valid(acl);
-+ if (ret)
-+ return ret;
-+ }
-+ return inode->i_op->set_acl(inode, acl, type);
-+}
-+EXPORT_SYMBOL(set_posix_acl);
-+
-+static int
-+posix_acl_xattr_set(const struct xattr_handler *handler,
-+ struct dentry *dentry, const char *name,
-+ const void *value, size_t size, int flags)
-+{
-+ struct inode *inode = d_backing_inode(dentry);
-+ struct posix_acl *acl = NULL;
-+ int ret;
-+
- if (value) {
- acl = posix_acl_from_xattr(&init_user_ns, value, size);
- if (IS_ERR(acl))
- return PTR_ERR(acl);
--
-- if (acl) {
-- ret = posix_acl_valid(acl);
-- if (ret)
-- goto out;
-- }
- }
--
-- ret = inode->i_op->set_acl(inode, acl, handler->flags);
--out:
-+ ret = set_posix_acl(inode, handler->flags, acl);
- posix_acl_release(acl);
- return ret;
- }
-diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
-index 446753d..5b5ec8d 100644
---- a/fs/ubifs/file.c
-+++ b/fs/ubifs/file.c
-@@ -52,6 +52,7 @@
- #include "ubifs.h"
- #include <linux/mount.h>
- #include <linux/slab.h>
-+#include <linux/migrate.h>
-
- static int read_block(struct inode *inode, void *addr, unsigned int block,
- struct ubifs_data_node *dn)
-@@ -1452,6 +1453,26 @@ static int ubifs_set_page_dirty(struct page *page)
- return ret;
- }
-
-+#ifdef CONFIG_MIGRATION
-+static int ubifs_migrate_page(struct address_space *mapping,
-+ struct page *newpage, struct page *page, enum migrate_mode mode)
-+{
-+ int rc;
-+
-+ rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0);
-+ if (rc != MIGRATEPAGE_SUCCESS)
-+ return rc;
-+
-+ if (PagePrivate(page)) {
-+ ClearPagePrivate(page);
-+ SetPagePrivate(newpage);
-+ }
-+
-+ migrate_page_copy(newpage, page);
-+ return MIGRATEPAGE_SUCCESS;
-+}
-+#endif
-+
- static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
- {
- /*
-@@ -1591,6 +1612,9 @@ const struct address_space_operations ubifs_file_address_operations = {
- .write_end = ubifs_write_end,
- .invalidatepage = ubifs_invalidatepage,
- .set_page_dirty = ubifs_set_page_dirty,
-+#ifdef CONFIG_MIGRATION
-+ .migratepage = ubifs_migrate_page,
-+#endif
- .releasepage = ubifs_releasepage,
- };
-
-diff --git a/include/asm-generic/qspinlock.h b/include/asm-generic/qspinlock.h
-index 6bd0570..05f05f1 100644
---- a/include/asm-generic/qspinlock.h
-+++ b/include/asm-generic/qspinlock.h
-@@ -22,37 +22,33 @@
- #include <asm-generic/qspinlock_types.h>
-
- /**
-+ * queued_spin_unlock_wait - wait until the _current_ lock holder releases the lock
-+ * @lock : Pointer to queued spinlock structure
-+ *
-+ * There is a very slight possibility of live-lock if the lockers keep coming
-+ * and the waiter is just unfortunate enough to not see any unlock state.
-+ */
-+#ifndef queued_spin_unlock_wait
-+extern void queued_spin_unlock_wait(struct qspinlock *lock);
-+#endif
-+
-+/**
- * queued_spin_is_locked - is the spinlock locked?
- * @lock: Pointer to queued spinlock structure
- * Return: 1 if it is locked, 0 otherwise
- */
-+#ifndef queued_spin_is_locked
- static __always_inline int queued_spin_is_locked(struct qspinlock *lock)
- {
- /*
-- * queued_spin_lock_slowpath() can ACQUIRE the lock before
-- * issuing the unordered store that sets _Q_LOCKED_VAL.
-- *
-- * See both smp_cond_acquire() sites for more detail.
-- *
-- * This however means that in code like:
-- *
-- * spin_lock(A) spin_lock(B)
-- * spin_unlock_wait(B) spin_is_locked(A)
-- * do_something() do_something()
-- *
-- * Both CPUs can end up running do_something() because the store
-- * setting _Q_LOCKED_VAL will pass through the loads in
-- * spin_unlock_wait() and/or spin_is_locked().
-+ * See queued_spin_unlock_wait().
- *
-- * Avoid this by issuing a full memory barrier between the spin_lock()
-- * and the loads in spin_unlock_wait() and spin_is_locked().
-- *
-- * Note that regular mutual exclusion doesn't care about this
-- * delayed store.
-+ * Any !0 state indicates it is locked, even if _Q_LOCKED_VAL
-+ * isn't immediately observable.
- */
-- smp_mb();
-- return atomic_read(&lock->val) & _Q_LOCKED_MASK;
-+ return atomic_read(&lock->val);
- }
-+#endif
-
- /**
- * queued_spin_value_unlocked - is the spinlock structure unlocked?
-@@ -122,21 +118,6 @@ static __always_inline void queued_spin_unlock(struct qspinlock *lock)
- }
- #endif
-
--/**
-- * queued_spin_unlock_wait - wait until current lock holder releases the lock
-- * @lock : Pointer to queued spinlock structure
-- *
-- * There is a very slight possibility of live-lock if the lockers keep coming
-- * and the waiter is just unfortunate enough to not see any unlock state.
-- */
--static inline void queued_spin_unlock_wait(struct qspinlock *lock)
--{
-- /* See queued_spin_is_locked() */
-- smp_mb();
-- while (atomic_read(&lock->val) & _Q_LOCKED_MASK)
-- cpu_relax();
--}
--
- #ifndef virt_spin_lock
- static __always_inline bool virt_spin_lock(struct qspinlock *lock)
- {
-diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
-index 055a08d..a74c49d 100644
---- a/include/drm/ttm/ttm_bo_api.h
-+++ b/include/drm/ttm/ttm_bo_api.h
-@@ -316,6 +316,20 @@ ttm_bo_reference(struct ttm_buffer_object *bo)
- */
- extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
- bool interruptible, bool no_wait);
-+
-+/**
-+ * ttm_bo_mem_compat - Check if proposed placement is compatible with a bo
-+ *
-+ * @placement: Return immediately if buffer is busy.
-+ * @mem: The struct ttm_mem_reg indicating the region where the bo resides
-+ * @new_flags: Describes compatible placement found
-+ *
-+ * Returns true if the placement is compatible
-+ */
-+extern bool ttm_bo_mem_compat(struct ttm_placement *placement,
-+ struct ttm_mem_reg *mem,
-+ uint32_t *new_flags);
-+
- /**
- * ttm_bo_validate
- *
-diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
-index 786ad32..07b83d3 100644
---- a/include/linux/cpuidle.h
-+++ b/include/linux/cpuidle.h
-@@ -152,6 +152,8 @@ extern void cpuidle_disable_device(struct cpuidle_device *dev);
- extern int cpuidle_play_dead(void);
-
- extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
-+static inline struct cpuidle_device *cpuidle_get_device(void)
-+{return __this_cpu_read(cpuidle_devices); }
- #else
- static inline void disable_cpuidle(void) { }
- static inline bool cpuidle_not_available(struct cpuidle_driver *drv,
-@@ -187,6 +189,7 @@ static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
- static inline int cpuidle_play_dead(void) {return -ENODEV; }
- static inline struct cpuidle_driver *cpuidle_get_cpu_driver(
- struct cpuidle_device *dev) {return NULL; }
-+static inline struct cpuidle_device *cpuidle_get_device(void) {return NULL; }
- #endif
-
- #if defined(CONFIG_CPU_IDLE) && defined(CONFIG_SUSPEND)
-diff --git a/include/linux/dcache.h b/include/linux/dcache.h
-index 7e9422c..ad5d582 100644
---- a/include/linux/dcache.h
-+++ b/include/linux/dcache.h
-@@ -576,5 +576,17 @@ static inline struct inode *vfs_select_inode(struct dentry *dentry,
- return inode;
- }
-
-+/**
-+ * d_real_inode - Return the real inode
-+ * @dentry: The dentry to query
-+ *
-+ * If dentry is on an union/overlay, then return the underlying, real inode.
-+ * Otherwise return d_inode().
-+ */
-+static inline struct inode *d_real_inode(struct dentry *dentry)
-+{
-+ return d_backing_inode(d_real(dentry));
-+}
-+
-
- #endif /* __LINUX_DCACHE_H */
-diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
-index 0536524..6890446 100644
---- a/include/linux/jump_label.h
-+++ b/include/linux/jump_label.h
-@@ -117,13 +117,18 @@ struct module;
-
- #include <linux/atomic.h>
-
-+#ifdef HAVE_JUMP_LABEL
-+
- static inline int static_key_count(struct static_key *key)
- {
-- return atomic_read(&key->enabled);
-+ /*
-+ * -1 means the first static_key_slow_inc() is in progress.
-+ * static_key_enabled() must return true, so return 1 here.
-+ */
-+ int n = atomic_read(&key->enabled);
-+ return n >= 0 ? n : 1;
- }
-
--#ifdef HAVE_JUMP_LABEL
--
- #define JUMP_TYPE_FALSE 0UL
- #define JUMP_TYPE_TRUE 1UL
- #define JUMP_TYPE_MASK 1UL
-@@ -162,6 +167,11 @@ extern void jump_label_apply_nops(struct module *mod);
-
- #else /* !HAVE_JUMP_LABEL */
-
-+static inline int static_key_count(struct static_key *key)
-+{
-+ return atomic_read(&key->enabled);
-+}
-+
- static __always_inline void jump_label_init(void)
- {
- static_key_initialized = true;
-diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
-index 15d0df9..794b924 100644
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -1062,6 +1062,7 @@ __skb_set_sw_hash(struct sk_buff *skb, __u32 hash, bool is_l4)
- }
-
- void __skb_get_hash(struct sk_buff *skb);
-+u32 __skb_get_hash_symmetric(struct sk_buff *skb);
- u32 skb_get_poff(const struct sk_buff *skb);
- u32 __skb_get_poff(const struct sk_buff *skb, void *data,
- const struct flow_keys *keys, int hlen);
-@@ -2860,6 +2861,25 @@ static inline void skb_postpush_rcsum(struct sk_buff *skb,
- }
-
- /**
-+ * skb_push_rcsum - push skb and update receive checksum
-+ * @skb: buffer to update
-+ * @len: length of data pulled
-+ *
-+ * This function performs an skb_push on the packet and updates
-+ * the CHECKSUM_COMPLETE checksum. It should be used on
-+ * receive path processing instead of skb_push unless you know
-+ * that the checksum difference is zero (e.g., a valid IP header)
-+ * or you are setting ip_summed to CHECKSUM_NONE.
-+ */
-+static inline unsigned char *skb_push_rcsum(struct sk_buff *skb,
-+ unsigned int len)
-+{
-+ skb_push(skb, len);
-+ skb_postpush_rcsum(skb, skb->data, len);
-+ return skb->data;
-+}
-+
-+/**
- * pskb_trim_rcsum - trim received skb and update checksum
- * @skb: buffer to trim
- * @len: new length
-diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h
-index 9a7ddba..14d70f5 100644
---- a/include/linux/sunrpc/clnt.h
-+++ b/include/linux/sunrpc/clnt.h
-@@ -137,8 +137,6 @@ struct rpc_create_args {
- #define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
-
- struct rpc_clnt *rpc_create(struct rpc_create_args *args);
--struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
-- struct rpc_xprt *xprt);
- struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
- const struct rpc_program *, u32);
- struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
-diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
-index b7dabc4..79ba508 100644
---- a/include/linux/sunrpc/svc_xprt.h
-+++ b/include/linux/sunrpc/svc_xprt.h
-@@ -84,6 +84,7 @@ struct svc_xprt {
-
- struct net *xpt_net;
- struct rpc_xprt *xpt_bc_xprt; /* NFSv4.1 backchannel */
-+ struct rpc_xprt_switch *xpt_bc_xps; /* NFSv4.1 backchannel */
- };
-
- static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u)
-diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
-index fb0d212..9f51e1d 100644
---- a/include/linux/sunrpc/xprt.h
-+++ b/include/linux/sunrpc/xprt.h
-@@ -296,6 +296,7 @@ struct xprt_create {
- size_t addrlen;
- const char *servername;
- struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
-+ struct rpc_xprt_switch *bc_xps;
- unsigned int flags;
- };
-
-diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h
-index 966889a..e479033 100644
---- a/include/linux/usb/ehci_def.h
-+++ b/include/linux/usb/ehci_def.h
-@@ -180,11 +180,11 @@ struct ehci_regs {
- * PORTSCx
- */
- /* HOSTPC: offset 0x84 */
-- u32 hostpc[1]; /* HOSTPC extension */
-+ u32 hostpc[0]; /* HOSTPC extension */
- #define HOSTPC_PHCD (1<<22) /* Phy clock disable */
- #define HOSTPC_PSPD (3<<25) /* Port speed detection */
-
-- u32 reserved5[16];
-+ u32 reserved5[17];
-
- /* USBMODE_EX: offset 0xc8 */
- u32 usbmode_ex; /* USB Device mode extension */
-diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
-index fb2cef4..b8334a6 100644
---- a/include/rdma/ib_verbs.h
-+++ b/include/rdma/ib_verbs.h
-@@ -217,7 +217,7 @@ enum ib_device_cap_flags {
- IB_DEVICE_CROSS_CHANNEL = (1 << 27),
- IB_DEVICE_MANAGED_FLOW_STEERING = (1 << 29),
- IB_DEVICE_SIGNATURE_HANDOVER = (1 << 30),
-- IB_DEVICE_ON_DEMAND_PAGING = (1 << 31),
-+ IB_DEVICE_ON_DEMAND_PAGING = (1ULL << 31),
- IB_DEVICE_SG_GAPS_REG = (1ULL << 32),
- IB_DEVICE_VIRTUAL_FUNCTION = ((u64)1 << 33),
- };
-diff --git a/include/rdma/rdma_vt.h b/include/rdma/rdma_vt.h
-index a869655..6ee9d97 100644
---- a/include/rdma/rdma_vt.h
-+++ b/include/rdma/rdma_vt.h
-@@ -203,7 +203,9 @@ struct rvt_driver_provided {
-
- /*
- * Allocate a private queue pair data structure for driver specific
-- * information which is opaque to rdmavt.
-+ * information which is opaque to rdmavt. Errors are returned via
-+ * ERR_PTR(err). The driver is free to return NULL or a valid
-+ * pointer.
- */
- void * (*qp_priv_alloc)(struct rvt_dev_info *rdi, struct rvt_qp *qp,
- gfp_t gfp);
-diff --git a/kernel/futex.c b/kernel/futex.c
-index c20f06f..6555d54 100644
---- a/kernel/futex.c
-+++ b/kernel/futex.c
-@@ -469,7 +469,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
- {
- unsigned long address = (unsigned long)uaddr;
- struct mm_struct *mm = current->mm;
-- struct page *page;
-+ struct page *page, *tail;
- struct address_space *mapping;
- int err, ro = 0;
-
-@@ -530,7 +530,15 @@ again:
- * considered here and page lock forces unnecessarily serialization
- * From this point on, mapping will be re-verified if necessary and
- * page lock will be acquired only if it is unavoidable
-- */
-+ *
-+ * Mapping checks require the head page for any compound page so the
-+ * head page and mapping is looked up now. For anonymous pages, it
-+ * does not matter if the page splits in the future as the key is
-+ * based on the address. For filesystem-backed pages, the tail is
-+ * required as the index of the page determines the key. For
-+ * base pages, there is no tail page and tail == page.
-+ */
-+ tail = page;
- page = compound_head(page);
- mapping = READ_ONCE(page->mapping);
-
-@@ -654,7 +662,7 @@ again:
-
- key->both.offset |= FUT_OFF_INODE; /* inode-based key */
- key->shared.inode = inode;
-- key->shared.pgoff = basepage_index(page);
-+ key->shared.pgoff = basepage_index(tail);
- rcu_read_unlock();
- }
-
-diff --git a/kernel/jump_label.c b/kernel/jump_label.c
-index 05254ee..4b353e0 100644
---- a/kernel/jump_label.c
-+++ b/kernel/jump_label.c
-@@ -58,13 +58,36 @@ static void jump_label_update(struct static_key *key);
-
- void static_key_slow_inc(struct static_key *key)
- {
-+ int v, v1;
-+
- STATIC_KEY_CHECK_USE();
-- if (atomic_inc_not_zero(&key->enabled))
-- return;
-+
-+ /*
-+ * Careful if we get concurrent static_key_slow_inc() calls;
-+ * later calls must wait for the first one to _finish_ the
-+ * jump_label_update() process. At the same time, however,
-+ * the jump_label_update() call below wants to see
-+ * static_key_enabled(&key) for jumps to be updated properly.
-+ *
-+ * So give a special meaning to negative key->enabled: it sends
-+ * static_key_slow_inc() down the slow path, and it is non-zero
-+ * so it counts as "enabled" in jump_label_update(). Note that
-+ * atomic_inc_unless_negative() checks >= 0, so roll our own.
-+ */
-+ for (v = atomic_read(&key->enabled); v > 0; v = v1) {
-+ v1 = atomic_cmpxchg(&key->enabled, v, v + 1);
-+ if (likely(v1 == v))
-+ return;
-+ }
-
- jump_label_lock();
-- if (atomic_inc_return(&key->enabled) == 1)
-+ if (atomic_read(&key->enabled) == 0) {
-+ atomic_set(&key->enabled, -1);
- jump_label_update(key);
-+ atomic_set(&key->enabled, 1);
-+ } else {
-+ atomic_inc(&key->enabled);
-+ }
- jump_label_unlock();
- }
- EXPORT_SYMBOL_GPL(static_key_slow_inc);
-@@ -72,6 +95,13 @@ EXPORT_SYMBOL_GPL(static_key_slow_inc);
- static void __static_key_slow_dec(struct static_key *key,
- unsigned long rate_limit, struct delayed_work *work)
- {
-+ /*
-+ * The negative count check is valid even when a negative
-+ * key->enabled is in use by static_key_slow_inc(); a
-+ * __static_key_slow_dec() before the first static_key_slow_inc()
-+ * returns is unbalanced, because all other static_key_slow_inc()
-+ * instances block while the update is in progress.
-+ */
- if (!atomic_dec_and_mutex_lock(&key->enabled, &jump_label_mutex)) {
- WARN(atomic_read(&key->enabled) < 0,
- "jump label: negative count!\n");
-diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
-index e364b42..79d2d76 100644
---- a/kernel/locking/mutex.c
-+++ b/kernel/locking/mutex.c
-@@ -486,9 +486,6 @@ __ww_mutex_lock_check_stamp(struct mutex *lock, struct ww_acquire_ctx *ctx)
- if (!hold_ctx)
- return 0;
-
-- if (unlikely(ctx == hold_ctx))
-- return -EALREADY;
--
- if (ctx->stamp - hold_ctx->stamp <= LONG_MAX &&
- (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) {
- #ifdef CONFIG_DEBUG_MUTEXES
-@@ -514,6 +511,12 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
- unsigned long flags;
- int ret;
-
-+ if (use_ww_ctx) {
-+ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base);
-+ if (unlikely(ww_ctx == READ_ONCE(ww->ctx)))
-+ return -EALREADY;
-+ }
-+
- preempt_disable();
- mutex_acquire_nest(&lock->dep_map, subclass, 0, nest_lock, ip);
-
-diff --git a/kernel/locking/qspinlock.c b/kernel/locking/qspinlock.c
-index ce2f75e..5fc8c31 100644
---- a/kernel/locking/qspinlock.c
-+++ b/kernel/locking/qspinlock.c
-@@ -267,6 +267,66 @@ static __always_inline u32 __pv_wait_head_or_lock(struct qspinlock *lock,
- #define queued_spin_lock_slowpath native_queued_spin_lock_slowpath
- #endif
-
-+/*
-+ * queued_spin_lock_slowpath() can (load-)ACQUIRE the lock before
-+ * issuing an _unordered_ store to set _Q_LOCKED_VAL.
-+ *
-+ * This means that the store can be delayed, but no later than the
-+ * store-release from the unlock. This means that simply observing
-+ * _Q_LOCKED_VAL is not sufficient to determine if the lock is acquired.
-+ *
-+ * There are two paths that can issue the unordered store:
-+ *
-+ * (1) clear_pending_set_locked(): *,1,0 -> *,0,1
-+ *
-+ * (2) set_locked(): t,0,0 -> t,0,1 ; t != 0
-+ * atomic_cmpxchg_relaxed(): t,0,0 -> 0,0,1
-+ *
-+ * However, in both cases we have other !0 state we've set before to queue
-+ * ourseves:
-+ *
-+ * For (1) we have the atomic_cmpxchg_acquire() that set _Q_PENDING_VAL, our
-+ * load is constrained by that ACQUIRE to not pass before that, and thus must
-+ * observe the store.
-+ *
-+ * For (2) we have a more intersting scenario. We enqueue ourselves using
-+ * xchg_tail(), which ends up being a RELEASE. This in itself is not
-+ * sufficient, however that is followed by an smp_cond_acquire() on the same
-+ * word, giving a RELEASE->ACQUIRE ordering. This again constrains our load and
-+ * guarantees we must observe that store.
-+ *
-+ * Therefore both cases have other !0 state that is observable before the
-+ * unordered locked byte store comes through. This means we can use that to
-+ * wait for the lock store, and then wait for an unlock.
-+ */
-+#ifndef queued_spin_unlock_wait
-+void queued_spin_unlock_wait(struct qspinlock *lock)
-+{
-+ u32 val;
-+
-+ for (;;) {
-+ val = atomic_read(&lock->val);
-+
-+ if (!val) /* not locked, we're done */
-+ goto done;
-+
-+ if (val & _Q_LOCKED_MASK) /* locked, go wait for unlock */
-+ break;
-+
-+ /* not locked, but pending, wait until we observe the lock */
-+ cpu_relax();
-+ }
-+
-+ /* any unlock is good */
-+ while (atomic_read(&lock->val) & _Q_LOCKED_MASK)
-+ cpu_relax();
-+
-+done:
-+ smp_rmb(); /* CTRL + RMB -> ACQUIRE */
-+}
-+EXPORT_SYMBOL(queued_spin_unlock_wait);
-+#endif
-+
- #endif /* _GEN_PV_LOCK_SLOWPATH */
-
- /**
-diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
-index e7dd0ec..eeaf920 100644
---- a/kernel/sched/fair.c
-+++ b/kernel/sched/fair.c
-@@ -2821,6 +2821,23 @@ static inline void update_tg_load_avg(struct cfs_rq *cfs_rq, int force) {}
-
- static inline u64 cfs_rq_clock_task(struct cfs_rq *cfs_rq);
-
-+/*
-+ * Unsigned subtract and clamp on underflow.
-+ *
-+ * Explicitly do a load-store to ensure the intermediate value never hits
-+ * memory. This allows lockless observations without ever seeing the negative
-+ * values.
-+ */
-+#define sub_positive(_ptr, _val) do { \
-+ typeof(_ptr) ptr = (_ptr); \
-+ typeof(*ptr) val = (_val); \
-+ typeof(*ptr) res, var = READ_ONCE(*ptr); \
-+ res = var - val; \
-+ if (res > var) \
-+ res = 0; \
-+ WRITE_ONCE(*ptr, res); \
-+} while (0)
-+
- /* Group cfs_rq's load_avg is used for task_h_load and update_cfs_share */
- static inline int update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
- {
-@@ -2829,15 +2846,15 @@ static inline int update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
-
- if (atomic_long_read(&cfs_rq->removed_load_avg)) {
- s64 r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0);
-- sa->load_avg = max_t(long, sa->load_avg - r, 0);
-- sa->load_sum = max_t(s64, sa->load_sum - r * LOAD_AVG_MAX, 0);
-+ sub_positive(&sa->load_avg, r);
-+ sub_positive(&sa->load_sum, r * LOAD_AVG_MAX);
- removed = 1;
- }
-
- if (atomic_long_read(&cfs_rq->removed_util_avg)) {
- long r = atomic_long_xchg(&cfs_rq->removed_util_avg, 0);
-- sa->util_avg = max_t(long, sa->util_avg - r, 0);
-- sa->util_sum = max_t(s32, sa->util_sum - r * LOAD_AVG_MAX, 0);
-+ sub_positive(&sa->util_avg, r);
-+ sub_positive(&sa->util_sum, r * LOAD_AVG_MAX);
- }
-
- decayed = __update_load_avg(now, cpu_of(rq_of(cfs_rq)), sa,
-@@ -2927,10 +2944,10 @@ static void detach_entity_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *s
- &se->avg, se->on_rq * scale_load_down(se->load.weight),
- cfs_rq->curr == se, NULL);
-
-- cfs_rq->avg.load_avg = max_t(long, cfs_rq->avg.load_avg - se->avg.load_avg, 0);
-- cfs_rq->avg.load_sum = max_t(s64, cfs_rq->avg.load_sum - se->avg.load_sum, 0);
-- cfs_rq->avg.util_avg = max_t(long, cfs_rq->avg.util_avg - se->avg.util_avg, 0);
-- cfs_rq->avg.util_sum = max_t(s32, cfs_rq->avg.util_sum - se->avg.util_sum, 0);
-+ sub_positive(&cfs_rq->avg.load_avg, se->avg.load_avg);
-+ sub_positive(&cfs_rq->avg.load_sum, se->avg.load_sum);
-+ sub_positive(&cfs_rq->avg.util_avg, se->avg.util_avg);
-+ sub_positive(&cfs_rq->avg.util_sum, se->avg.util_sum);
- }
-
- /* Add the load generated by se into cfs_rq's load average */
-diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
-index bd12c6c..c5aeedf 100644
---- a/kernel/sched/idle.c
-+++ b/kernel/sched/idle.c
-@@ -127,7 +127,7 @@ static int call_cpuidle(struct cpuidle_driver *drv, struct cpuidle_device *dev,
- */
- static void cpuidle_idle_call(void)
- {
-- struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
-+ struct cpuidle_device *dev = cpuidle_get_device();
- struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
- int next_state, entered_state;
-
-diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
-index f96f038..ad1d616 100644
---- a/kernel/trace/trace_printk.c
-+++ b/kernel/trace/trace_printk.c
-@@ -36,6 +36,10 @@ struct trace_bprintk_fmt {
- static inline struct trace_bprintk_fmt *lookup_format(const char *fmt)
- {
- struct trace_bprintk_fmt *pos;
-+
-+ if (!fmt)
-+ return ERR_PTR(-EINVAL);
-+
- list_for_each_entry(pos, &trace_bprintk_fmt_list, list) {
- if (!strcmp(pos->fmt, fmt))
- return pos;
-@@ -57,7 +61,8 @@ void hold_module_trace_bprintk_format(const char **start, const char **end)
- for (iter = start; iter < end; iter++) {
- struct trace_bprintk_fmt *tb_fmt = lookup_format(*iter);
- if (tb_fmt) {
-- *iter = tb_fmt->fmt;
-+ if (!IS_ERR(tb_fmt))
-+ *iter = tb_fmt->fmt;
- continue;
- }
-
-diff --git a/mm/migrate.c b/mm/migrate.c
-index f9dfb18..bdf3410 100644
---- a/mm/migrate.c
-+++ b/mm/migrate.c
-@@ -431,6 +431,7 @@ int migrate_page_move_mapping(struct address_space *mapping,
-
- return MIGRATEPAGE_SUCCESS;
- }
-+EXPORT_SYMBOL(migrate_page_move_mapping);
-
- /*
- * The expected number of remaining references is the same as that
-@@ -586,6 +587,7 @@ void migrate_page_copy(struct page *newpage, struct page *page)
-
- mem_cgroup_migrate(page, newpage);
- }
-+EXPORT_SYMBOL(migrate_page_copy);
-
- /************************************************************
- * Migration functions
-diff --git a/mm/page-writeback.c b/mm/page-writeback.c
-index bc5149d..e389f0a 100644
---- a/mm/page-writeback.c
-+++ b/mm/page-writeback.c
-@@ -369,8 +369,9 @@ static void domain_dirty_limits(struct dirty_throttle_control *dtc)
- struct dirty_throttle_control *gdtc = mdtc_gdtc(dtc);
- unsigned long bytes = vm_dirty_bytes;
- unsigned long bg_bytes = dirty_background_bytes;
-- unsigned long ratio = vm_dirty_ratio;
-- unsigned long bg_ratio = dirty_background_ratio;
-+ /* convert ratios to per-PAGE_SIZE for higher precision */
-+ unsigned long ratio = (vm_dirty_ratio * PAGE_SIZE) / 100;
-+ unsigned long bg_ratio = (dirty_background_ratio * PAGE_SIZE) / 100;
- unsigned long thresh;
- unsigned long bg_thresh;
- struct task_struct *tsk;
-@@ -382,26 +383,28 @@ static void domain_dirty_limits(struct dirty_throttle_control *dtc)
- /*
- * The byte settings can't be applied directly to memcg
- * domains. Convert them to ratios by scaling against
-- * globally available memory.
-+ * globally available memory. As the ratios are in
-+ * per-PAGE_SIZE, they can be obtained by dividing bytes by
-+ * number of pages.
- */
- if (bytes)
-- ratio = min(DIV_ROUND_UP(bytes, PAGE_SIZE) * 100 /
-- global_avail, 100UL);
-+ ratio = min(DIV_ROUND_UP(bytes, global_avail),
-+ PAGE_SIZE);
- if (bg_bytes)
-- bg_ratio = min(DIV_ROUND_UP(bg_bytes, PAGE_SIZE) * 100 /
-- global_avail, 100UL);
-+ bg_ratio = min(DIV_ROUND_UP(bg_bytes, global_avail),
-+ PAGE_SIZE);
- bytes = bg_bytes = 0;
- }
-
- if (bytes)
- thresh = DIV_ROUND_UP(bytes, PAGE_SIZE);
- else
-- thresh = (ratio * available_memory) / 100;
-+ thresh = (ratio * available_memory) / PAGE_SIZE;
-
- if (bg_bytes)
- bg_thresh = DIV_ROUND_UP(bg_bytes, PAGE_SIZE);
- else
-- bg_thresh = (bg_ratio * available_memory) / 100;
-+ bg_thresh = (bg_ratio * available_memory) / PAGE_SIZE;
-
- if (bg_thresh >= thresh)
- bg_thresh = thresh / 2;
-diff --git a/mm/percpu.c b/mm/percpu.c
-index 0c59684..9903830 100644
---- a/mm/percpu.c
-+++ b/mm/percpu.c
-@@ -112,7 +112,7 @@ struct pcpu_chunk {
- int map_used; /* # of map entries used before the sentry */
- int map_alloc; /* # of map entries allocated */
- int *map; /* allocation map */
-- struct work_struct map_extend_work;/* async ->map[] extension */
-+ struct list_head map_extend_list;/* on pcpu_map_extend_chunks */
-
- void *data; /* chunk data */
- int first_free; /* no free below this */
-@@ -162,10 +162,13 @@ static struct pcpu_chunk *pcpu_reserved_chunk;
- static int pcpu_reserved_chunk_limit;
-
- static DEFINE_SPINLOCK(pcpu_lock); /* all internal data structures */
--static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop */
-+static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop, map ext */
-
- static struct list_head *pcpu_slot __read_mostly; /* chunk list slots */
-
-+/* chunks which need their map areas extended, protected by pcpu_lock */
-+static LIST_HEAD(pcpu_map_extend_chunks);
-+
- /*
- * The number of empty populated pages, protected by pcpu_lock. The
- * reserved chunk doesn't contribute to the count.
-@@ -395,13 +398,19 @@ static int pcpu_need_to_extend(struct pcpu_chunk *chunk, bool is_atomic)
- {
- int margin, new_alloc;
-
-+ lockdep_assert_held(&pcpu_lock);
-+
- if (is_atomic) {
- margin = 3;
-
- if (chunk->map_alloc <
-- chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW &&
-- pcpu_async_enabled)
-- schedule_work(&chunk->map_extend_work);
-+ chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW) {
-+ if (list_empty(&chunk->map_extend_list)) {
-+ list_add_tail(&chunk->map_extend_list,
-+ &pcpu_map_extend_chunks);
-+ pcpu_schedule_balance_work();
-+ }
-+ }
- } else {
- margin = PCPU_ATOMIC_MAP_MARGIN_HIGH;
- }
-@@ -435,6 +444,8 @@ static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc)
- size_t old_size = 0, new_size = new_alloc * sizeof(new[0]);
- unsigned long flags;
-
-+ lockdep_assert_held(&pcpu_alloc_mutex);
-+
- new = pcpu_mem_zalloc(new_size);
- if (!new)
- return -ENOMEM;
-@@ -467,20 +478,6 @@ out_unlock:
- return 0;
- }
-
--static void pcpu_map_extend_workfn(struct work_struct *work)
--{
-- struct pcpu_chunk *chunk = container_of(work, struct pcpu_chunk,
-- map_extend_work);
-- int new_alloc;
--
-- spin_lock_irq(&pcpu_lock);
-- new_alloc = pcpu_need_to_extend(chunk, false);
-- spin_unlock_irq(&pcpu_lock);
--
-- if (new_alloc)
-- pcpu_extend_area_map(chunk, new_alloc);
--}
--
- /**
- * pcpu_fit_in_area - try to fit the requested allocation in a candidate area
- * @chunk: chunk the candidate area belongs to
-@@ -740,7 +737,7 @@ static struct pcpu_chunk *pcpu_alloc_chunk(void)
- chunk->map_used = 1;
-
- INIT_LIST_HEAD(&chunk->list);
-- INIT_WORK(&chunk->map_extend_work, pcpu_map_extend_workfn);
-+ INIT_LIST_HEAD(&chunk->map_extend_list);
- chunk->free_size = pcpu_unit_size;
- chunk->contig_hint = pcpu_unit_size;
-
-@@ -895,6 +892,9 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved,
- return NULL;
- }
-
-+ if (!is_atomic)
-+ mutex_lock(&pcpu_alloc_mutex);
-+
- spin_lock_irqsave(&pcpu_lock, flags);
-
- /* serve reserved allocations from the reserved chunk if available */
-@@ -967,12 +967,9 @@ restart:
- if (is_atomic)
- goto fail;
-
-- mutex_lock(&pcpu_alloc_mutex);
--
- if (list_empty(&pcpu_slot[pcpu_nr_slots - 1])) {
- chunk = pcpu_create_chunk();
- if (!chunk) {
-- mutex_unlock(&pcpu_alloc_mutex);
- err = "failed to allocate new chunk";
- goto fail;
- }
-@@ -983,7 +980,6 @@ restart:
- spin_lock_irqsave(&pcpu_lock, flags);
- }
-
-- mutex_unlock(&pcpu_alloc_mutex);
- goto restart;
-
- area_found:
-@@ -993,8 +989,6 @@ area_found:
- if (!is_atomic) {
- int page_start, page_end, rs, re;
-
-- mutex_lock(&pcpu_alloc_mutex);
--
- page_start = PFN_DOWN(off);
- page_end = PFN_UP(off + size);
-
-@@ -1005,7 +999,6 @@ area_found:
-
- spin_lock_irqsave(&pcpu_lock, flags);
- if (ret) {
-- mutex_unlock(&pcpu_alloc_mutex);
- pcpu_free_area(chunk, off, &occ_pages);
- err = "failed to populate";
- goto fail_unlock;
-@@ -1045,6 +1038,8 @@ fail:
- /* see the flag handling in pcpu_blance_workfn() */
- pcpu_atomic_alloc_failed = true;
- pcpu_schedule_balance_work();
-+ } else {
-+ mutex_unlock(&pcpu_alloc_mutex);
- }
- return NULL;
- }
-@@ -1129,6 +1124,7 @@ static void pcpu_balance_workfn(struct work_struct *work)
- if (chunk == list_first_entry(free_head, struct pcpu_chunk, list))
- continue;
-
-+ list_del_init(&chunk->map_extend_list);
- list_move(&chunk->list, &to_free);
- }
-
-@@ -1146,6 +1142,25 @@ static void pcpu_balance_workfn(struct work_struct *work)
- pcpu_destroy_chunk(chunk);
- }
-
-+ /* service chunks which requested async area map extension */
-+ do {
-+ int new_alloc = 0;
-+
-+ spin_lock_irq(&pcpu_lock);
-+
-+ chunk = list_first_entry_or_null(&pcpu_map_extend_chunks,
-+ struct pcpu_chunk, map_extend_list);
-+ if (chunk) {
-+ list_del_init(&chunk->map_extend_list);
-+ new_alloc = pcpu_need_to_extend(chunk, false);
-+ }
-+
-+ spin_unlock_irq(&pcpu_lock);
-+
-+ if (new_alloc)
-+ pcpu_extend_area_map(chunk, new_alloc);
-+ } while (chunk);
-+
- /*
- * Ensure there are certain number of free populated pages for
- * atomic allocs. Fill up from the most packed so that atomic
-@@ -1644,7 +1659,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
- */
- schunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0);
- INIT_LIST_HEAD(&schunk->list);
-- INIT_WORK(&schunk->map_extend_work, pcpu_map_extend_workfn);
-+ INIT_LIST_HEAD(&schunk->map_extend_list);
- schunk->base_addr = base_addr;
- schunk->map = smap;
- schunk->map_alloc = ARRAY_SIZE(smap);
-@@ -1673,7 +1688,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
- if (dyn_size) {
- dchunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0);
- INIT_LIST_HEAD(&dchunk->list);
-- INIT_WORK(&dchunk->map_extend_work, pcpu_map_extend_workfn);
-+ INIT_LIST_HEAD(&dchunk->map_extend_list);
- dchunk->base_addr = base_addr;
- dchunk->map = dmap;
- dchunk->map_alloc = ARRAY_SIZE(dmap);
-diff --git a/mm/shmem.c b/mm/shmem.c
-index 719bd6b..9ca09f5 100644
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -2236,9 +2236,11 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset,
- NULL);
- if (error) {
- /* Remove the !PageUptodate pages we added */
-- shmem_undo_range(inode,
-- (loff_t)start << PAGE_SHIFT,
-- (loff_t)index << PAGE_SHIFT, true);
-+ if (index > start) {
-+ shmem_undo_range(inode,
-+ (loff_t)start << PAGE_SHIFT,
-+ ((loff_t)index << PAGE_SHIFT) - 1, true);
-+ }
- goto undone;
- }
-
-diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
-index a669dea..61ad43f 100644
---- a/net/core/flow_dissector.c
-+++ b/net/core/flow_dissector.c
-@@ -651,6 +651,23 @@ void make_flow_keys_digest(struct flow_keys_digest *digest,
- }
- EXPORT_SYMBOL(make_flow_keys_digest);
-
-+static struct flow_dissector flow_keys_dissector_symmetric __read_mostly;
-+
-+u32 __skb_get_hash_symmetric(struct sk_buff *skb)
-+{
-+ struct flow_keys keys;
-+
-+ __flow_hash_secret_init();
-+
-+ memset(&keys, 0, sizeof(keys));
-+ __skb_flow_dissect(skb, &flow_keys_dissector_symmetric, &keys,
-+ NULL, 0, 0, 0,
-+ FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
-+
-+ return __flow_hash_from_keys(&keys, hashrnd);
-+}
-+EXPORT_SYMBOL_GPL(__skb_get_hash_symmetric);
-+
- /**
- * __skb_get_hash: calculate a flow hash
- * @skb: sk_buff to calculate flow hash from
-@@ -868,6 +885,29 @@ static const struct flow_dissector_key flow_keys_dissector_keys[] = {
- },
- };
-
-+static const struct flow_dissector_key flow_keys_dissector_symmetric_keys[] = {
-+ {
-+ .key_id = FLOW_DISSECTOR_KEY_CONTROL,
-+ .offset = offsetof(struct flow_keys, control),
-+ },
-+ {
-+ .key_id = FLOW_DISSECTOR_KEY_BASIC,
-+ .offset = offsetof(struct flow_keys, basic),
-+ },
-+ {
-+ .key_id = FLOW_DISSECTOR_KEY_IPV4_ADDRS,
-+ .offset = offsetof(struct flow_keys, addrs.v4addrs),
-+ },
-+ {
-+ .key_id = FLOW_DISSECTOR_KEY_IPV6_ADDRS,
-+ .offset = offsetof(struct flow_keys, addrs.v6addrs),
-+ },
-+ {
-+ .key_id = FLOW_DISSECTOR_KEY_PORTS,
-+ .offset = offsetof(struct flow_keys, ports),
-+ },
-+};
-+
- static const struct flow_dissector_key flow_keys_buf_dissector_keys[] = {
- {
- .key_id = FLOW_DISSECTOR_KEY_CONTROL,
-@@ -889,6 +929,9 @@ static int __init init_default_flow_dissectors(void)
- skb_flow_dissector_init(&flow_keys_dissector,
- flow_keys_dissector_keys,
- ARRAY_SIZE(flow_keys_dissector_keys));
-+ skb_flow_dissector_init(&flow_keys_dissector_symmetric,
-+ flow_keys_dissector_symmetric_keys,
-+ ARRAY_SIZE(flow_keys_dissector_symmetric_keys));
- skb_flow_dissector_init(&flow_keys_buf_dissector,
- flow_keys_buf_dissector_keys,
- ARRAY_SIZE(flow_keys_buf_dissector_keys));
-diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index e561f9f..59bf4d7 100644
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -3016,24 +3016,6 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
- EXPORT_SYMBOL_GPL(skb_append_pagefrags);
-
- /**
-- * skb_push_rcsum - push skb and update receive checksum
-- * @skb: buffer to update
-- * @len: length of data pulled
-- *
-- * This function performs an skb_push on the packet and updates
-- * the CHECKSUM_COMPLETE checksum. It should be used on
-- * receive path processing instead of skb_push unless you know
-- * that the checksum difference is zero (e.g., a valid IP header)
-- * or you are setting ip_summed to CHECKSUM_NONE.
-- */
--static unsigned char *skb_push_rcsum(struct sk_buff *skb, unsigned len)
--{
-- skb_push(skb, len);
-- skb_postpush_rcsum(skb, skb->data, len);
-- return skb->data;
--}
--
--/**
- * skb_pull_rcsum - pull skb and update receive checksum
- * @skb: buffer to update
- * @len: length of data pulled
-diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
-index ea071fa..c26fac2 100644
---- a/net/ipv6/ip6_fib.c
-+++ b/net/ipv6/ip6_fib.c
-@@ -177,6 +177,7 @@ static void rt6_free_pcpu(struct rt6_info *non_pcpu_rt)
- }
- }
-
-+ free_percpu(non_pcpu_rt->rt6i_pcpu);
- non_pcpu_rt->rt6i_pcpu = NULL;
- }
-
-diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
-index d32cefc..34a5712 100644
---- a/net/mac80211/mesh.c
-+++ b/net/mac80211/mesh.c
-@@ -150,19 +150,26 @@ u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata)
- void mesh_sta_cleanup(struct sta_info *sta)
- {
- struct ieee80211_sub_if_data *sdata = sta->sdata;
-- u32 changed;
-+ u32 changed = 0;
-
- /*
- * maybe userspace handles peer allocation and peering, but in either
- * case the beacon is still generated by the kernel and we might need
- * an update.
- */
-- changed = mesh_accept_plinks_update(sdata);
-+ if (sdata->u.mesh.user_mpm &&
-+ sta->mesh->plink_state == NL80211_PLINK_ESTAB)
-+ changed |= mesh_plink_dec_estab_count(sdata);
-+ changed |= mesh_accept_plinks_update(sdata);
- if (!sdata->u.mesh.user_mpm) {
- changed |= mesh_plink_deactivate(sta);
- del_timer_sync(&sta->mesh->plink_timer);
- }
-
-+ /* make sure no readers can access nexthop sta from here on */
-+ mesh_path_flush_by_nexthop(sta);
-+ synchronize_net();
-+
- if (changed)
- ieee80211_mbss_info_change_notify(sdata, changed);
- }
-diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
-index 62193f4..ba7ce53 100644
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -275,7 +275,7 @@ struct ieee80211_fast_tx {
- u8 sa_offs, da_offs, pn_offs;
- u8 band;
- u8 hdr[30 + 2 + IEEE80211_FAST_XMIT_MAX_IV +
-- sizeof(rfc1042_header)];
-+ sizeof(rfc1042_header)] __aligned(2);
-
- struct rcu_head rcu_head;
- };
-diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
-index 18d0bec..8012f67 100644
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -1340,7 +1340,7 @@ static unsigned int fanout_demux_hash(struct packet_fanout *f,
- struct sk_buff *skb,
- unsigned int num)
- {
-- return reciprocal_scale(skb_get_hash(skb), num);
-+ return reciprocal_scale(__skb_get_hash_symmetric(skb), num);
- }
-
- static unsigned int fanout_demux_lb(struct packet_fanout *f,
-diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
-index 8f3948d..934336e 100644
---- a/net/sched/act_mirred.c
-+++ b/net/sched/act_mirred.c
-@@ -180,7 +180,7 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a,
-
- if (!(at & AT_EGRESS)) {
- if (m->tcfm_ok_push)
-- skb_push(skb2, skb->mac_len);
-+ skb_push_rcsum(skb2, skb->mac_len);
- }
-
- /* mirror is always swallowed */
-diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
-index 7e0c9bf..837dd91 100644
---- a/net/sunrpc/clnt.c
-+++ b/net/sunrpc/clnt.c
-@@ -446,16 +446,27 @@ out_no_rpciod:
- return ERR_PTR(err);
- }
-
--struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
-+static struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
- struct rpc_xprt *xprt)
- {
- struct rpc_clnt *clnt = NULL;
- struct rpc_xprt_switch *xps;
-
-- xps = xprt_switch_alloc(xprt, GFP_KERNEL);
-- if (xps == NULL)
-- return ERR_PTR(-ENOMEM);
--
-+ if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) {
-+ WARN_ON(args->protocol != XPRT_TRANSPORT_BC_TCP);
-+ xps = args->bc_xprt->xpt_bc_xps;
-+ xprt_switch_get(xps);
-+ } else {
-+ xps = xprt_switch_alloc(xprt, GFP_KERNEL);
-+ if (xps == NULL) {
-+ xprt_put(xprt);
-+ return ERR_PTR(-ENOMEM);
-+ }
-+ if (xprt->bc_xprt) {
-+ xprt_switch_get(xps);
-+ xprt->bc_xprt->xpt_bc_xps = xps;
-+ }
-+ }
- clnt = rpc_new_client(args, xps, xprt, NULL);
- if (IS_ERR(clnt))
- return clnt;
-@@ -483,7 +494,6 @@ struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
-
- return clnt;
- }
--EXPORT_SYMBOL_GPL(rpc_create_xprt);
-
- /**
- * rpc_create - create an RPC client and transport with one call
-@@ -509,6 +519,15 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
- };
- char servername[48];
-
-+ if (args->bc_xprt) {
-+ WARN_ON(args->protocol != XPRT_TRANSPORT_BC_TCP);
-+ xprt = args->bc_xprt->xpt_bc_xprt;
-+ if (xprt) {
-+ xprt_get(xprt);
-+ return rpc_create_xprt(args, xprt);
-+ }
-+ }
-+
- if (args->flags & RPC_CLNT_CREATE_INFINITE_SLOTS)
- xprtargs.flags |= XPRT_CREATE_INFINITE_SLOTS;
- if (args->flags & RPC_CLNT_CREATE_NO_IDLE_TIMEOUT)
-diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
-index 7422f28..7231cb4 100644
---- a/net/sunrpc/svc_xprt.c
-+++ b/net/sunrpc/svc_xprt.c
-@@ -136,6 +136,8 @@ static void svc_xprt_free(struct kref *kref)
- /* See comment on corresponding get in xs_setup_bc_tcp(): */
- if (xprt->xpt_bc_xprt)
- xprt_put(xprt->xpt_bc_xprt);
-+ if (xprt->xpt_bc_xps)
-+ xprt_switch_put(xprt->xpt_bc_xps);
- xprt->xpt_ops->xpo_free(xprt);
- module_put(owner);
- }
-diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
-index 65e7595..e9e5dd0 100644
---- a/net/sunrpc/xprtsock.c
-+++ b/net/sunrpc/xprtsock.c
-@@ -3050,6 +3050,7 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
- return xprt;
-
- args->bc_xprt->xpt_bc_xprt = NULL;
-+ args->bc_xprt->xpt_bc_xps = NULL;
- xprt_put(xprt);
- ret = ERR_PTR(-EINVAL);
- out_err:
-diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index 8269da7..7748199 100644
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -315,7 +315,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i)
- &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
- struct dentry *dentry = unix_sk(s)->path.dentry;
-
-- if (dentry && d_backing_inode(dentry) == i) {
-+ if (dentry && d_real_inode(dentry) == i) {
- sock_hold(s);
- goto found;
- }
-@@ -911,7 +911,7 @@ static struct sock *unix_find_other(struct net *net,
- err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
- if (err)
- goto fail;
-- inode = d_backing_inode(path.dentry);
-+ inode = d_real_inode(path.dentry);
- err = inode_permission(inode, MAY_WRITE);
- if (err)
- goto put_fail;
-@@ -1048,7 +1048,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
- goto out_up;
- }
- addr->hash = UNIX_HASH_SIZE;
-- hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
-+ hash = d_real_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
- spin_lock(&unix_table_lock);
- u->path = u_path;
- list = &unix_socket_table[hash];
-diff --git a/net/wireless/core.c b/net/wireless/core.c
-index 9f1c4aa..c878045 100644
---- a/net/wireless/core.c
-+++ b/net/wireless/core.c
-@@ -360,8 +360,6 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
- WARN_ON(ops->remain_on_channel && !ops->cancel_remain_on_channel);
- WARN_ON(ops->tdls_channel_switch && !ops->tdls_cancel_channel_switch);
- WARN_ON(ops->add_tx_ts && !ops->del_tx_ts);
-- WARN_ON(ops->set_tx_power && !ops->get_tx_power);
-- WARN_ON(ops->set_antenna && !ops->get_antenna);
-
- alloc_size = sizeof(*rdev) + sizeof_priv;
-
-diff --git a/net/wireless/util.c b/net/wireless/util.c
-index 9f440a9..47b9178 100644
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -509,7 +509,7 @@ static int __ieee80211_data_to_8023(struct sk_buff *skb, struct ethhdr *ehdr,
- * replace EtherType */
- hdrlen += ETH_ALEN + 2;
- else
-- tmp.h_proto = htons(skb->len);
-+ tmp.h_proto = htons(skb->len - hdrlen);
-
- pskb_pull(skb, hdrlen);
-
-diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
-index a915507..fec7578 100644
---- a/scripts/mod/file2alias.c
-+++ b/scripts/mod/file2alias.c
-@@ -384,7 +384,7 @@ static void do_of_entry_multi(void *symval, struct module *mod)
- len = sprintf(alias, "of:N%sT%s", (*name)[0] ? *name : "*",
- (*type)[0] ? *type : "*");
-
-- if (compatible[0])
-+ if ((*compatible)[0])
- sprintf(&alias[len], "%sC%s", (*type)[0] ? "*" : "",
- *compatible);
-
-diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
-index dec607c..5ee8201 100644
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -523,34 +523,34 @@ static int apparmor_setprocattr(struct task_struct *task, char *name,
- {
- struct common_audit_data sa;
- struct apparmor_audit_data aad = {0,};
-- char *command, *args = value;
-+ char *command, *largs = NULL, *args = value;
- size_t arg_size;
- int error;
-
- if (size == 0)
- return -EINVAL;
-- /* args points to a PAGE_SIZE buffer, AppArmor requires that
-- * the buffer must be null terminated or have size <= PAGE_SIZE -1
-- * so that AppArmor can null terminate them
-- */
-- if (args[size - 1] != '\0') {
-- if (size == PAGE_SIZE)
-- return -EINVAL;
-- args[size] = '\0';
-- }
--
- /* task can only write its own attributes */
- if (current != task)
- return -EACCES;
-
-- args = value;
-+ /* AppArmor requires that the buffer must be null terminated atm */
-+ if (args[size - 1] != '\0') {
-+ /* null terminate */
-+ largs = args = kmalloc(size + 1, GFP_KERNEL);
-+ if (!args)
-+ return -ENOMEM;
-+ memcpy(args, value, size);
-+ args[size] = '\0';
-+ }
-+
-+ error = -EINVAL;
- args = strim(args);
- command = strsep(&args, " ");
- if (!args)
-- return -EINVAL;
-+ goto out;
- args = skip_spaces(args);
- if (!*args)
-- return -EINVAL;
-+ goto out;
-
- arg_size = size - (args - (char *) value);
- if (strcmp(name, "current") == 0) {
-@@ -576,10 +576,12 @@ static int apparmor_setprocattr(struct task_struct *task, char *name,
- goto fail;
- } else
- /* only support the "current" and "exec" process attributes */
-- return -EINVAL;
-+ goto fail;
-
- if (!error)
- error = size;
-+out:
-+ kfree(largs);
- return error;
-
- fail:
-@@ -588,9 +590,9 @@ fail:
- aad.profile = aa_current_profile();
- aad.op = OP_SETPROCATTR;
- aad.info = name;
-- aad.error = -EINVAL;
-+ aad.error = error = -EINVAL;
- aa_audit_msg(AUDIT_APPARMOR_DENIED, &sa, NULL);
-- return -EINVAL;
-+ goto out;
- }
-
- static int apparmor_task_setrlimit(struct task_struct *task,
-diff --git a/security/keys/key.c b/security/keys/key.c
-index b287551..af7f682 100644
---- a/security/keys/key.c
-+++ b/security/keys/key.c
-@@ -584,7 +584,7 @@ int key_reject_and_link(struct key *key,
-
- mutex_unlock(&key_construction_mutex);
-
-- if (keyring)
-+ if (keyring && link_ret == 0)
- __key_link_end(keyring, &key->index_key, edit);
-
- /* wake up anyone waiting for a key to be constructed */
-diff --git a/sound/core/control.c b/sound/core/control.c
-index a85d455..b4fe9b0 100644
---- a/sound/core/control.c
-+++ b/sound/core/control.c
-@@ -160,6 +160,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask,
-
- if (snd_BUG_ON(!card || !id))
- return;
-+ if (card->shutdown)
-+ return;
- read_lock(&card->ctl_files_rwlock);
- #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
- card->mixer_oss_change_count++;
-diff --git a/sound/core/pcm.c b/sound/core/pcm.c
-index 308c9ec..8e980aa 100644
---- a/sound/core/pcm.c
-+++ b/sound/core/pcm.c
-@@ -849,6 +849,14 @@ int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
- }
- EXPORT_SYMBOL(snd_pcm_new_internal);
-
-+static void free_chmap(struct snd_pcm_str *pstr)
-+{
-+ if (pstr->chmap_kctl) {
-+ snd_ctl_remove(pstr->pcm->card, pstr->chmap_kctl);
-+ pstr->chmap_kctl = NULL;
-+ }
-+}
-+
- static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
- {
- struct snd_pcm_substream *substream, *substream_next;
-@@ -871,6 +879,7 @@ static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
- kfree(setup);
- }
- #endif
-+ free_chmap(pstr);
- if (pstr->substream_count)
- put_device(&pstr->dev);
- }
-@@ -1135,10 +1144,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
- for (cidx = 0; cidx < 2; cidx++) {
- if (!pcm->internal)
- snd_unregister_device(&pcm->streams[cidx].dev);
-- if (pcm->streams[cidx].chmap_kctl) {
-- snd_ctl_remove(pcm->card, pcm->streams[cidx].chmap_kctl);
-- pcm->streams[cidx].chmap_kctl = NULL;
-- }
-+ free_chmap(&pcm->streams[cidx]);
- }
- mutex_unlock(&pcm->open_mutex);
- mutex_unlock(&register_mutex);
-diff --git a/sound/core/timer.c b/sound/core/timer.c
-index 6469bed..23b73f6 100644
---- a/sound/core/timer.c
-+++ b/sound/core/timer.c
-@@ -1954,6 +1954,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
-
- qhead = tu->qhead++;
- tu->qhead %= tu->queue_size;
-+ tu->qused--;
- spin_unlock_irq(&tu->qlock);
-
- if (tu->tread) {
-@@ -1967,7 +1968,6 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer,
- }
-
- spin_lock_irq(&tu->qlock);
-- tu->qused--;
- if (err < 0)
- goto _error;
- result += unit;
-diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c
-index c0f8f61..172dacd 100644
---- a/sound/drivers/dummy.c
-+++ b/sound/drivers/dummy.c
-@@ -420,6 +420,7 @@ static int dummy_hrtimer_stop(struct snd_pcm_substream *substream)
-
- static inline void dummy_hrtimer_sync(struct dummy_hrtimer_pcm *dpcm)
- {
-+ hrtimer_cancel(&dpcm->timer);
- tasklet_kill(&dpcm->tasklet);
- }
-
-diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c
-index 87041dd..47a358f 100644
---- a/sound/hda/hdac_regmap.c
-+++ b/sound/hda/hdac_regmap.c
-@@ -444,7 +444,7 @@ int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg,
- err = reg_raw_write(codec, reg, val);
- if (err == -EAGAIN) {
- err = snd_hdac_power_up_pm(codec);
-- if (!err)
-+ if (err >= 0)
- err = reg_raw_write(codec, reg, val);
- snd_hdac_power_down_pm(codec);
- }
-@@ -470,7 +470,7 @@ static int __snd_hdac_regmap_read_raw(struct hdac_device *codec,
- err = reg_raw_read(codec, reg, val, uncached);
- if (err == -EAGAIN) {
- err = snd_hdac_power_up_pm(codec);
-- if (!err)
-+ if (err >= 0)
- err = reg_raw_read(codec, reg, val, uncached);
- snd_hdac_power_down_pm(codec);
- }
-diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c
-index 4667c32..7417718 100644
---- a/sound/pci/au88x0/au88x0_core.c
-+++ b/sound/pci/au88x0/au88x0_core.c
-@@ -1444,9 +1444,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
- int page, p, pp, delta, i;
-
- page =
-- (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) &
-- WT_SUBBUF_MASK)
-- >> WT_SUBBUF_SHIFT;
-+ (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2))
-+ >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK;
- if (dma->nr_periods >= 4)
- delta = (page - dma->period_real) & 3;
- else {
-diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c
-index 1cb85ae..286f5e3 100644
---- a/sound/pci/echoaudio/echoaudio.c
-+++ b/sound/pci/echoaudio/echoaudio.c
-@@ -2200,11 +2200,11 @@ static int snd_echo_resume(struct device *dev)
- u32 pipe_alloc_mask;
- int err;
-
-- commpage_bak = kmalloc(sizeof(struct echoaudio), GFP_KERNEL);
-+ commpage_bak = kmalloc(sizeof(*commpage), GFP_KERNEL);
- if (commpage_bak == NULL)
- return -ENOMEM;
- commpage = chip->comm_page;
-- memcpy(commpage_bak, commpage, sizeof(struct comm_page));
-+ memcpy(commpage_bak, commpage, sizeof(*commpage));
-
- err = init_hw(chip, chip->pci->device, chip->pci->subsystem_device);
- if (err < 0) {
-diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
-index dfaf1a9..d77cc76 100644
---- a/sound/pci/hda/hda_generic.c
-+++ b/sound/pci/hda/hda_generic.c
-@@ -3977,6 +3977,8 @@ static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid,
-
- for (n = 0; n < spec->paths.used; n++) {
- path = snd_array_elem(&spec->paths, n);
-+ if (!path->depth)
-+ continue;
- if (path->path[0] == nid ||
- path->path[path->depth - 1] == nid) {
- bool pin_old = path->pin_enabled;
-diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
-index 94089fc..6f8ea13 100644
---- a/sound/pci/hda/hda_intel.c
-+++ b/sound/pci/hda/hda_intel.c
-@@ -367,9 +367,10 @@ enum {
- #define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
- #define IS_KBL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa171)
- #define IS_KBL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d71)
-+#define IS_KBL_H(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa2f0)
- #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
- #define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci)) || \
-- IS_KBL(pci) || IS_KBL_LP(pci)
-+ IS_KBL(pci) || IS_KBL_LP(pci) || IS_KBL_H(pci)
-
- static char *driver_short_names[] = {
- [AZX_DRIVER_ICH] = "HDA Intel",
-@@ -1217,8 +1218,10 @@ static int azx_free(struct azx *chip)
- if (use_vga_switcheroo(hda)) {
- if (chip->disabled && hda->probe_continued)
- snd_hda_unlock_devices(&chip->bus);
-- if (hda->vga_switcheroo_registered)
-+ if (hda->vga_switcheroo_registered) {
- vga_switcheroo_unregister_client(chip->pci);
-+ vga_switcheroo_fini_domain_pm_ops(chip->card->dev);
-+ }
- }
-
- if (bus->chip_init) {
-@@ -2190,6 +2193,9 @@ static const struct pci_device_id azx_ids[] = {
- /* Kabylake-LP */
- { PCI_DEVICE(0x8086, 0x9d71),
- .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
-+ /* Kabylake-H */
-+ { PCI_DEVICE(0x8086, 0xa2f0),
-+ .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
- /* Broxton-P(Apollolake) */
- { PCI_DEVICE(0x8086, 0x5a98),
- .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON },
-@@ -2263,6 +2269,8 @@ static const struct pci_device_id azx_ids[] = {
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- { PCI_DEVICE(0x1002, 0x157a),
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
-+ { PCI_DEVICE(0x1002, 0x15b3),
-+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- { PCI_DEVICE(0x1002, 0x793b),
- .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
- { PCI_DEVICE(0x1002, 0x7919),
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index 0fe18ed..abcb5a6 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -5650,6 +5650,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
- SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
- SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
- SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
-+ SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
-+ SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
-+ SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
- SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
- SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
- SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
-@@ -5735,7 +5738,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
- {}
- };
- #define ALC225_STANDARD_PINS \
-- {0x12, 0xb7a60130}, \
- {0x21, 0x04211020}
-
- #define ALC256_STANDARD_PINS \
-@@ -5760,10 +5762,24 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
- static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
- SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
- ALC225_STANDARD_PINS,
-+ {0x12, 0xb7a60130},
- {0x14, 0x901701a0}),
- SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
- ALC225_STANDARD_PINS,
-+ {0x12, 0xb7a60130},
- {0x14, 0x901701b0}),
-+ SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
-+ ALC225_STANDARD_PINS,
-+ {0x12, 0xb7a60150},
-+ {0x14, 0x901701a0}),
-+ SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
-+ ALC225_STANDARD_PINS,
-+ {0x12, 0xb7a60150},
-+ {0x14, 0x901701b0}),
-+ SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
-+ ALC225_STANDARD_PINS,
-+ {0x12, 0xb7a60130},
-+ {0x1b, 0x90170110}),
- SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
- {0x14, 0x90170110},
- {0x21, 0x02211020}),
-@@ -5832,6 +5848,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
- {0x14, 0x90170120},
- {0x21, 0x02211030}),
- SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
-+ {0x12, 0x90a60170},
-+ {0x14, 0x90170120},
-+ {0x21, 0x02211030}),
-+ SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
- ALC256_STANDARD_PINS),
- SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
- {0x12, 0x90a60130},
-diff --git a/sound/usb/card.c b/sound/usb/card.c
-index 3fc6358..2d49350 100644
---- a/sound/usb/card.c
-+++ b/sound/usb/card.c
-@@ -552,7 +552,6 @@ static int usb_audio_probe(struct usb_interface *intf,
- goto __error;
- }
- chip = usb_chip[i];
-- dev_set_drvdata(&dev->dev, chip);
- atomic_inc(&chip->active); /* avoid autopm */
- break;
- }
-@@ -578,6 +577,7 @@ static int usb_audio_probe(struct usb_interface *intf,
- goto __error;
- }
- }
-+ dev_set_drvdata(&dev->dev, chip);
-
- /*
- * For devices with more than one control interface, we assume the
-diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
-index 4fd482f..7cb1224 100644
---- a/virt/kvm/kvm_main.c
-+++ b/virt/kvm/kvm_main.c
-@@ -2868,7 +2868,7 @@ static long kvm_vm_ioctl(struct file *filp,
- if (copy_from_user(&routing, argp, sizeof(routing)))
- goto out;
- r = -EINVAL;
-- if (routing.nr >= KVM_MAX_IRQ_ROUTES)
-+ if (routing.nr > KVM_MAX_IRQ_ROUTES)
- goto out;
- if (routing.flags)
- goto out;