diff options
author | Mike Pagano <mpagano@gentoo.org> | 2014-07-18 07:34:20 -0400 |
---|---|---|
committer | Mike Pagano <mpagano@gentoo.org> | 2014-07-18 07:34:20 -0400 |
commit | b84c2b5b188c4ff642ee4e555f8c588bcf798b87 (patch) | |
tree | 6984026f0a0aa0a90cc54df8458f43e0fdb4d2d8 | |
parent | Linux patch 3.15.5. Removal of redundant patch (diff) | |
download | linux-patches-b84c2b5b188c4ff642ee4e555f8c588bcf798b87.tar.gz linux-patches-b84c2b5b188c4ff642ee4e555f8c588bcf798b87.tar.bz2 linux-patches-b84c2b5b188c4ff642ee4e555f8c588bcf798b87.zip |
Linux patch 3.15.63.15-8
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1005_linux-3.15.6.patch | 2994 |
2 files changed, 2998 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 03708fb1..69ec900b 100644 --- a/0000_README +++ b/0000_README @@ -63,6 +63,10 @@ Patch: 1004_linux-3.15.5.patch From: http://www.kernel.org Desc: Linux 3.15.5 +Patch: 1005_linux-3.15.6.patch +From: http://www.kernel.org +Desc: Linux 3.15.6 + Patch: 1700_enable-thinkpad-micled.patch From: https://bugs.gentoo.org/show_bug.cgi?id=449248 Desc: Enable mic mute led in thinkpads diff --git a/1005_linux-3.15.6.patch b/1005_linux-3.15.6.patch new file mode 100644 index 00000000..4ce582da --- /dev/null +++ b/1005_linux-3.15.6.patch @@ -0,0 +1,2994 @@ +diff --git a/Documentation/cpu-freq/intel-pstate.txt b/Documentation/cpu-freq/intel-pstate.txt +index e742d21dbd96..a69ffe1d54d5 100644 +--- a/Documentation/cpu-freq/intel-pstate.txt ++++ b/Documentation/cpu-freq/intel-pstate.txt +@@ -15,10 +15,13 @@ New sysfs files for controlling P state selection have been added to + /sys/devices/system/cpu/intel_pstate/ + + max_perf_pct: limits the maximum P state that will be requested by +- the driver stated as a percentage of the available performance. ++ the driver stated as a percentage of the available performance. The ++ available (P states) performance may be reduced by the no_turbo ++ setting described below. + + min_perf_pct: limits the minimum P state that will be requested by +- the driver stated as a percentage of the available performance. ++ the driver stated as a percentage of the max (non-turbo) ++ performance level. + + no_turbo: limits the driver to selecting P states below the turbo + frequency range. +diff --git a/Makefile b/Makefile +index e6b01ed8fd9f..fefa0237c2d1 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 3 + PATCHLEVEL = 15 +-SUBLEVEL = 5 ++SUBLEVEL = 6 + EXTRAVERSION = + NAME = Shuffling Zombie Juror + +diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h +index 993bce527b85..902eb708804a 100644 +--- a/arch/arm64/include/asm/memory.h ++++ b/arch/arm64/include/asm/memory.h +@@ -56,6 +56,8 @@ + #define TASK_SIZE_32 UL(0x100000000) + #define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \ + TASK_SIZE_32 : TASK_SIZE_64) ++#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk, TIF_32BIT) ? \ ++ TASK_SIZE_32 : TASK_SIZE_64) + #else + #define TASK_SIZE TASK_SIZE_64 + #endif /* CONFIG_COMPAT */ +diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c +index 608716f8496b..af3bc359dc70 100644 +--- a/arch/parisc/kernel/hardware.c ++++ b/arch/parisc/kernel/hardware.c +@@ -1210,7 +1210,8 @@ static struct hp_hardware hp_hardware_list[] = { + {HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"}, + {HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"}, + {HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"}, +- {HPHW_FIO, 0x076, 0x000AD, 0x00, "Crestone Peak RS-232"}, ++ {HPHW_FIO, 0x076, 0x000AD, 0x0, "Crestone Peak Core RS-232"}, ++ {HPHW_FIO, 0x077, 0x000AD, 0x0, "Crestone Peak Fast? Core RS-232"}, + {HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"}, + {HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"}, + {HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"}, +diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c +index bb9f3b64de55..ec741fe02ab6 100644 +--- a/arch/parisc/kernel/sys_parisc32.c ++++ b/arch/parisc/kernel/sys_parisc32.c +@@ -4,6 +4,7 @@ + * Copyright (C) 2000-2001 Hewlett Packard Company + * Copyright (C) 2000 John Marvin + * Copyright (C) 2001 Matthew Wilcox ++ * Copyright (C) 2014 Helge Deller <deller@gmx.de> + * + * These routines maintain argument size conversion between 32bit and 64bit + * environment. Based heavily on sys_ia32.c and sys_sparc32.c. +@@ -57,3 +58,12 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23, + current->comm, current->pid, r20); + return -ENOSYS; + } ++ ++asmlinkage long sys32_fanotify_mark(compat_int_t fanotify_fd, compat_uint_t flags, ++ compat_uint_t mask0, compat_uint_t mask1, compat_int_t dfd, ++ const char __user * pathname) ++{ ++ return sys_fanotify_mark(fanotify_fd, flags, ++ ((__u64)mask1 << 32) | mask0, ++ dfd, pathname); ++} +diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S +index c5fa7a697fba..84c5d3a58fa1 100644 +--- a/arch/parisc/kernel/syscall_table.S ++++ b/arch/parisc/kernel/syscall_table.S +@@ -418,7 +418,7 @@ + ENTRY_SAME(accept4) /* 320 */ + ENTRY_SAME(prlimit64) + ENTRY_SAME(fanotify_init) +- ENTRY_COMP(fanotify_mark) ++ ENTRY_DIFF(fanotify_mark) + ENTRY_COMP(clock_adjtime) + ENTRY_SAME(name_to_handle_at) /* 325 */ + ENTRY_COMP(open_by_handle_at) +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index e0998997943b..c95c4b8c3e74 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -414,7 +414,7 @@ config KEXEC + config CRASH_DUMP + bool "Build a kdump crash kernel" + depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP) +- select RELOCATABLE if PPC64 || 44x || FSL_BOOKE ++ select RELOCATABLE if (PPC64 && !COMPILE_TEST) || 44x || FSL_BOOKE + help + Build a kernel suitable for use as a kdump capture kernel. + The same kernel binary can be used as production kernel and dump +@@ -1009,6 +1009,7 @@ endmenu + if PPC64 + config RELOCATABLE + bool "Build a relocatable kernel" ++ depends on !COMPILE_TEST + select NONSTATIC_KERNEL + help + This builds a kernel image that is capable of running anywhere +diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h +index 9ed737146dbb..b3e936027b26 100644 +--- a/arch/powerpc/include/asm/perf_event_server.h ++++ b/arch/powerpc/include/asm/perf_event_server.h +@@ -61,8 +61,7 @@ struct power_pmu { + #define PPMU_SIAR_VALID 0x00000010 /* Processor has SIAR Valid bit */ + #define PPMU_HAS_SSLOT 0x00000020 /* Has sampled slot in MMCRA */ + #define PPMU_HAS_SIER 0x00000040 /* Has SIER */ +-#define PPMU_BHRB 0x00000080 /* has BHRB feature enabled */ +-#define PPMU_EBB 0x00000100 /* supports event based branch */ ++#define PPMU_ARCH_207S 0x00000080 /* PMC is architecture v2.07S */ + + /* + * Values for flags to get_alternatives() +diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S +index e18e3cfc32de..92be3fad1075 100644 +--- a/arch/powerpc/kvm/book3s_hv_interrupts.S ++++ b/arch/powerpc/kvm/book3s_hv_interrupts.S +@@ -127,11 +127,6 @@ BEGIN_FTR_SECTION + stw r10, HSTATE_PMC + 24(r13) + stw r11, HSTATE_PMC + 28(r13) + END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) +-BEGIN_FTR_SECTION +- mfspr r9, SPRN_SIER +- std r8, HSTATE_MMCR + 40(r13) +- std r9, HSTATE_MMCR + 48(r13) +-END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) + 31: + + /* +diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c +index 4520c9356b54..6b0641c3f03f 100644 +--- a/arch/powerpc/perf/core-book3s.c ++++ b/arch/powerpc/perf/core-book3s.c +@@ -485,7 +485,7 @@ static bool is_ebb_event(struct perf_event *event) + * check that the PMU supports EBB, meaning those that don't can still + * use bit 63 of the event code for something else if they wish. + */ +- return (ppmu->flags & PPMU_EBB) && ++ return (ppmu->flags & PPMU_ARCH_207S) && + ((event->attr.config >> PERF_EVENT_CONFIG_EBB_SHIFT) & 1); + } + +@@ -777,7 +777,7 @@ void perf_event_print_debug(void) + if (ppmu->flags & PPMU_HAS_SIER) + sier = mfspr(SPRN_SIER); + +- if (ppmu->flags & PPMU_EBB) { ++ if (ppmu->flags & PPMU_ARCH_207S) { + pr_info("MMCR2: %016lx EBBHR: %016lx\n", + mfspr(SPRN_MMCR2), mfspr(SPRN_EBBHR)); + pr_info("EBBRR: %016lx BESCR: %016lx\n", +@@ -996,7 +996,22 @@ static void power_pmu_read(struct perf_event *event) + } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); + + local64_add(delta, &event->count); +- local64_sub(delta, &event->hw.period_left); ++ ++ /* ++ * A number of places program the PMC with (0x80000000 - period_left). ++ * We never want period_left to be less than 1 because we will program ++ * the PMC with a value >= 0x800000000 and an edge detected PMC will ++ * roll around to 0 before taking an exception. We have seen this ++ * on POWER8. ++ * ++ * To fix this, clamp the minimum value of period_left to 1. ++ */ ++ do { ++ prev = local64_read(&event->hw.period_left); ++ val = prev - delta; ++ if (val < 1) ++ val = 1; ++ } while (local64_cmpxchg(&event->hw.period_left, prev, val) != prev); + } + + /* +@@ -1300,6 +1315,9 @@ static void power_pmu_enable(struct pmu *pmu) + + write_mmcr0(cpuhw, mmcr0); + ++ if (ppmu->flags & PPMU_ARCH_207S) ++ mtspr(SPRN_MMCR2, 0); ++ + /* + * Enable instruction sampling if necessary + */ +@@ -1696,7 +1714,7 @@ static int power_pmu_event_init(struct perf_event *event) + + if (has_branch_stack(event)) { + /* PMU has BHRB enabled */ +- if (!(ppmu->flags & PPMU_BHRB)) ++ if (!(ppmu->flags & PPMU_ARCH_207S)) + return -EOPNOTSUPP; + } + +diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c +index fe2763b6e039..639cd9156585 100644 +--- a/arch/powerpc/perf/power8-pmu.c ++++ b/arch/powerpc/perf/power8-pmu.c +@@ -792,7 +792,7 @@ static struct power_pmu power8_pmu = { + .get_constraint = power8_get_constraint, + .get_alternatives = power8_get_alternatives, + .disable_pmc = power8_disable_pmc, +- .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB | PPMU_EBB, ++ .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_ARCH_207S, + .n_generic = ARRAY_SIZE(power8_generic_events), + .generic_events = power8_generic_events, + .cache_events = &power8_cache_events, +diff --git a/arch/x86/crypto/sha512_ssse3_glue.c b/arch/x86/crypto/sha512_ssse3_glue.c +index f30cd10293f0..8626b03e83b7 100644 +--- a/arch/x86/crypto/sha512_ssse3_glue.c ++++ b/arch/x86/crypto/sha512_ssse3_glue.c +@@ -141,7 +141,7 @@ static int sha512_ssse3_final(struct shash_desc *desc, u8 *out) + + /* save number of bits */ + bits[1] = cpu_to_be64(sctx->count[0] << 3); +- bits[0] = cpu_to_be64(sctx->count[1] << 3) | sctx->count[0] >> 61; ++ bits[0] = cpu_to_be64(sctx->count[1] << 3 | sctx->count[0] >> 61); + + /* Pad out to 112 mod 128 and append length */ + index = sctx->count[0] & 0x7f; +diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c +index 597ac155c91c..bc7527e109c8 100644 +--- a/arch/x86/mm/ioremap.c ++++ b/arch/x86/mm/ioremap.c +@@ -50,6 +50,21 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size, + return err; + } + ++static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, ++ void *arg) ++{ ++ unsigned long i; ++ ++ for (i = 0; i < nr_pages; ++i) ++ if (pfn_valid(start_pfn + i) && ++ !PageReserved(pfn_to_page(start_pfn + i))) ++ return 1; ++ ++ WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn); ++ ++ return 0; ++} ++ + /* + * Remap an arbitrary physical address space into the kernel virtual + * address space. Needed when the kernel wants to access high addresses +@@ -93,14 +108,11 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, + /* + * Don't allow anybody to remap normal RAM that we're using.. + */ ++ pfn = phys_addr >> PAGE_SHIFT; + last_pfn = last_addr >> PAGE_SHIFT; +- for (pfn = phys_addr >> PAGE_SHIFT; pfn <= last_pfn; pfn++) { +- int is_ram = page_is_ram(pfn); +- +- if (is_ram && pfn_valid(pfn) && !PageReserved(pfn_to_page(pfn))) +- return NULL; +- WARN_ON_ONCE(is_ram); +- } ++ if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL, ++ __ioremap_check_ram) == 1) ++ return NULL; + + /* + * Mappings have to be page-aligned +diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c +index c67f6f5ad611..36b0e61f9c09 100644 +--- a/drivers/acpi/ac.c ++++ b/drivers/acpi/ac.c +@@ -30,6 +30,10 @@ + #include <linux/types.h> + #include <linux/dmi.h> + #include <linux/delay.h> ++#ifdef CONFIG_ACPI_PROCFS_POWER ++#include <linux/proc_fs.h> ++#include <linux/seq_file.h> ++#endif + #include <linux/platform_device.h> + #include <linux/power_supply.h> + #include <linux/acpi.h> +@@ -52,6 +56,7 @@ MODULE_AUTHOR("Paul Diefenbaugh"); + MODULE_DESCRIPTION("ACPI AC Adapter Driver"); + MODULE_LICENSE("GPL"); + ++ + static int acpi_ac_add(struct acpi_device *device); + static int acpi_ac_remove(struct acpi_device *device); + static void acpi_ac_notify(struct acpi_device *device, u32 event); +@@ -67,6 +72,13 @@ static int acpi_ac_resume(struct device *dev); + #endif + static SIMPLE_DEV_PM_OPS(acpi_ac_pm, NULL, acpi_ac_resume); + ++#ifdef CONFIG_ACPI_PROCFS_POWER ++extern struct proc_dir_entry *acpi_lock_ac_dir(void); ++extern void *acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir); ++static int acpi_ac_open_fs(struct inode *inode, struct file *file); ++#endif ++ ++ + static int ac_sleep_before_get_state_ms; + + static struct acpi_driver acpi_ac_driver = { +@@ -91,6 +103,16 @@ struct acpi_ac { + + #define to_acpi_ac(x) container_of(x, struct acpi_ac, charger) + ++#ifdef CONFIG_ACPI_PROCFS_POWER ++static const struct file_operations acpi_ac_fops = { ++ .owner = THIS_MODULE, ++ .open = acpi_ac_open_fs, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++#endif ++ + /* -------------------------------------------------------------------------- + AC Adapter Management + -------------------------------------------------------------------------- */ +@@ -143,6 +165,83 @@ static enum power_supply_property ac_props[] = { + POWER_SUPPLY_PROP_ONLINE, + }; + ++#ifdef CONFIG_ACPI_PROCFS_POWER ++/* -------------------------------------------------------------------------- ++ FS Interface (/proc) ++ -------------------------------------------------------------------------- */ ++ ++static struct proc_dir_entry *acpi_ac_dir; ++ ++static int acpi_ac_seq_show(struct seq_file *seq, void *offset) ++{ ++ struct acpi_ac *ac = seq->private; ++ ++ ++ if (!ac) ++ return 0; ++ ++ if (acpi_ac_get_state(ac)) { ++ seq_puts(seq, "ERROR: Unable to read AC Adapter state\n"); ++ return 0; ++ } ++ ++ seq_puts(seq, "state: "); ++ switch (ac->state) { ++ case ACPI_AC_STATUS_OFFLINE: ++ seq_puts(seq, "off-line\n"); ++ break; ++ case ACPI_AC_STATUS_ONLINE: ++ seq_puts(seq, "on-line\n"); ++ break; ++ default: ++ seq_puts(seq, "unknown\n"); ++ break; ++ } ++ ++ return 0; ++} ++ ++static int acpi_ac_open_fs(struct inode *inode, struct file *file) ++{ ++ return single_open(file, acpi_ac_seq_show, PDE_DATA(inode)); ++} ++ ++static int acpi_ac_add_fs(struct acpi_ac *ac) ++{ ++ struct proc_dir_entry *entry = NULL; ++ ++ printk(KERN_WARNING PREFIX "Deprecated procfs I/F for AC is loaded," ++ " please retry with CONFIG_ACPI_PROCFS_POWER cleared\n"); ++ if (!acpi_device_dir(ac->device)) { ++ acpi_device_dir(ac->device) = ++ proc_mkdir(acpi_device_bid(ac->device), acpi_ac_dir); ++ if (!acpi_device_dir(ac->device)) ++ return -ENODEV; ++ } ++ ++ /* 'state' [R] */ ++ entry = proc_create_data(ACPI_AC_FILE_STATE, ++ S_IRUGO, acpi_device_dir(ac->device), ++ &acpi_ac_fops, ac); ++ if (!entry) ++ return -ENODEV; ++ return 0; ++} ++ ++static int acpi_ac_remove_fs(struct acpi_ac *ac) ++{ ++ ++ if (acpi_device_dir(ac->device)) { ++ remove_proc_entry(ACPI_AC_FILE_STATE, ++ acpi_device_dir(ac->device)); ++ remove_proc_entry(acpi_device_bid(ac->device), acpi_ac_dir); ++ acpi_device_dir(ac->device) = NULL; ++ } ++ ++ return 0; ++} ++#endif ++ + /* -------------------------------------------------------------------------- + Driver Model + -------------------------------------------------------------------------- */ +@@ -243,6 +342,11 @@ static int acpi_ac_add(struct acpi_device *device) + goto end; + + ac->charger.name = acpi_device_bid(device); ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ result = acpi_ac_add_fs(ac); ++ if (result) ++ goto end; ++#endif + ac->charger.type = POWER_SUPPLY_TYPE_MAINS; + ac->charger.properties = ac_props; + ac->charger.num_properties = ARRAY_SIZE(ac_props); +@@ -258,8 +362,12 @@ static int acpi_ac_add(struct acpi_device *device) + ac->battery_nb.notifier_call = acpi_ac_battery_notify; + register_acpi_notifier(&ac->battery_nb); + end: +- if (result) ++ if (result) { ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ acpi_ac_remove_fs(ac); ++#endif + kfree(ac); ++ } + + dmi_check_system(ac_dmi_table); + return result; +@@ -303,6 +411,10 @@ static int acpi_ac_remove(struct acpi_device *device) + power_supply_unregister(&ac->charger); + unregister_acpi_notifier(&ac->battery_nb); + ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ acpi_ac_remove_fs(ac); ++#endif ++ + kfree(ac); + + return 0; +@@ -315,9 +427,20 @@ static int __init acpi_ac_init(void) + if (acpi_disabled) + return -ENODEV; + ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ acpi_ac_dir = acpi_lock_ac_dir(); ++ if (!acpi_ac_dir) ++ return -ENODEV; ++#endif ++ ++ + result = acpi_bus_register_driver(&acpi_ac_driver); +- if (result < 0) ++ if (result < 0) { ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ acpi_unlock_ac_dir(acpi_ac_dir); ++#endif + return -ENODEV; ++ } + + return 0; + } +@@ -325,6 +448,9 @@ static int __init acpi_ac_init(void) + static void __exit acpi_ac_exit(void) + { + acpi_bus_unregister_driver(&acpi_ac_driver); ++#ifdef CONFIG_ACPI_PROCFS_POWER ++ acpi_unlock_ac_dir(acpi_ac_dir); ++#endif + } + module_init(acpi_ac_init); + module_exit(acpi_ac_exit); +diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c +index 6e7b2a12860d..884c5674fda8 100644 +--- a/drivers/acpi/battery.c ++++ b/drivers/acpi/battery.c +@@ -34,6 +34,7 @@ + #include <linux/dmi.h> + #include <linux/slab.h> + #include <linux/suspend.h> ++#include <linux/delay.h> + #include <asm/unaligned.h> + + #ifdef CONFIG_ACPI_PROCFS_POWER +@@ -1069,6 +1070,28 @@ static struct dmi_system_id bat_dmi_table[] = { + {}, + }; + ++/* ++ * Some machines'(E,G Lenovo Z480) ECs are not stable ++ * during boot up and this causes battery driver fails to be ++ * probed due to failure of getting battery information ++ * from EC sometimes. After several retries, the operation ++ * may work. So add retry code here and 20ms sleep between ++ * every retries. ++ */ ++static int acpi_battery_update_retry(struct acpi_battery *battery) ++{ ++ int retry, ret; ++ ++ for (retry = 5; retry; retry--) { ++ ret = acpi_battery_update(battery); ++ if (!ret) ++ break; ++ ++ msleep(20); ++ } ++ return ret; ++} ++ + static int acpi_battery_add(struct acpi_device *device) + { + int result = 0; +@@ -1087,9 +1110,11 @@ static int acpi_battery_add(struct acpi_device *device) + mutex_init(&battery->sysfs_lock); + if (acpi_has_method(battery->device->handle, "_BIX")) + set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); +- result = acpi_battery_update(battery); ++ ++ result = acpi_battery_update_retry(battery); + if (result) + goto fail; ++ + #ifdef CONFIG_ACPI_PROCFS_POWER + result = acpi_battery_add_fs(device); + #endif +diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c +index ad11ba4a412d..49d89909b4ed 100644 +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -78,6 +78,9 @@ enum { + EC_FLAGS_BLOCKED, /* Transactions are blocked */ + }; + ++#define ACPI_EC_COMMAND_POLL 0x01 /* Available for command byte */ ++#define ACPI_EC_COMMAND_COMPLETE 0x02 /* Completed last byte */ ++ + /* ec.c is compiled in acpi namespace so this shows up as acpi.ec_delay param */ + static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY; + module_param(ec_delay, uint, 0644); +@@ -109,7 +112,7 @@ struct transaction { + u8 ri; + u8 wlen; + u8 rlen; +- bool done; ++ u8 flags; + }; + + struct acpi_ec *boot_ec, *first_ec; +@@ -150,60 +153,74 @@ static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) + outb(data, ec->data_addr); + } + +-static int ec_transaction_done(struct acpi_ec *ec) ++static int ec_transaction_completed(struct acpi_ec *ec) + { + unsigned long flags; + int ret = 0; + spin_lock_irqsave(&ec->lock, flags); +- if (!ec->curr || ec->curr->done) ++ if (ec->curr && (ec->curr->flags & ACPI_EC_COMMAND_COMPLETE)) + ret = 1; + spin_unlock_irqrestore(&ec->lock, flags); + return ret; + } + +-static void start_transaction(struct acpi_ec *ec) ++static bool advance_transaction(struct acpi_ec *ec) + { +- ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; +- ec->curr->done = false; +- acpi_ec_write_cmd(ec, ec->curr->command); +-} +- +-static void advance_transaction(struct acpi_ec *ec, u8 status) +-{ +- unsigned long flags; + struct transaction *t; ++ u8 status; ++ bool wakeup = false; + +- spin_lock_irqsave(&ec->lock, flags); ++ pr_debug("===== %s =====\n", in_interrupt() ? "IRQ" : "TASK"); ++ status = acpi_ec_read_status(ec); + t = ec->curr; + if (!t) +- goto unlock; +- if (t->wlen > t->wi) { +- if ((status & ACPI_EC_FLAG_IBF) == 0) +- acpi_ec_write_data(ec, +- t->wdata[t->wi++]); +- else +- goto err; +- } else if (t->rlen > t->ri) { +- if ((status & ACPI_EC_FLAG_OBF) == 1) { +- t->rdata[t->ri++] = acpi_ec_read_data(ec); +- if (t->rlen == t->ri) +- t->done = true; ++ goto err; ++ if (t->flags & ACPI_EC_COMMAND_POLL) { ++ if (t->wlen > t->wi) { ++ if ((status & ACPI_EC_FLAG_IBF) == 0) ++ acpi_ec_write_data(ec, t->wdata[t->wi++]); ++ else ++ goto err; ++ } else if (t->rlen > t->ri) { ++ if ((status & ACPI_EC_FLAG_OBF) == 1) { ++ t->rdata[t->ri++] = acpi_ec_read_data(ec); ++ if (t->rlen == t->ri) { ++ t->flags |= ACPI_EC_COMMAND_COMPLETE; ++ wakeup = true; ++ } ++ } else ++ goto err; ++ } else if (t->wlen == t->wi && ++ (status & ACPI_EC_FLAG_IBF) == 0) { ++ t->flags |= ACPI_EC_COMMAND_COMPLETE; ++ wakeup = true; ++ } ++ return wakeup; ++ } else { ++ if ((status & ACPI_EC_FLAG_IBF) == 0) { ++ acpi_ec_write_cmd(ec, t->command); ++ t->flags |= ACPI_EC_COMMAND_POLL; + } else + goto err; +- } else if (t->wlen == t->wi && +- (status & ACPI_EC_FLAG_IBF) == 0) +- t->done = true; +- goto unlock; ++ return wakeup; ++ } + err: + /* + * If SCI bit is set, then don't think it's a false IRQ + * otherwise will take a not handled IRQ as a false one. + */ +- if (in_interrupt() && !(status & ACPI_EC_FLAG_SCI)) +- ++t->irq_count; ++ if (!(status & ACPI_EC_FLAG_SCI)) { ++ if (in_interrupt() && t) ++ ++t->irq_count; ++ } ++ return wakeup; ++} + +-unlock: +- spin_unlock_irqrestore(&ec->lock, flags); ++static void start_transaction(struct acpi_ec *ec) ++{ ++ ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; ++ ec->curr->flags = 0; ++ (void)advance_transaction(ec); + } + + static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data); +@@ -228,15 +245,17 @@ static int ec_poll(struct acpi_ec *ec) + /* don't sleep with disabled interrupts */ + if (EC_FLAGS_MSI || irqs_disabled()) { + udelay(ACPI_EC_MSI_UDELAY); +- if (ec_transaction_done(ec)) ++ if (ec_transaction_completed(ec)) + return 0; + } else { + if (wait_event_timeout(ec->wait, +- ec_transaction_done(ec), ++ ec_transaction_completed(ec), + msecs_to_jiffies(1))) + return 0; + } +- advance_transaction(ec, acpi_ec_read_status(ec)); ++ spin_lock_irqsave(&ec->lock, flags); ++ (void)advance_transaction(ec); ++ spin_unlock_irqrestore(&ec->lock, flags); + } while (time_before(jiffies, delay)); + pr_debug("controller reset, restart transaction\n"); + spin_lock_irqsave(&ec->lock, flags); +@@ -268,23 +287,6 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, + return ret; + } + +-static int ec_check_ibf0(struct acpi_ec *ec) +-{ +- u8 status = acpi_ec_read_status(ec); +- return (status & ACPI_EC_FLAG_IBF) == 0; +-} +- +-static int ec_wait_ibf0(struct acpi_ec *ec) +-{ +- unsigned long delay = jiffies + msecs_to_jiffies(ec_delay); +- /* interrupt wait manually if GPE mode is not active */ +- while (time_before(jiffies, delay)) +- if (wait_event_timeout(ec->wait, ec_check_ibf0(ec), +- msecs_to_jiffies(1))) +- return 0; +- return -ETIME; +-} +- + static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) + { + int status; +@@ -305,12 +307,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) + goto unlock; + } + } +- if (ec_wait_ibf0(ec)) { +- pr_err("input buffer is not empty, " +- "aborting transaction\n"); +- status = -ETIME; +- goto end; +- } + pr_debug("transaction start (cmd=0x%02x, addr=0x%02x)\n", + t->command, t->wdata ? t->wdata[0] : 0); + /* disable GPE during transaction if storm is detected */ +@@ -334,7 +330,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) + set_bit(EC_FLAGS_GPE_STORM, &ec->flags); + } + pr_debug("transaction end\n"); +-end: + if (ec->global_lock) + acpi_release_global_lock(glk); + unlock: +@@ -634,17 +629,14 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state) + static u32 acpi_ec_gpe_handler(acpi_handle gpe_device, + u32 gpe_number, void *data) + { ++ unsigned long flags; + struct acpi_ec *ec = data; +- u8 status = acpi_ec_read_status(ec); + +- pr_debug("~~~> interrupt, status:0x%02x\n", status); +- +- advance_transaction(ec, status); +- if (ec_transaction_done(ec) && +- (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) { ++ spin_lock_irqsave(&ec->lock, flags); ++ if (advance_transaction(ec)) + wake_up(&ec->wait); +- ec_check_sci(ec, acpi_ec_read_status(ec)); +- } ++ spin_unlock_irqrestore(&ec->lock, flags); ++ ec_check_sci(ec, acpi_ec_read_status(ec)); + return ACPI_INTERRUPT_HANDLED | ACPI_REENABLE_GPE; + } + +diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c +index 0bdacc5e26a3..2ba8f02ced36 100644 +--- a/drivers/acpi/resource.c ++++ b/drivers/acpi/resource.c +@@ -77,7 +77,7 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res) + switch (ares->type) { + case ACPI_RESOURCE_TYPE_MEMORY24: + memory24 = &ares->data.memory24; +- if (!memory24->address_length) ++ if (!memory24->minimum && !memory24->address_length) + return false; + acpi_dev_get_memresource(res, memory24->minimum, + memory24->address_length, +@@ -85,7 +85,7 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res) + break; + case ACPI_RESOURCE_TYPE_MEMORY32: + memory32 = &ares->data.memory32; +- if (!memory32->address_length) ++ if (!memory32->minimum && !memory32->address_length) + return false; + acpi_dev_get_memresource(res, memory32->minimum, + memory32->address_length, +@@ -93,7 +93,7 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res) + break; + case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: + fixed_memory32 = &ares->data.fixed_memory32; +- if (!fixed_memory32->address_length) ++ if (!fixed_memory32->address && !fixed_memory32->address_length) + return false; + acpi_dev_get_memresource(res, fixed_memory32->address, + fixed_memory32->address_length, +@@ -150,7 +150,7 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res) + switch (ares->type) { + case ACPI_RESOURCE_TYPE_IO: + io = &ares->data.io; +- if (!io->address_length) ++ if (!io->minimum && !io->address_length) + return false; + acpi_dev_get_ioresource(res, io->minimum, + io->address_length, +@@ -158,7 +158,7 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res) + break; + case ACPI_RESOURCE_TYPE_FIXED_IO: + fixed_io = &ares->data.fixed_io; +- if (!fixed_io->address_length) ++ if (!fixed_io->address && !fixed_io->address_length) + return false; + acpi_dev_get_ioresource(res, fixed_io->address, + fixed_io->address_length, +diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c +index 8befeb69eeb1..926355e6eeea 100644 +--- a/drivers/ata/ahci_imx.c ++++ b/drivers/ata/ahci_imx.c +@@ -58,6 +58,8 @@ enum ahci_imx_type { + struct imx_ahci_priv { + struct platform_device *ahci_pdev; + enum ahci_imx_type type; ++ struct clk *sata_clk; ++ struct clk *sata_ref_clk; + struct clk *ahb_clk; + struct regmap *gpr; + bool no_device; +@@ -224,7 +226,7 @@ static int imx_sata_enable(struct ahci_host_priv *hpriv) + return ret; + } + +- ret = ahci_platform_enable_clks(hpriv); ++ ret = clk_prepare_enable(imxpriv->sata_ref_clk); + if (ret < 0) + goto disable_regulator; + +@@ -291,7 +293,7 @@ static void imx_sata_disable(struct ahci_host_priv *hpriv) + !IMX6Q_GPR13_SATA_MPLL_CLK_EN); + } + +- ahci_platform_disable_clks(hpriv); ++ clk_disable_unprepare(imxpriv->sata_ref_clk); + + if (hpriv->target_pwr) + regulator_disable(hpriv->target_pwr); +@@ -385,6 +387,19 @@ static int imx_ahci_probe(struct platform_device *pdev) + imxpriv->no_device = false; + imxpriv->first_time = true; + imxpriv->type = (enum ahci_imx_type)of_id->data; ++ ++ imxpriv->sata_clk = devm_clk_get(dev, "sata"); ++ if (IS_ERR(imxpriv->sata_clk)) { ++ dev_err(dev, "can't get sata clock.\n"); ++ return PTR_ERR(imxpriv->sata_clk); ++ } ++ ++ imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref"); ++ if (IS_ERR(imxpriv->sata_ref_clk)) { ++ dev_err(dev, "can't get sata_ref clock.\n"); ++ return PTR_ERR(imxpriv->sata_ref_clk); ++ } ++ + imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); + if (IS_ERR(imxpriv->ahb_clk)) { + dev_err(dev, "can't get ahb clock.\n"); +@@ -407,10 +422,14 @@ static int imx_ahci_probe(struct platform_device *pdev) + + hpriv->plat_data = imxpriv; + +- ret = imx_sata_enable(hpriv); ++ ret = clk_prepare_enable(imxpriv->sata_clk); + if (ret) + return ret; + ++ ret = imx_sata_enable(hpriv); ++ if (ret) ++ goto disable_clk; ++ + /* + * Configure the HWINIT bits of the HOST_CAP and HOST_PORTS_IMPL, + * and IP vendor specific register IMX_TIMER1MS. +@@ -434,16 +453,24 @@ static int imx_ahci_probe(struct platform_device *pdev) + + ret = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info, 0, 0); + if (ret) +- imx_sata_disable(hpriv); ++ goto disable_sata; ++ ++ return 0; + ++disable_sata: ++ imx_sata_disable(hpriv); ++disable_clk: ++ clk_disable_unprepare(imxpriv->sata_clk); + return ret; + } + + static void ahci_imx_host_stop(struct ata_host *host) + { + struct ahci_host_priv *hpriv = host->private_data; ++ struct imx_ahci_priv *imxpriv = hpriv->plat_data; + + imx_sata_disable(hpriv); ++ clk_disable_unprepare(imxpriv->sata_clk); + } + + #ifdef CONFIG_PM_SLEEP +diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c +index 165c2c299e57..d3bffa478eca 100644 +--- a/drivers/base/dma-contiguous.c ++++ b/drivers/base/dma-contiguous.c +@@ -155,13 +155,23 @@ static int __init cma_activate_area(struct cma *cma) + base_pfn = pfn; + for (j = pageblock_nr_pages; j; --j, pfn++) { + WARN_ON_ONCE(!pfn_valid(pfn)); ++ /* ++ * alloc_contig_range requires the pfn range ++ * specified to be in the same zone. Make this ++ * simple by forcing the entire CMA resv range ++ * to be in the same zone. ++ */ + if (page_zone(pfn_to_page(pfn)) != zone) +- return -EINVAL; ++ goto err; + } + init_cma_reserved_pageblock(pfn_to_page(base_pfn)); + } while (--i); + + return 0; ++ ++err: ++ kfree(cma->bitmap); ++ return -EINVAL; + } + + static struct cma cma_areas[MAX_CMA_AREAS]; +diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c +index d915707d2ba1..93dcad0c1cbe 100644 +--- a/drivers/char/i8k.c ++++ b/drivers/char/i8k.c +@@ -138,7 +138,9 @@ static int i8k_smm(struct smm_regs *regs) + if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) + return -ENOMEM; + cpumask_copy(old_mask, ¤t->cpus_allowed); +- set_cpus_allowed_ptr(current, cpumask_of(0)); ++ rc = set_cpus_allowed_ptr(current, cpumask_of(0)); ++ if (rc) ++ goto out; + if (smp_processor_id() != 0) { + rc = -EBUSY; + goto out; +diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c +index f2f62a1bf61a..cbc23a610d9f 100644 +--- a/drivers/clk/clk-s2mps11.c ++++ b/drivers/clk/clk-s2mps11.c +@@ -206,16 +206,13 @@ static int s2mps11_clk_probe(struct platform_device *pdev) + goto err_reg; + } + +- s2mps11_clk->lookup = devm_kzalloc(&pdev->dev, +- sizeof(struct clk_lookup), GFP_KERNEL); ++ s2mps11_clk->lookup = clkdev_alloc(s2mps11_clk->clk, ++ s2mps11_name(s2mps11_clk), NULL); + if (!s2mps11_clk->lookup) { + ret = -ENOMEM; + goto err_lup; + } + +- s2mps11_clk->lookup->con_id = s2mps11_name(s2mps11_clk); +- s2mps11_clk->lookup->clk = s2mps11_clk->clk; +- + clkdev_add(s2mps11_clk->lookup); + } + +diff --git a/drivers/clk/qcom/mmcc-msm8960.c b/drivers/clk/qcom/mmcc-msm8960.c +index f9b59c7e48e9..9be47a829144 100644 +--- a/drivers/clk/qcom/mmcc-msm8960.c ++++ b/drivers/clk/qcom/mmcc-msm8960.c +@@ -1208,7 +1208,7 @@ static struct clk_branch rot_clk = { + + static u8 mmcc_pxo_hdmi_map[] = { + [P_PXO] = 0, +- [P_HDMI_PLL] = 2, ++ [P_HDMI_PLL] = 3, + }; + + static const char *mmcc_pxo_hdmi[] = { +diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c +index c2d204315546..125eba86c844 100644 +--- a/drivers/clk/spear/spear3xx_clock.c ++++ b/drivers/clk/spear/spear3xx_clock.c +@@ -211,7 +211,7 @@ static inline void spear310_clk_init(void) { } + /* array of all spear 320 clock lookups */ + #ifdef CONFIG_MACH_SPEAR320 + +-#define SPEAR320_CONTROL_REG (soc_config_base + 0x0000) ++#define SPEAR320_CONTROL_REG (soc_config_base + 0x0010) + #define SPEAR320_EXT_CTRL_REG (soc_config_base + 0x0018) + + #define SPEAR320_UARTX_PCLK_MASK 0x1 +diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile +index 0dbb963c1aef..3254f6cf56bf 100644 +--- a/drivers/cpufreq/Makefile ++++ b/drivers/cpufreq/Makefile +@@ -47,7 +47,7 @@ obj-$(CONFIG_ARM_BIG_LITTLE_CPUFREQ) += arm_big_little.o + # LITTLE drivers, so that it is probed last. + obj-$(CONFIG_ARM_DT_BL_CPUFREQ) += arm_big_little_dt.o + +-obj-$(CONFIG_ARCH_DAVINCI_DA850) += davinci-cpufreq.o ++obj-$(CONFIG_ARCH_DAVINCI) += davinci-cpufreq.o + obj-$(CONFIG_UX500_SOC_DB8500) += dbx500-cpufreq.o + obj-$(CONFIG_ARM_EXYNOS_CPUFREQ) += exynos-cpufreq.o + obj-$(CONFIG_ARM_EXYNOS4210_CPUFREQ) += exynos4210-cpufreq.o +diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c +index fcd0c9208e98..870eecc816ce 100644 +--- a/drivers/cpufreq/intel_pstate.c ++++ b/drivers/cpufreq/intel_pstate.c +@@ -132,6 +132,7 @@ static struct pstate_funcs pstate_funcs; + + struct perf_limits { + int no_turbo; ++ int turbo_disabled; + int max_perf_pct; + int min_perf_pct; + int32_t max_perf; +@@ -291,7 +292,10 @@ static ssize_t store_no_turbo(struct kobject *a, struct attribute *b, + if (ret != 1) + return -EINVAL; + limits.no_turbo = clamp_t(int, input, 0 , 1); +- ++ if (limits.turbo_disabled) { ++ pr_warn("Turbo disabled by BIOS or unavailable on processor\n"); ++ limits.no_turbo = limits.turbo_disabled; ++ } + return count; + } + +@@ -361,21 +365,21 @@ static int byt_get_min_pstate(void) + { + u64 value; + rdmsrl(BYT_RATIOS, value); +- return (value >> 8) & 0x3F; ++ return (value >> 8) & 0x7F; + } + + static int byt_get_max_pstate(void) + { + u64 value; + rdmsrl(BYT_RATIOS, value); +- return (value >> 16) & 0x3F; ++ return (value >> 16) & 0x7F; + } + + static int byt_get_turbo_pstate(void) + { + u64 value; + rdmsrl(BYT_TURBO_RATIOS, value); +- return value & 0x3F; ++ return value & 0x7F; + } + + static void byt_set_pstate(struct cpudata *cpudata, int pstate) +@@ -385,7 +389,7 @@ static void byt_set_pstate(struct cpudata *cpudata, int pstate) + u32 vid; + + val = pstate << 8; +- if (limits.no_turbo) ++ if (limits.no_turbo && !limits.turbo_disabled) + val |= (u64)1 << 32; + + vid_fp = cpudata->vid.min + mul_fp( +@@ -409,8 +413,8 @@ static void byt_get_vid(struct cpudata *cpudata) + + + rdmsrl(BYT_VIDS, value); +- cpudata->vid.min = int_tofp((value >> 8) & 0x3f); +- cpudata->vid.max = int_tofp((value >> 16) & 0x3f); ++ cpudata->vid.min = int_tofp((value >> 8) & 0x7f); ++ cpudata->vid.max = int_tofp((value >> 16) & 0x7f); + cpudata->vid.ratio = div_fp( + cpudata->vid.max - cpudata->vid.min, + int_tofp(cpudata->pstate.max_pstate - +@@ -452,7 +456,7 @@ static void core_set_pstate(struct cpudata *cpudata, int pstate) + u64 val; + + val = pstate << 8; +- if (limits.no_turbo) ++ if (limits.no_turbo && !limits.turbo_disabled) + val |= (u64)1 << 32; + + wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val); +@@ -705,9 +709,8 @@ static int intel_pstate_init_cpu(unsigned int cpunum) + + cpu = all_cpu_data[cpunum]; + +- intel_pstate_get_cpu_pstates(cpu); +- + cpu->cpu = cpunum; ++ intel_pstate_get_cpu_pstates(cpu); + + init_timer_deferrable(&cpu->timer); + cpu->timer.function = intel_pstate_timer_func; +@@ -750,7 +753,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy) + limits.min_perf = int_tofp(1); + limits.max_perf_pct = 100; + limits.max_perf = int_tofp(1); +- limits.no_turbo = 0; ++ limits.no_turbo = limits.turbo_disabled; + return 0; + } + limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq; +@@ -793,6 +796,7 @@ static int intel_pstate_cpu_init(struct cpufreq_policy *policy) + { + struct cpudata *cpu; + int rc; ++ u64 misc_en; + + rc = intel_pstate_init_cpu(policy->cpu); + if (rc) +@@ -800,8 +804,13 @@ static int intel_pstate_cpu_init(struct cpufreq_policy *policy) + + cpu = all_cpu_data[policy->cpu]; + +- if (!limits.no_turbo && +- limits.min_perf_pct == 100 && limits.max_perf_pct == 100) ++ rdmsrl(MSR_IA32_MISC_ENABLE, misc_en); ++ if (misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE || ++ cpu->pstate.max_pstate == cpu->pstate.turbo_pstate) { ++ limits.turbo_disabled = 1; ++ limits.no_turbo = 1; ++ } ++ if (limits.min_perf_pct == 100 && limits.max_perf_pct == 100) + policy->policy = CPUFREQ_POLICY_PERFORMANCE; + else + policy->policy = CPUFREQ_POLICY_POWERSAVE; +diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c +index 1d80bd3636c5..b512a4ba7569 100644 +--- a/drivers/crypto/caam/jr.c ++++ b/drivers/crypto/caam/jr.c +@@ -453,8 +453,8 @@ static int caam_jr_probe(struct platform_device *pdev) + int error; + + jrdev = &pdev->dev; +- jrpriv = kmalloc(sizeof(struct caam_drv_private_jr), +- GFP_KERNEL); ++ jrpriv = devm_kmalloc(jrdev, sizeof(struct caam_drv_private_jr), ++ GFP_KERNEL); + if (!jrpriv) + return -ENOMEM; + +@@ -487,10 +487,8 @@ static int caam_jr_probe(struct platform_device *pdev) + + /* Now do the platform independent part */ + error = caam_jr_init(jrdev); /* now turn on hardware */ +- if (error) { +- kfree(jrpriv); ++ if (error) + return error; +- } + + jrpriv->dev = jrdev; + spin_lock(&driver_data.jr_alloc_lock); +diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h +index 388c028e223c..44c79fd04523 100644 +--- a/drivers/gpu/drm/i915/i915_drv.h ++++ b/drivers/gpu/drm/i915/i915_drv.h +@@ -803,6 +803,7 @@ enum intel_sbi_destination { + #define QUIRK_PIPEA_FORCE (1<<0) + #define QUIRK_LVDS_SSC_DISABLE (1<<1) + #define QUIRK_INVERT_BRIGHTNESS (1<<2) ++#define QUIRK_BACKLIGHT_PRESENT (1<<3) + + struct intel_fbdev; + struct intel_fbc_work; +diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c +index 62ef55ba061c..7465ab0fd396 100644 +--- a/drivers/gpu/drm/i915/i915_gem_stolen.c ++++ b/drivers/gpu/drm/i915/i915_gem_stolen.c +@@ -74,6 +74,50 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev) + if (base == 0) + return 0; + ++ /* make sure we don't clobber the GTT if it's within stolen memory */ ++ if (INTEL_INFO(dev)->gen <= 4 && !IS_G33(dev) && !IS_G4X(dev)) { ++ struct { ++ u32 start, end; ++ } stolen[2] = { ++ { .start = base, .end = base + dev_priv->gtt.stolen_size, }, ++ { .start = base, .end = base + dev_priv->gtt.stolen_size, }, ++ }; ++ u64 gtt_start, gtt_end; ++ ++ gtt_start = I915_READ(PGTBL_CTL); ++ if (IS_GEN4(dev)) ++ gtt_start = (gtt_start & PGTBL_ADDRESS_LO_MASK) | ++ (gtt_start & PGTBL_ADDRESS_HI_MASK) << 28; ++ else ++ gtt_start &= PGTBL_ADDRESS_LO_MASK; ++ gtt_end = gtt_start + gtt_total_entries(dev_priv->gtt) * 4; ++ ++ if (gtt_start >= stolen[0].start && gtt_start < stolen[0].end) ++ stolen[0].end = gtt_start; ++ if (gtt_end > stolen[1].start && gtt_end <= stolen[1].end) ++ stolen[1].start = gtt_end; ++ ++ /* pick the larger of the two chunks */ ++ if (stolen[0].end - stolen[0].start > ++ stolen[1].end - stolen[1].start) { ++ base = stolen[0].start; ++ dev_priv->gtt.stolen_size = stolen[0].end - stolen[0].start; ++ } else { ++ base = stolen[1].start; ++ dev_priv->gtt.stolen_size = stolen[1].end - stolen[1].start; ++ } ++ ++ if (stolen[0].start != stolen[1].start || ++ stolen[0].end != stolen[1].end) { ++ DRM_DEBUG_KMS("GTT within stolen memory at 0x%llx-0x%llx\n", ++ (unsigned long long) gtt_start, ++ (unsigned long long) gtt_end - 1); ++ DRM_DEBUG_KMS("Stolen memory adjusted to 0x%x-0x%x\n", ++ base, base + (u32) dev_priv->gtt.stolen_size - 1); ++ } ++ } ++ ++ + /* Verify that nothing else uses this physical address. Stolen + * memory should be reserved by the BIOS and hidden from the + * kernel. So if the region is already marked as busy, something +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +index c77af69c2d8f..3f34dcf283a5 100644 +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -659,6 +659,9 @@ enum punit_power_well { + /* + * Instruction and interrupt control regs + */ ++#define PGTBL_CTL 0x02020 ++#define PGTBL_ADDRESS_LO_MASK 0xfffff000 /* bits [31:12] */ ++#define PGTBL_ADDRESS_HI_MASK 0x000000f0 /* bits [35:32] (gen4) */ + #define PGTBL_ER 0x02024 + #define RENDER_RING_BASE 0x02000 + #define BSD_RING_BASE 0x04000 +diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c +index 5b60e25baa32..b91dfbe9fe8e 100644 +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -11166,6 +11166,14 @@ static void quirk_invert_brightness(struct drm_device *dev) + DRM_INFO("applying inverted panel brightness quirk\n"); + } + ++/* Some VBT's incorrectly indicate no backlight is present */ ++static void quirk_backlight_present(struct drm_device *dev) ++{ ++ struct drm_i915_private *dev_priv = dev->dev_private; ++ dev_priv->quirks |= QUIRK_BACKLIGHT_PRESENT; ++ DRM_INFO("applying backlight present quirk\n"); ++} ++ + struct intel_quirk { + int device; + int subsystem_vendor; +@@ -11237,6 +11245,12 @@ static struct intel_quirk intel_quirks[] = { + + /* Acer Aspire 5336 */ + { 0x2a42, 0x1025, 0x048a, quirk_invert_brightness }, ++ ++ /* Acer C720 and C720P Chromebooks (Celeron 2955U) have backlights */ ++ { 0x0a06, 0x1025, 0x0a11, quirk_backlight_present }, ++ ++ /* Toshiba CB35 Chromebook (Celeron 2955U) */ ++ { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present }, + }; + + static void intel_init_quirks(struct drm_device *dev) +diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c +index 8b2538356371..27ee96ba906a 100644 +--- a/drivers/gpu/drm/i915/intel_panel.c ++++ b/drivers/gpu/drm/i915/intel_panel.c +@@ -1065,8 +1065,12 @@ int intel_panel_setup_backlight(struct drm_connector *connector) + int ret; + + if (!dev_priv->vbt.backlight.present) { +- DRM_DEBUG_KMS("native backlight control not available per VBT\n"); +- return 0; ++ if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) { ++ DRM_DEBUG_KMS("no backlight present per VBT, but present per quirk\n"); ++ } else { ++ DRM_DEBUG_KMS("no backlight present per VBT\n"); ++ return 0; ++ } + } + + /* set level and max in panel struct */ +diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c +index 10dae4106c08..584090ac3eb9 100644 +--- a/drivers/gpu/drm/radeon/ci_dpm.c ++++ b/drivers/gpu/drm/radeon/ci_dpm.c +@@ -1179,7 +1179,7 @@ static int ci_stop_dpm(struct radeon_device *rdev) + tmp &= ~GLOBAL_PWRMGT_EN; + WREG32_SMC(GENERAL_PWRMGT, tmp); + +- tmp = RREG32(SCLK_PWRMGT_CNTL); ++ tmp = RREG32_SMC(SCLK_PWRMGT_CNTL); + tmp &= ~DYNAMIC_PM_EN; + WREG32_SMC(SCLK_PWRMGT_CNTL, tmp); + +diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c +index 0f7a51a3694f..a61a9039f6f6 100644 +--- a/drivers/gpu/drm/radeon/evergreen.c ++++ b/drivers/gpu/drm/radeon/evergreen.c +@@ -189,7 +189,7 @@ static const u32 evergreen_golden_registers[] = + 0x8c1c, 0xffffffff, 0x00001010, + 0x28350, 0xffffffff, 0x00000000, + 0xa008, 0xffffffff, 0x00010000, +- 0x5cc, 0xffffffff, 0x00000001, ++ 0x5c4, 0xffffffff, 0x00000001, + 0x9508, 0xffffffff, 0x00000002, + 0x913c, 0x0000000f, 0x0000000a + }; +@@ -476,7 +476,7 @@ static const u32 cedar_golden_registers[] = + 0x8c1c, 0xffffffff, 0x00001010, + 0x28350, 0xffffffff, 0x00000000, + 0xa008, 0xffffffff, 0x00010000, +- 0x5cc, 0xffffffff, 0x00000001, ++ 0x5c4, 0xffffffff, 0x00000001, + 0x9508, 0xffffffff, 0x00000002 + }; + +@@ -635,7 +635,7 @@ static const u32 juniper_mgcg_init[] = + static const u32 supersumo_golden_registers[] = + { + 0x5eb4, 0xffffffff, 0x00000002, +- 0x5cc, 0xffffffff, 0x00000001, ++ 0x5c4, 0xffffffff, 0x00000001, + 0x7030, 0xffffffff, 0x00000011, + 0x7c30, 0xffffffff, 0x00000011, + 0x6104, 0x01000300, 0x00000000, +@@ -719,7 +719,7 @@ static const u32 sumo_golden_registers[] = + static const u32 wrestler_golden_registers[] = + { + 0x5eb4, 0xffffffff, 0x00000002, +- 0x5cc, 0xffffffff, 0x00000001, ++ 0x5c4, 0xffffffff, 0x00000001, + 0x7030, 0xffffffff, 0x00000011, + 0x7c30, 0xffffffff, 0x00000011, + 0x6104, 0x01000300, 0x00000000, +diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c +index c11b71d249e3..c8c48aa4181e 100644 +--- a/drivers/gpu/drm/radeon/radeon_vm.c ++++ b/drivers/gpu/drm/radeon/radeon_vm.c +@@ -493,7 +493,7 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, + mutex_unlock(&vm->mutex); + + r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8, +- RADEON_GPU_PAGE_SIZE, false, ++ RADEON_GPU_PAGE_SIZE, true, + RADEON_GEM_DOMAIN_VRAM, NULL, &pt); + if (r) + return r; +@@ -913,7 +913,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm) + return -ENOMEM; + } + +- r = radeon_bo_create(rdev, pd_size, RADEON_VM_PTB_ALIGN_SIZE, false, ++ r = radeon_bo_create(rdev, pd_size, RADEON_VM_PTB_ALIGN_SIZE, true, + RADEON_GEM_DOMAIN_VRAM, NULL, + &vm->page_directory); + if (r) +diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c +index 72d3616de08e..95b693c11640 100644 +--- a/drivers/gpu/drm/radeon/rs600.c ++++ b/drivers/gpu/drm/radeon/rs600.c +@@ -646,8 +646,10 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) + return -EINVAL; + } + addr = addr & 0xFFFFFFFFFFFFF000ULL; +- addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED; +- addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE; ++ if (addr != rdev->dummy_page.addr) ++ addr |= R600_PTE_VALID | R600_PTE_READABLE | ++ R600_PTE_WRITEABLE; ++ addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED; + writeq(addr, ptr + (i * 8)); + return 0; + } +diff --git a/drivers/gpu/drm/radeon/rv770_dpm.c b/drivers/gpu/drm/radeon/rv770_dpm.c +index da041a43d82e..3c76e1dcdf04 100644 +--- a/drivers/gpu/drm/radeon/rv770_dpm.c ++++ b/drivers/gpu/drm/radeon/rv770_dpm.c +@@ -2329,12 +2329,6 @@ void rv770_get_engine_memory_ss(struct radeon_device *rdev) + pi->mclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss, + ASIC_INTERNAL_MEMORY_SS, 0); + +- /* disable ss, causes hangs on some cayman boards */ +- if (rdev->family == CHIP_CAYMAN) { +- pi->sclk_ss = false; +- pi->mclk_ss = false; +- } +- + if (pi->sclk_ss || pi->mclk_ss) + pi->dynamic_ss = true; + else +diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c +index 05827eccc53a..ce5a9f2584f3 100644 +--- a/drivers/hv/connection.c ++++ b/drivers/hv/connection.c +@@ -319,9 +319,13 @@ static void process_chn_event(u32 relid) + */ + + do { +- hv_begin_read(&channel->inbound); ++ if (read_state) ++ hv_begin_read(&channel->inbound); + channel->onchannel_callback(arg); +- bytes_to_read = hv_end_read(&channel->inbound); ++ if (read_state) ++ bytes_to_read = hv_end_read(&channel->inbound); ++ else ++ bytes_to_read = 0; + } while (read_state && (bytes_to_read != 0)); + } else { + pr_err("no channel callback for relid - %u\n", relid); +diff --git a/drivers/hwmon/adc128d818.c b/drivers/hwmon/adc128d818.c +index 5ffd81f19d01..0625e50d7a6e 100644 +--- a/drivers/hwmon/adc128d818.c ++++ b/drivers/hwmon/adc128d818.c +@@ -239,50 +239,50 @@ static ssize_t adc128_show_alarm(struct device *dev, + return sprintf(buf, "%u\n", !!(alarms & mask)); + } + +-static SENSOR_DEVICE_ATTR_2(in0_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 0, 0); ++static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, ++ adc128_show_in, NULL, 0, 0); + static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 0, 1); + static SENSOR_DEVICE_ATTR_2(in0_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 0, 2); + +-static SENSOR_DEVICE_ATTR_2(in1_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 1, 0); ++static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, ++ adc128_show_in, NULL, 1, 0); + static SENSOR_DEVICE_ATTR_2(in1_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 1, 1); + static SENSOR_DEVICE_ATTR_2(in1_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 1, 2); + +-static SENSOR_DEVICE_ATTR_2(in2_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 2, 0); ++static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, ++ adc128_show_in, NULL, 2, 0); + static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 2, 1); + static SENSOR_DEVICE_ATTR_2(in2_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 2, 2); + +-static SENSOR_DEVICE_ATTR_2(in3_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 3, 0); ++static SENSOR_DEVICE_ATTR_2(in3_input, S_IRUGO, ++ adc128_show_in, NULL, 3, 0); + static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 3, 1); + static SENSOR_DEVICE_ATTR_2(in3_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 3, 2); + +-static SENSOR_DEVICE_ATTR_2(in4_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 4, 0); ++static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, ++ adc128_show_in, NULL, 4, 0); + static SENSOR_DEVICE_ATTR_2(in4_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 4, 1); + static SENSOR_DEVICE_ATTR_2(in4_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 4, 2); + +-static SENSOR_DEVICE_ATTR_2(in5_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 5, 0); ++static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, ++ adc128_show_in, NULL, 5, 0); + static SENSOR_DEVICE_ATTR_2(in5_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 5, 1); + static SENSOR_DEVICE_ATTR_2(in5_max, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 5, 2); + +-static SENSOR_DEVICE_ATTR_2(in6_input, S_IWUSR | S_IRUGO, +- adc128_show_in, adc128_set_in, 6, 0); ++static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, ++ adc128_show_in, NULL, 6, 0); + static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO, + adc128_show_in, adc128_set_in, 6, 1); + static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO, +diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c +index 3eb4281689b5..d74241bb278c 100644 +--- a/drivers/hwmon/adm1021.c ++++ b/drivers/hwmon/adm1021.c +@@ -185,7 +185,7 @@ static ssize_t set_temp_max(struct device *dev, + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long temp; +- int err; ++ int reg_val, err; + + err = kstrtol(buf, 10, &temp); + if (err) +@@ -193,10 +193,11 @@ static ssize_t set_temp_max(struct device *dev, + temp /= 1000; + + mutex_lock(&data->update_lock); +- data->temp_max[index] = clamp_val(temp, -128, 127); ++ reg_val = clamp_val(temp, -128, 127); ++ data->temp_max[index] = reg_val * 1000; + if (!read_only) + i2c_smbus_write_byte_data(client, ADM1021_REG_TOS_W(index), +- data->temp_max[index]); ++ reg_val); + mutex_unlock(&data->update_lock); + + return count; +@@ -210,7 +211,7 @@ static ssize_t set_temp_min(struct device *dev, + struct adm1021_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long temp; +- int err; ++ int reg_val, err; + + err = kstrtol(buf, 10, &temp); + if (err) +@@ -218,10 +219,11 @@ static ssize_t set_temp_min(struct device *dev, + temp /= 1000; + + mutex_lock(&data->update_lock); +- data->temp_min[index] = clamp_val(temp, -128, 127); ++ reg_val = clamp_val(temp, -128, 127); ++ data->temp_min[index] = reg_val * 1000; + if (!read_only) + i2c_smbus_write_byte_data(client, ADM1021_REG_THYST_W(index), +- data->temp_min[index]); ++ reg_val); + mutex_unlock(&data->update_lock); + + return count; +diff --git a/drivers/hwmon/adm1029.c b/drivers/hwmon/adm1029.c +index d19c790e410a..e38115ce0350 100644 +--- a/drivers/hwmon/adm1029.c ++++ b/drivers/hwmon/adm1029.c +@@ -232,6 +232,9 @@ static ssize_t set_fan_div(struct device *dev, + /* Update the value */ + reg = (reg & 0x3F) | (val << 6); + ++ /* Update the cache */ ++ data->fan_div[attr->index] = reg; ++ + /* Write value */ + i2c_smbus_write_byte_data(client, + ADM1029_REG_FAN_DIV[attr->index], reg); +diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c +index a8a540ca8c34..51c1a5a165ab 100644 +--- a/drivers/hwmon/adm1031.c ++++ b/drivers/hwmon/adm1031.c +@@ -365,6 +365,7 @@ set_auto_temp_min(struct device *dev, struct device_attribute *attr, + if (ret) + return ret; + ++ val = clamp_val(val, 0, 127000); + mutex_lock(&data->update_lock); + data->auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data->auto_temp[nr]); + adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), +@@ -394,6 +395,7 @@ set_auto_temp_max(struct device *dev, struct device_attribute *attr, + if (ret) + return ret; + ++ val = clamp_val(val, 0, 127000); + mutex_lock(&data->update_lock); + data->temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data->auto_temp[nr], + data->pwm[nr]); +@@ -696,7 +698,7 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, + if (ret) + return ret; + +- val = clamp_val(val, -55000, nr == 0 ? 127750 : 127875); ++ val = clamp_val(val, -55000, 127000); + mutex_lock(&data->update_lock); + data->temp_min[nr] = TEMP_TO_REG(val); + adm1031_write_value(client, ADM1031_REG_TEMP_MIN(nr), +@@ -717,7 +719,7 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, + if (ret) + return ret; + +- val = clamp_val(val, -55000, nr == 0 ? 127750 : 127875); ++ val = clamp_val(val, -55000, 127000); + mutex_lock(&data->update_lock); + data->temp_max[nr] = TEMP_TO_REG(val); + adm1031_write_value(client, ADM1031_REG_TEMP_MAX(nr), +@@ -738,7 +740,7 @@ static ssize_t set_temp_crit(struct device *dev, struct device_attribute *attr, + if (ret) + return ret; + +- val = clamp_val(val, -55000, nr == 0 ? 127750 : 127875); ++ val = clamp_val(val, -55000, 127000); + mutex_lock(&data->update_lock); + data->temp_crit[nr] = TEMP_TO_REG(val); + adm1031_write_value(client, ADM1031_REG_TEMP_CRIT(nr), +diff --git a/drivers/hwmon/amc6821.c b/drivers/hwmon/amc6821.c +index eea817296513..9f2be3dd28f3 100644 +--- a/drivers/hwmon/amc6821.c ++++ b/drivers/hwmon/amc6821.c +@@ -704,7 +704,7 @@ static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, + get_temp_alarm, NULL, IDX_TEMP1_MAX); + static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, + get_temp_alarm, NULL, IDX_TEMP1_CRIT); +-static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO | S_IWUSR, ++static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, + get_temp, NULL, IDX_TEMP2_INPUT); + static SENSOR_DEVICE_ATTR(temp2_min, S_IRUGO | S_IWUSR, get_temp, + set_temp, IDX_TEMP2_MIN); +diff --git a/drivers/hwmon/emc2103.c b/drivers/hwmon/emc2103.c +index fd892dd48e4c..78002de46cb6 100644 +--- a/drivers/hwmon/emc2103.c ++++ b/drivers/hwmon/emc2103.c +@@ -250,9 +250,7 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *da, + if (result < 0) + return result; + +- val = DIV_ROUND_CLOSEST(val, 1000); +- if ((val < -63) || (val > 127)) +- return -EINVAL; ++ val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -63, 127); + + mutex_lock(&data->update_lock); + data->temp_min[nr] = val; +@@ -274,9 +272,7 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *da, + if (result < 0) + return result; + +- val = DIV_ROUND_CLOSEST(val, 1000); +- if ((val < -63) || (val > 127)) +- return -EINVAL; ++ val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -63, 127); + + mutex_lock(&data->update_lock); + data->temp_max[nr] = val; +@@ -390,15 +386,14 @@ static ssize_t set_fan_target(struct device *dev, struct device_attribute *da, + { + struct emc2103_data *data = emc2103_update_device(dev); + struct i2c_client *client = to_i2c_client(dev); +- long rpm_target; ++ unsigned long rpm_target; + +- int result = kstrtol(buf, 10, &rpm_target); ++ int result = kstrtoul(buf, 10, &rpm_target); + if (result < 0) + return result; + + /* Datasheet states 16384 as maximum RPM target (table 3.2) */ +- if ((rpm_target < 0) || (rpm_target > 16384)) +- return -EINVAL; ++ rpm_target = clamp_val(rpm_target, 0, 16384); + + mutex_lock(&data->update_lock); + +diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c +index a4db3026bec6..d5dc4c6ce86c 100644 +--- a/drivers/iio/adc/ti_am335x_adc.c ++++ b/drivers/iio/adc/ti_am335x_adc.c +@@ -374,7 +374,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev, + return -EAGAIN; + } + } +- map_val = chan->channel + TOTAL_CHANNELS; ++ map_val = adc_dev->channel_step[chan->scan_index]; + + /* + * We check the complete FIFO. We programmed just one entry but in case +diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c +index 3842ac738f98..db404a0f7e2c 100644 +--- a/drivers/md/dm-io.c ++++ b/drivers/md/dm-io.c +@@ -10,6 +10,7 @@ + #include <linux/device-mapper.h> + + #include <linux/bio.h> ++#include <linux/completion.h> + #include <linux/mempool.h> + #include <linux/module.h> + #include <linux/sched.h> +@@ -32,7 +33,7 @@ struct dm_io_client { + struct io { + unsigned long error_bits; + atomic_t count; +- struct task_struct *sleeper; ++ struct completion *wait; + struct dm_io_client *client; + io_notify_fn callback; + void *context; +@@ -121,8 +122,8 @@ static void dec_count(struct io *io, unsigned int region, int error) + invalidate_kernel_vmap_range(io->vma_invalidate_address, + io->vma_invalidate_size); + +- if (io->sleeper) +- wake_up_process(io->sleeper); ++ if (io->wait) ++ complete(io->wait); + + else { + unsigned long r = io->error_bits; +@@ -387,6 +388,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, + */ + volatile char io_[sizeof(struct io) + __alignof__(struct io) - 1]; + struct io *io = (struct io *)PTR_ALIGN(&io_, __alignof__(struct io)); ++ DECLARE_COMPLETION_ONSTACK(wait); + + if (num_regions > 1 && (rw & RW_MASK) != WRITE) { + WARN_ON(1); +@@ -395,7 +397,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, + + io->error_bits = 0; + atomic_set(&io->count, 1); /* see dispatch_io() */ +- io->sleeper = current; ++ io->wait = &wait; + io->client = client; + + io->vma_invalidate_address = dp->vma_invalidate_address; +@@ -403,15 +405,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, + + dispatch_io(rw, num_regions, where, dp, io, 1); + +- while (1) { +- set_current_state(TASK_UNINTERRUPTIBLE); +- +- if (!atomic_read(&io->count)) +- break; +- +- io_schedule(); +- } +- set_current_state(TASK_RUNNING); ++ wait_for_completion_io(&wait); + + if (error_bits) + *error_bits = io->error_bits; +@@ -434,7 +428,7 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, + io = mempool_alloc(client->pool, GFP_NOIO); + io->error_bits = 0; + atomic_set(&io->count, 1); /* see dispatch_io() */ +- io->sleeper = NULL; ++ io->wait = NULL; + io->client = client; + io->callback = fn; + io->context = context; +diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c +index ebfa411d1a7d..9efb863ad052 100644 +--- a/drivers/md/dm-mpath.c ++++ b/drivers/md/dm-mpath.c +@@ -1620,8 +1620,9 @@ static int multipath_busy(struct dm_target *ti) + + spin_lock_irqsave(&m->lock, flags); + +- /* pg_init in progress, requeue until done */ +- if (!pg_ready(m)) { ++ /* pg_init in progress or no paths available */ ++ if (m->pg_init_in_progress || ++ (!m->nr_valid_paths && m->queue_if_no_path)) { + busy = 1; + goto out; + } +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 455e64916498..490ac238772d 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -54,6 +54,8 @@ static void do_deferred_remove(struct work_struct *w); + + static DECLARE_WORK(deferred_remove_work, do_deferred_remove); + ++static struct workqueue_struct *deferred_remove_workqueue; ++ + /* + * For bio-based dm. + * One of these is allocated per bio. +@@ -276,16 +278,24 @@ static int __init local_init(void) + if (r) + goto out_free_rq_tio_cache; + ++ deferred_remove_workqueue = alloc_workqueue("kdmremove", WQ_UNBOUND, 1); ++ if (!deferred_remove_workqueue) { ++ r = -ENOMEM; ++ goto out_uevent_exit; ++ } ++ + _major = major; + r = register_blkdev(_major, _name); + if (r < 0) +- goto out_uevent_exit; ++ goto out_free_workqueue; + + if (!_major) + _major = r; + + return 0; + ++out_free_workqueue: ++ destroy_workqueue(deferred_remove_workqueue); + out_uevent_exit: + dm_uevent_exit(); + out_free_rq_tio_cache: +@@ -299,6 +309,7 @@ out_free_io_cache: + static void local_exit(void) + { + flush_scheduled_work(); ++ destroy_workqueue(deferred_remove_workqueue); + + kmem_cache_destroy(_rq_tio_cache); + kmem_cache_destroy(_io_cache); +@@ -407,7 +418,7 @@ static void dm_blk_close(struct gendisk *disk, fmode_t mode) + + if (atomic_dec_and_test(&md->open_count) && + (test_bit(DMF_DEFERRED_REMOVE, &md->flags))) +- schedule_work(&deferred_remove_work); ++ queue_work(deferred_remove_workqueue, &deferred_remove_work); + + dm_put(md); + +diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c +index 0a685089c3fd..69faeec7fa4c 100644 +--- a/drivers/mtd/nand/omap2.c ++++ b/drivers/mtd/nand/omap2.c +@@ -1162,7 +1162,7 @@ static int __maybe_unused omap_calculate_ecc_bch(struct mtd_info *mtd, + struct gpmc_nand_regs *gpmc_regs = &info->reg; + u8 *ecc_code; + unsigned long nsectors, bch_val1, bch_val2, bch_val3, bch_val4; +- int i; ++ int i, j; + + nsectors = ((readl(info->reg.gpmc_ecc_config) >> 4) & 0x7) + 1; + for (i = 0; i < nsectors; i++) { +@@ -1210,8 +1210,8 @@ static int __maybe_unused omap_calculate_ecc_bch(struct mtd_info *mtd, + case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW: + /* Add constant polynomial to remainder, so that + * ECC of blank pages results in 0x0 on reading back */ +- for (i = 0; i < eccbytes; i++) +- ecc_calc[i] ^= bch4_polynomial[i]; ++ for (j = 0; j < eccbytes; j++) ++ ecc_calc[j] ^= bch4_polynomial[j]; + break; + case OMAP_ECC_BCH4_CODE_HW: + /* Set 8th ECC byte as 0x0 for ROM compatibility */ +@@ -1220,8 +1220,8 @@ static int __maybe_unused omap_calculate_ecc_bch(struct mtd_info *mtd, + case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW: + /* Add constant polynomial to remainder, so that + * ECC of blank pages results in 0x0 on reading back */ +- for (i = 0; i < eccbytes; i++) +- ecc_calc[i] ^= bch8_polynomial[i]; ++ for (j = 0; j < eccbytes; j++) ++ ecc_calc[j] ^= bch8_polynomial[j]; + break; + case OMAP_ECC_BCH8_CODE_HW: + /* Set 14th ECC byte as 0x0 for ROM compatibility */ +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index cf0761f08911..71dfd79f391a 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -4310,7 +4310,7 @@ int i40e_vsi_open(struct i40e_vsi *vsi) + goto err_setup_rx; + + if (!vsi->netdev) { +- err = EINVAL; ++ err = -EINVAL; + goto err_setup_rx; + } + snprintf(int_name, sizeof(int_name) - 1, "%s-%s", +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 83b01fa02400..bba3726ab510 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -3109,8 +3109,13 @@ static int pci_af_flr(struct pci_dev *dev, int probe) + if (probe) + return 0; + +- /* Wait for Transaction Pending bit clean */ +- if (pci_wait_for_pending(dev, pos + PCI_AF_STATUS, PCI_AF_STATUS_TP)) ++ /* ++ * Wait for Transaction Pending bit to clear. A word-aligned test ++ * is used, so we use the conrol offset rather than status and shift ++ * the test bit to match. ++ */ ++ if (pci_wait_for_pending(dev, pos + PCI_AF_CTRL, ++ PCI_AF_STATUS_TP << 8)) + goto clear; + + dev_err(&dev->dev, "transaction is not cleared; " +diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c +index c64a2f3b2d62..49c446530101 100644 +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -614,8 +614,9 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops, + return phy; + + put_dev: +- put_device(&phy->dev); +- ida_remove(&phy_ida, phy->id); ++ put_device(&phy->dev); /* calls phy_release() which frees resources */ ++ return ERR_PTR(ret); ++ + free_phy: + kfree(phy); + return ERR_PTR(ret); +@@ -799,7 +800,7 @@ static void phy_release(struct device *dev) + + phy = to_phy(dev); + dev_vdbg(dev, "releasing '%s'\n", dev_name(dev)); +- ida_remove(&phy_ida, phy->id); ++ ida_simple_remove(&phy_ida, phy->id); + kfree(phy); + } + +diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c +index 1ecfe3bd92ac..1cff2a21db67 100644 +--- a/drivers/rtc/rtc-puv3.c ++++ b/drivers/rtc/rtc-puv3.c +@@ -71,7 +71,7 @@ static int puv3_rtc_setpie(struct device *dev, int enabled) + { + unsigned int tmp; + +- dev_debug(dev, "%s: pie=%d\n", __func__, enabled); ++ dev_dbg(dev, "%s: pie=%d\n", __func__, enabled); + + spin_lock_irq(&puv3_rtc_pie_lock); + tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; +@@ -140,7 +140,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) + rtc_tm_to_time(tm, &rtcalarm_count); + writel(rtcalarm_count, RTC_RTAR); + +- puv3_rtc_setaie(&dev->dev, alrm->enabled); ++ puv3_rtc_setaie(dev, alrm->enabled); + + if (alrm->enabled) + enable_irq_wake(puv3_rtc_alarmno); +diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c +index fdb07199d9c2..1967bee4f076 100644 +--- a/drivers/thermal/thermal_hwmon.c ++++ b/drivers/thermal/thermal_hwmon.c +@@ -140,6 +140,12 @@ thermal_hwmon_lookup_temp(const struct thermal_hwmon_device *hwmon, + return NULL; + } + ++static bool thermal_zone_crit_temp_valid(struct thermal_zone_device *tz) ++{ ++ unsigned long temp; ++ return tz->ops->get_crit_temp && !tz->ops->get_crit_temp(tz, &temp); ++} ++ + int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) + { + struct thermal_hwmon_device *hwmon; +@@ -189,21 +195,18 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) + if (result) + goto free_temp_mem; + +- if (tz->ops->get_crit_temp) { +- unsigned long temperature; +- if (!tz->ops->get_crit_temp(tz, &temperature)) { +- snprintf(temp->temp_crit.name, +- sizeof(temp->temp_crit.name), ++ if (thermal_zone_crit_temp_valid(tz)) { ++ snprintf(temp->temp_crit.name, ++ sizeof(temp->temp_crit.name), + "temp%d_crit", hwmon->count); +- temp->temp_crit.attr.attr.name = temp->temp_crit.name; +- temp->temp_crit.attr.attr.mode = 0444; +- temp->temp_crit.attr.show = temp_crit_show; +- sysfs_attr_init(&temp->temp_crit.attr.attr); +- result = device_create_file(hwmon->device, +- &temp->temp_crit.attr); +- if (result) +- goto unregister_input; +- } ++ temp->temp_crit.attr.attr.name = temp->temp_crit.name; ++ temp->temp_crit.attr.attr.mode = 0444; ++ temp->temp_crit.attr.show = temp_crit_show; ++ sysfs_attr_init(&temp->temp_crit.attr.attr); ++ result = device_create_file(hwmon->device, ++ &temp->temp_crit.attr); ++ if (result) ++ goto unregister_input; + } + + mutex_lock(&thermal_hwmon_list_lock); +@@ -250,7 +253,7 @@ void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz) + } + + device_remove_file(hwmon->device, &temp->temp_input.attr); +- if (tz->ops->get_crit_temp) ++ if (thermal_zone_crit_temp_valid(tz)) + device_remove_file(hwmon->device, &temp->temp_crit.attr); + + mutex_lock(&thermal_hwmon_list_lock); +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 3b6c1a2e25de..be1c842ec747 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -563,6 +563,9 @@ static void imx_start_tx(struct uart_port *port) + struct imx_port *sport = (struct imx_port *)port; + unsigned long temp; + ++ if (uart_circ_empty(&port->state->xmit)) ++ return; ++ + if (USE_IRDA(sport)) { + /* half duplex in IrDA mode; have to disable receive mode */ + temp = readl(sport->port.membase + UCR4); +diff --git a/drivers/tty/serial/ip22zilog.c b/drivers/tty/serial/ip22zilog.c +index 1efd4c36ba0c..99b7b8697861 100644 +--- a/drivers/tty/serial/ip22zilog.c ++++ b/drivers/tty/serial/ip22zilog.c +@@ -603,6 +603,8 @@ static void ip22zilog_start_tx(struct uart_port *port) + } else { + struct circ_buf *xmit = &port->state->xmit; + ++ if (uart_circ_empty(xmit)) ++ return; + writeb(xmit->buf[xmit->tail], &channel->data); + ZSDELAY(); + ZS_WSYNC(channel); +diff --git a/drivers/tty/serial/m32r_sio.c b/drivers/tty/serial/m32r_sio.c +index 68f2c53e0b54..5702828fb62e 100644 +--- a/drivers/tty/serial/m32r_sio.c ++++ b/drivers/tty/serial/m32r_sio.c +@@ -266,9 +266,11 @@ static void m32r_sio_start_tx(struct uart_port *port) + if (!(up->ier & UART_IER_THRI)) { + up->ier |= UART_IER_THRI; + serial_out(up, UART_IER, up->ier); +- serial_out(up, UART_TX, xmit->buf[xmit->tail]); +- xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); +- up->port.icount.tx++; ++ if (!uart_circ_empty(xmit)) { ++ serial_out(up, UART_TX, xmit->buf[xmit->tail]); ++ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); ++ up->port.icount.tx++; ++ } + } + while((serial_in(up, UART_LSR) & UART_EMPTY) != UART_EMPTY); + #else +diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c +index 8193635103ee..f7ad5b903055 100644 +--- a/drivers/tty/serial/pmac_zilog.c ++++ b/drivers/tty/serial/pmac_zilog.c +@@ -653,6 +653,8 @@ static void pmz_start_tx(struct uart_port *port) + } else { + struct circ_buf *xmit = &port->state->xmit; + ++ if (uart_circ_empty(xmit)) ++ goto out; + write_zsdata(uap, xmit->buf[xmit->tail]); + zssync(uap); + xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); +@@ -661,6 +663,7 @@ static void pmz_start_tx(struct uart_port *port) + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) + uart_write_wakeup(&uap->port); + } ++ out: + pmz_debug("pmz: start_tx() done.\n"); + } + +diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c +index 80a58eca785b..2f57df9a71d9 100644 +--- a/drivers/tty/serial/sunsab.c ++++ b/drivers/tty/serial/sunsab.c +@@ -427,6 +427,9 @@ static void sunsab_start_tx(struct uart_port *port) + struct circ_buf *xmit = &up->port.state->xmit; + int i; + ++ if (uart_circ_empty(xmit)) ++ return; ++ + up->interrupt_mask1 &= ~(SAB82532_IMR1_ALLS|SAB82532_IMR1_XPR); + writeb(up->interrupt_mask1, &up->regs->w.imr1); + +diff --git a/drivers/tty/serial/sunzilog.c b/drivers/tty/serial/sunzilog.c +index a85db8b87156..02df3940b95e 100644 +--- a/drivers/tty/serial/sunzilog.c ++++ b/drivers/tty/serial/sunzilog.c +@@ -703,6 +703,8 @@ static void sunzilog_start_tx(struct uart_port *port) + } else { + struct circ_buf *xmit = &port->state->xmit; + ++ if (uart_circ_empty(xmit)) ++ return; + writeb(xmit->buf[xmit->tail], &channel->data); + ZSDELAY(); + ZS_WSYNC(channel); +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index 762e4a5f5ae9..330df5ce435b 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -153,6 +153,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ + { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ + { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ ++ { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ + { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ + { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ + { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ +diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c +index 115662c16dcc..8a3813be1b28 100644 +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -720,7 +720,8 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, +- { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, ++ { USB_DEVICE(TESTO_VID, TESTO_1_PID) }, ++ { USB_DEVICE(TESTO_VID, TESTO_3_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, +@@ -944,6 +945,8 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, ++ /* Infineon Devices */ ++ { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) }, + { } /* Terminating entry */ + }; + +diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h +index 500474c48f4b..c4777bc6aee0 100644 +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -584,6 +584,12 @@ + #define RATOC_PRODUCT_ID_USB60F 0xb020 + + /* ++ * Infineon Technologies ++ */ ++#define INFINEON_VID 0x058b ++#define INFINEON_TRIBOARD_PID 0x0028 /* DAS JTAG TriBoard TC1798 V1.0 */ ++ ++/* + * Acton Research Corp. + */ + #define ACTON_VID 0x0647 /* Vendor ID */ +@@ -798,7 +804,8 @@ + * Submitted by Colin Leroy + */ + #define TESTO_VID 0x128D +-#define TESTO_USB_INTERFACE_PID 0x0001 ++#define TESTO_1_PID 0x0001 ++#define TESTO_3_PID 0x0003 + + /* + * Mobility Electronics products. +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index e25e8ca09fe2..9da566a3f5c8 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -1487,6 +1487,8 @@ static const struct usb_device_id option_ids[] = { + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1428, 0xff, 0xff, 0xff), /* Telewell TW-LTE 4G v2 */ ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) }, +diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c +index 0ebc21204b51..c7d7d5fc3ac3 100644 +--- a/fs/ext4/extents_status.c ++++ b/fs/ext4/extents_status.c +@@ -960,10 +960,10 @@ retry: + continue; + } + +- if (ei->i_es_lru_nr == 0 || ei == locked_ei) ++ if (ei->i_es_lru_nr == 0 || ei == locked_ei || ++ !write_trylock(&ei->i_es_lock)) + continue; + +- write_lock(&ei->i_es_lock); + shrunk = __es_try_to_reclaim_extents(ei, nr_to_scan); + if (ei->i_es_lru_nr == 0) + list_del_init(&ei->i_es_lru); +diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c +index 0ee59a6644e2..64bb32f17903 100644 +--- a/fs/ext4/ialloc.c ++++ b/fs/ext4/ialloc.c +@@ -851,6 +851,13 @@ got: + goto out; + } + ++ BUFFER_TRACE(group_desc_bh, "get_write_access"); ++ err = ext4_journal_get_write_access(handle, group_desc_bh); ++ if (err) { ++ ext4_std_error(sb, err); ++ goto out; ++ } ++ + /* We may have to initialize the block bitmap if it isn't already */ + if (ext4_has_group_desc_csum(sb) && + gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { +@@ -887,13 +894,6 @@ got: + } + } + +- BUFFER_TRACE(group_desc_bh, "get_write_access"); +- err = ext4_journal_get_write_access(handle, group_desc_bh); +- if (err) { +- ext4_std_error(sb, err); +- goto out; +- } +- + /* Update the relevant bg descriptor fields */ + if (ext4_has_group_desc_csum(sb)) { + int free; +diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c +index fe4e668d3023..2735a72d1ec4 100644 +--- a/fs/ext4/mballoc.c ++++ b/fs/ext4/mballoc.c +@@ -751,8 +751,8 @@ void ext4_mb_generate_buddy(struct super_block *sb, + + if (free != grp->bb_free) { + ext4_grp_locked_error(sb, group, 0, 0, +- "%u clusters in bitmap, %u in gd; " +- "block bitmap corrupt.", ++ "block bitmap and bg descriptor " ++ "inconsistent: %u vs %u free clusters", + free, grp->bb_free); + /* + * If we intend to continue, we consider group descriptor +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index 6f9e6fadac04..29a403c0c003 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1524,8 +1524,6 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, + arg = JBD2_DEFAULT_MAX_COMMIT_AGE; + sbi->s_commit_interval = HZ * arg; + } else if (token == Opt_max_batch_time) { +- if (arg == 0) +- arg = EXT4_DEF_MAX_BATCH_TIME; + sbi->s_max_batch_time = arg; + } else if (token == Opt_min_batch_time) { + sbi->s_min_batch_time = arg; +@@ -2798,10 +2796,11 @@ static void print_daily_error_info(unsigned long arg) + es = sbi->s_es; + + if (es->s_error_count) +- ext4_msg(sb, KERN_NOTICE, "error count: %u", ++ /* fsck newer than v1.41.13 is needed to clean this condition. */ ++ ext4_msg(sb, KERN_NOTICE, "error count since last fsck: %u", + le32_to_cpu(es->s_error_count)); + if (es->s_first_error_time) { +- printk(KERN_NOTICE "EXT4-fs (%s): initial error at %u: %.*s:%d", ++ printk(KERN_NOTICE "EXT4-fs (%s): initial error at time %u: %.*s:%d", + sb->s_id, le32_to_cpu(es->s_first_error_time), + (int) sizeof(es->s_first_error_func), + es->s_first_error_func, +@@ -2815,7 +2814,7 @@ static void print_daily_error_info(unsigned long arg) + printk("\n"); + } + if (es->s_last_error_time) { +- printk(KERN_NOTICE "EXT4-fs (%s): last error at %u: %.*s:%d", ++ printk(KERN_NOTICE "EXT4-fs (%s): last error at time %u: %.*s:%d", + sb->s_id, le32_to_cpu(es->s_last_error_time), + (int) sizeof(es->s_last_error_func), + es->s_last_error_func, +@@ -3869,38 +3868,19 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) + goto failed_mount2; + } + } +- +- /* +- * set up enough so that it can read an inode, +- * and create new inode for buddy allocator +- */ +- sbi->s_gdb_count = db_count; +- if (!test_opt(sb, NOLOAD) && +- EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) +- sb->s_op = &ext4_sops; +- else +- sb->s_op = &ext4_nojournal_sops; +- +- ext4_ext_init(sb); +- err = ext4_mb_init(sb); +- if (err) { +- ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", +- err); +- goto failed_mount2; +- } +- + if (!ext4_check_descriptors(sb, &first_not_zeroed)) { + ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); +- goto failed_mount2a; ++ goto failed_mount2; + } + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) + if (!ext4_fill_flex_info(sb)) { + ext4_msg(sb, KERN_ERR, + "unable to initialize " + "flex_bg meta info!"); +- goto failed_mount2a; ++ goto failed_mount2; + } + ++ sbi->s_gdb_count = db_count; + get_random_bytes(&sbi->s_next_generation, sizeof(u32)); + spin_lock_init(&sbi->s_next_gen_lock); + +@@ -3935,6 +3915,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) + sbi->s_stripe = ext4_get_stripe_size(sbi); + sbi->s_extent_max_zeroout_kb = 32; + ++ /* ++ * set up enough so that it can read an inode ++ */ ++ if (!test_opt(sb, NOLOAD) && ++ EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) ++ sb->s_op = &ext4_sops; ++ else ++ sb->s_op = &ext4_nojournal_sops; + sb->s_export_op = &ext4_export_ops; + sb->s_xattr = ext4_xattr_handlers; + #ifdef CONFIG_QUOTA +@@ -4124,13 +4112,21 @@ no_journal: + if (err) { + ext4_msg(sb, KERN_ERR, "failed to reserve %llu clusters for " + "reserved pool", ext4_calculate_resv_clusters(sb)); +- goto failed_mount5; ++ goto failed_mount4a; + } + + err = ext4_setup_system_zone(sb); + if (err) { + ext4_msg(sb, KERN_ERR, "failed to initialize system " + "zone (%d)", err); ++ goto failed_mount4a; ++ } ++ ++ ext4_ext_init(sb); ++ err = ext4_mb_init(sb); ++ if (err) { ++ ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", ++ err); + goto failed_mount5; + } + +@@ -4207,8 +4203,11 @@ failed_mount8: + failed_mount7: + ext4_unregister_li_request(sb); + failed_mount6: +- ext4_release_system_zone(sb); ++ ext4_mb_release(sb); + failed_mount5: ++ ext4_ext_release(sb); ++ ext4_release_system_zone(sb); ++failed_mount4a: + dput(sb->s_root); + sb->s_root = NULL; + failed_mount4: +@@ -4232,14 +4231,11 @@ failed_mount3: + percpu_counter_destroy(&sbi->s_extent_cache_cnt); + if (sbi->s_mmp_tsk) + kthread_stop(sbi->s_mmp_tsk); +-failed_mount2a: +- ext4_mb_release(sb); + failed_mount2: + for (i = 0; i < db_count; i++) + brelse(sbi->s_group_desc[i]); + ext4_kvfree(sbi->s_group_desc); + failed_mount: +- ext4_ext_release(sb); + if (sbi->s_chksum_driver) + crypto_free_shash(sbi->s_chksum_driver); + if (sbi->s_proc) { +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index bc077f3c8868..a63e20fee78a 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -869,7 +869,8 @@ static int f2fs_write_data_pages(struct address_space *mapping, + return 0; + + if (S_ISDIR(inode->i_mode) && wbc->sync_mode == WB_SYNC_NONE && +- get_dirty_dents(inode) < nr_pages_to_skip(sbi, DATA)) ++ get_dirty_dents(inode) < nr_pages_to_skip(sbi, DATA) && ++ available_free_memory(sbi, DIRTY_DENTS)) + goto skip_write; + + diff = nr_pages_to_write(sbi, DATA, wbc); +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 2ecac8312359..656523cb4513 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -1140,6 +1140,7 @@ f2fs_hash_t f2fs_dentry_hash(const char *, size_t); + struct dnode_of_data; + struct node_info; + ++bool available_free_memory(struct f2fs_sb_info *, int); + int is_checkpointed_node(struct f2fs_sb_info *, nid_t); + bool fsync_mark_done(struct f2fs_sb_info *, nid_t); + void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index a161e955c4c8..5696bde95702 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -26,20 +26,28 @@ + static struct kmem_cache *nat_entry_slab; + static struct kmem_cache *free_nid_slab; + +-static inline bool available_free_memory(struct f2fs_nm_info *nm_i, int type) ++bool available_free_memory(struct f2fs_sb_info *sbi, int type) + { ++ struct f2fs_nm_info *nm_i = NM_I(sbi); + struct sysinfo val; + unsigned long mem_size = 0; ++ bool res = false; + + si_meminfo(&val); +- if (type == FREE_NIDS) +- mem_size = nm_i->fcnt * sizeof(struct free_nid); +- else if (type == NAT_ENTRIES) +- mem_size += nm_i->nat_cnt * sizeof(struct nat_entry); +- mem_size >>= 12; +- +- /* give 50:50 memory for free nids and nat caches respectively */ +- return (mem_size < ((val.totalram * nm_i->ram_thresh) >> 11)); ++ /* give 25%, 25%, 50% memory for each components respectively */ ++ if (type == FREE_NIDS) { ++ mem_size = (nm_i->fcnt * sizeof(struct free_nid)) >> 12; ++ res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2); ++ } else if (type == NAT_ENTRIES) { ++ mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >> 12; ++ res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2); ++ } else if (type == DIRTY_DENTS) { ++ if (sbi->sb->s_bdi->dirty_exceeded) ++ return false; ++ mem_size = get_pages(sbi, F2FS_DIRTY_DENTS); ++ res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 1); ++ } ++ return res; + } + + static void clear_node_page_dirty(struct page *page) +@@ -243,7 +251,7 @@ int try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink) + { + struct f2fs_nm_info *nm_i = NM_I(sbi); + +- if (available_free_memory(nm_i, NAT_ENTRIES)) ++ if (available_free_memory(sbi, NAT_ENTRIES)) + return 0; + + write_lock(&nm_i->nat_tree_lock); +@@ -1315,13 +1323,14 @@ static void __del_from_free_nid_list(struct f2fs_nm_info *nm_i, + radix_tree_delete(&nm_i->free_nid_root, i->nid); + } + +-static int add_free_nid(struct f2fs_nm_info *nm_i, nid_t nid, bool build) ++static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) + { ++ struct f2fs_nm_info *nm_i = NM_I(sbi); + struct free_nid *i; + struct nat_entry *ne; + bool allocated = false; + +- if (!available_free_memory(nm_i, FREE_NIDS)) ++ if (!available_free_memory(sbi, FREE_NIDS)) + return -1; + + /* 0 nid should not be used */ +@@ -1374,9 +1383,10 @@ static void remove_free_nid(struct f2fs_nm_info *nm_i, nid_t nid) + kmem_cache_free(free_nid_slab, i); + } + +-static void scan_nat_page(struct f2fs_nm_info *nm_i, ++static void scan_nat_page(struct f2fs_sb_info *sbi, + struct page *nat_page, nid_t start_nid) + { ++ struct f2fs_nm_info *nm_i = NM_I(sbi); + struct f2fs_nat_block *nat_blk = page_address(nat_page); + block_t blk_addr; + int i; +@@ -1391,7 +1401,7 @@ static void scan_nat_page(struct f2fs_nm_info *nm_i, + blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); + f2fs_bug_on(blk_addr == NEW_ADDR); + if (blk_addr == NULL_ADDR) { +- if (add_free_nid(nm_i, start_nid, true) < 0) ++ if (add_free_nid(sbi, start_nid, true) < 0) + break; + } + } +@@ -1415,7 +1425,7 @@ static void build_free_nids(struct f2fs_sb_info *sbi) + while (1) { + struct page *page = get_current_nat_page(sbi, nid); + +- scan_nat_page(nm_i, page, nid); ++ scan_nat_page(sbi, page, nid); + f2fs_put_page(page, 1); + + nid += (NAT_ENTRY_PER_BLOCK - (nid % NAT_ENTRY_PER_BLOCK)); +@@ -1435,7 +1445,7 @@ static void build_free_nids(struct f2fs_sb_info *sbi) + block_t addr = le32_to_cpu(nat_in_journal(sum, i).block_addr); + nid = le32_to_cpu(nid_in_journal(sum, i)); + if (addr == NULL_ADDR) +- add_free_nid(nm_i, nid, true); ++ add_free_nid(sbi, nid, true); + else + remove_free_nid(nm_i, nid); + } +@@ -1512,7 +1522,7 @@ void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid) + spin_lock(&nm_i->free_nid_list_lock); + i = __lookup_free_nid_list(nm_i, nid); + f2fs_bug_on(!i || i->state != NID_ALLOC); +- if (!available_free_memory(nm_i, FREE_NIDS)) { ++ if (!available_free_memory(sbi, FREE_NIDS)) { + __del_from_free_nid_list(nm_i, i); + need_free = true; + } else { +@@ -1843,7 +1853,7 @@ flush_now: + } + + if (nat_get_blkaddr(ne) == NULL_ADDR && +- add_free_nid(NM_I(sbi), nid, false) <= 0) { ++ add_free_nid(sbi, nid, false) <= 0) { + write_lock(&nm_i->nat_tree_lock); + __del_from_nat_cache(nm_i, ne); + write_unlock(&nm_i->nat_tree_lock); +diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h +index 5decc1a375f0..b5170776b8dc 100644 +--- a/fs/f2fs/node.h ++++ b/fs/f2fs/node.h +@@ -75,9 +75,10 @@ static inline void node_info_from_raw_nat(struct node_info *ni, + ni->version = raw_ne->version; + } + +-enum nid_type { ++enum mem_type { + FREE_NIDS, /* indicates the free nid list */ +- NAT_ENTRIES /* indicates the cached nat entry */ ++ NAT_ENTRIES, /* indicates the cached nat entry */ ++ DIRTY_DENTS /* indicates dirty dentry pages */ + }; + + /* +diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c +index 38cfcf5f6fce..6f0f590cc5a3 100644 +--- a/fs/jbd2/transaction.c ++++ b/fs/jbd2/transaction.c +@@ -1588,9 +1588,12 @@ int jbd2_journal_stop(handle_t *handle) + * to perform a synchronous write. We do this to detect the + * case where a single process is doing a stream of sync + * writes. No point in waiting for joiners in that case. ++ * ++ * Setting max_batch_time to 0 disables this completely. + */ + pid = current->pid; +- if (handle->h_sync && journal->j_last_sync_writer != pid) { ++ if (handle->h_sync && journal->j_last_sync_writer != pid && ++ journal->j_max_batch_time) { + u64 commit_time, trans_time; + + journal->j_last_sync_writer = pid; +diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c +index ac127cd008bf..a693f5b01ae6 100644 +--- a/fs/kernfs/dir.c ++++ b/fs/kernfs/dir.c +@@ -714,6 +714,7 @@ struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops, + return ERR_PTR(-ENOMEM); + + ida_init(&root->ino_ida); ++ INIT_LIST_HEAD(&root->supers); + + kn = __kernfs_new_node(root, "", S_IFDIR | S_IRUGO | S_IXUGO, + KERNFS_DIR); +diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h +index 8be13b2a079b..dc84a3ef9ca2 100644 +--- a/fs/kernfs/kernfs-internal.h ++++ b/fs/kernfs/kernfs-internal.h +@@ -49,6 +49,8 @@ static inline struct kernfs_root *kernfs_root(struct kernfs_node *kn) + * mount.c + */ + struct kernfs_super_info { ++ struct super_block *sb; ++ + /* + * The root associated with this super_block. Each super_block is + * identified by the root and ns it's associated with. +@@ -62,6 +64,9 @@ struct kernfs_super_info { + * an array and compare kernfs_node tag against every entry. + */ + const void *ns; ++ ++ /* anchored at kernfs_root->supers, protected by kernfs_mutex */ ++ struct list_head node; + }; + #define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info)) + +diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c +index 95dcd1d558bb..f973ae9b05f1 100644 +--- a/fs/kernfs/mount.c ++++ b/fs/kernfs/mount.c +@@ -68,6 +68,7 @@ static int kernfs_fill_super(struct super_block *sb, unsigned long magic) + struct inode *inode; + struct dentry *root; + ++ info->sb = sb; + sb->s_blocksize = PAGE_CACHE_SIZE; + sb->s_blocksize_bits = PAGE_CACHE_SHIFT; + sb->s_magic = magic; +@@ -167,12 +168,18 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, + *new_sb_created = !sb->s_root; + + if (!sb->s_root) { ++ struct kernfs_super_info *info = kernfs_info(sb); ++ + error = kernfs_fill_super(sb, magic); + if (error) { + deactivate_locked_super(sb); + return ERR_PTR(error); + } + sb->s_flags |= MS_ACTIVE; ++ ++ mutex_lock(&kernfs_mutex); ++ list_add(&info->node, &root->supers); ++ mutex_unlock(&kernfs_mutex); + } + + return dget(sb->s_root); +@@ -191,6 +198,10 @@ void kernfs_kill_sb(struct super_block *sb) + struct kernfs_super_info *info = kernfs_info(sb); + struct kernfs_node *root_kn = sb->s_root->d_fsdata; + ++ mutex_lock(&kernfs_mutex); ++ list_del(&info->node); ++ mutex_unlock(&kernfs_mutex); ++ + /* + * Remove the superblock from fs_supers/s_instances + * so we can't find it, before freeing kernfs_super_info. +@@ -200,6 +211,36 @@ void kernfs_kill_sb(struct super_block *sb) + kernfs_put(root_kn); + } + ++/** ++ * kernfs_pin_sb: try to pin the superblock associated with a kernfs_root ++ * @kernfs_root: the kernfs_root in question ++ * @ns: the namespace tag ++ * ++ * Pin the superblock so the superblock won't be destroyed in subsequent ++ * operations. This can be used to block ->kill_sb() which may be useful ++ * for kernfs users which dynamically manage superblocks. ++ * ++ * Returns NULL if there's no superblock associated to this kernfs_root, or ++ * -EINVAL if the superblock is being freed. ++ */ ++struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns) ++{ ++ struct kernfs_super_info *info; ++ struct super_block *sb = NULL; ++ ++ mutex_lock(&kernfs_mutex); ++ list_for_each_entry(info, &root->supers, node) { ++ if (info->ns == ns) { ++ sb = info->sb; ++ if (!atomic_inc_not_zero(&info->sb->s_active)) ++ sb = ERR_PTR(-EINVAL); ++ break; ++ } ++ } ++ mutex_unlock(&kernfs_mutex); ++ return sb; ++} ++ + void __init kernfs_init(void) + { + kernfs_node_cache = kmem_cache_create("kernfs_node_cache", +diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h +index 52bf5677db0b..20f493564917 100644 +--- a/include/linux/kernfs.h ++++ b/include/linux/kernfs.h +@@ -161,6 +161,10 @@ struct kernfs_root { + /* private fields, do not use outside kernfs proper */ + struct ida ino_ida; + struct kernfs_syscall_ops *syscall_ops; ++ ++ /* list of kernfs_super_info of this root, protected by kernfs_mutex */ ++ struct list_head supers; ++ + wait_queue_head_t deactivate_waitq; + }; + +@@ -300,6 +304,7 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, + struct kernfs_root *root, unsigned long magic, + bool *new_sb_created, const void *ns); + void kernfs_kill_sb(struct super_block *sb); ++struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns); + + void kernfs_init(void); + +diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h +index d69cf637a15a..49a4d6f59108 100644 +--- a/include/linux/ring_buffer.h ++++ b/include/linux/ring_buffer.h +@@ -97,7 +97,7 @@ __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *k + __ring_buffer_alloc((size), (flags), &__key); \ + }) + +-void ring_buffer_wait(struct ring_buffer *buffer, int cpu); ++int ring_buffer_wait(struct ring_buffer *buffer, int cpu); + int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu, + struct file *filp, poll_table *poll_table); + +diff --git a/kernel/cgroup.c b/kernel/cgroup.c +index ceee0c54c6a4..073226b3dfb0 100644 +--- a/kernel/cgroup.c ++++ b/kernel/cgroup.c +@@ -1484,10 +1484,13 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, + int flags, const char *unused_dev_name, + void *data) + { ++ struct super_block *pinned_sb = NULL; ++ struct cgroup_subsys *ss; + struct cgroup_root *root; + struct cgroup_sb_opts opts; + struct dentry *dentry; + int ret; ++ int i; + bool new_sb; + + /* +@@ -1514,6 +1517,29 @@ retry: + goto out_unlock; + } + ++ /* ++ * Destruction of cgroup root is asynchronous, so subsystems may ++ * still be dying after the previous unmount. Let's drain the ++ * dying subsystems. We just need to ensure that the ones ++ * unmounted previously finish dying and don't care about new ones ++ * starting. Testing ref liveliness is good enough. ++ */ ++ for_each_subsys(ss, i) { ++ if (!(opts.subsys_mask & (1 << i)) || ++ ss->root == &cgrp_dfl_root) ++ continue; ++ ++ if (!atomic_inc_not_zero(&ss->root->cgrp.refcnt)) { ++ mutex_unlock(&cgroup_mutex); ++ mutex_unlock(&cgroup_tree_mutex); ++ msleep(10); ++ mutex_lock(&cgroup_tree_mutex); ++ mutex_lock(&cgroup_mutex); ++ goto retry; ++ } ++ cgroup_put(&ss->root->cgrp); ++ } ++ + for_each_root(root) { + bool name_match = false; + +@@ -1559,10 +1585,25 @@ retry: + * destruction to complete so that the subsystems are free. + * We can use wait_queue for the wait but this path is + * super cold. Let's just sleep for a bit and retry. ++ ++ * We want to reuse @root whose lifetime is governed by its ++ * ->cgrp. Let's check whether @root is alive and keep it ++ * that way. As cgroup_kill_sb() can happen anytime, we ++ * want to block it by pinning the sb so that @root doesn't ++ * get killed before mount is complete. ++ * ++ * With the sb pinned, inc_not_zero can reliably indicate ++ * whether @root can be reused. If it's being killed, ++ * drain it. We can use wait_queue for the wait but this ++ * path is super cold. Let's just sleep a bit and retry. + */ +- if (!atomic_inc_not_zero(&root->cgrp.refcnt)) { ++ pinned_sb = kernfs_pin_sb(root->kf_root, NULL); ++ if (IS_ERR(pinned_sb) || ++ !atomic_inc_not_zero(&root->cgrp.refcnt)) { + mutex_unlock(&cgroup_mutex); + mutex_unlock(&cgroup_tree_mutex); ++ if (!IS_ERR_OR_NULL(pinned_sb)) ++ deactivate_super(pinned_sb); + msleep(10); + mutex_lock(&cgroup_tree_mutex); + mutex_lock(&cgroup_mutex); +@@ -1609,6 +1650,16 @@ out_unlock: + CGROUP_SUPER_MAGIC, &new_sb); + if (IS_ERR(dentry) || !new_sb) + cgroup_put(&root->cgrp); ++ ++ /* ++ * If @pinned_sb, we're reusing an existing root and holding an ++ * extra ref on its sb. Mount is complete. Put the extra ref. ++ */ ++ if (pinned_sb) { ++ WARN_ON(new_sb); ++ deactivate_super(pinned_sb); ++ } ++ + return dentry; + } + +diff --git a/kernel/cpuset.c b/kernel/cpuset.c +index 3d54c418bd06..a735402837ac 100644 +--- a/kernel/cpuset.c ++++ b/kernel/cpuset.c +@@ -1188,7 +1188,13 @@ done: + + int current_cpuset_is_being_rebound(void) + { +- return task_cs(current) == cpuset_being_rebound; ++ int ret; ++ ++ rcu_read_lock(); ++ ret = task_cs(current) == cpuset_being_rebound; ++ rcu_read_unlock(); ++ ++ return ret; + } + + static int update_relax_domain_level(struct cpuset *cs, s64 val) +diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c +index c634868c2921..7c56c3d06943 100644 +--- a/kernel/trace/ring_buffer.c ++++ b/kernel/trace/ring_buffer.c +@@ -543,7 +543,7 @@ static void rb_wake_up_waiters(struct irq_work *work) + * as data is added to any of the @buffer's cpu buffers. Otherwise + * it will wait for data to be added to a specific cpu buffer. + */ +-void ring_buffer_wait(struct ring_buffer *buffer, int cpu) ++int ring_buffer_wait(struct ring_buffer *buffer, int cpu) + { + struct ring_buffer_per_cpu *cpu_buffer; + DEFINE_WAIT(wait); +@@ -557,6 +557,8 @@ void ring_buffer_wait(struct ring_buffer *buffer, int cpu) + if (cpu == RING_BUFFER_ALL_CPUS) + work = &buffer->irq_work; + else { ++ if (!cpumask_test_cpu(cpu, buffer->cpumask)) ++ return -ENODEV; + cpu_buffer = buffer->buffers[cpu]; + work = &cpu_buffer->irq_work; + } +@@ -591,6 +593,7 @@ void ring_buffer_wait(struct ring_buffer *buffer, int cpu) + schedule(); + + finish_wait(&work->waiters, &wait); ++ return 0; + } + + /** +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 1848dc6278b7..39a12265c253 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -1103,13 +1103,13 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) + } + #endif /* CONFIG_TRACER_MAX_TRACE */ + +-static void default_wait_pipe(struct trace_iterator *iter) ++static int default_wait_pipe(struct trace_iterator *iter) + { + /* Iterators are static, they should be filled or empty */ + if (trace_buffer_iter(iter, iter->cpu_file)) +- return; ++ return 0; + +- ring_buffer_wait(iter->trace_buffer->buffer, iter->cpu_file); ++ return ring_buffer_wait(iter->trace_buffer->buffer, iter->cpu_file); + } + + #ifdef CONFIG_FTRACE_STARTUP_TEST +@@ -4236,17 +4236,19 @@ tracing_poll_pipe(struct file *filp, poll_table *poll_table) + * + * Anyway, this is really very primitive wakeup. + */ +-void poll_wait_pipe(struct trace_iterator *iter) ++int poll_wait_pipe(struct trace_iterator *iter) + { + set_current_state(TASK_INTERRUPTIBLE); + /* sleep for 100 msecs, and try again. */ + schedule_timeout(HZ / 10); ++ return 0; + } + + /* Must be called with trace_types_lock mutex held. */ + static int tracing_wait_pipe(struct file *filp) + { + struct trace_iterator *iter = filp->private_data; ++ int ret; + + while (trace_empty(iter)) { + +@@ -4256,10 +4258,13 @@ static int tracing_wait_pipe(struct file *filp) + + mutex_unlock(&iter->mutex); + +- iter->trace->wait_pipe(iter); ++ ret = iter->trace->wait_pipe(iter); + + mutex_lock(&iter->mutex); + ++ if (ret) ++ return ret; ++ + if (signal_pending(current)) + return -EINTR; + +@@ -5196,8 +5201,12 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, + goto out_unlock; + } + mutex_unlock(&trace_types_lock); +- iter->trace->wait_pipe(iter); ++ ret = iter->trace->wait_pipe(iter); + mutex_lock(&trace_types_lock); ++ if (ret) { ++ size = ret; ++ goto out_unlock; ++ } + if (signal_pending(current)) { + size = -EINTR; + goto out_unlock; +@@ -5407,8 +5416,10 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, + goto out; + } + mutex_unlock(&trace_types_lock); +- iter->trace->wait_pipe(iter); ++ ret = iter->trace->wait_pipe(iter); + mutex_lock(&trace_types_lock); ++ if (ret) ++ goto out; + if (signal_pending(current)) { + ret = -EINTR; + goto out; +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index 2e29d7ba5a52..99676cd9e28a 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -342,7 +342,7 @@ struct tracer { + void (*stop)(struct trace_array *tr); + void (*open)(struct trace_iterator *iter); + void (*pipe_open)(struct trace_iterator *iter); +- void (*wait_pipe)(struct trace_iterator *iter); ++ int (*wait_pipe)(struct trace_iterator *iter); + void (*close)(struct trace_iterator *iter); + void (*pipe_close)(struct trace_iterator *iter); + ssize_t (*read)(struct trace_iterator *iter, +@@ -560,7 +560,7 @@ void trace_init_global_iter(struct trace_iterator *iter); + + void tracing_iter_reset(struct trace_iterator *iter, int cpu); + +-void poll_wait_pipe(struct trace_iterator *iter); ++int poll_wait_pipe(struct trace_iterator *iter); + + void tracing_sched_switch_trace(struct trace_array *tr, + struct task_struct *prev, +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 8edc87185427..7ba589779a6b 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -3422,6 +3422,7 @@ int workqueue_sysfs_register(struct workqueue_struct *wq) + } + } + ++ dev_set_uevent_suppress(&wq_dev->dev, false); + kobject_uevent(&wq_dev->dev.kobj, KOBJ_ADD); + return 0; + } +@@ -5033,7 +5034,7 @@ static void __init wq_numa_init(void) + BUG_ON(!tbl); + + for_each_node(node) +- BUG_ON(!alloc_cpumask_var_node(&tbl[node], GFP_KERNEL, ++ BUG_ON(!zalloc_cpumask_var_node(&tbl[node], GFP_KERNEL, + node_online(node) ? node : NUMA_NO_NODE)); + + for_each_possible_cpu(cpu) { +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 35f9f91278fd..6b65d10f0df8 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2136,7 +2136,6 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) + } else + *new = *old; + +- rcu_read_lock(); + if (current_cpuset_is_being_rebound()) { + nodemask_t mems = cpuset_mems_allowed(current); + if (new->flags & MPOL_F_REBINDING) +@@ -2144,7 +2143,6 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) + else + mpol_rebind_policy(new, &mems, MPOL_REBIND_ONCE); + } +- rcu_read_unlock(); + atomic_set(&new->refcnt, 1); + return new; + } |