diff options
author | 2015-05-11 12:36:04 -0400 | |
---|---|---|
committer | 2015-05-11 12:36:04 -0400 | |
commit | 9f342c3c3caad0b8bc5042ba59927219a5df581b (patch) | |
tree | c81e2ca55dd306b692971816d4212eb3975cfe18 /3.2.68/1041_linux-3.2.42.patch | |
parent | Grsec/PaX: 3.1-{3.2.68,3.14.41,4.0.2}-201505091724 (diff) | |
download | hardened-patchset-9f342c3c3caad0b8bc5042ba59927219a5df581b.tar.gz hardened-patchset-9f342c3c3caad0b8bc5042ba59927219a5df581b.tar.bz2 hardened-patchset-9f342c3c3caad0b8bc5042ba59927219a5df581b.zip |
Grsec/PaX: 3.1-{3.2.69,3.14.41,4.0.2}-20150510112220150510
Diffstat (limited to '3.2.68/1041_linux-3.2.42.patch')
-rw-r--r-- | 3.2.68/1041_linux-3.2.42.patch | 3602 |
1 files changed, 0 insertions, 3602 deletions
diff --git a/3.2.68/1041_linux-3.2.42.patch b/3.2.68/1041_linux-3.2.42.patch deleted file mode 100644 index 77a08ed..0000000 --- a/3.2.68/1041_linux-3.2.42.patch +++ /dev/null @@ -1,3602 +0,0 @@ -diff --git a/Makefile b/Makefile -index 95e6220..d44f009 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 3 - PATCHLEVEL = 2 --SUBLEVEL = 41 -+SUBLEVEL = 42 - EXTRAVERSION = - NAME = Saber-toothed Squirrel - -diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h -index 43ba0fb..559ee24 100644 ---- a/arch/arm/include/asm/signal.h -+++ b/arch/arm/include/asm/signal.h -@@ -127,6 +127,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/avr32/include/asm/signal.h b/arch/avr32/include/asm/signal.h -index 8790dfc..e6952a0 100644 ---- a/arch/avr32/include/asm/signal.h -+++ b/arch/avr32/include/asm/signal.h -@@ -128,6 +128,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/cris/include/asm/signal.h b/arch/cris/include/asm/signal.h -index ea6af9a..057fea2 100644 ---- a/arch/cris/include/asm/signal.h -+++ b/arch/cris/include/asm/signal.h -@@ -122,6 +122,7 @@ struct sigaction { - void (*sa_restorer)(void); - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/h8300/include/asm/signal.h b/arch/h8300/include/asm/signal.h -index fd8b66e..8695707 100644 ---- a/arch/h8300/include/asm/signal.h -+++ b/arch/h8300/include/asm/signal.h -@@ -121,6 +121,7 @@ struct sigaction { - void (*sa_restorer)(void); - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/m32r/include/asm/signal.h b/arch/m32r/include/asm/signal.h -index b2eeb0d..802d561 100644 ---- a/arch/m32r/include/asm/signal.h -+++ b/arch/m32r/include/asm/signal.h -@@ -123,6 +123,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h -index 93fe83e..a20ae63 100644 ---- a/arch/m68k/include/asm/signal.h -+++ b/arch/m68k/include/asm/signal.h -@@ -119,6 +119,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/mn10300/include/asm/signal.h b/arch/mn10300/include/asm/signal.h -index 1865d72..eecaa76 100644 ---- a/arch/mn10300/include/asm/signal.h -+++ b/arch/mn10300/include/asm/signal.h -@@ -131,6 +131,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h -index 3eb13be..ec63a0a 100644 ---- a/arch/powerpc/include/asm/signal.h -+++ b/arch/powerpc/include/asm/signal.h -@@ -109,6 +109,7 @@ struct sigaction { - __sigrestore_t sa_restorer; - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c -index edae5bb..b92b756 100644 ---- a/arch/powerpc/kernel/cputable.c -+++ b/arch/powerpc/kernel/cputable.c -@@ -268,7 +268,7 @@ static struct cpu_spec __initdata cpu_specs[] = { - .cpu_features = CPU_FTRS_PPC970, - .cpu_user_features = COMMON_USER_POWER4 | - PPC_FEATURE_HAS_ALTIVEC_COMP, -- .mmu_features = MMU_FTR_HPTE_TABLE, -+ .mmu_features = MMU_FTRS_PPC970, - .icache_bsize = 128, - .dcache_bsize = 128, - .num_pmcs = 8, -diff --git a/arch/s390/include/asm/signal.h b/arch/s390/include/asm/signal.h -index cdf5cb2..c872626 100644 ---- a/arch/s390/include/asm/signal.h -+++ b/arch/s390/include/asm/signal.h -@@ -131,6 +131,7 @@ struct sigaction { - void (*sa_restorer)(void); - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h -index 1d8648c..8743029 100644 ---- a/arch/s390/include/asm/tlbflush.h -+++ b/arch/s390/include/asm/tlbflush.h -@@ -74,8 +74,6 @@ static inline void __tlb_flush_idte(unsigned long asce) - - static inline void __tlb_flush_mm(struct mm_struct * mm) - { -- if (unlikely(cpumask_empty(mm_cpumask(mm)))) -- return; - /* - * If the machine has IDTE we prefer to do a per mm flush - * on all cpus instead of doing a local flush if the mm -diff --git a/arch/sparc/include/asm/signal.h b/arch/sparc/include/asm/signal.h -index e49b828..4929431 100644 ---- a/arch/sparc/include/asm/signal.h -+++ b/arch/sparc/include/asm/signal.h -@@ -191,6 +191,7 @@ struct __old_sigaction { - unsigned long sa_flags; - void (*sa_restorer)(void); /* not used by Linux/SPARC yet */ - }; -+#define __ARCH_HAS_SA_RESTORER - - typedef struct sigaltstack { - void __user *ss_sp; -diff --git a/arch/x86/include/asm/signal.h b/arch/x86/include/asm/signal.h -index 598457c..6cbc795 100644 ---- a/arch/x86/include/asm/signal.h -+++ b/arch/x86/include/asm/signal.h -@@ -125,6 +125,8 @@ typedef unsigned long sigset_t; - extern void do_notify_resume(struct pt_regs *, void *, __u32); - # endif /* __KERNEL__ */ - -+#define __ARCH_HAS_SA_RESTORER -+ - #ifdef __i386__ - # ifdef __KERNEL__ - struct old_sigaction { -diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c -index 73da6b6..2d4e76b 100644 ---- a/arch/x86/kernel/cpu/perf_event_intel_ds.c -+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c -@@ -736,3 +736,13 @@ void intel_ds_init(void) - } - } - } -+ -+void perf_restore_debug_store(void) -+{ -+ struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds); -+ -+ if (!x86_pmu.bts && !x86_pmu.pebs) -+ return; -+ -+ wrmsrl(MSR_IA32_DS_AREA, (unsigned long)ds); -+} -diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c -index b7c2849..554b7b5 100644 ---- a/arch/x86/lib/usercopy_64.c -+++ b/arch/x86/lib/usercopy_64.c -@@ -169,10 +169,10 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) - char c; - unsigned zero_len; - -- for (; len; --len) { -+ for (; len; --len, to++) { - if (__get_user_nocheck(c, from++, sizeof(char))) - break; -- if (__put_user_nocheck(c, to++, sizeof(char))) -+ if (__put_user_nocheck(c, to, sizeof(char))) - break; - } - -diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c -index f10c0af..43c9f6a 100644 ---- a/arch/x86/power/cpu.c -+++ b/arch/x86/power/cpu.c -@@ -11,6 +11,7 @@ - #include <linux/suspend.h> - #include <linux/export.h> - #include <linux/smp.h> -+#include <linux/perf_event.h> - - #include <asm/pgtable.h> - #include <asm/proto.h> -@@ -225,6 +226,7 @@ static void __restore_processor_state(struct saved_context *ctxt) - - do_fpu_end(); - mtrr_bp_restore(); -+ perf_restore_debug_store(); - } - - /* Needed by apm.c */ -diff --git a/arch/xtensa/include/asm/signal.h b/arch/xtensa/include/asm/signal.h -index 633ba73..75edf8a 100644 ---- a/arch/xtensa/include/asm/signal.h -+++ b/arch/xtensa/include/asm/signal.h -@@ -133,6 +133,7 @@ struct sigaction { - void (*sa_restorer)(void); - sigset_t sa_mask; /* mask last for extensibility */ - }; -+#define __ARCH_HAS_SA_RESTORER - - struct k_sigaction { - struct sigaction sa; -diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig -index efba163..bf4d6e2 100644 ---- a/drivers/firmware/Kconfig -+++ b/drivers/firmware/Kconfig -@@ -53,6 +53,24 @@ config EFI_VARS - Subsequent efibootmgr releases may be found at: - <http://linux.dell.com/efibootmgr> - -+config EFI_VARS_PSTORE -+ bool "Register efivars backend for pstore" -+ depends on EFI_VARS && PSTORE -+ default y -+ help -+ Say Y here to enable use efivars as a backend to pstore. This -+ will allow writing console messages, crash dumps, or anything -+ else supported by pstore to EFI variables. -+ -+config EFI_VARS_PSTORE_DEFAULT_DISABLE -+ bool "Disable using efivars as a pstore backend by default" -+ depends on EFI_VARS_PSTORE -+ default n -+ help -+ Saying Y here will disable the use of efivars as a storage -+ backend for pstore by default. This setting can be overridden -+ using the efivars module's pstore_disable parameter. -+ - config EFI_PCDP - bool "Console device selection via EFI PCDP or HCDP table" - depends on ACPI && EFI && IA64 -diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c -index 81346ae..b15c0aa 100644 ---- a/drivers/firmware/efivars.c -+++ b/drivers/firmware/efivars.c -@@ -92,6 +92,11 @@ MODULE_VERSION(EFIVARS_VERSION); - - #define DUMP_NAME_LEN 52 - -+static bool efivars_pstore_disable = -+ IS_ENABLED(CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE); -+ -+module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644); -+ - /* - * The maximum size of VariableName + Data = 1024 - * Therefore, it's reasonable to save that much -@@ -122,6 +127,8 @@ struct efivar_attribute { - ssize_t (*store)(struct efivar_entry *entry, const char *buf, size_t count); - }; - -+static struct efivars __efivars; -+ - #define PSTORE_EFI_ATTRIBUTES \ - (EFI_VARIABLE_NON_VOLATILE | \ - EFI_VARIABLE_BOOTSERVICE_ACCESS | \ -@@ -146,6 +153,14 @@ efivar_create_sysfs_entry(struct efivars *efivars, - efi_char16_t *variable_name, - efi_guid_t *vendor_guid); - -+/* -+ * Prototype for workqueue functions updating sysfs entry -+ */ -+ -+static void efivar_update_sysfs_entries(struct work_struct *); -+static DECLARE_WORK(efivar_work, efivar_update_sysfs_entries); -+static bool efivar_wq_enabled = true; -+ - /* Return the number of unicode characters in data */ - static unsigned long - utf16_strnlen(efi_char16_t *s, size_t maxlength) -@@ -659,8 +674,6 @@ static struct kobj_type efivar_ktype = { - .default_attrs = def_attrs, - }; - --static struct pstore_info efi_pstore_info; -- - static inline void - efivar_unregister(struct efivar_entry *var) - { -@@ -697,7 +710,7 @@ static int efi_status_to_err(efi_status_t status) - return err; - } - --#ifdef CONFIG_PSTORE -+#ifdef CONFIG_EFI_VARS_PSTORE - - static int efi_pstore_open(struct pstore_info *psi) - { -@@ -774,19 +787,21 @@ static int efi_pstore_write(enum pstore_type_id type, u64 *id, - - spin_lock_irqsave(&efivars->lock, flags); - -- /* -- * Check if there is a space enough to log. -- * size: a size of logging data -- * DUMP_NAME_LEN * 2: a maximum size of variable name -- */ -+ if (size) { -+ /* -+ * Check if there is a space enough to log. -+ * size: a size of logging data -+ * DUMP_NAME_LEN * 2: a maximum size of variable name -+ */ - -- status = check_var_size_locked(efivars, PSTORE_EFI_ATTRIBUTES, -- size + DUMP_NAME_LEN * 2); -+ status = check_var_size_locked(efivars, PSTORE_EFI_ATTRIBUTES, -+ size + DUMP_NAME_LEN * 2); - -- if (status) { -- spin_unlock_irqrestore(&efivars->lock, flags); -- *id = part; -- return -ENOSPC; -+ if (status) { -+ spin_unlock_irqrestore(&efivars->lock, flags); -+ *id = part; -+ return -ENOSPC; -+ } - } - - for (i = 0; i < DUMP_NAME_LEN; i++) -@@ -830,11 +845,8 @@ static int efi_pstore_write(enum pstore_type_id type, u64 *id, - if (found) - efivar_unregister(found); - -- if (size) -- ret = efivar_create_sysfs_entry(efivars, -- utf16_strsize(efi_name, -- DUMP_NAME_LEN * 2), -- efi_name, &vendor); -+ if (efivar_wq_enabled) -+ schedule_work(&efivar_work); - - *id = part; - return ret; -@@ -847,36 +859,6 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, - - return 0; - } --#else --static int efi_pstore_open(struct pstore_info *psi) --{ -- return 0; --} -- --static int efi_pstore_close(struct pstore_info *psi) --{ -- return 0; --} -- --static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, -- struct timespec *timespec, -- char **buf, struct pstore_info *psi) --{ -- return -1; --} -- --static int efi_pstore_write(enum pstore_type_id type, u64 *id, -- unsigned int part, size_t size, struct pstore_info *psi) --{ -- return 0; --} -- --static int efi_pstore_erase(enum pstore_type_id type, u64 id, -- struct pstore_info *psi) --{ -- return 0; --} --#endif - - static struct pstore_info efi_pstore_info = { - .owner = THIS_MODULE, -@@ -888,6 +870,24 @@ static struct pstore_info efi_pstore_info = { - .erase = efi_pstore_erase, - }; - -+static void efivar_pstore_register(struct efivars *efivars) -+{ -+ efivars->efi_pstore_info = efi_pstore_info; -+ efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); -+ if (efivars->efi_pstore_info.buf) { -+ efivars->efi_pstore_info.bufsize = 1024; -+ efivars->efi_pstore_info.data = efivars; -+ spin_lock_init(&efivars->efi_pstore_info.buf_lock); -+ pstore_register(&efivars->efi_pstore_info); -+ } -+} -+#else -+static void efivar_pstore_register(struct efivars *efivars) -+{ -+ return; -+} -+#endif -+ - static ssize_t efivar_create(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t pos, size_t count) -@@ -1025,6 +1025,103 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, - return count; - } - -+static bool variable_is_present(efi_char16_t *variable_name, efi_guid_t *vendor) -+{ -+ struct efivar_entry *entry, *n; -+ struct efivars *efivars = &__efivars; -+ unsigned long strsize1, strsize2; -+ bool found = false; -+ -+ strsize1 = utf16_strsize(variable_name, 1024); -+ list_for_each_entry_safe(entry, n, &efivars->list, list) { -+ strsize2 = utf16_strsize(entry->var.VariableName, 1024); -+ if (strsize1 == strsize2 && -+ !memcmp(variable_name, &(entry->var.VariableName), -+ strsize2) && -+ !efi_guidcmp(entry->var.VendorGuid, -+ *vendor)) { -+ found = true; -+ break; -+ } -+ } -+ return found; -+} -+ -+/* -+ * Returns the size of variable_name, in bytes, including the -+ * terminating NULL character, or variable_name_size if no NULL -+ * character is found among the first variable_name_size bytes. -+ */ -+static unsigned long var_name_strnsize(efi_char16_t *variable_name, -+ unsigned long variable_name_size) -+{ -+ unsigned long len; -+ efi_char16_t c; -+ -+ /* -+ * The variable name is, by definition, a NULL-terminated -+ * string, so make absolutely sure that variable_name_size is -+ * the value we expect it to be. If not, return the real size. -+ */ -+ for (len = 2; len <= variable_name_size; len += sizeof(c)) { -+ c = variable_name[(len / sizeof(c)) - 1]; -+ if (!c) -+ break; -+ } -+ -+ return min(len, variable_name_size); -+} -+ -+static void efivar_update_sysfs_entries(struct work_struct *work) -+{ -+ struct efivars *efivars = &__efivars; -+ efi_guid_t vendor; -+ efi_char16_t *variable_name; -+ unsigned long variable_name_size = 1024; -+ efi_status_t status = EFI_NOT_FOUND; -+ bool found; -+ -+ /* Add new sysfs entries */ -+ while (1) { -+ variable_name = kzalloc(variable_name_size, GFP_KERNEL); -+ if (!variable_name) { -+ pr_err("efivars: Memory allocation failed.\n"); -+ return; -+ } -+ -+ spin_lock_irq(&efivars->lock); -+ found = false; -+ while (1) { -+ variable_name_size = 1024; -+ status = efivars->ops->get_next_variable( -+ &variable_name_size, -+ variable_name, -+ &vendor); -+ if (status != EFI_SUCCESS) { -+ break; -+ } else { -+ if (!variable_is_present(variable_name, -+ &vendor)) { -+ found = true; -+ break; -+ } -+ } -+ } -+ spin_unlock_irq(&efivars->lock); -+ -+ if (!found) { -+ kfree(variable_name); -+ break; -+ } else { -+ variable_name_size = var_name_strnsize(variable_name, -+ variable_name_size); -+ efivar_create_sysfs_entry(efivars, -+ variable_name_size, -+ variable_name, &vendor); -+ } -+ } -+} -+ - /* - * Let's not leave out systab information that snuck into - * the efivars driver -@@ -1212,6 +1309,35 @@ void unregister_efivars(struct efivars *efivars) - } - EXPORT_SYMBOL_GPL(unregister_efivars); - -+/* -+ * Print a warning when duplicate EFI variables are encountered and -+ * disable the sysfs workqueue since the firmware is buggy. -+ */ -+static void dup_variable_bug(efi_char16_t *s16, efi_guid_t *vendor_guid, -+ unsigned long len16) -+{ -+ size_t i, len8 = len16 / sizeof(efi_char16_t); -+ char *s8; -+ -+ /* -+ * Disable the workqueue since the algorithm it uses for -+ * detecting new variables won't work with this buggy -+ * implementation of GetNextVariableName(). -+ */ -+ efivar_wq_enabled = false; -+ -+ s8 = kzalloc(len8, GFP_KERNEL); -+ if (!s8) -+ return; -+ -+ for (i = 0; i < len8; i++) -+ s8[i] = s16[i]; -+ -+ printk(KERN_WARNING "efivars: duplicate variable: %s-%pUl\n", -+ s8, vendor_guid); -+ kfree(s8); -+} -+ - int register_efivars(struct efivars *efivars, - const struct efivar_operations *ops, - struct kobject *parent_kobj) -@@ -1252,6 +1378,24 @@ int register_efivars(struct efivars *efivars, - &vendor_guid); - switch (status) { - case EFI_SUCCESS: -+ variable_name_size = var_name_strnsize(variable_name, -+ variable_name_size); -+ -+ /* -+ * Some firmware implementations return the -+ * same variable name on multiple calls to -+ * get_next_variable(). Terminate the loop -+ * immediately as there is no guarantee that -+ * we'll ever see a different variable name, -+ * and may end up looping here forever. -+ */ -+ if (variable_is_present(variable_name, &vendor_guid)) { -+ dup_variable_bug(variable_name, &vendor_guid, -+ variable_name_size); -+ status = EFI_NOT_FOUND; -+ break; -+ } -+ - efivar_create_sysfs_entry(efivars, - variable_name_size, - variable_name, -@@ -1271,15 +1415,8 @@ int register_efivars(struct efivars *efivars, - if (error) - unregister_efivars(efivars); - -- efivars->efi_pstore_info = efi_pstore_info; -- -- efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL); -- if (efivars->efi_pstore_info.buf) { -- efivars->efi_pstore_info.bufsize = 1024; -- efivars->efi_pstore_info.data = efivars; -- spin_lock_init(&efivars->efi_pstore_info.buf_lock); -- pstore_register(&efivars->efi_pstore_info); -- } -+ if (!efivars_pstore_disable) -+ efivar_pstore_register(efivars); - - out: - kfree(variable_name); -@@ -1288,7 +1425,6 @@ out: - } - EXPORT_SYMBOL_GPL(register_efivars); - --static struct efivars __efivars; - static struct efivar_operations ops; - - /* -@@ -1346,6 +1482,8 @@ err_put: - static void __exit - efivars_exit(void) - { -+ cancel_work_sync(&efivar_work); -+ - if (efi_enabled(EFI_RUNTIME_SERVICES)) { - unregister_efivars(&__efivars); - kobject_put(efi_kobj); -diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index 9080eb7..7211f67 100644 ---- a/drivers/gpu/drm/drm_edid.c -+++ b/drivers/gpu/drm/drm_edid.c -@@ -852,7 +852,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, - unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo; - unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo; - unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo; -- unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 | pt->vsync_offset_pulse_width_lo >> 4; -+ unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4; - unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf); - - /* ignore tiny modes */ -@@ -933,6 +933,7 @@ set_size: - } - - mode->type = DRM_MODE_TYPE_DRIVER; -+ mode->vrefresh = drm_mode_vrefresh(mode); - drm_mode_set_name(mode); - - return mode; -diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c -index 5620192..9b4e5c6 100644 ---- a/drivers/gpu/drm/i915/i915_debugfs.c -+++ b/drivers/gpu/drm/i915/i915_debugfs.c -@@ -122,7 +122,7 @@ static const char *cache_level_str(int type) - static void - describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) - { -- seq_printf(m, "%p: %s%s %8zd %04x %04x %d %d%s%s%s", -+ seq_printf(m, "%pK: %s%s %8zd %04x %04x %d %d%s%s%s", - &obj->base, - get_pin_flag(obj), - get_tiling_flag(obj), -diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c -index 878b989..b1bb734 100644 ---- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c -+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c -@@ -907,15 +907,20 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec, - int count) - { - int i; -+ int relocs_total = 0; -+ int relocs_max = INT_MAX / sizeof(struct drm_i915_gem_relocation_entry); - - for (i = 0; i < count; i++) { - char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr; - int length; /* limited by fault_in_pages_readable() */ - -- /* First check for malicious input causing overflow */ -- if (exec[i].relocation_count > -- INT_MAX / sizeof(struct drm_i915_gem_relocation_entry)) -+ /* First check for malicious input causing overflow in -+ * the worst case where we need to allocate the entire -+ * relocation tree as a single array. -+ */ -+ if (exec[i].relocation_count > relocs_max - relocs_total) - return -EINVAL; -+ relocs_total += exec[i].relocation_count; - - length = exec[i].relocation_count * - sizeof(struct drm_i915_gem_relocation_entry); -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 4591582..17961df 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -8059,7 +8059,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) - I915_WRITE(GEN6_RC_SLEEP, 0); - I915_WRITE(GEN6_RC1e_THRESHOLD, 1000); - I915_WRITE(GEN6_RC6_THRESHOLD, 50000); -- I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); -+ I915_WRITE(GEN6_RC6p_THRESHOLD, 150000); - I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ - - if (intel_enable_rc6(dev_priv->dev)) -diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c -index 289140b..cffb007 100644 ---- a/drivers/gpu/drm/i915/intel_opregion.c -+++ b/drivers/gpu/drm/i915/intel_opregion.c -@@ -419,6 +419,25 @@ blind_set: - goto end; - } - -+static void intel_setup_cadls(struct drm_device *dev) -+{ -+ struct drm_i915_private *dev_priv = dev->dev_private; -+ struct intel_opregion *opregion = &dev_priv->opregion; -+ int i = 0; -+ u32 disp_id; -+ -+ /* Initialize the CADL field by duplicating the DIDL values. -+ * Technically, this is not always correct as display outputs may exist, -+ * but not active. This initialization is necessary for some Clevo -+ * laptops that check this field before processing the brightness and -+ * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if -+ * there are less than eight devices. */ -+ do { -+ disp_id = ioread32(&opregion->acpi->didl[i]); -+ iowrite32(disp_id, &opregion->acpi->cadl[i]); -+ } while (++i < 8 && disp_id != 0); -+} -+ - void intel_opregion_init(struct drm_device *dev) - { - struct drm_i915_private *dev_priv = dev->dev_private; -@@ -428,8 +447,10 @@ void intel_opregion_init(struct drm_device *dev) - return; - - if (opregion->acpi) { -- if (drm_core_check_feature(dev, DRIVER_MODESET)) -+ if (drm_core_check_feature(dev, DRIVER_MODESET)) { - intel_didl_outputs(dev); -+ intel_setup_cadls(dev); -+ } - - /* Notify BIOS we are ready to handle ACPI video ext notifs. - * Right now, all the events are handled by the ACPI video module. -diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c -index 17e1a9b..441de38 100644 ---- a/drivers/gpu/drm/radeon/radeon_benchmark.c -+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c -@@ -139,13 +139,15 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, - sdomain, ddomain, "dma"); - } - -- time = radeon_benchmark_do_move(rdev, size, saddr, daddr, -- RADEON_BENCHMARK_COPY_BLIT, n); -- if (time < 0) -- goto out_cleanup; -- if (time > 0) -- radeon_benchmark_log_results(n, size, time, -- sdomain, ddomain, "blit"); -+ if (rdev->asic->copy_blit) { -+ time = radeon_benchmark_do_move(rdev, size, saddr, daddr, -+ RADEON_BENCHMARK_COPY_BLIT, n); -+ if (time < 0) -+ goto out_cleanup; -+ if (time > 0) -+ radeon_benchmark_log_results(n, size, time, -+ sdomain, ddomain, "blit"); -+ } - - out_cleanup: - if (sobj) { -diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c -index 3d7885a..3056ea4 100644 ---- a/drivers/i2c/busses/i2c-tegra.c -+++ b/drivers/i2c/busses/i2c-tegra.c -@@ -341,7 +341,11 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) - u32 val; - int err = 0; - -- clk_enable(i2c_dev->clk); -+ err = clk_enable(i2c_dev->clk); -+ if (err < 0) { -+ dev_err(i2c_dev->dev, "Clock enable failed %d\n", err); -+ return err; -+ } - - tegra_periph_reset_assert(i2c_dev->clk); - udelay(2); -@@ -536,7 +540,12 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], - if (i2c_dev->is_suspended) - return -EBUSY; - -- clk_enable(i2c_dev->clk); -+ ret = clk_enable(i2c_dev->clk); -+ if (ret < 0) { -+ dev_err(i2c_dev->dev, "Clock enable failed %d\n", ret); -+ return ret; -+ } -+ - for (i = 0; i < num; i++) { - int stop = (i == (num - 1)) ? 1 : 0; - ret = tegra_i2c_xfer_msg(i2c_dev, &msgs[i], stop); -diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c -index da4d299..2c9dd2c 100644 ---- a/drivers/md/dm-thin.c -+++ b/drivers/md/dm-thin.c -@@ -2212,7 +2212,7 @@ static struct target_type pool_target = { - .name = "thin-pool", - .features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE | - DM_TARGET_IMMUTABLE, -- .version = {1, 0, 1}, -+ .version = {1, 0, 2}, - .module = THIS_MODULE, - .ctr = pool_ctr, - .dtr = pool_dtr, -@@ -2428,7 +2428,7 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits) - - static struct target_type thin_target = { - .name = "thin", -- .version = {1, 0, 1}, -+ .version = {1, 0, 2}, - .module = THIS_MODULE, - .ctr = thin_ctr, - .dtr = thin_dtr, -diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c -index e6cdfde..1de0f5f 100644 ---- a/drivers/md/persistent-data/dm-btree-remove.c -+++ b/drivers/md/persistent-data/dm-btree-remove.c -@@ -139,15 +139,8 @@ struct child { - struct btree_node *n; - }; - --static struct dm_btree_value_type le64_type = { -- .context = NULL, -- .size = sizeof(__le64), -- .inc = NULL, -- .dec = NULL, -- .equal = NULL --}; -- --static int init_child(struct dm_btree_info *info, struct btree_node *parent, -+static int init_child(struct dm_btree_info *info, struct dm_btree_value_type *vt, -+ struct btree_node *parent, - unsigned index, struct child *result) - { - int r, inc; -@@ -164,7 +157,7 @@ static int init_child(struct dm_btree_info *info, struct btree_node *parent, - result->n = dm_block_data(result->block); - - if (inc) -- inc_children(info->tm, result->n, &le64_type); -+ inc_children(info->tm, result->n, vt); - - *((__le64 *) value_ptr(parent, index, sizeof(__le64))) = - cpu_to_le64(dm_block_location(result->block)); -@@ -236,7 +229,7 @@ static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent, - } - - static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, -- unsigned left_index) -+ struct dm_btree_value_type *vt, unsigned left_index) - { - int r; - struct btree_node *parent; -@@ -244,11 +237,11 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, - - parent = dm_block_data(shadow_current(s)); - -- r = init_child(info, parent, left_index, &left); -+ r = init_child(info, vt, parent, left_index, &left); - if (r) - return r; - -- r = init_child(info, parent, left_index + 1, &right); -+ r = init_child(info, vt, parent, left_index + 1, &right); - if (r) { - exit_child(info, &left); - return r; -@@ -368,7 +361,7 @@ static void __rebalance3(struct dm_btree_info *info, struct btree_node *parent, - } - - static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, -- unsigned left_index) -+ struct dm_btree_value_type *vt, unsigned left_index) - { - int r; - struct btree_node *parent = dm_block_data(shadow_current(s)); -@@ -377,17 +370,17 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, - /* - * FIXME: fill out an array? - */ -- r = init_child(info, parent, left_index, &left); -+ r = init_child(info, vt, parent, left_index, &left); - if (r) - return r; - -- r = init_child(info, parent, left_index + 1, ¢er); -+ r = init_child(info, vt, parent, left_index + 1, ¢er); - if (r) { - exit_child(info, &left); - return r; - } - -- r = init_child(info, parent, left_index + 2, &right); -+ r = init_child(info, vt, parent, left_index + 2, &right); - if (r) { - exit_child(info, &left); - exit_child(info, ¢er); -@@ -434,7 +427,8 @@ static int get_nr_entries(struct dm_transaction_manager *tm, - } - - static int rebalance_children(struct shadow_spine *s, -- struct dm_btree_info *info, uint64_t key) -+ struct dm_btree_info *info, -+ struct dm_btree_value_type *vt, uint64_t key) - { - int i, r, has_left_sibling, has_right_sibling; - uint32_t child_entries; -@@ -472,13 +466,13 @@ static int rebalance_children(struct shadow_spine *s, - has_right_sibling = i < (le32_to_cpu(n->header.nr_entries) - 1); - - if (!has_left_sibling) -- r = rebalance2(s, info, i); -+ r = rebalance2(s, info, vt, i); - - else if (!has_right_sibling) -- r = rebalance2(s, info, i - 1); -+ r = rebalance2(s, info, vt, i - 1); - - else -- r = rebalance3(s, info, i - 1); -+ r = rebalance3(s, info, vt, i - 1); - - return r; - } -@@ -529,7 +523,7 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, - if (le32_to_cpu(n->header.flags) & LEAF_NODE) - return do_leaf(n, key, index); - -- r = rebalance_children(s, info, key); -+ r = rebalance_children(s, info, vt, key); - if (r) - break; - -@@ -550,6 +544,14 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, - return r; - } - -+static struct dm_btree_value_type le64_type = { -+ .context = NULL, -+ .size = sizeof(__le64), -+ .inc = NULL, -+ .dec = NULL, -+ .equal = NULL -+}; -+ - int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, - uint64_t *keys, dm_block_t *new_root) - { -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index 202ae34..63e3c47 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -1715,6 +1715,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) - - bond_compute_features(bond); - -+ bond_update_speed_duplex(new_slave); -+ - read_lock(&bond->lock); - - new_slave->last_arp_rx = jiffies; -@@ -1758,8 +1760,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) - new_slave->link = BOND_LINK_DOWN; - } - -- bond_update_speed_duplex(new_slave); -- - if (USES_PRIMARY(bond->params.mode) && bond->params.primary[0]) { - /* if there is a primary slave, remember it */ - if (strcmp(bond->params.primary, new_slave->dev->name) == 0) { -@@ -2437,8 +2437,6 @@ static void bond_miimon_commit(struct bonding *bond) - bond_set_backup_slave(slave); - } - -- bond_update_speed_duplex(slave); -- - pr_info("%s: link status definitely up for interface %s, %u Mbps %s duplex.\n", - bond->dev->name, slave->dev->name, - slave->speed, slave->duplex ? "full" : "half"); -diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c -index a6611f1..5d5a05f 100644 ---- a/drivers/net/ethernet/sfc/efx.c -+++ b/drivers/net/ethernet/sfc/efx.c -@@ -650,25 +650,30 @@ static void efx_fini_channels(struct efx_nic *efx) - struct efx_channel *channel; - struct efx_tx_queue *tx_queue; - struct efx_rx_queue *rx_queue; -+ struct pci_dev *dev = efx->pci_dev; - int rc; - - EFX_ASSERT_RESET_SERIALISED(efx); - BUG_ON(efx->port_enabled); - -- rc = efx_nic_flush_queues(efx); -- if (rc && EFX_WORKAROUND_7803(efx)) { -- /* Schedule a reset to recover from the flush failure. The -- * descriptor caches reference memory we're about to free, -- * but falcon_reconfigure_mac_wrapper() won't reconnect -- * the MACs because of the pending reset. */ -- netif_err(efx, drv, efx->net_dev, -- "Resetting to recover from flush failure\n"); -- efx_schedule_reset(efx, RESET_TYPE_ALL); -- } else if (rc) { -- netif_err(efx, drv, efx->net_dev, "failed to flush queues\n"); -- } else { -- netif_dbg(efx, drv, efx->net_dev, -- "successfully flushed all queues\n"); -+ /* Only perform flush if dma is enabled */ -+ if (dev->is_busmaster) { -+ rc = efx_nic_flush_queues(efx); -+ -+ if (rc && EFX_WORKAROUND_7803(efx)) { -+ /* Schedule a reset to recover from the flush failure. The -+ * descriptor caches reference memory we're about to free, -+ * but falcon_reconfigure_mac_wrapper() won't reconnect -+ * the MACs because of the pending reset. */ -+ netif_err(efx, drv, efx->net_dev, -+ "Resetting to recover from flush failure\n"); -+ efx_schedule_reset(efx, RESET_TYPE_ALL); -+ } else if (rc) { -+ netif_err(efx, drv, efx->net_dev, "failed to flush queues\n"); -+ } else { -+ netif_dbg(efx, drv, efx->net_dev, -+ "successfully flushed all queues\n"); -+ } - } - - efx_for_each_channel(channel, efx) { -@@ -714,6 +719,7 @@ efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries) - unsigned i; - int rc; - -+ efx_device_detach_sync(efx); - efx_stop_all(efx); - efx_fini_channels(efx); - -@@ -757,6 +763,7 @@ out: - - efx_init_channels(efx); - efx_start_all(efx); -+ netif_device_attach(efx->net_dev); - return rc; - - rollback: -@@ -1525,8 +1532,12 @@ static void efx_stop_all(struct efx_nic *efx) - /* Flush efx_mac_work(), refill_workqueue, monitor_work */ - efx_flush_all(efx); - -- /* Stop the kernel transmit interface late, so the watchdog -- * timer isn't ticking over the flush */ -+ /* Stop the kernel transmit interface. This is only valid if -+ * the device is stopped or detached; otherwise the watchdog -+ * may fire immediately. -+ */ -+ WARN_ON(netif_running(efx->net_dev) && -+ netif_device_present(efx->net_dev)); - if (efx_dev_registered(efx)) { - netif_tx_stop_all_queues(efx->net_dev); - netif_tx_lock_bh(efx->net_dev); -@@ -1827,10 +1838,11 @@ static int efx_change_mtu(struct net_device *net_dev, int new_mtu) - if (new_mtu > EFX_MAX_MTU) - return -EINVAL; - -- efx_stop_all(efx); -- - netif_dbg(efx, drv, efx->net_dev, "changing MTU to %d\n", new_mtu); - -+ efx_device_detach_sync(efx); -+ efx_stop_all(efx); -+ - efx_fini_channels(efx); - - mutex_lock(&efx->mac_lock); -@@ -1843,6 +1855,7 @@ static int efx_change_mtu(struct net_device *net_dev, int new_mtu) - efx_init_channels(efx); - - efx_start_all(efx); -+ netif_device_attach(efx->net_dev); - return rc; - } - -@@ -2132,7 +2145,7 @@ int efx_reset(struct efx_nic *efx, enum reset_type method) - netif_info(efx, drv, efx->net_dev, "resetting (%s)\n", - RESET_TYPE(method)); - -- netif_device_detach(efx->net_dev); -+ efx_device_detach_sync(efx); - efx_reset_down(efx, method); - - rc = efx->type->reset(efx, method); -@@ -2580,7 +2593,7 @@ static int efx_pm_freeze(struct device *dev) - - efx->state = STATE_FINI; - -- netif_device_detach(efx->net_dev); -+ efx_device_detach_sync(efx); - - efx_stop_all(efx); - efx_fini_channels(efx); -diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h -index 1355245..9668d29 100644 ---- a/drivers/net/ethernet/sfc/efx.h -+++ b/drivers/net/ethernet/sfc/efx.h -@@ -149,4 +149,17 @@ extern void efx_link_status_changed(struct efx_nic *efx); - extern void efx_link_set_advertising(struct efx_nic *efx, u32); - extern void efx_link_set_wanted_fc(struct efx_nic *efx, u8); - -+static inline void efx_device_detach_sync(struct efx_nic *efx) -+{ -+ struct net_device *dev = efx->net_dev; -+ -+ /* Lock/freeze all TX queues so that we can be sure the -+ * TX scheduler is stopped when we're done and before -+ * netif_device_present() becomes false. -+ */ -+ netif_tx_lock_bh(dev); -+ netif_device_detach(dev); -+ netif_tx_unlock_bh(dev); -+} -+ - #endif /* EFX_EFX_H */ -diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c -index 97b606b..26cd6c0 100644 ---- a/drivers/net/ethernet/sfc/falcon.c -+++ b/drivers/net/ethernet/sfc/falcon.c -@@ -1762,6 +1762,7 @@ const struct efx_nic_type falcon_a1_nic_type = { - .remove_port = falcon_remove_port, - .handle_global_event = falcon_handle_global_event, - .prepare_flush = falcon_prepare_flush, -+ .finish_flush = efx_port_dummy_op_void, - .update_stats = falcon_update_nic_stats, - .start_stats = falcon_start_nic_stats, - .stop_stats = falcon_stop_nic_stats, -@@ -1804,6 +1805,7 @@ const struct efx_nic_type falcon_b0_nic_type = { - .remove_port = falcon_remove_port, - .handle_global_event = falcon_handle_global_event, - .prepare_flush = falcon_prepare_flush, -+ .finish_flush = efx_port_dummy_op_void, - .update_stats = falcon_update_nic_stats, - .start_stats = falcon_start_nic_stats, - .stop_stats = falcon_stop_nic_stats, -diff --git a/drivers/net/ethernet/sfc/mcdi.c b/drivers/net/ethernet/sfc/mcdi.c -index 81a4253..c1000ce 100644 ---- a/drivers/net/ethernet/sfc/mcdi.c -+++ b/drivers/net/ethernet/sfc/mcdi.c -@@ -30,7 +30,7 @@ - #define REBOOT_FLAG_PORT0 0x3f8 - #define REBOOT_FLAG_PORT1 0x3fc - --#define MCDI_RPC_TIMEOUT 10 /*seconds */ -+#define MCDI_RPC_TIMEOUT (10 * HZ) - - #define MCDI_PDU(efx) \ - (efx_port_num(efx) ? CMD_PDU_PORT1 : CMD_PDU_PORT0) -@@ -120,7 +120,7 @@ static void efx_mcdi_copyout(struct efx_nic *efx, u8 *outbuf, size_t outlen) - static int efx_mcdi_poll(struct efx_nic *efx) - { - struct efx_mcdi_iface *mcdi = efx_mcdi(efx); -- unsigned int time, finish; -+ unsigned long time, finish; - unsigned int respseq, respcmd, error; - unsigned int pdu = FR_CZ_MC_TREG_SMEM + MCDI_PDU(efx); - unsigned int rc, spins; -@@ -136,7 +136,7 @@ static int efx_mcdi_poll(struct efx_nic *efx) - * and poll once a jiffy (approximately) - */ - spins = TICK_USEC; -- finish = get_seconds() + MCDI_RPC_TIMEOUT; -+ finish = jiffies + MCDI_RPC_TIMEOUT; - - while (1) { - if (spins != 0) { -@@ -146,7 +146,7 @@ static int efx_mcdi_poll(struct efx_nic *efx) - schedule_timeout_uninterruptible(1); - } - -- time = get_seconds(); -+ time = jiffies; - - rmb(); - efx_readd(efx, ®, pdu); -@@ -158,7 +158,7 @@ static int efx_mcdi_poll(struct efx_nic *efx) - EFX_DWORD_FIELD(reg, MCDI_HEADER_RESPONSE)) - break; - -- if (time >= finish) -+ if (time_after(time, finish)) - return -ETIMEDOUT; - } - -@@ -250,7 +250,7 @@ static int efx_mcdi_await_completion(struct efx_nic *efx) - if (wait_event_timeout( - mcdi->wq, - atomic_read(&mcdi->state) == MCDI_STATE_COMPLETED, -- msecs_to_jiffies(MCDI_RPC_TIMEOUT * 1000)) == 0) -+ MCDI_RPC_TIMEOUT) == 0) - return -ETIMEDOUT; - - /* Check if efx_mcdi_set_mode() switched us back to polled completions. -@@ -666,9 +666,8 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, - u16 *fw_subtype_list) - { - uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LEN]; -- size_t outlen; -+ size_t outlen, offset, i; - int port_num = efx_port_num(efx); -- int offset; - int rc; - - BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_IN_LEN != 0); -@@ -688,10 +687,16 @@ int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, - : MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST; - if (mac_address) - memcpy(mac_address, outbuf + offset, ETH_ALEN); -- if (fw_subtype_list) -- memcpy(fw_subtype_list, -- outbuf + MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST, -- MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN); -+ if (fw_subtype_list) { -+ offset = MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_OFST; -+ for (i = 0; -+ i < MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_LEN / 2; -+ i++) { -+ fw_subtype_list[i] = -+ le16_to_cpup((__le16 *)(outbuf + offset)); -+ offset += 2; -+ } -+ } - - return 0; - -diff --git a/drivers/net/ethernet/sfc/mcdi.h b/drivers/net/ethernet/sfc/mcdi.h -index aced2a7..b61eea0 100644 ---- a/drivers/net/ethernet/sfc/mcdi.h -+++ b/drivers/net/ethernet/sfc/mcdi.h -@@ -126,5 +126,6 @@ extern int efx_mcdi_wol_filter_set_magic(struct efx_nic *efx, - extern int efx_mcdi_wol_filter_get_magic(struct efx_nic *efx, int *id_out); - extern int efx_mcdi_wol_filter_remove(struct efx_nic *efx, int id); - extern int efx_mcdi_wol_filter_reset(struct efx_nic *efx); -+extern int efx_mcdi_set_mac(struct efx_nic *efx); - - #endif /* EFX_MCDI_H */ -diff --git a/drivers/net/ethernet/sfc/mcdi_mac.c b/drivers/net/ethernet/sfc/mcdi_mac.c -index 50c2077..da269d7 100644 ---- a/drivers/net/ethernet/sfc/mcdi_mac.c -+++ b/drivers/net/ethernet/sfc/mcdi_mac.c -@@ -13,7 +13,7 @@ - #include "mcdi.h" - #include "mcdi_pcol.h" - --static int efx_mcdi_set_mac(struct efx_nic *efx) -+int efx_mcdi_set_mac(struct efx_nic *efx) - { - u32 reject, fcntl; - u8 cmdbytes[MC_CMD_SET_MAC_IN_LEN]; -@@ -45,6 +45,8 @@ static int efx_mcdi_set_mac(struct efx_nic *efx) - } - if (efx->wanted_fc & EFX_FC_AUTO) - fcntl = MC_CMD_FCNTL_AUTO; -+ if (efx->fc_disable) -+ fcntl = MC_CMD_FCNTL_OFF; - - MCDI_SET_DWORD(cmdbytes, SET_MAC_IN_FCNTL, fcntl); - -diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h -index b8e251a..8bcb8fd 100644 ---- a/drivers/net/ethernet/sfc/net_driver.h -+++ b/drivers/net/ethernet/sfc/net_driver.h -@@ -213,6 +213,7 @@ struct efx_tx_queue { - * If both this and page are %NULL, the buffer slot is currently free. - * @page: The associated page buffer, if any. - * If both this and skb are %NULL, the buffer slot is currently free. -+ * @page_offset: Offset within page. Valid iff @flags & %EFX_RX_BUF_PAGE. - * @len: Buffer length, in bytes. - * @is_page: Indicates if @page is valid. If false, @skb is valid. - */ -@@ -222,7 +223,8 @@ struct efx_rx_buffer { - struct sk_buff *skb; - struct page *page; - } u; -- unsigned int len; -+ u16 page_offset; -+ u16 len; - bool is_page; - }; - -@@ -689,6 +691,9 @@ struct efx_filter_state; - * @promiscuous: Promiscuous flag. Protected by netif_tx_lock. - * @multicast_hash: Multicast hash table - * @wanted_fc: Wanted flow control flags -+ * @fc_disable: When non-zero flow control is disabled. Typically used to -+ * ensure that network back pressure doesn't delay dma queue flushes. -+ * Serialised by the rtnl lock. - * @mac_work: Work item for changing MAC promiscuity and multicast hash - * @loopback_mode: Loopback status - * @loopback_modes: Supported loopback mode bitmask -@@ -782,6 +787,7 @@ struct efx_nic { - bool promiscuous; - union efx_multicast_hash multicast_hash; - u8 wanted_fc; -+ unsigned fc_disable; - - atomic_t rx_reset; - enum efx_loopback_mode loopback_mode; -@@ -835,6 +841,7 @@ static inline unsigned int efx_port_num(struct efx_nic *efx) - * @remove_port: Free resources allocated by probe_port() - * @handle_global_event: Handle a "global" event (may be %NULL) - * @prepare_flush: Prepare the hardware for flushing the DMA queues -+ * @finish_flush: Clean up after flushing the DMA queues - * @update_stats: Update statistics not provided by event handling - * @start_stats: Start the regular fetching of statistics - * @stop_stats: Stop the regular fetching of statistics -@@ -880,6 +887,7 @@ struct efx_nic_type { - void (*remove_port)(struct efx_nic *efx); - bool (*handle_global_event)(struct efx_channel *channel, efx_qword_t *); - void (*prepare_flush)(struct efx_nic *efx); -+ void (*finish_flush)(struct efx_nic *efx); - void (*update_stats)(struct efx_nic *efx); - void (*start_stats)(struct efx_nic *efx); - void (*stop_stats)(struct efx_nic *efx); -diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c -index 3edfbaf..2e9ca10 100644 ---- a/drivers/net/ethernet/sfc/nic.c -+++ b/drivers/net/ethernet/sfc/nic.c -@@ -371,7 +371,8 @@ efx_may_push_tx_desc(struct efx_tx_queue *tx_queue, unsigned int write_count) - return false; - - tx_queue->empty_read_count = 0; -- return ((empty_read_count ^ write_count) & ~EFX_EMPTY_COUNT_VALID) == 0; -+ return ((empty_read_count ^ write_count) & ~EFX_EMPTY_COUNT_VALID) == 0 -+ && tx_queue->write_count - write_count == 1; - } - - /* For each entry inserted into the software descriptor ring, create a -@@ -1261,13 +1262,27 @@ int efx_nic_flush_queues(struct efx_nic *efx) - } - efx_for_each_possible_channel_tx_queue(tx_queue, channel) { - if (tx_queue->initialised && -- tx_queue->flushed != FLUSH_DONE) -- ++tx_pending; -+ tx_queue->flushed != FLUSH_DONE) { -+ efx_oword_t txd_ptr_tbl; -+ -+ efx_reado_table(efx, &txd_ptr_tbl, -+ FR_BZ_TX_DESC_PTR_TBL, -+ tx_queue->queue); -+ if (EFX_OWORD_FIELD(txd_ptr_tbl, -+ FRF_AZ_TX_DESCQ_FLUSH) || -+ EFX_OWORD_FIELD(txd_ptr_tbl, -+ FRF_AZ_TX_DESCQ_EN)) -+ ++tx_pending; -+ else -+ tx_queue->flushed = FLUSH_DONE; -+ } - } - } - -- if (rx_pending == 0 && tx_pending == 0) -+ if (rx_pending == 0 && tx_pending == 0) { -+ efx->type->finish_flush(efx); - return 0; -+ } - - msleep(EFX_FLUSH_INTERVAL); - efx_poll_flush_events(efx); -@@ -1293,6 +1308,7 @@ int efx_nic_flush_queues(struct efx_nic *efx) - } - } - -+ efx->type->finish_flush(efx); - return -ETIMEDOUT; - } - -diff --git a/drivers/net/ethernet/sfc/nic.h b/drivers/net/ethernet/sfc/nic.h -index 66ece48..58302a2 100644 ---- a/drivers/net/ethernet/sfc/nic.h -+++ b/drivers/net/ethernet/sfc/nic.h -@@ -210,6 +210,8 @@ extern void falcon_irq_ack_a1(struct efx_nic *efx); - - /* Global Resources */ - extern int efx_nic_flush_queues(struct efx_nic *efx); -+extern void siena_prepare_flush(struct efx_nic *efx); -+extern void siena_finish_flush(struct efx_nic *efx); - extern void falcon_start_nic_stats(struct efx_nic *efx); - extern void falcon_stop_nic_stats(struct efx_nic *efx); - extern void falcon_setup_xaui(struct efx_nic *efx); -diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c -index 5ef4cc0..9ce8665 100644 ---- a/drivers/net/ethernet/sfc/rx.c -+++ b/drivers/net/ethernet/sfc/rx.c -@@ -95,11 +95,7 @@ static unsigned int rx_refill_limit = 95; - static inline unsigned int efx_rx_buf_offset(struct efx_nic *efx, - struct efx_rx_buffer *buf) - { -- /* Offset is always within one page, so we don't need to consider -- * the page order. -- */ -- return (((__force unsigned long) buf->dma_addr & (PAGE_SIZE - 1)) + -- efx->type->rx_buffer_hash_size); -+ return buf->page_offset + efx->type->rx_buffer_hash_size; - } - static inline unsigned int efx_rx_buf_size(struct efx_nic *efx) - { -@@ -194,6 +190,7 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue) - struct efx_rx_buffer *rx_buf; - struct page *page; - void *page_addr; -+ unsigned int page_offset; - struct efx_rx_page_state *state; - dma_addr_t dma_addr; - unsigned index, count; -@@ -220,12 +217,14 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue) - - page_addr += sizeof(struct efx_rx_page_state); - dma_addr += sizeof(struct efx_rx_page_state); -+ page_offset = sizeof(struct efx_rx_page_state); - - split: - index = rx_queue->added_count & rx_queue->ptr_mask; - rx_buf = efx_rx_buffer(rx_queue, index); - rx_buf->dma_addr = dma_addr + EFX_PAGE_IP_ALIGN; - rx_buf->u.page = page; -+ rx_buf->page_offset = page_offset + EFX_PAGE_IP_ALIGN; - rx_buf->len = efx->rx_buffer_len - EFX_PAGE_IP_ALIGN; - rx_buf->is_page = true; - ++rx_queue->added_count; -@@ -237,6 +236,7 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue) - get_page(page); - dma_addr += (PAGE_SIZE >> 1); - page_addr += (PAGE_SIZE >> 1); -+ page_offset += (PAGE_SIZE >> 1); - ++count; - goto split; - } -@@ -246,7 +246,8 @@ static int efx_init_rx_buffers_page(struct efx_rx_queue *rx_queue) - } - - static void efx_unmap_rx_buffer(struct efx_nic *efx, -- struct efx_rx_buffer *rx_buf) -+ struct efx_rx_buffer *rx_buf, -+ unsigned int used_len) - { - if (rx_buf->is_page && rx_buf->u.page) { - struct efx_rx_page_state *state; -@@ -257,6 +258,10 @@ static void efx_unmap_rx_buffer(struct efx_nic *efx, - state->dma_addr, - efx_rx_buf_size(efx), - PCI_DMA_FROMDEVICE); -+ } else if (used_len) { -+ dma_sync_single_for_cpu(&efx->pci_dev->dev, -+ rx_buf->dma_addr, used_len, -+ DMA_FROM_DEVICE); - } - } else if (!rx_buf->is_page && rx_buf->u.skb) { - pci_unmap_single(efx->pci_dev, rx_buf->dma_addr, -@@ -279,7 +284,7 @@ static void efx_free_rx_buffer(struct efx_nic *efx, - static void efx_fini_rx_buffer(struct efx_rx_queue *rx_queue, - struct efx_rx_buffer *rx_buf) - { -- efx_unmap_rx_buffer(rx_queue->efx, rx_buf); -+ efx_unmap_rx_buffer(rx_queue->efx, rx_buf, 0); - efx_free_rx_buffer(rx_queue->efx, rx_buf); - } - -@@ -550,10 +555,10 @@ void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index, - goto out; - } - -- /* Release card resources - assumes all RX buffers consumed in-order -- * per RX queue -+ /* Release and/or sync DMA mapping - assumes all RX buffers -+ * consumed in-order per RX queue - */ -- efx_unmap_rx_buffer(efx, rx_buf); -+ efx_unmap_rx_buffer(efx, rx_buf, len); - - /* Prefetch nice and early so data will (hopefully) be in cache by - * the time we look at it. -diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c -index 822f6c2..4907885 100644 ---- a/drivers/net/ethernet/sfc/selftest.c -+++ b/drivers/net/ethernet/sfc/selftest.c -@@ -698,7 +698,7 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests, - /* Detach the device so the kernel doesn't transmit during the - * loopback test and the watchdog timeout doesn't fire. - */ -- netif_device_detach(efx->net_dev); -+ efx_device_detach_sync(efx); - - mutex_lock(&efx->mac_lock); - if (efx->loopback_modes) { -diff --git a/drivers/net/ethernet/sfc/siena.c b/drivers/net/ethernet/sfc/siena.c -index cc2549c..c58b973 100644 ---- a/drivers/net/ethernet/sfc/siena.c -+++ b/drivers/net/ethernet/sfc/siena.c -@@ -137,6 +137,18 @@ static void siena_remove_port(struct efx_nic *efx) - efx_nic_free_buffer(efx, &efx->stats_buffer); - } - -+void siena_prepare_flush(struct efx_nic *efx) -+{ -+ if (efx->fc_disable++ == 0) -+ efx_mcdi_set_mac(efx); -+} -+ -+void siena_finish_flush(struct efx_nic *efx) -+{ -+ if (--efx->fc_disable == 0) -+ efx_mcdi_set_mac(efx); -+} -+ - static const struct efx_nic_register_test siena_register_tests[] = { - { FR_AZ_ADR_REGION, - EFX_OWORD32(0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF) }, -@@ -624,7 +636,8 @@ const struct efx_nic_type siena_a0_nic_type = { - .reset = siena_reset_hw, - .probe_port = siena_probe_port, - .remove_port = siena_remove_port, -- .prepare_flush = efx_port_dummy_op_void, -+ .prepare_flush = siena_prepare_flush, -+ .finish_flush = siena_finish_flush, - .update_stats = siena_update_nic_stats, - .start_stats = siena_start_nic_stats, - .stop_stats = siena_stop_nic_stats, -diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c -index 97f342e..544ac06 100644 ---- a/drivers/net/macvlan.c -+++ b/drivers/net/macvlan.c -@@ -585,6 +585,7 @@ void macvlan_common_setup(struct net_device *dev) - ether_setup(dev); - - dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); -+ dev->priv_flags |= IFF_UNICAST_FLT; - dev->netdev_ops = &macvlan_netdev_ops; - dev->destructor = free_netdev; - dev->header_ops = &macvlan_hard_header_ops, -diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c -index 01b104e..bff6908 100644 ---- a/drivers/net/netconsole.c -+++ b/drivers/net/netconsole.c -@@ -630,6 +630,7 @@ static int netconsole_netdev_event(struct notifier_block *this, - goto done; - - spin_lock_irqsave(&target_list_lock, flags); -+restart: - list_for_each_entry(nt, &target_list, list) { - netconsole_target_get(nt); - if (nt->np.dev == dev) { -@@ -642,20 +643,17 @@ static int netconsole_netdev_event(struct notifier_block *this, - case NETDEV_UNREGISTER: - /* - * rtnl_lock already held -+ * we might sleep in __netpoll_cleanup() - */ -- if (nt->np.dev) { -- spin_unlock_irqrestore( -- &target_list_lock, -- flags); -- __netpoll_cleanup(&nt->np); -- spin_lock_irqsave(&target_list_lock, -- flags); -- dev_put(nt->np.dev); -- nt->np.dev = NULL; -- } -+ spin_unlock_irqrestore(&target_list_lock, flags); -+ __netpoll_cleanup(&nt->np); -+ spin_lock_irqsave(&target_list_lock, flags); -+ dev_put(nt->np.dev); -+ nt->np.dev = NULL; - nt->enabled = 0; - stopped = true; -- break; -+ netconsole_target_put(nt); -+ goto restart; - } - } - netconsole_target_put(nt); -diff --git a/drivers/net/tun.c b/drivers/net/tun.c -index a12c9bf..f4c5de6 100644 ---- a/drivers/net/tun.c -+++ b/drivers/net/tun.c -@@ -417,6 +417,8 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) - * for indefinite time. */ - skb_orphan(skb); - -+ nf_reset(skb); -+ - /* Enqueue packet */ - skb_queue_tail(&tun->socket.sk->sk_receive_queue, skb); - -diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c -index 62b4c29..d48dfb7 100644 ---- a/drivers/net/wireless/mwifiex/join.c -+++ b/drivers/net/wireless/mwifiex/join.c -@@ -1062,10 +1062,9 @@ mwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv, - adhoc_join->bss_descriptor.bssid, - adhoc_join->bss_descriptor.ssid); - -- for (i = 0; bss_desc->supported_rates[i] && -- i < MWIFIEX_SUPPORTED_RATES; -- i++) -- ; -+ for (i = 0; i < MWIFIEX_SUPPORTED_RATES && -+ bss_desc->supported_rates[i]; i++) -+ ; - rates_size = i; - - /* Copy Data Rates from the Rates recorded in scan response */ -diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -index 814c05d..d3920da 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c -@@ -1557,74 +1557,57 @@ void rtl92cu_card_disable(struct ieee80211_hw *hw) - - void rtl92cu_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid) - { -- /* dummy routine needed for callback from rtl_op_configure_filter() */ --} -- --/*========================================================================== */ -- --static void _rtl92cu_set_check_bssid(struct ieee80211_hw *hw, -- enum nl80211_iftype type) --{ - struct rtl_priv *rtlpriv = rtl_priv(hw); -- u32 reg_rcr = rtl_read_dword(rtlpriv, REG_RCR); - struct rtl_hal *rtlhal = rtl_hal(rtlpriv); -- struct rtl_phy *rtlphy = &(rtlpriv->phy); -- u8 filterout_non_associated_bssid = false; -+ u32 reg_rcr = rtl_read_dword(rtlpriv, REG_RCR); - -- switch (type) { -- case NL80211_IFTYPE_ADHOC: -- case NL80211_IFTYPE_STATION: -- filterout_non_associated_bssid = true; -- break; -- case NL80211_IFTYPE_UNSPECIFIED: -- case NL80211_IFTYPE_AP: -- default: -- break; -- } -- if (filterout_non_associated_bssid) { -+ if (rtlpriv->psc.rfpwr_state != ERFON) -+ return; -+ -+ if (check_bssid) { -+ u8 tmp; - if (IS_NORMAL_CHIP(rtlhal->version)) { -- switch (rtlphy->current_io_type) { -- case IO_CMD_RESUME_DM_BY_SCAN: -- reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); -- rtlpriv->cfg->ops->set_hw_reg(hw, -- HW_VAR_RCR, (u8 *)(®_rcr)); -- /* enable update TSF */ -- _rtl92cu_set_bcn_ctrl_reg(hw, 0, BIT(4)); -- break; -- case IO_CMD_PAUSE_DM_BY_SCAN: -- reg_rcr &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); -- rtlpriv->cfg->ops->set_hw_reg(hw, -- HW_VAR_RCR, (u8 *)(®_rcr)); -- /* disable update TSF */ -- _rtl92cu_set_bcn_ctrl_reg(hw, BIT(4), 0); -- break; -- } -+ reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); -+ tmp = BIT(4); - } else { -- reg_rcr |= (RCR_CBSSID); -- rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, -- (u8 *)(®_rcr)); -- _rtl92cu_set_bcn_ctrl_reg(hw, 0, (BIT(4)|BIT(5))); -+ reg_rcr |= RCR_CBSSID; -+ tmp = BIT(4) | BIT(5); - } -- } else if (filterout_non_associated_bssid == false) { -+ rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, -+ (u8 *) (®_rcr)); -+ _rtl92cu_set_bcn_ctrl_reg(hw, 0, tmp); -+ } else { -+ u8 tmp; - if (IS_NORMAL_CHIP(rtlhal->version)) { -- reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); -- rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, -- (u8 *)(®_rcr)); -- _rtl92cu_set_bcn_ctrl_reg(hw, BIT(4), 0); -+ reg_rcr &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); -+ tmp = BIT(4); - } else { -- reg_rcr &= (~RCR_CBSSID); -- rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, -- (u8 *)(®_rcr)); -- _rtl92cu_set_bcn_ctrl_reg(hw, (BIT(4)|BIT(5)), 0); -+ reg_rcr &= ~RCR_CBSSID; -+ tmp = BIT(4) | BIT(5); - } -+ reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); -+ rtlpriv->cfg->ops->set_hw_reg(hw, -+ HW_VAR_RCR, (u8 *) (®_rcr)); -+ _rtl92cu_set_bcn_ctrl_reg(hw, tmp, 0); - } - } - -+/*========================================================================== */ -+ - int rtl92cu_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type) - { -+ struct rtl_priv *rtlpriv = rtl_priv(hw); -+ - if (_rtl92cu_set_media_status(hw, type)) - return -EOPNOTSUPP; -- _rtl92cu_set_check_bssid(hw, type); -+ -+ if (rtlpriv->mac80211.link_state == MAC80211_LINKED) { -+ if (type != NL80211_IFTYPE_AP) -+ rtl92cu_set_check_bssid(hw, true); -+ } else { -+ rtl92cu_set_check_bssid(hw, false); -+ } -+ - return 0; - } - -@@ -2238,8 +2221,6 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, - (shortgi_rate << 4) | (shortgi_rate); - } - rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value); -- RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, ("%x\n", rtl_read_dword(rtlpriv, -- REG_ARFR0))); - } - - void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) -diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c -index e18604b..d19b879 100644 ---- a/drivers/tty/pty.c -+++ b/drivers/tty/pty.c -@@ -49,7 +49,6 @@ static void pty_close(struct tty_struct *tty, struct file *filp) - tty->packet = 0; - if (!tty->link) - return; -- tty->link->packet = 0; - set_bit(TTY_OTHER_CLOSED, &tty->link->flags); - wake_up_interruptible(&tty->link->read_wait); - wake_up_interruptible(&tty->link->write_wait); -diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c -index ad0f8f5..2dc4d9b 100644 ---- a/drivers/tty/serial/sunsu.c -+++ b/drivers/tty/serial/sunsu.c -@@ -968,6 +968,7 @@ static struct uart_ops sunsu_pops = { - #define UART_NR 4 - - static struct uart_sunsu_port sunsu_ports[UART_NR]; -+static int nr_inst; /* Number of already registered ports */ - - #ifdef CONFIG_SERIO - -@@ -1337,13 +1338,8 @@ static int __init sunsu_console_setup(struct console *co, char *options) - printk("Console: ttyS%d (SU)\n", - (sunsu_reg.minor - 64) + co->index); - -- /* -- * Check whether an invalid uart number has been specified, and -- * if so, search for the first available port that does have -- * console support. -- */ -- if (co->index >= UART_NR) -- co->index = 0; -+ if (co->index > nr_inst) -+ return -ENODEV; - port = &sunsu_ports[co->index].port; - - /* -@@ -1408,7 +1404,6 @@ static enum su_type __devinit su_get_type(struct device_node *dp) - - static int __devinit su_probe(struct platform_device *op) - { -- static int inst; - struct device_node *dp = op->dev.of_node; - struct uart_sunsu_port *up; - struct resource *rp; -@@ -1418,16 +1413,16 @@ static int __devinit su_probe(struct platform_device *op) - - type = su_get_type(dp); - if (type == SU_PORT_PORT) { -- if (inst >= UART_NR) -+ if (nr_inst >= UART_NR) - return -EINVAL; -- up = &sunsu_ports[inst]; -+ up = &sunsu_ports[nr_inst]; - } else { - up = kzalloc(sizeof(*up), GFP_KERNEL); - if (!up) - return -ENOMEM; - } - -- up->port.line = inst; -+ up->port.line = nr_inst; - - spin_lock_init(&up->port.lock); - -@@ -1461,6 +1456,8 @@ static int __devinit su_probe(struct platform_device *op) - } - dev_set_drvdata(&op->dev, up); - -+ nr_inst++; -+ - return 0; - } - -@@ -1488,7 +1485,7 @@ static int __devinit su_probe(struct platform_device *op) - - dev_set_drvdata(&op->dev, up); - -- inst++; -+ nr_inst++; - - return 0; - -diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c -index 61d08dd..76be3ba 100644 ---- a/drivers/usb/core/hcd-pci.c -+++ b/drivers/usb/core/hcd-pci.c -@@ -173,6 +173,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) - struct hc_driver *driver; - struct usb_hcd *hcd; - int retval; -+ int hcd_irq = 0; - - if (usb_disabled()) - return -ENODEV; -@@ -187,15 +188,19 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) - return -ENODEV; - dev->current_state = PCI_D0; - -- /* The xHCI driver supports MSI and MSI-X, -- * so don't fail if the BIOS doesn't provide a legacy IRQ. -+ /* -+ * The xHCI driver has its own irq management -+ * make sure irq setup is not touched for xhci in generic hcd code - */ -- if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) { -- dev_err(&dev->dev, -- "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", -- pci_name(dev)); -- retval = -ENODEV; -- goto disable_pci; -+ if ((driver->flags & HCD_MASK) != HCD_USB3) { -+ if (!dev->irq) { -+ dev_err(&dev->dev, -+ "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", -+ pci_name(dev)); -+ retval = -ENODEV; -+ goto disable_pci; -+ } -+ hcd_irq = dev->irq; - } - - hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); -@@ -245,7 +250,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) - - pci_set_master(dev); - -- retval = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); -+ retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED); - if (retval != 0) - goto unmap_registers; - set_hs_companion(dev, hcd); -diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c -index 901924a..d433fdf 100644 ---- a/drivers/usb/gadget/udc-core.c -+++ b/drivers/usb/gadget/udc-core.c -@@ -213,7 +213,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) - udc->driver->disconnect(udc->gadget); - usb_gadget_disconnect(udc->gadget); - udc->driver->unbind(udc->gadget); -- usb_gadget_udc_stop(udc->gadget, udc->driver); -+ usb_gadget_udc_stop(udc->gadget, NULL); - } else { - usb_gadget_stop(udc->gadget, udc->driver); - } -diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c -index 53c8be1..2c0350f 100644 ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -342,7 +342,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) - * generate interrupts. Don't even try to enable MSI. - */ - if (xhci->quirks & XHCI_BROKEN_MSI) -- return 0; -+ goto legacy_irq; - - /* unregister the legacy interrupt */ - if (hcd->irq) -@@ -363,6 +363,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) - return -EINVAL; - } - -+ legacy_irq: - /* fall back to legacy interrupt*/ - ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, - hcd->irq_descr, hcd); -diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h -index cc368c2..c519a31 100644 ---- a/drivers/usb/host/xhci.h -+++ b/drivers/usb/host/xhci.h -@@ -206,8 +206,8 @@ struct xhci_op_regs { - /* bits 12:31 are reserved (and should be preserved on writes). */ - - /* IMAN - Interrupt Management Register */ --#define IMAN_IP (1 << 1) --#define IMAN_IE (1 << 0) -+#define IMAN_IE (1 << 1) -+#define IMAN_IP (1 << 0) - - /* USBSTS - USB status - status bitmasks */ - /* HC not running - set to 1 when run/stop bit is cleared. */ -diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c -index 1a49ca9..e664bac 100644 ---- a/drivers/usb/serial/garmin_gps.c -+++ b/drivers/usb/serial/garmin_gps.c -@@ -973,10 +973,7 @@ static void garmin_close(struct usb_serial_port *port) - if (!serial) - return; - -- mutex_lock(&port->serial->disc_mutex); -- -- if (!port->serial->disconnected) -- garmin_clear(garmin_data_p); -+ garmin_clear(garmin_data_p); - - /* shutdown our urbs */ - usb_kill_urb(port->read_urb); -@@ -985,8 +982,6 @@ static void garmin_close(struct usb_serial_port *port) - /* keep reset state so we know that we must start a new session */ - if (garmin_data_p->state != STATE_RESET) - garmin_data_p->state = STATE_DISCONNECTED; -- -- mutex_unlock(&port->serial->disc_mutex); - } - - -diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c -index 3de751d..1f145bf 100644 ---- a/drivers/usb/serial/io_ti.c -+++ b/drivers/usb/serial/io_ti.c -@@ -2796,6 +2796,7 @@ static struct usb_serial_driver edgeport_2port_device = { - .set_termios = edge_set_termios, - .tiocmget = edge_tiocmget, - .tiocmset = edge_tiocmset, -+ .get_icount = edge_get_icount, - .write = edge_write, - .write_room = edge_write_room, - .chars_in_buffer = edge_chars_in_buffer, -diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c -index dc1ce62..2482d5e 100644 ---- a/drivers/usb/serial/usb-serial.c -+++ b/drivers/usb/serial/usb-serial.c -@@ -168,6 +168,7 @@ static void destroy_serial(struct kref *kref) - } - } - -+ usb_put_intf(serial->interface); - usb_put_dev(serial->dev); - kfree(serial); - } -@@ -624,7 +625,7 @@ static struct usb_serial *create_serial(struct usb_device *dev, - } - serial->dev = usb_get_dev(dev); - serial->type = driver; -- serial->interface = interface; -+ serial->interface = usb_get_intf(interface); - kref_init(&serial->kref); - mutex_init(&serial->disc_mutex); - serial->minor = SERIAL_TTY_NO_MINOR; -diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h -index fa8a1b2..7b8d564 100644 ---- a/drivers/usb/storage/unusual_devs.h -+++ b/drivers/usb/storage/unusual_devs.h -@@ -488,6 +488,13 @@ UNUSUAL_DEV( 0x04e8, 0x5122, 0x0000, 0x9999, - USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_MAX_SECTORS_64 | US_FL_BULK_IGNORE_TAG), - -+/* Added by Dmitry Artamonow <mad_soft@inbox.ru> */ -+UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999, -+ "Samsung", -+ "YP-Z3", -+ USB_SC_DEVICE, USB_PR_DEVICE, NULL, -+ US_FL_MAX_SECTORS_64), -+ - /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. - * Device uses standards-violating 32-byte Bulk Command Block Wrappers and - * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. -diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c -index b76071e..5c58128 100644 ---- a/drivers/vhost/net.c -+++ b/drivers/vhost/net.c -@@ -234,7 +234,8 @@ static void handle_tx(struct vhost_net *net) - msg.msg_controllen = 0; - ubufs = NULL; - } else { -- struct ubuf_info *ubuf = &vq->ubuf_info[head]; -+ struct ubuf_info *ubuf; -+ ubuf = vq->ubuf_info + vq->upend_idx; - - vq->heads[vq->upend_idx].len = len; - ubuf->callback = vhost_zerocopy_callback; -diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c -index cfd1ce3..1d36db1 100644 ---- a/fs/cifs/asn1.c -+++ b/fs/cifs/asn1.c -@@ -614,53 +614,10 @@ decode_negTokenInit(unsigned char *security_blob, int length, - } - } - -- /* mechlistMIC */ -- if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { -- /* Check if we have reached the end of the blob, but with -- no mechListMic (e.g. NTLMSSP instead of KRB5) */ -- if (ctx.error == ASN1_ERR_DEC_EMPTY) -- goto decode_negtoken_exit; -- cFYI(1, "Error decoding last part negTokenInit exit3"); -- return 0; -- } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { -- /* tag = 3 indicating mechListMIC */ -- cFYI(1, "Exit 4 cls = %d con = %d tag = %d end = %p (%d)", -- cls, con, tag, end, *end); -- return 0; -- } -- -- /* sequence */ -- if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { -- cFYI(1, "Error decoding last part negTokenInit exit5"); -- return 0; -- } else if ((cls != ASN1_UNI) || (con != ASN1_CON) -- || (tag != ASN1_SEQ)) { -- cFYI(1, "cls = %d con = %d tag = %d end = %p (%d)", -- cls, con, tag, end, *end); -- } -- -- /* sequence of */ -- if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { -- cFYI(1, "Error decoding last part negTokenInit exit 7"); -- return 0; -- } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { -- cFYI(1, "Exit 8 cls = %d con = %d tag = %d end = %p (%d)", -- cls, con, tag, end, *end); -- return 0; -- } -- -- /* general string */ -- if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { -- cFYI(1, "Error decoding last part negTokenInit exit9"); -- return 0; -- } else if ((cls != ASN1_UNI) || (con != ASN1_PRI) -- || (tag != ASN1_GENSTR)) { -- cFYI(1, "Exit10 cls = %d con = %d tag = %d end = %p (%d)", -- cls, con, tag, end, *end); -- return 0; -- } -- cFYI(1, "Need to call asn1_octets_decode() function for %s", -- ctx.pointer); /* is this UTF-8 or ASCII? */ --decode_negtoken_exit: -+ /* -+ * We currently ignore anything at the end of the SPNEGO blob after -+ * the mechTypes have been parsed, since none of that info is -+ * used at the moment. -+ */ - return 1; - } -diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c -index b3a2a40..25bb97f 100644 ---- a/fs/cifs/cifsfs.c -+++ b/fs/cifs/cifsfs.c -@@ -90,6 +90,30 @@ extern mempool_t *cifs_sm_req_poolp; - extern mempool_t *cifs_req_poolp; - extern mempool_t *cifs_mid_poolp; - -+/* -+ * Bumps refcount for cifs super block. -+ * Note that it should be only called if a referece to VFS super block is -+ * already held, e.g. in open-type syscalls context. Otherwise it can race with -+ * atomic_dec_and_test in deactivate_locked_super. -+ */ -+void -+cifs_sb_active(struct super_block *sb) -+{ -+ struct cifs_sb_info *server = CIFS_SB(sb); -+ -+ if (atomic_inc_return(&server->active) == 1) -+ atomic_inc(&sb->s_active); -+} -+ -+void -+cifs_sb_deactive(struct super_block *sb) -+{ -+ struct cifs_sb_info *server = CIFS_SB(sb); -+ -+ if (atomic_dec_and_test(&server->active)) -+ deactivate_super(sb); -+} -+ - static int - cifs_read_super(struct super_block *sb) - { -diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h -index 30ff560..c91ea81 100644 ---- a/fs/cifs/cifsfs.h -+++ b/fs/cifs/cifsfs.h -@@ -41,6 +41,10 @@ extern struct file_system_type cifs_fs_type; - extern const struct address_space_operations cifs_addr_ops; - extern const struct address_space_operations cifs_addr_ops_smallbuf; - -+/* Functions related to super block operations */ -+extern void cifs_sb_active(struct super_block *sb); -+extern void cifs_sb_deactive(struct super_block *sb); -+ - /* Functions related to inodes */ - extern const struct inode_operations cifs_dir_inode_ops; - extern struct inode *cifs_root_iget(struct super_block *); -diff --git a/fs/cifs/file.c b/fs/cifs/file.c -index 51574d4..c55808e 100644 ---- a/fs/cifs/file.c -+++ b/fs/cifs/file.c -@@ -265,6 +265,8 @@ cifs_new_fileinfo(__u16 fileHandle, struct file *file, - mutex_init(&pCifsFile->fh_mutex); - INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break); - -+ cifs_sb_active(inode->i_sb); -+ - spin_lock(&cifs_file_list_lock); - list_add(&pCifsFile->tlist, &(tlink_tcon(tlink)->openFileList)); - /* if readable file instance put first in list*/ -@@ -293,7 +295,8 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) - struct inode *inode = cifs_file->dentry->d_inode; - struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink); - struct cifsInodeInfo *cifsi = CIFS_I(inode); -- struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); -+ struct super_block *sb = inode->i_sb; -+ struct cifs_sb_info *cifs_sb = CIFS_SB(sb); - struct cifsLockInfo *li, *tmp; - - spin_lock(&cifs_file_list_lock); -@@ -345,6 +348,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) - - cifs_put_tlink(cifs_file->tlink); - dput(cifs_file->dentry); -+ cifs_sb_deactive(sb); - kfree(cifs_file); - } - -diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c -index 484ffee..2845a1f 100644 ---- a/fs/ext4/balloc.c -+++ b/fs/ext4/balloc.c -@@ -571,7 +571,7 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) - brelse(bitmap_bh); - printk(KERN_DEBUG "ext4_count_free_clusters: stored = %llu" - ", computed = %llu, %llu\n", -- EXT4_B2C(EXT4_SB(sb), ext4_free_blocks_count(es)), -+ EXT4_NUM_B2C(EXT4_SB(sb), ext4_free_blocks_count(es)), - desc_count, bitmap_count); - return bitmap_count; - #else -diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h -index 8cb184c..60b6ca5 100644 ---- a/fs/ext4/ext4.h -+++ b/fs/ext4/ext4.h -@@ -309,9 +309,9 @@ struct ext4_group_desc - */ - - struct flex_groups { -- atomic_t free_inodes; -- atomic_t free_clusters; -- atomic_t used_dirs; -+ atomic64_t free_clusters; -+ atomic_t free_inodes; -+ atomic_t used_dirs; - }; - - #define EXT4_BG_INODE_UNINIT 0x0001 /* Inode table/bitmap not in use */ -diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c -index b48e0dc..ce0bc25 100644 ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -2960,6 +2960,7 @@ static int ext4_split_extent(handle_t *handle, - int err = 0; - int uninitialized; - int split_flag1, flags1; -+ int allocated = map->m_len; - - depth = ext_depth(inode); - ex = path[depth].p_ext; -@@ -2979,6 +2980,8 @@ static int ext4_split_extent(handle_t *handle, - map->m_lblk + map->m_len, split_flag1, flags1); - if (err) - goto out; -+ } else { -+ allocated = ee_len - (map->m_lblk - ee_block); - } - - ext4_ext_drop_refs(path); -@@ -3001,7 +3004,7 @@ static int ext4_split_extent(handle_t *handle, - - ext4_ext_show_leaf(inode, path); - out: -- return err ? err : map->m_len; -+ return err ? err : allocated; - } - - #define EXT4_EXT_ZERO_LEN 7 -@@ -3663,6 +3666,7 @@ out: - allocated - map->m_len); - allocated = map->m_len; - } -+ map->m_len = allocated; - - /* - * If we have done fallocate with the offset that is already -diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c -index 6266799..6d1f577 100644 ---- a/fs/ext4/ialloc.c -+++ b/fs/ext4/ialloc.c -@@ -294,8 +294,8 @@ error_return: - } - - struct orlov_stats { -+ __u64 free_clusters; - __u32 free_inodes; -- __u32 free_clusters; - __u32 used_dirs; - }; - -@@ -312,7 +312,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, - - if (flex_size > 1) { - stats->free_inodes = atomic_read(&flex_group[g].free_inodes); -- stats->free_clusters = atomic_read(&flex_group[g].free_clusters); -+ stats->free_clusters = atomic64_read(&flex_group[g].free_clusters); - stats->used_dirs = atomic_read(&flex_group[g].used_dirs); - return; - } -diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c -index 4b2bb75..3270ffd 100644 ---- a/fs/ext4/inode.c -+++ b/fs/ext4/inode.c -@@ -142,7 +142,8 @@ void ext4_evict_inode(struct inode *inode) - * don't use page cache. - */ - if (ext4_should_journal_data(inode) && -- (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode))) { -+ (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && -+ inode->i_ino != EXT4_JOURNAL_INO) { - journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; - tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; - -diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c -index 553ff71..7b18563 100644 ---- a/fs/ext4/mballoc.c -+++ b/fs/ext4/mballoc.c -@@ -2866,8 +2866,8 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, - if (sbi->s_log_groups_per_flex) { - ext4_group_t flex_group = ext4_flex_group(sbi, - ac->ac_b_ex.fe_group); -- atomic_sub(ac->ac_b_ex.fe_len, -- &sbi->s_flex_groups[flex_group].free_clusters); -+ atomic64_sub(ac->ac_b_ex.fe_len, -+ &sbi->s_flex_groups[flex_group].free_clusters); - } - - err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); -@@ -3485,7 +3485,7 @@ ext4_mb_new_inode_pa(struct ext4_allocation_context *ac) - win = offs; - - ac->ac_b_ex.fe_logical = ac->ac_o_ex.fe_logical - -- EXT4_B2C(sbi, win); -+ EXT4_NUM_B2C(sbi, win); - BUG_ON(ac->ac_o_ex.fe_logical < ac->ac_b_ex.fe_logical); - BUG_ON(ac->ac_o_ex.fe_len > ac->ac_b_ex.fe_len); - } -@@ -4634,7 +4634,7 @@ do_more: - EXT4_BLOCKS_PER_GROUP(sb); - count -= overflow; - } -- count_clusters = EXT4_B2C(sbi, count); -+ count_clusters = EXT4_NUM_B2C(sbi, count); - bitmap_bh = ext4_read_block_bitmap(sb, block_group); - if (!bitmap_bh) { - err = -EIO; -@@ -4724,8 +4724,8 @@ do_more: - - if (sbi->s_log_groups_per_flex) { - ext4_group_t flex_group = ext4_flex_group(sbi, block_group); -- atomic_add(count_clusters, -- &sbi->s_flex_groups[flex_group].free_clusters); -+ atomic64_add(count_clusters, -+ &sbi->s_flex_groups[flex_group].free_clusters); - } - - ext4_mb_unload_buddy(&e4b); -@@ -4865,12 +4865,12 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, - desc->bg_checksum = ext4_group_desc_csum(sbi, block_group, desc); - ext4_unlock_group(sb, block_group); - percpu_counter_add(&sbi->s_freeclusters_counter, -- EXT4_B2C(sbi, blocks_freed)); -+ EXT4_NUM_B2C(sbi, blocks_freed)); - - if (sbi->s_log_groups_per_flex) { - ext4_group_t flex_group = ext4_flex_group(sbi, block_group); -- atomic_add(EXT4_B2C(sbi, blocks_freed), -- &sbi->s_flex_groups[flex_group].free_clusters); -+ atomic64_add(EXT4_NUM_B2C(sbi, blocks_freed), -+ &sbi->s_flex_groups[flex_group].free_clusters); - } - - ext4_mb_unload_buddy(&e4b); -diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c -index 33129c0..6e67b97 100644 ---- a/fs/ext4/resize.c -+++ b/fs/ext4/resize.c -@@ -938,7 +938,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) - - /* Update the free space counts */ - percpu_counter_add(&sbi->s_freeclusters_counter, -- EXT4_B2C(sbi, input->free_blocks_count)); -+ EXT4_NUM_B2C(sbi, input->free_blocks_count)); - percpu_counter_add(&sbi->s_freeinodes_counter, - EXT4_INODES_PER_GROUP(sb)); - -@@ -946,8 +946,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) - sbi->s_log_groups_per_flex) { - ext4_group_t flex_group; - flex_group = ext4_flex_group(sbi, input->group); -- atomic_add(EXT4_B2C(sbi, input->free_blocks_count), -- &sbi->s_flex_groups[flex_group].free_clusters); -+ atomic64_add(EXT4_NUM_B2C(sbi, input->free_blocks_count), -+ &sbi->s_flex_groups[flex_group].free_clusters); - atomic_add(EXT4_INODES_PER_GROUP(sb), - &sbi->s_flex_groups[flex_group].free_inodes); - } -diff --git a/fs/ext4/super.c b/fs/ext4/super.c -index 24ac7a2..cc386b2 100644 ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -2047,8 +2047,8 @@ static int ext4_fill_flex_info(struct super_block *sb) - flex_group = ext4_flex_group(sbi, i); - atomic_add(ext4_free_inodes_count(sb, gdp), - &sbi->s_flex_groups[flex_group].free_inodes); -- atomic_add(ext4_free_group_clusters(sb, gdp), -- &sbi->s_flex_groups[flex_group].free_clusters); -+ atomic64_add(ext4_free_group_clusters(sb, gdp), -+ &sbi->s_flex_groups[flex_group].free_clusters); - atomic_add(ext4_used_dirs_count(sb, gdp), - &sbi->s_flex_groups[flex_group].used_dirs); - } -diff --git a/fs/isofs/export.c b/fs/isofs/export.c -index 516eb21..fd88add 100644 ---- a/fs/isofs/export.c -+++ b/fs/isofs/export.c -@@ -135,6 +135,7 @@ isofs_export_encode_fh(struct dentry *dentry, - len = 3; - fh32[0] = ei->i_iget5_block; - fh16[2] = (__u16)ei->i_iget5_offset; /* fh16 [sic] */ -+ fh16[3] = 0; /* avoid leaking uninitialized data */ - fh32[2] = inode->i_generation; - if (connectable && !S_ISDIR(inode->i_mode)) { - struct inode *parent; -diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c -index d7dd774..6ac5bb1 100644 ---- a/fs/jbd2/transaction.c -+++ b/fs/jbd2/transaction.c -@@ -1016,9 +1016,12 @@ out: - void jbd2_journal_set_triggers(struct buffer_head *bh, - struct jbd2_buffer_trigger_type *type) - { -- struct journal_head *jh = bh2jh(bh); -+ struct journal_head *jh = jbd2_journal_grab_journal_head(bh); - -+ if (WARN_ON(!jh)) -+ return; - jh->b_triggers = type; -+ jbd2_journal_put_journal_head(jh); - } - - void jbd2_buffer_frozen_trigger(struct journal_head *jh, void *mapped_data, -@@ -1070,17 +1073,18 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) - { - transaction_t *transaction = handle->h_transaction; - journal_t *journal = transaction->t_journal; -- struct journal_head *jh = bh2jh(bh); -+ struct journal_head *jh; - int ret = 0; - -- jbd_debug(5, "journal_head %p\n", jh); -- JBUFFER_TRACE(jh, "entry"); - if (is_handle_aborted(handle)) - goto out; -- if (!buffer_jbd(bh)) { -+ jh = jbd2_journal_grab_journal_head(bh); -+ if (!jh) { - ret = -EUCLEAN; - goto out; - } -+ jbd_debug(5, "journal_head %p\n", jh); -+ JBUFFER_TRACE(jh, "entry"); - - jbd_lock_bh_state(bh); - -@@ -1171,6 +1175,7 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) - spin_unlock(&journal->j_list_lock); - out_unlock_bh: - jbd_unlock_bh_state(bh); -+ jbd2_journal_put_journal_head(jh); - out: - JBUFFER_TRACE(jh, "exit"); - WARN_ON(ret); /* All errors are bugs, so dump the stack */ -diff --git a/fs/proc/inode.c b/fs/proc/inode.c -index 7737c54..00f08b3 100644 ---- a/fs/proc/inode.c -+++ b/fs/proc/inode.c -@@ -427,12 +427,10 @@ static const struct file_operations proc_reg_file_ops_no_compat = { - - struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) - { -- struct inode * inode; -+ struct inode *inode = new_inode_pseudo(sb); - -- inode = iget_locked(sb, de->low_ino); -- if (!inode) -- return NULL; -- if (inode->i_state & I_NEW) { -+ if (inode) { -+ inode->i_ino = de->low_ino; - inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; - PROC_I(inode)->fd = 0; - PROC_I(inode)->pde = de; -@@ -461,9 +459,7 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) - inode->i_fop = de->proc_fops; - } - } -- unlock_new_inode(inode); -- } else -- pde_put(de); -+ } - return inode; - } - -diff --git a/fs/udf/namei.c b/fs/udf/namei.c -index 4639e13..71c97fb 100644 ---- a/fs/udf/namei.c -+++ b/fs/udf/namei.c -@@ -1293,6 +1293,7 @@ static int udf_encode_fh(struct dentry *de, __u32 *fh, int *lenp, - *lenp = 3; - fid->udf.block = location.logicalBlockNum; - fid->udf.partref = location.partitionReferenceNum; -+ fid->udf.parent_partref = 0; - fid->udf.generation = inode->i_generation; - - if (connectable && !S_ISDIR(inode->i_mode)) { -diff --git a/include/asm-generic/signal.h b/include/asm-generic/signal.h -index 555c0ae..743f7a5 100644 ---- a/include/asm-generic/signal.h -+++ b/include/asm-generic/signal.h -@@ -99,6 +99,10 @@ typedef unsigned long old_sigset_t; - - #include <asm-generic/signal-defs.h> - -+#ifdef SA_RESTORER -+#define __ARCH_HAS_SA_RESTORER -+#endif -+ - struct sigaction { - __sighandler_t sa_handler; - unsigned long sa_flags; -diff --git a/include/linux/efi.h b/include/linux/efi.h -index ce95a4b..8469f3f 100644 ---- a/include/linux/efi.h -+++ b/include/linux/efi.h -@@ -484,7 +484,8 @@ struct efivars { - * 1) ->list - adds, removals, reads, writes - * 2) ops.[gs]et_variable() calls. - * It must not be held when creating sysfs entries or calling kmalloc. -- * ops.get_next_variable() is only called from register_efivars(), -+ * ops.get_next_variable() is only called from register_efivars() -+ * or efivar_update_sysfs_entries(), - * which is protected by the BKL, so that path is safe. - */ - spinlock_t lock; -diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h -index b669be6..9b9b2aa 100644 ---- a/include/linux/perf_event.h -+++ b/include/linux/perf_event.h -@@ -1186,6 +1186,12 @@ static inline void perf_event_disable(struct perf_event *event) { } - static inline void perf_event_task_tick(void) { } - #endif - -+#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL) -+extern void perf_restore_debug_store(void); -+#else -+static inline void perf_restore_debug_store(void) { } -+#endif -+ - #define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof(x)) - - /* -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h -index 53dc7e7..da65890 100644 ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -455,7 +455,7 @@ struct sk_buff { - union { - __u32 mark; - __u32 dropcount; -- __u32 avail_size; -+ __u32 reserved_tailroom; - }; - - __u16 vlan_tci; -@@ -1332,7 +1332,10 @@ static inline int skb_tailroom(const struct sk_buff *skb) - */ - static inline int skb_availroom(const struct sk_buff *skb) - { -- return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len; -+ if (skb_is_nonlinear(skb)) -+ return 0; -+ -+ return skb->end - skb->tail - skb->reserved_tailroom; - } - - /** -diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h -index 16ff29a..b289bd2 100644 ---- a/include/net/inet_frag.h -+++ b/include/net/inet_frag.h -@@ -33,6 +33,13 @@ struct inet_frag_queue { - - #define INETFRAGS_HASHSZ 64 - -+/* averaged: -+ * max_depth = default ipfrag_high_thresh / INETFRAGS_HASHSZ / -+ * rounded up (SKB_TRUELEN(0) + sizeof(struct ipq or -+ * struct frag_queue)) -+ */ -+#define INETFRAGS_MAXDEPTH 128 -+ - struct inet_frags { - struct hlist_head hash[INETFRAGS_HASHSZ]; - rwlock_t lock; -@@ -64,6 +71,8 @@ int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f); - struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, - struct inet_frags *f, void *key, unsigned int hash) - __releases(&f->lock); -+void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q, -+ const char *prefix); - - static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f) - { -diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h -index 10422ef..2124004 100644 ---- a/include/net/ip_fib.h -+++ b/include/net/ip_fib.h -@@ -129,18 +129,16 @@ struct fib_result_nl { - }; - - #ifdef CONFIG_IP_ROUTE_MULTIPATH -- - #define FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel]) -- --#define FIB_TABLE_HASHSZ 2 -- - #else /* CONFIG_IP_ROUTE_MULTIPATH */ -- - #define FIB_RES_NH(res) ((res).fi->fib_nh[0]) -+#endif /* CONFIG_IP_ROUTE_MULTIPATH */ - -+#ifdef CONFIG_IP_MULTIPLE_TABLES - #define FIB_TABLE_HASHSZ 256 -- --#endif /* CONFIG_IP_ROUTE_MULTIPATH */ -+#else -+#define FIB_TABLE_HASHSZ 2 -+#endif - - extern __be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh); - -diff --git a/kernel/signal.c b/kernel/signal.c -index 71e1816..ea76d30 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -481,7 +481,7 @@ flush_signal_handlers(struct task_struct *t, int force_default) - if (force_default || ka->sa.sa_handler != SIG_IGN) - ka->sa.sa_handler = SIG_DFL; - ka->sa.sa_flags = 0; --#ifdef SA_RESTORER -+#ifdef __ARCH_HAS_SA_RESTORER - ka->sa.sa_restorer = NULL; - #endif - sigemptyset(&ka->sa.sa_mask); -diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c -index 6c880e8..0943d2a 100644 ---- a/kernel/trace/ftrace.c -+++ b/kernel/trace/ftrace.c -@@ -2725,8 +2725,8 @@ __unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops, - continue; - } - -- hlist_del(&entry->node); -- call_rcu(&entry->rcu, ftrace_free_entry_rcu); -+ hlist_del_rcu(&entry->node); -+ call_rcu_sched(&entry->rcu, ftrace_free_entry_rcu); - } - } - __disable_ftrace_function_probe(); -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 5638104..17edb14 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -652,7 +652,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) - void - update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) - { -- struct ring_buffer *buf = tr->buffer; -+ struct ring_buffer *buf; - - if (trace_stop_count) - return; -@@ -664,6 +664,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) - } - arch_spin_lock(&ftrace_max_lock); - -+ buf = tr->buffer; - tr->buffer = max_tr.buffer; - max_tr.buffer = buf; - -@@ -2635,11 +2636,25 @@ static int set_tracer_option(struct tracer *trace, char *cmp, int neg) - return -EINVAL; - } - --static void set_tracer_flags(unsigned int mask, int enabled) -+/* Some tracers require overwrite to stay enabled */ -+int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) -+{ -+ if (tracer->enabled && (mask & TRACE_ITER_OVERWRITE) && !set) -+ return -1; -+ -+ return 0; -+} -+ -+int set_tracer_flag(unsigned int mask, int enabled) - { - /* do nothing if flag is already set */ - if (!!(trace_flags & mask) == !!enabled) -- return; -+ return 0; -+ -+ /* Give the tracer a chance to approve the change */ -+ if (current_trace->flag_changed) -+ if (current_trace->flag_changed(current_trace, mask, !!enabled)) -+ return -EINVAL; - - if (enabled) - trace_flags |= mask; -@@ -2649,8 +2664,14 @@ static void set_tracer_flags(unsigned int mask, int enabled) - if (mask == TRACE_ITER_RECORD_CMD) - trace_event_enable_cmd_record(enabled); - -- if (mask == TRACE_ITER_OVERWRITE) -+ if (mask == TRACE_ITER_OVERWRITE) { - ring_buffer_change_overwrite(global_trace.buffer, enabled); -+#ifdef CONFIG_TRACER_MAX_TRACE -+ ring_buffer_change_overwrite(max_tr.buffer, enabled); -+#endif -+ } -+ -+ return 0; - } - - static ssize_t -@@ -2660,7 +2681,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf, - char buf[64]; - char *cmp; - int neg = 0; -- int ret; -+ int ret = 0; - int i; - - if (cnt >= sizeof(buf)) -@@ -2677,21 +2698,23 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf, - cmp += 2; - } - -+ mutex_lock(&trace_types_lock); -+ - for (i = 0; trace_options[i]; i++) { - if (strcmp(cmp, trace_options[i]) == 0) { -- set_tracer_flags(1 << i, !neg); -+ ret = set_tracer_flag(1 << i, !neg); - break; - } - } - - /* If no option could be set, test the specific tracer options */ -- if (!trace_options[i]) { -- mutex_lock(&trace_types_lock); -+ if (!trace_options[i]) - ret = set_tracer_option(current_trace, cmp, neg); -- mutex_unlock(&trace_types_lock); -- if (ret) -- return ret; -- } -+ -+ mutex_unlock(&trace_types_lock); -+ -+ if (ret) -+ return ret; - - *ppos += cnt; - -@@ -3015,6 +3038,9 @@ static int tracing_set_tracer(const char *buf) - goto out; - - trace_branch_disable(); -+ -+ current_trace->enabled = false; -+ - if (current_trace && current_trace->reset) - current_trace->reset(tr); - if (current_trace && current_trace->use_max_tr) { -@@ -3044,6 +3070,7 @@ static int tracing_set_tracer(const char *buf) - goto out; - } - -+ current_trace->enabled = true; - trace_branch_enable(tr); - out: - mutex_unlock(&trace_types_lock); -@@ -4378,7 +4405,13 @@ trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt, - - if (val != 0 && val != 1) - return -EINVAL; -- set_tracer_flags(1 << index, val); -+ -+ mutex_lock(&trace_types_lock); -+ ret = set_tracer_flag(1 << index, val); -+ mutex_unlock(&trace_types_lock); -+ -+ if (ret < 0) -+ return ret; - - *ppos += cnt; - -diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h -index 092e1f8..c3c3f6b 100644 ---- a/kernel/trace/trace.h -+++ b/kernel/trace/trace.h -@@ -271,10 +271,14 @@ struct tracer { - enum print_line_t (*print_line)(struct trace_iterator *iter); - /* If you handled the flag setting, return 0 */ - int (*set_flag)(u32 old_flags, u32 bit, int set); -+ /* Return 0 if OK with change, else return non-zero */ -+ int (*flag_changed)(struct tracer *tracer, -+ u32 mask, int set); - struct tracer *next; - struct tracer_flags *flags; - int print_max; - int use_max_tr; -+ bool enabled; - }; - - -@@ -815,6 +819,9 @@ extern struct list_head ftrace_events; - extern const char *__start___trace_bprintk_fmt[]; - extern const char *__stop___trace_bprintk_fmt[]; - -+int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set); -+int set_tracer_flag(unsigned int mask, int enabled); -+ - #undef FTRACE_ENTRY - #define FTRACE_ENTRY(call, struct_name, id, tstruct, print) \ - extern struct ftrace_event_call \ -diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c -index 20dad0d..1626e1a 100644 ---- a/kernel/trace/trace_irqsoff.c -+++ b/kernel/trace/trace_irqsoff.c -@@ -32,7 +32,7 @@ enum { - - static int trace_type __read_mostly; - --static int save_lat_flag; -+static int save_flags; - - static void stop_irqsoff_tracer(struct trace_array *tr, int graph); - static int start_irqsoff_tracer(struct trace_array *tr, int graph); -@@ -546,8 +546,11 @@ static void stop_irqsoff_tracer(struct trace_array *tr, int graph) - - static void __irqsoff_tracer_init(struct trace_array *tr) - { -- save_lat_flag = trace_flags & TRACE_ITER_LATENCY_FMT; -- trace_flags |= TRACE_ITER_LATENCY_FMT; -+ save_flags = trace_flags; -+ -+ /* non overwrite screws up the latency tracers */ -+ set_tracer_flag(TRACE_ITER_OVERWRITE, 1); -+ set_tracer_flag(TRACE_ITER_LATENCY_FMT, 1); - - tracing_max_latency = 0; - irqsoff_trace = tr; -@@ -561,10 +564,13 @@ static void __irqsoff_tracer_init(struct trace_array *tr) - - static void irqsoff_tracer_reset(struct trace_array *tr) - { -+ int lat_flag = save_flags & TRACE_ITER_LATENCY_FMT; -+ int overwrite_flag = save_flags & TRACE_ITER_OVERWRITE; -+ - stop_irqsoff_tracer(tr, is_graph()); - -- if (!save_lat_flag) -- trace_flags &= ~TRACE_ITER_LATENCY_FMT; -+ set_tracer_flag(TRACE_ITER_LATENCY_FMT, lat_flag); -+ set_tracer_flag(TRACE_ITER_OVERWRITE, overwrite_flag); - } - - static void irqsoff_tracer_start(struct trace_array *tr) -@@ -597,6 +603,7 @@ static struct tracer irqsoff_tracer __read_mostly = - .print_line = irqsoff_print_line, - .flags = &tracer_flags, - .set_flag = irqsoff_set_flag, -+ .flag_changed = trace_keep_overwrite, - #ifdef CONFIG_FTRACE_SELFTEST - .selftest = trace_selftest_startup_irqsoff, - #endif -@@ -630,6 +637,7 @@ static struct tracer preemptoff_tracer __read_mostly = - .print_line = irqsoff_print_line, - .flags = &tracer_flags, - .set_flag = irqsoff_set_flag, -+ .flag_changed = trace_keep_overwrite, - #ifdef CONFIG_FTRACE_SELFTEST - .selftest = trace_selftest_startup_preemptoff, - #endif -@@ -665,6 +673,7 @@ static struct tracer preemptirqsoff_tracer __read_mostly = - .print_line = irqsoff_print_line, - .flags = &tracer_flags, - .set_flag = irqsoff_set_flag, -+ .flag_changed = trace_keep_overwrite, - #ifdef CONFIG_FTRACE_SELFTEST - .selftest = trace_selftest_startup_preemptirqsoff, - #endif -diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c -index e4a70c0..6857e0c 100644 ---- a/kernel/trace/trace_sched_wakeup.c -+++ b/kernel/trace/trace_sched_wakeup.c -@@ -36,7 +36,7 @@ static void __wakeup_reset(struct trace_array *tr); - static int wakeup_graph_entry(struct ftrace_graph_ent *trace); - static void wakeup_graph_return(struct ftrace_graph_ret *trace); - --static int save_lat_flag; -+static int save_flags; - - #define TRACE_DISPLAY_GRAPH 1 - -@@ -528,8 +528,11 @@ static void stop_wakeup_tracer(struct trace_array *tr) - - static int __wakeup_tracer_init(struct trace_array *tr) - { -- save_lat_flag = trace_flags & TRACE_ITER_LATENCY_FMT; -- trace_flags |= TRACE_ITER_LATENCY_FMT; -+ save_flags = trace_flags; -+ -+ /* non overwrite screws up the latency tracers */ -+ set_tracer_flag(TRACE_ITER_OVERWRITE, 1); -+ set_tracer_flag(TRACE_ITER_LATENCY_FMT, 1); - - tracing_max_latency = 0; - wakeup_trace = tr; -@@ -551,12 +554,15 @@ static int wakeup_rt_tracer_init(struct trace_array *tr) - - static void wakeup_tracer_reset(struct trace_array *tr) - { -+ int lat_flag = save_flags & TRACE_ITER_LATENCY_FMT; -+ int overwrite_flag = save_flags & TRACE_ITER_OVERWRITE; -+ - stop_wakeup_tracer(tr); - /* make sure we put back any tasks we are tracing */ - wakeup_reset(tr); - -- if (!save_lat_flag) -- trace_flags &= ~TRACE_ITER_LATENCY_FMT; -+ set_tracer_flag(TRACE_ITER_LATENCY_FMT, lat_flag); -+ set_tracer_flag(TRACE_ITER_OVERWRITE, overwrite_flag); - } - - static void wakeup_tracer_start(struct trace_array *tr) -@@ -582,6 +588,7 @@ static struct tracer wakeup_tracer __read_mostly = - .print_line = wakeup_print_line, - .flags = &tracer_flags, - .set_flag = wakeup_set_flag, -+ .flag_changed = trace_keep_overwrite, - #ifdef CONFIG_FTRACE_SELFTEST - .selftest = trace_selftest_startup_wakeup, - #endif -@@ -603,6 +610,7 @@ static struct tracer wakeup_rt_tracer __read_mostly = - .print_line = wakeup_print_line, - .flags = &tracer_flags, - .set_flag = wakeup_set_flag, -+ .flag_changed = trace_keep_overwrite, - #ifdef CONFIG_FTRACE_SELFTEST - .selftest = trace_selftest_startup_wakeup, - #endif -diff --git a/mm/hugetlb.c b/mm/hugetlb.c -index d6c0fdf..4c7d42a 100644 ---- a/mm/hugetlb.c -+++ b/mm/hugetlb.c -@@ -2092,8 +2092,12 @@ int hugetlb_report_node_meminfo(int nid, char *buf) - /* Return the number pages of memory we physically have, in PAGE_SIZE units. */ - unsigned long hugetlb_total_pages(void) - { -- struct hstate *h = &default_hstate; -- return h->nr_huge_pages * pages_per_huge_page(h); -+ struct hstate *h; -+ unsigned long nr_total_pages = 0; -+ -+ for_each_hstate(h) -+ nr_total_pages += h->nr_huge_pages * pages_per_huge_page(h); -+ return nr_total_pages; - } - - static int hugetlb_acct_memory(struct hstate *h, long delta) -diff --git a/net/core/dev.c b/net/core/dev.c -index 2aac4ec..b23bbbf 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3299,6 +3299,7 @@ ncls: - } - switch (rx_handler(&skb)) { - case RX_HANDLER_CONSUMED: -+ ret = NET_RX_SUCCESS; - goto out; - case RX_HANDLER_ANOTHER: - goto another_round; -diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c -index 5229c7f..3b5e680 100644 ---- a/net/core/rtnetlink.c -+++ b/net/core/rtnetlink.c -@@ -973,6 +973,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, - * report anything. - */ - ivi.spoofchk = -1; -+ memset(ivi.mac, 0, sizeof(ivi.mac)); - if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) - break; - vf_mac.vf = -@@ -2041,7 +2042,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) - struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len); - - while (RTA_OK(attr, attrlen)) { -- unsigned flavor = attr->rta_type; -+ unsigned int flavor = attr->rta_type & NLA_TYPE_MASK; - if (flavor) { - if (flavor > rta_max[sz_idx]) - return -EINVAL; -diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c -index d860530..2f9517d 100644 ---- a/net/dcb/dcbnl.c -+++ b/net/dcb/dcbnl.c -@@ -336,6 +336,7 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlattr **tb, - dcb->dcb_family = AF_UNSPEC; - dcb->cmd = DCB_CMD_GPERM_HWADDR; - -+ memset(perm_addr, 0, sizeof(perm_addr)); - netdev->dcbnl_ops->getpermhwaddr(netdev, perm_addr); - - ret = nla_put(dcbnl_skb, DCB_ATTR_PERM_HWADDR, sizeof(perm_addr), -@@ -1238,6 +1239,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) - - if (ops->ieee_getets) { - struct ieee_ets ets; -+ memset(&ets, 0, sizeof(ets)); - err = ops->ieee_getets(netdev, &ets); - if (!err) - NLA_PUT(skb, DCB_ATTR_IEEE_ETS, sizeof(ets), &ets); -@@ -1245,6 +1247,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) - - if (ops->ieee_getpfc) { - struct ieee_pfc pfc; -+ memset(&pfc, 0, sizeof(pfc)); - err = ops->ieee_getpfc(netdev, &pfc); - if (!err) - NLA_PUT(skb, DCB_ATTR_IEEE_PFC, sizeof(pfc), &pfc); -@@ -1277,6 +1280,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) - /* get peer info if available */ - if (ops->ieee_peer_getets) { - struct ieee_ets ets; -+ memset(&ets, 0, sizeof(ets)); - err = ops->ieee_peer_getets(netdev, &ets); - if (!err) - NLA_PUT(skb, DCB_ATTR_IEEE_PEER_ETS, sizeof(ets), &ets); -@@ -1284,6 +1288,7 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) - - if (ops->ieee_peer_getpfc) { - struct ieee_pfc pfc; -+ memset(&pfc, 0, sizeof(pfc)); - err = ops->ieee_peer_getpfc(netdev, &pfc); - if (!err) - NLA_PUT(skb, DCB_ATTR_IEEE_PEER_PFC, sizeof(pfc), &pfc); -@@ -1463,6 +1468,7 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) - /* peer info if available */ - if (ops->cee_peer_getpg) { - struct cee_pg pg; -+ memset(&pg, 0, sizeof(pg)); - err = ops->cee_peer_getpg(netdev, &pg); - if (!err) - NLA_PUT(skb, DCB_ATTR_CEE_PEER_PG, sizeof(pg), &pg); -@@ -1470,6 +1476,7 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) - - if (ops->cee_peer_getpfc) { - struct cee_pfc pfc; -+ memset(&pfc, 0, sizeof(pfc)); - err = ops->cee_peer_getpfc(netdev, &pfc); - if (!err) - NLA_PUT(skb, DCB_ATTR_CEE_PEER_PFC, sizeof(pfc), &pfc); -diff --git a/net/ieee802154/6lowpan.h b/net/ieee802154/6lowpan.h -index 5d8cf80..8b0866f 100644 ---- a/net/ieee802154/6lowpan.h -+++ b/net/ieee802154/6lowpan.h -@@ -87,7 +87,7 @@ - (memcmp(addr1, addr2, length >> 3) == 0) - - /* local link, i.e. FE80::/10 */ --#define is_addr_link_local(a) (((a)->s6_addr16[0]) == 0x80FE) -+#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80)) - - /* - * check whether we can compress the IID to 16 bits, -diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c -index 5ff2a51..210b710 100644 ---- a/net/ipv4/inet_fragment.c -+++ b/net/ipv4/inet_fragment.c -@@ -21,6 +21,7 @@ - #include <linux/rtnetlink.h> - #include <linux/slab.h> - -+#include <net/sock.h> - #include <net/inet_frag.h> - - static void inet_frag_secret_rebuild(unsigned long dummy) -@@ -271,6 +272,7 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, - { - struct inet_frag_queue *q; - struct hlist_node *n; -+ int depth = 0; - - hlist_for_each_entry(q, n, &f->hash[hash], list) { - if (q->net == nf && f->match(q, key)) { -@@ -278,9 +280,25 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, - read_unlock(&f->lock); - return q; - } -+ depth++; - } - read_unlock(&f->lock); - -- return inet_frag_create(nf, f, key); -+ if (depth <= INETFRAGS_MAXDEPTH) -+ return inet_frag_create(nf, f, key); -+ else -+ return ERR_PTR(-ENOBUFS); - } - EXPORT_SYMBOL(inet_frag_find); -+ -+void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q, -+ const char *prefix) -+{ -+ static const char msg[] = "inet_frag_find: Fragment hash bucket" -+ " list length grew over limit " __stringify(INETFRAGS_MAXDEPTH) -+ ". Dropping fragment.\n"; -+ -+ if (PTR_ERR(q) == -ENOBUFS) -+ LIMIT_NETDEBUG(KERN_WARNING "%s%s", prefix, msg); -+} -+EXPORT_SYMBOL(inet_frag_maybe_warn_overflow); -diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c -index a4e7131..b2cfe83 100644 ---- a/net/ipv4/ip_fragment.c -+++ b/net/ipv4/ip_fragment.c -@@ -20,6 +20,8 @@ - * Patrick McHardy : LRU queue of frag heads for evictor. - */ - -+#define pr_fmt(fmt) "IPv4: " fmt -+ - #include <linux/compiler.h> - #include <linux/module.h> - #include <linux/types.h> -@@ -293,14 +295,12 @@ static inline struct ipq *ip_find(struct net *net, struct iphdr *iph, u32 user) - hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); - - q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); -- if (q == NULL) -- goto out_nomem; -+ if (IS_ERR_OR_NULL(q)) { -+ inet_frag_maybe_warn_overflow(q, pr_fmt()); -+ return NULL; -+ } - - return container_of(q, struct ipq, q); -- --out_nomem: -- LIMIT_NETDEBUG(KERN_ERR "ip_frag_create: no memory left !\n"); -- return NULL; - } - - /* Is the fragment too far ahead to be part of ipq? */ -diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c -index 42dd1a9..40eb4fc 100644 ---- a/net/ipv4/ip_options.c -+++ b/net/ipv4/ip_options.c -@@ -358,7 +358,6 @@ int ip_options_compile(struct net *net, - } - switch (optptr[3]&0xF) { - case IPOPT_TS_TSONLY: -- opt->ts = optptr - iph; - if (skb) - timeptr = &optptr[optptr[2]-1]; - opt->ts_needtime = 1; -@@ -369,7 +368,6 @@ int ip_options_compile(struct net *net, - pp_ptr = optptr + 2; - goto error; - } -- opt->ts = optptr - iph; - if (rt) { - memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4); - timeptr = &optptr[optptr[2]+3]; -@@ -383,7 +381,6 @@ int ip_options_compile(struct net *net, - pp_ptr = optptr + 2; - goto error; - } -- opt->ts = optptr - iph; - { - __be32 addr; - memcpy(&addr, &optptr[optptr[2]-1], 4); -@@ -416,12 +413,12 @@ int ip_options_compile(struct net *net, - pp_ptr = optptr + 3; - goto error; - } -- opt->ts = optptr - iph; - if (skb) { - optptr[3] = (optptr[3]&0xF)|((overflow+1)<<4); - opt->is_changed = 1; - } - } -+ opt->ts = optptr - iph; - break; - case IPOPT_RA: - if (optlen < 4) { -diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 52edbb8..fe381c2 100644 ---- a/net/ipv4/tcp.c -+++ b/net/ipv4/tcp.c -@@ -704,7 +704,7 @@ struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp) - * Make sure that we have exactly size bytes - * available to the caller, no more, no less. - */ -- skb->avail_size = size; -+ skb->reserved_tailroom = skb->end - skb->tail - size; - return skb; - } - __kfree_skb(skb); -diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c -index e865ed1..1b1f7af 100644 ---- a/net/ipv4/tcp_input.c -+++ b/net/ipv4/tcp_input.c -@@ -5494,6 +5494,9 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, - if (tcp_checksum_complete_user(sk, skb)) - goto csum_error; - -+ if ((int)skb->truesize > sk->sk_forward_alloc) -+ goto step5; -+ - /* Predicted packet is in window by definition. - * seq == rcv_nxt and rcv_wup <= rcv_nxt. - * Hence, check seq<=rcv_wup reduces to: -@@ -5505,9 +5508,6 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, - - tcp_rcv_rtt_measure_ts(sk, skb); - -- if ((int)skb->truesize > sk->sk_forward_alloc) -- goto step5; -- - NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPHPHITS); - - /* Bulk data transfer: receiver */ -diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index 921cbac..9bb7400 100644 ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -1096,7 +1096,6 @@ static void __pskb_trim_head(struct sk_buff *skb, int len) - eat = min_t(int, len, skb_headlen(skb)); - if (eat) { - __skb_pull(skb, eat); -- skb->avail_size -= eat; - len -= eat; - if (!len) - return; -diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c -index a46c64e..f8d24dd 100644 ---- a/net/ipv6/ip6_input.c -+++ b/net/ipv6/ip6_input.c -@@ -265,7 +265,8 @@ int ip6_mc_input(struct sk_buff *skb) - * IPv6 multicast router mode is now supported ;) - */ - if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding && -- !(ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) && -+ !(ipv6_addr_type(&hdr->daddr) & -+ (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)) && - likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) { - /* - * Okay, we try to forward - split and duplicate -diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c -index 38f00b0..52e2f65 100644 ---- a/net/ipv6/netfilter/nf_conntrack_reasm.c -+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c -@@ -14,6 +14,8 @@ - * 2 of the License, or (at your option) any later version. - */ - -+#define pr_fmt(fmt) "IPv6-nf: " fmt -+ - #include <linux/errno.h> - #include <linux/types.h> - #include <linux/string.h> -@@ -176,13 +178,12 @@ fq_find(__be32 id, u32 user, struct in6_addr *src, struct in6_addr *dst) - - q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); - local_bh_enable(); -- if (q == NULL) -- goto oom; -+ if (IS_ERR_OR_NULL(q)) { -+ inet_frag_maybe_warn_overflow(q, pr_fmt()); -+ return NULL; -+ } - - return container_of(q, struct nf_ct_frag6_queue, q); -- --oom: -- return NULL; - } - - -diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c -index dfb164e..2b0a4ca 100644 ---- a/net/ipv6/reassembly.c -+++ b/net/ipv6/reassembly.c -@@ -26,6 +26,9 @@ - * YOSHIFUJI,H. @USAGI Always remove fragment header to - * calculate ICV correctly. - */ -+ -+#define pr_fmt(fmt) "IPv6: " fmt -+ - #include <linux/errno.h> - #include <linux/types.h> - #include <linux/string.h> -@@ -240,9 +243,10 @@ fq_find(struct net *net, __be32 id, const struct in6_addr *src, const struct in6 - hash = inet6_hash_frag(id, src, dst, ip6_frags.rnd); - - q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); -- if (q == NULL) -+ if (IS_ERR_OR_NULL(q)) { -+ inet_frag_maybe_warn_overflow(q, pr_fmt()); - return NULL; -- -+ } - return container_of(q, struct frag_queue, q); - } - -diff --git a/net/ipv6/route.c b/net/ipv6/route.c -index 791c1fa..18ea73c 100644 ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -1920,7 +1920,8 @@ void rt6_purge_dflt_routers(struct net *net) - restart: - read_lock_bh(&table->tb6_lock); - for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { -- if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) { -+ if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) && -+ (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) { - dst_hold(&rt->dst); - read_unlock_bh(&table->tb6_lock); - ip6_del_rt(rt); -diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c -index b1bd16f..6f60175 100644 ---- a/net/l2tp/l2tp_ppp.c -+++ b/net/l2tp/l2tp_ppp.c -@@ -360,6 +360,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh - l2tp_xmit_skb(session, skb, session->hdr_len); - - sock_put(ps->tunnel_sock); -+ sock_put(sk); - - return error; - -diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c -index d463f5a..23267b3 100644 ---- a/net/netlabel/netlabel_unlabeled.c -+++ b/net/netlabel/netlabel_unlabeled.c -@@ -1189,8 +1189,6 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb, - struct netlbl_unlhsh_walk_arg cb_arg; - u32 skip_bkt = cb->args[0]; - u32 skip_chain = cb->args[1]; -- u32 skip_addr4 = cb->args[2]; -- u32 skip_addr6 = cb->args[3]; - u32 iter_bkt; - u32 iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0; - struct netlbl_unlhsh_iface *iface; -@@ -1215,7 +1213,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb, - continue; - netlbl_af4list_foreach_rcu(addr4, - &iface->addr4_list) { -- if (iter_addr4++ < skip_addr4) -+ if (iter_addr4++ < cb->args[2]) - continue; - if (netlbl_unlabel_staticlist_gen( - NLBL_UNLABEL_C_STATICLIST, -@@ -1231,7 +1229,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb, - #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) - netlbl_af6list_foreach_rcu(addr6, - &iface->addr6_list) { -- if (iter_addr6++ < skip_addr6) -+ if (iter_addr6++ < cb->args[3]) - continue; - if (netlbl_unlabel_staticlist_gen( - NLBL_UNLABEL_C_STATICLIST, -@@ -1250,10 +1248,10 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb, - - unlabel_staticlist_return: - rcu_read_unlock(); -- cb->args[0] = skip_bkt; -- cb->args[1] = skip_chain; -- cb->args[2] = skip_addr4; -- cb->args[3] = skip_addr6; -+ cb->args[0] = iter_bkt; -+ cb->args[1] = iter_chain; -+ cb->args[2] = iter_addr4; -+ cb->args[3] = iter_addr6; - return skb->len; - } - -@@ -1273,12 +1271,9 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, - { - struct netlbl_unlhsh_walk_arg cb_arg; - struct netlbl_unlhsh_iface *iface; -- u32 skip_addr4 = cb->args[0]; -- u32 skip_addr6 = cb->args[1]; -- u32 iter_addr4 = 0; -+ u32 iter_addr4 = 0, iter_addr6 = 0; - struct netlbl_af4list *addr4; - #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) -- u32 iter_addr6 = 0; - struct netlbl_af6list *addr6; - #endif - -@@ -1292,7 +1287,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, - goto unlabel_staticlistdef_return; - - netlbl_af4list_foreach_rcu(addr4, &iface->addr4_list) { -- if (iter_addr4++ < skip_addr4) -+ if (iter_addr4++ < cb->args[0]) - continue; - if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, - iface, -@@ -1305,7 +1300,7 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, - } - #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) - netlbl_af6list_foreach_rcu(addr6, &iface->addr6_list) { -- if (iter_addr6++ < skip_addr6) -+ if (iter_addr6++ < cb->args[1]) - continue; - if (netlbl_unlabel_staticlist_gen(NLBL_UNLABEL_C_STATICLISTDEF, - iface, -@@ -1320,8 +1315,8 @@ static int netlbl_unlabel_staticlistdef(struct sk_buff *skb, - - unlabel_staticlistdef_return: - rcu_read_unlock(); -- cb->args[0] = skip_addr4; -- cb->args[1] = skip_addr6; -+ cb->args[0] = iter_addr4; -+ cb->args[1] = iter_addr6; - return skb->len; - } - -diff --git a/net/rds/message.c b/net/rds/message.c -index f0a4658..aff589c 100644 ---- a/net/rds/message.c -+++ b/net/rds/message.c -@@ -197,6 +197,9 @@ struct rds_message *rds_message_alloc(unsigned int extra_len, gfp_t gfp) - { - struct rds_message *rm; - -+ if (extra_len > KMALLOC_MAX_SIZE - sizeof(struct rds_message)) -+ return NULL; -+ - rm = kzalloc(sizeof(struct rds_message) + extra_len, gfp); - if (!rm) - goto out; -diff --git a/net/sctp/associola.c b/net/sctp/associola.c -index acd2edb..3c04692 100644 ---- a/net/sctp/associola.c -+++ b/net/sctp/associola.c -@@ -1050,7 +1050,7 @@ struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *asoc, - transports) { - - if (transport == active) -- break; -+ continue; - list_for_each_entry(chunk, &transport->transmitted, - transmitted_list) { - if (key == chunk->subh.data_hdr->tsn) { -diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c -index 891f5db..cb1c430 100644 ---- a/net/sctp/sm_statefuns.c -+++ b/net/sctp/sm_statefuns.c -@@ -2044,7 +2044,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep, - } - - /* Delete the tempory new association. */ -- sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); -+ sctp_add_cmd_sf(commands, SCTP_CMD_SET_ASOC, SCTP_ASOC(new_asoc)); - sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); - - /* Restore association pointer to provide SCTP command interpeter -diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c -index 48665ec..8ab2951 100644 ---- a/security/selinux/xfrm.c -+++ b/security/selinux/xfrm.c -@@ -310,7 +310,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, - - if (old_ctx) { - new_ctx = kmalloc(sizeof(*old_ctx) + old_ctx->ctx_len, -- GFP_KERNEL); -+ GFP_ATOMIC); - if (!new_ctx) - return -ENOMEM; - -diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c -index b0187e7..7747d26 100644 ---- a/sound/pci/hda/hda_codec.c -+++ b/sound/pci/hda/hda_codec.c -@@ -2771,7 +2771,7 @@ static unsigned int convert_to_spdif_status(unsigned short val) - if (val & AC_DIG1_PROFESSIONAL) - sbits |= IEC958_AES0_PROFESSIONAL; - if (sbits & IEC958_AES0_PROFESSIONAL) { -- if (sbits & AC_DIG1_EMPHASIS) -+ if (val & AC_DIG1_EMPHASIS) - sbits |= IEC958_AES0_PRO_EMPHASIS_5015; - } else { - if (val & AC_DIG1_EMPHASIS) -diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c -index c9269ce..984b5b1 100644 ---- a/sound/pci/hda/patch_conexant.c -+++ b/sound/pci/hda/patch_conexant.c -@@ -1236,7 +1236,7 @@ static int patch_cxt5045(struct hda_codec *codec) - } - - if (spec->beep_amp) -- snd_hda_attach_beep_device(codec, spec->beep_amp); -+ snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); - - return 0; - } -@@ -2027,7 +2027,7 @@ static int patch_cxt5051(struct hda_codec *codec) - } - - if (spec->beep_amp) -- snd_hda_attach_beep_device(codec, spec->beep_amp); -+ snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); - - conexant_init_jacks(codec); - if (spec->auto_mic & AUTO_MIC_PORTB) -@@ -3225,7 +3225,7 @@ static int patch_cxt5066(struct hda_codec *codec) - } - - if (spec->beep_amp) -- snd_hda_attach_beep_device(codec, spec->beep_amp); -+ snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); - - return 0; - } -@@ -4556,7 +4556,7 @@ static int patch_conexant_auto(struct hda_codec *codec) - spec->capture_stream = &cx_auto_pcm_analog_capture; - codec->patch_ops = cx_auto_patch_ops; - if (spec->beep_amp) -- snd_hda_attach_beep_device(codec, spec->beep_amp); -+ snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); - return 0; - } - -diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c -index 9121dee..f4540bf 100644 ---- a/sound/usb/mixer.c -+++ b/sound/usb/mixer.c -@@ -711,8 +711,9 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ - case UAC2_CLOCK_SELECTOR: { - struct uac_selector_unit_descriptor *d = p1; - /* call recursively to retrieve the channel info */ -- if (check_input_term(state, d->baSourceID[0], term) < 0) -- return -ENODEV; -+ err = check_input_term(state, d->baSourceID[0], term); -+ if (err < 0) -+ return err; - term->type = d->bDescriptorSubtype << 16; /* virtual type */ - term->id = id; - term->name = uac_selector_unit_iSelector(d); -@@ -1263,8 +1264,9 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void - return err; - - /* determine the input source type and name */ -- if (check_input_term(state, hdr->bSourceID, &iterm) < 0) -- return -EINVAL; -+ err = check_input_term(state, hdr->bSourceID, &iterm); -+ if (err < 0) -+ return err; - - master_bits = snd_usb_combine_bytes(bmaControls, csize); - /* master configuration quirks */ -@@ -2018,7 +2020,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) - state.oterm.type = le16_to_cpu(desc->wTerminalType); - state.oterm.name = desc->iTerminal; - err = parse_audio_unit(&state, desc->bSourceID); -- if (err < 0) -+ if (err < 0 && err != -EINVAL) - return err; - } else { /* UAC_VERSION_2 */ - struct uac2_output_terminal_descriptor *desc = p; -@@ -2030,12 +2032,12 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) - state.oterm.type = le16_to_cpu(desc->wTerminalType); - state.oterm.name = desc->iTerminal; - err = parse_audio_unit(&state, desc->bSourceID); -- if (err < 0) -+ if (err < 0 && err != -EINVAL) - return err; - - /* for UAC2, use the same approach to also add the clock selectors */ - err = parse_audio_unit(&state, desc->bCSourceID); -- if (err < 0) -+ if (err < 0 && err != -EINVAL) - return err; - } - } -diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c -index 0961d88..5e19410 100644 ---- a/tools/hv/hv_kvp_daemon.c -+++ b/tools/hv/hv_kvp_daemon.c -@@ -393,13 +393,19 @@ int main(void) - len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, - addr_p, &addr_l); - -- if (len < 0 || addr.nl_pid) { -+ if (len < 0) { - syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", - addr.nl_pid, errno, strerror(errno)); - close(fd); - return -1; - } - -+ if (addr.nl_pid) { -+ syslog(LOG_WARNING, "Received packet from untrusted pid:%u", -+ addr.nl_pid); -+ continue; -+ } -+ - incoming_msg = (struct nlmsghdr *)kvp_recv_buffer; - incoming_cn_msg = (struct cn_msg *)NLMSG_DATA(incoming_msg); - -diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c -index bf54c48..6c164dc 100644 ---- a/tools/perf/util/trace-event-parse.c -+++ b/tools/perf/util/trace-event-parse.c -@@ -1582,8 +1582,6 @@ process_symbols(struct event *event, struct print_arg *arg, char **tok) - field = malloc_or_die(sizeof(*field)); - - type = process_arg(event, field, &token); -- while (type == EVENT_OP) -- type = process_op(event, field, &token); - if (test_type_token(type, token, EVENT_DELIM, ",")) - goto out_free; - |