commit: e989bdfcc48b199cf8faa0375950668a3b8e5ec5 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Sun Jun 7 21:54:35 2020 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Sun Jun 7 21:54:35 2020 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=e989bdfc
Linux patch 5.6.17 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1016_linux-5.6.17.patch | 1227 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1231 insertions(+) diff --git a/0000_README b/0000_README index eb1d2c7..07595c4 100644 --- a/0000_README +++ b/0000_README @@ -107,6 +107,10 @@ Patch: 1015_linux-5.6.16.patch From: http://www.kernel.org Desc: Linux 5.6.16 +Patch: 1016_linux-5.6.17.patch +From: http://www.kernel.org +Desc: Linux 5.6.17 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1016_linux-5.6.17.patch b/1016_linux-5.6.17.patch new file mode 100644 index 0000000..698ce9a --- /dev/null +++ b/1016_linux-5.6.17.patch @@ -0,0 +1,1227 @@ +diff --git a/Makefile b/Makefile +index 1befb37dcc58..8254beb87a7b 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 6 +-SUBLEVEL = 16 ++SUBLEVEL = 17 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c +index aa41af6ef4ac..efdedf83b954 100644 +--- a/arch/arc/kernel/setup.c ++++ b/arch/arc/kernel/setup.c +@@ -11,6 +11,7 @@ + #include <linux/clocksource.h> + #include <linux/console.h> + #include <linux/module.h> ++#include <linux/sizes.h> + #include <linux/cpu.h> + #include <linux/of_clk.h> + #include <linux/of_fdt.h> +@@ -409,12 +410,12 @@ static void arc_chk_core_config(void) + if ((unsigned int)__arc_dccm_base != cpu->dccm.base_addr) + panic("Linux built with incorrect DCCM Base address\n"); + +- if (CONFIG_ARC_DCCM_SZ != cpu->dccm.sz) ++ if (CONFIG_ARC_DCCM_SZ * SZ_1K != cpu->dccm.sz) + panic("Linux built with incorrect DCCM Size\n"); + #endif + + #ifdef CONFIG_ARC_HAS_ICCM +- if (CONFIG_ARC_ICCM_SZ != cpu->iccm.sz) ++ if (CONFIG_ARC_ICCM_SZ * SZ_1K != cpu->iccm.sz) + panic("Linux built with incorrect ICCM Size\n"); + #endif + +diff --git a/arch/arc/plat-eznps/Kconfig b/arch/arc/plat-eznps/Kconfig +index a931d0a256d0..a645bca5899a 100644 +--- a/arch/arc/plat-eznps/Kconfig ++++ b/arch/arc/plat-eznps/Kconfig +@@ -6,6 +6,7 @@ + + menuconfig ARC_PLAT_EZNPS + bool "\"EZchip\" ARC dev platform" ++ depends on ISA_ARCOMPACT + select CPU_BIG_ENDIAN + select CLKSRC_NPS if !PHYS_ADDR_T_64BIT + select EZNPS_GIC +diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c +index 157924baa191..1dc26384a6c4 100644 +--- a/arch/riscv/mm/init.c ++++ b/arch/riscv/mm/init.c +@@ -46,7 +46,7 @@ static void setup_zero_page(void) + memset((void *)empty_zero_page, 0, PAGE_SIZE); + } + +-#ifdef CONFIG_DEBUG_VM ++#if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM) + static inline void print_mlk(char *name, unsigned long b, unsigned long t) + { + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld kB)\n", name, b, t, +diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c +index 5674710a4841..7dfae86afa47 100644 +--- a/arch/s390/mm/hugetlbpage.c ++++ b/arch/s390/mm/hugetlbpage.c +@@ -159,10 +159,13 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, + rste &= ~_SEGMENT_ENTRY_NOEXEC; + + /* Set correct table type for 2G hugepages */ +- if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) +- rste |= _REGION_ENTRY_TYPE_R3 | _REGION3_ENTRY_LARGE; +- else ++ if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) { ++ if (likely(pte_present(pte))) ++ rste |= _REGION3_ENTRY_LARGE; ++ rste |= _REGION_ENTRY_TYPE_R3; ++ } else if (likely(pte_present(pte))) + rste |= _SEGMENT_ENTRY_LARGE; ++ + clear_huge_pte_skeys(mm, rste); + pte_val(*ptep) = rste; + } +diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c +index fd51bac11b46..acf76b466db6 100644 +--- a/arch/x86/hyperv/hv_init.c ++++ b/arch/x86/hyperv/hv_init.c +@@ -226,10 +226,18 @@ static int hv_cpu_die(unsigned int cpu) + + rdmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl)); + if (re_ctrl.target_vp == hv_vp_index[cpu]) { +- /* Reassign to some other online CPU */ ++ /* ++ * Reassign reenlightenment notifications to some other online ++ * CPU or just disable the feature if there are no online CPUs ++ * left (happens on hibernation). ++ */ + new_cpu = cpumask_any_but(cpu_online_mask, cpu); + +- re_ctrl.target_vp = hv_vp_index[new_cpu]; ++ if (new_cpu < nr_cpu_ids) ++ re_ctrl.target_vp = hv_vp_index[new_cpu]; ++ else ++ re_ctrl.enabled = 0; ++ + wrmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl)); + } + +@@ -293,6 +301,13 @@ static void hv_resume(void) + + hv_hypercall_pg = hv_hypercall_pg_saved; + hv_hypercall_pg_saved = NULL; ++ ++ /* ++ * Reenlightenment notifications are disabled by hv_cpu_die(0), ++ * reenable them here if hv_reenlightenment_cb was previously set. ++ */ ++ if (hv_reenlightenment_cb) ++ set_hv_tscchange_cb(hv_reenlightenment_cb); + } + + /* Note: when the ops are called, only CPU0 is online and IRQs are disabled. */ +diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h +index 64a03f226ab7..dca64a2dda9c 100644 +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -256,6 +256,7 @@ static inline int pmd_large(pmd_t pte) + } + + #ifdef CONFIG_TRANSPARENT_HUGEPAGE ++/* NOTE: when predicate huge page, consider also pmd_devmap, or use pmd_large */ + static inline int pmd_trans_huge(pmd_t pmd) + { + return (pmd_val(pmd) & (_PAGE_PSE|_PAGE_DEVMAP)) == _PAGE_PSE; +diff --git a/arch/x86/include/uapi/asm/unistd.h b/arch/x86/include/uapi/asm/unistd.h +index 196fdd02b8b1..be5e2e747f50 100644 +--- a/arch/x86/include/uapi/asm/unistd.h ++++ b/arch/x86/include/uapi/asm/unistd.h +@@ -2,8 +2,15 @@ + #ifndef _UAPI_ASM_X86_UNISTD_H + #define _UAPI_ASM_X86_UNISTD_H + +-/* x32 syscall flag bit */ +-#define __X32_SYSCALL_BIT 0x40000000UL ++/* ++ * x32 syscall flag bit. Some user programs expect syscall NR macros ++ * and __X32_SYSCALL_BIT to have type int, even though syscall numbers ++ * are, for practical purposes, unsigned long. ++ * ++ * Fortunately, expressions like (nr & ~__X32_SYSCALL_BIT) do the right ++ * thing regardless. ++ */ ++#define __X32_SYSCALL_BIT 0x40000000 + + #ifndef __KERNEL__ + # ifdef __i386__ +diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c +index 673de6063345..92530af38b09 100644 +--- a/arch/x86/mm/mmio-mod.c ++++ b/arch/x86/mm/mmio-mod.c +@@ -372,7 +372,7 @@ static void enter_uniprocessor(void) + int cpu; + int err; + +- if (downed_cpus == NULL && ++ if (!cpumask_available(downed_cpus) && + !alloc_cpumask_var(&downed_cpus, GFP_KERNEL)) { + pr_notice("Failed to allocate mask\n"); + goto out; +@@ -402,7 +402,7 @@ static void leave_uniprocessor(void) + int cpu; + int err; + +- if (downed_cpus == NULL || cpumask_weight(downed_cpus) == 0) ++ if (!cpumask_available(downed_cpus) || cpumask_weight(downed_cpus) == 0) + return; + pr_notice("Re-enabling CPUs...\n"); + for_each_cpu(cpu, downed_cpus) { +diff --git a/crypto/algapi.c b/crypto/algapi.c +index 69605e21af92..f8b4dc161c02 100644 +--- a/crypto/algapi.c ++++ b/crypto/algapi.c +@@ -716,17 +716,27 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn); + + static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn) + { +- struct crypto_alg *alg; ++ struct crypto_alg *alg = ERR_PTR(-EAGAIN); ++ struct crypto_alg *target; ++ bool shoot = false; + + down_read(&crypto_alg_sem); +- alg = spawn->alg; +- if (!spawn->dead && !crypto_mod_get(alg)) { +- alg->cra_flags |= CRYPTO_ALG_DYING; +- alg = NULL; ++ if (!spawn->dead) { ++ alg = spawn->alg; ++ if (!crypto_mod_get(alg)) { ++ target = crypto_alg_get(alg); ++ shoot = true; ++ alg = ERR_PTR(-EAGAIN); ++ } + } + up_read(&crypto_alg_sem); + +- return alg ?: ERR_PTR(-EAGAIN); ++ if (shoot) { ++ crypto_shoot_alg(target); ++ crypto_alg_put(target); ++ } ++ ++ return alg; + } + + struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, +diff --git a/crypto/api.c b/crypto/api.c +index 7d71a9b10e5f..edcf690800d4 100644 +--- a/crypto/api.c ++++ b/crypto/api.c +@@ -333,12 +333,13 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask) + return len; + } + +-static void crypto_shoot_alg(struct crypto_alg *alg) ++void crypto_shoot_alg(struct crypto_alg *alg) + { + down_write(&crypto_alg_sem); + alg->cra_flags |= CRYPTO_ALG_DYING; + up_write(&crypto_alg_sem); + } ++EXPORT_SYMBOL_GPL(crypto_shoot_alg); + + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask) +diff --git a/crypto/internal.h b/crypto/internal.h +index d5ebc60c5143..ff06a3bd1ca1 100644 +--- a/crypto/internal.h ++++ b/crypto/internal.h +@@ -65,6 +65,7 @@ void crypto_alg_tested(const char *name, int err); + void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list, + struct crypto_alg *nalg); + void crypto_remove_final(struct list_head *list); ++void crypto_shoot_alg(struct crypto_alg *alg); + struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, + u32 mask); + void *crypto_create_tfm(struct crypto_alg *alg, +diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c +index ed34785dd64b..5dc955f5ea0a 100644 +--- a/drivers/block/null_blk_zoned.c ++++ b/drivers/block/null_blk_zoned.c +@@ -20,6 +20,10 @@ int null_zone_init(struct nullb_device *dev) + pr_err("zone_size must be power-of-two\n"); + return -EINVAL; + } ++ if (dev->zone_size > dev->size) { ++ pr_err("Zone size larger than device capacity\n"); ++ return -EINVAL; ++ } + + dev->zone_size_sects = dev->zone_size << ZONE_SIZE_SHIFT; + dev->nr_zones = dev_size >> +diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c +index 0536866a58ce..4bfbca2add1b 100644 +--- a/drivers/dma/ti/k3-udma.c ++++ b/drivers/dma/ti/k3-udma.c +@@ -2148,7 +2148,8 @@ udma_prep_slave_sg_tr(struct udma_chan *uc, struct scatterlist *sgl, + d->residue += sg_dma_len(sgent); + } + +- cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags, CPPI5_TR_CSF_EOP); ++ cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags, ++ CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP); + + return d; + } +@@ -2725,7 +2726,8 @@ udma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, + tr_req[1].dicnt3 = 1; + } + +- cppi5_tr_csf_set(&tr_req[num_tr - 1].flags, CPPI5_TR_CSF_EOP); ++ cppi5_tr_csf_set(&tr_req[num_tr - 1].flags, ++ CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP); + + if (uc->config.metadata_size) + d->vd.tx.metadata_ops = &metadata_ops; +diff --git a/drivers/firmware/efi/earlycon.c b/drivers/firmware/efi/earlycon.c +index 5d4f84781aa0..a52236e11e5f 100644 +--- a/drivers/firmware/efi/earlycon.c ++++ b/drivers/firmware/efi/earlycon.c +@@ -114,14 +114,16 @@ static void efi_earlycon_write_char(u32 *dst, unsigned char c, unsigned int h) + const u32 color_black = 0x00000000; + const u32 color_white = 0x00ffffff; + const u8 *src; +- u8 s8; +- int m; ++ int m, n, bytes; ++ u8 x; + +- src = font->data + c * font->height; +- s8 = *(src + h); ++ bytes = BITS_TO_BYTES(font->width); ++ src = font->data + c * font->height * bytes + h * bytes; + +- for (m = 0; m < 8; m++) { +- if ((s8 >> (7 - m)) & 1) ++ for (m = 0; m < font->width; m++) { ++ n = m % 8; ++ x = *(src + m / 8); ++ if ((x >> (7 - n)) & 1) + *dst = color_white; + else + *dst = color_black; +diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c +index 7bbef4a67350..30e77a9e62b2 100644 +--- a/drivers/firmware/efi/libstub/arm-stub.c ++++ b/drivers/firmware/efi/libstub/arm-stub.c +@@ -59,7 +59,11 @@ static struct screen_info *setup_graphics(void) + si = alloc_screen_info(); + if (!si) + return NULL; +- efi_setup_gop(si, &gop_proto, size); ++ status = efi_setup_gop(si, &gop_proto, size); ++ if (status != EFI_SUCCESS) { ++ free_screen_info(si); ++ return NULL; ++ } + } + return si; + } +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +index 1b6c75a4dd60..fbcd979438e2 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +@@ -220,6 +220,30 @@ static enum dpcd_training_patterns + return dpcd_tr_pattern; + } + ++static uint8_t dc_dp_initialize_scrambling_data_symbols( ++ struct dc_link *link, ++ enum dc_dp_training_pattern pattern) ++{ ++ uint8_t disable_scrabled_data_symbols = 0; ++ ++ switch (pattern) { ++ case DP_TRAINING_PATTERN_SEQUENCE_1: ++ case DP_TRAINING_PATTERN_SEQUENCE_2: ++ case DP_TRAINING_PATTERN_SEQUENCE_3: ++ disable_scrabled_data_symbols = 1; ++ break; ++ case DP_TRAINING_PATTERN_SEQUENCE_4: ++ disable_scrabled_data_symbols = 0; ++ break; ++ default: ++ ASSERT(0); ++ DC_LOG_HW_LINK_TRAINING("%s: Invalid HW Training pattern: %d\n", ++ __func__, pattern); ++ break; ++ } ++ return disable_scrabled_data_symbols; ++} ++ + static inline bool is_repeater(struct dc_link *link, uint32_t offset) + { + return (!link->is_lttpr_mode_transparent && offset != 0); +@@ -252,6 +276,9 @@ static void dpcd_set_lt_pattern_and_lane_settings( + dpcd_pattern.v1_4.TRAINING_PATTERN_SET = + dc_dp_training_pattern_to_dpcd_training_pattern(link, pattern); + ++ dpcd_pattern.v1_4.SCRAMBLING_DISABLE = ++ dc_dp_initialize_scrambling_data_symbols(link, pattern); ++ + dpcd_lt_buffer[DP_TRAINING_PATTERN_SET - DP_TRAINING_PATTERN_SET] + = dpcd_pattern.raw; + +diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c +index 079800a07d6e..5c611baba2fc 100644 +--- a/drivers/gpu/drm/drm_edid.c ++++ b/drivers/gpu/drm/drm_edid.c +@@ -191,10 +191,11 @@ static const struct edid_quirk { + { "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP }, + { "HVR", 0xaa02, EDID_QUIRK_NON_DESKTOP }, + +- /* Oculus Rift DK1, DK2, and CV1 VR Headsets */ ++ /* Oculus Rift DK1, DK2, CV1 and Rift S VR Headsets */ + { "OVR", 0x0001, EDID_QUIRK_NON_DESKTOP }, + { "OVR", 0x0003, EDID_QUIRK_NON_DESKTOP }, + { "OVR", 0x0004, EDID_QUIRK_NON_DESKTOP }, ++ { "OVR", 0x0012, EDID_QUIRK_NON_DESKTOP }, + + /* Windows Mixed Reality Headsets */ + { "ACR", 0x7fce, EDID_QUIRK_NON_DESKTOP }, +diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c +index 03c720b47306..39e4da7468e1 100644 +--- a/drivers/hid/hid-multitouch.c ++++ b/drivers/hid/hid-multitouch.c +@@ -69,6 +69,7 @@ MODULE_LICENSE("GPL"); + #define MT_QUIRK_ASUS_CUSTOM_UP BIT(17) + #define MT_QUIRK_WIN8_PTP_BUTTONS BIT(18) + #define MT_QUIRK_SEPARATE_APP_REPORT BIT(19) ++#define MT_QUIRK_FORCE_MULTI_INPUT BIT(20) + + #define MT_INPUTMODE_TOUCHSCREEN 0x02 + #define MT_INPUTMODE_TOUCHPAD 0x03 +@@ -189,6 +190,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app); + #define MT_CLS_WIN_8 0x0012 + #define MT_CLS_EXPORT_ALL_INPUTS 0x0013 + #define MT_CLS_WIN_8_DUAL 0x0014 ++#define MT_CLS_WIN_8_FORCE_MULTI_INPUT 0x0015 + + /* vendor specific classes */ + #define MT_CLS_3M 0x0101 +@@ -279,6 +281,15 @@ static const struct mt_class mt_classes[] = { + MT_QUIRK_CONTACT_CNT_ACCURATE | + MT_QUIRK_WIN8_PTP_BUTTONS, + .export_all_inputs = true }, ++ { .name = MT_CLS_WIN_8_FORCE_MULTI_INPUT, ++ .quirks = MT_QUIRK_ALWAYS_VALID | ++ MT_QUIRK_IGNORE_DUPLICATES | ++ MT_QUIRK_HOVERING | ++ MT_QUIRK_CONTACT_CNT_ACCURATE | ++ MT_QUIRK_STICKY_FINGERS | ++ MT_QUIRK_WIN8_PTP_BUTTONS | ++ MT_QUIRK_FORCE_MULTI_INPUT, ++ .export_all_inputs = true }, + + /* + * vendor specific classes +@@ -1714,6 +1725,11 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) + if (id->group != HID_GROUP_MULTITOUCH_WIN_8) + hdev->quirks |= HID_QUIRK_MULTI_INPUT; + ++ if (mtclass->quirks & MT_QUIRK_FORCE_MULTI_INPUT) { ++ hdev->quirks &= ~HID_QUIRK_INPUT_PER_APP; ++ hdev->quirks |= HID_QUIRK_MULTI_INPUT; ++ } ++ + timer_setup(&td->release_timer, mt_expired_timeout, 0); + + ret = hid_parse(hdev); +@@ -1926,6 +1942,11 @@ static const struct hid_device_id mt_devices[] = { + MT_USB_DEVICE(USB_VENDOR_ID_DWAV, + USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_C002) }, + ++ /* Elan devices */ ++ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, ++ HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, ++ USB_VENDOR_ID_ELAN, 0x313a) }, ++ + /* Elitegroup panel */ + { .driver_data = MT_CLS_SERIAL, + MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP, +@@ -2056,6 +2077,11 @@ static const struct hid_device_id mt_devices[] = { + MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, + USB_DEVICE_ID_MTP_STM)}, + ++ /* Synaptics devices */ ++ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, ++ HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, ++ USB_VENDOR_ID_SYNAPTICS, 0xce08) }, ++ + /* TopSeed panels */ + { .driver_data = MT_CLS_TOPSEED, + MT_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, +diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +index 4c6ed6ef31f1..2f073f536070 100644 +--- a/drivers/hid/hid-sony.c ++++ b/drivers/hid/hid-sony.c +@@ -867,6 +867,23 @@ static u8 *sony_report_fixup(struct hid_device *hdev, u8 *rdesc, + if (sc->quirks & PS3REMOTE) + return ps3remote_fixup(hdev, rdesc, rsize); + ++ /* ++ * Some knock-off USB dongles incorrectly report their button count ++ * as 13 instead of 16 causing three non-functional buttons. ++ */ ++ if ((sc->quirks & SIXAXIS_CONTROLLER_USB) && *rsize >= 45 && ++ /* Report Count (13) */ ++ rdesc[23] == 0x95 && rdesc[24] == 0x0D && ++ /* Usage Maximum (13) */ ++ rdesc[37] == 0x29 && rdesc[38] == 0x0D && ++ /* Report Count (3) */ ++ rdesc[43] == 0x95 && rdesc[44] == 0x03) { ++ hid_info(hdev, "Fixing up USB dongle report descriptor\n"); ++ rdesc[24] = 0x10; ++ rdesc[38] = 0x10; ++ rdesc[44] = 0x00; ++ } ++ + return rdesc; + } + +diff --git a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c +index a66f08041a1a..ec142bc8c1da 100644 +--- a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c ++++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c +@@ -389,6 +389,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = { + }, + .driver_data = (void *)&sipodev_desc + }, ++ { ++ .ident = "Schneider SCL142ALM", ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SCHNEIDER"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SCL142ALM"), ++ }, ++ .driver_data = (void *)&sipodev_desc ++ }, + { } /* Terminate list */ + }; + +diff --git a/drivers/i2c/busses/i2c-altera.c b/drivers/i2c/busses/i2c-altera.c +index 92d2c706c2a7..a60042431370 100644 +--- a/drivers/i2c/busses/i2c-altera.c ++++ b/drivers/i2c/busses/i2c-altera.c +@@ -70,6 +70,7 @@ + * @isr_mask: cached copy of local ISR enables. + * @isr_status: cached copy of local ISR status. + * @lock: spinlock for IRQ synchronization. ++ * @isr_mutex: mutex for IRQ thread. + */ + struct altr_i2c_dev { + void __iomem *base; +@@ -86,6 +87,7 @@ struct altr_i2c_dev { + u32 isr_mask; + u32 isr_status; + spinlock_t lock; /* IRQ synchronization */ ++ struct mutex isr_mutex; + }; + + static void +@@ -245,10 +247,11 @@ static irqreturn_t altr_i2c_isr(int irq, void *_dev) + struct altr_i2c_dev *idev = _dev; + u32 status = idev->isr_status; + ++ mutex_lock(&idev->isr_mutex); + if (!idev->msg) { + dev_warn(idev->dev, "unexpected interrupt\n"); + altr_i2c_int_clear(idev, ALTR_I2C_ALL_IRQ); +- return IRQ_HANDLED; ++ goto out; + } + read = (idev->msg->flags & I2C_M_RD) != 0; + +@@ -301,6 +304,8 @@ static irqreturn_t altr_i2c_isr(int irq, void *_dev) + complete(&idev->msg_complete); + dev_dbg(idev->dev, "Message Complete\n"); + } ++out: ++ mutex_unlock(&idev->isr_mutex); + + return IRQ_HANDLED; + } +@@ -312,6 +317,7 @@ static int altr_i2c_xfer_msg(struct altr_i2c_dev *idev, struct i2c_msg *msg) + u32 value; + u8 addr = i2c_8bit_addr_from_msg(msg); + ++ mutex_lock(&idev->isr_mutex); + idev->msg = msg; + idev->msg_len = msg->len; + idev->buf = msg->buf; +@@ -336,6 +342,7 @@ static int altr_i2c_xfer_msg(struct altr_i2c_dev *idev, struct i2c_msg *msg) + altr_i2c_int_enable(idev, imask, true); + altr_i2c_fill_tx_fifo(idev); + } ++ mutex_unlock(&idev->isr_mutex); + + time_left = wait_for_completion_timeout(&idev->msg_complete, + ALTR_I2C_XFER_TIMEOUT); +@@ -409,6 +416,7 @@ static int altr_i2c_probe(struct platform_device *pdev) + idev->dev = &pdev->dev; + init_completion(&idev->msg_complete); + spin_lock_init(&idev->lock); ++ mutex_init(&idev->isr_mutex); + + ret = device_property_read_u32(idev->dev, "fifo-size", + &idev->fifo_size); +diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c +index 04d59bede5ea..74503cacf594 100644 +--- a/drivers/net/can/ifi_canfd/ifi_canfd.c ++++ b/drivers/net/can/ifi_canfd/ifi_canfd.c +@@ -947,8 +947,11 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev) + u32 id, rev; + + addr = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(addr)) ++ return PTR_ERR(addr); ++ + irq = platform_get_irq(pdev, 0); +- if (IS_ERR(addr) || irq < 0) ++ if (irq < 0) + return -EINVAL; + + id = readl(addr + IFI_CANFD_IP_ID); +diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c +index e3ba8ab0cbf4..e2c6cf4b2228 100644 +--- a/drivers/net/can/sun4i_can.c ++++ b/drivers/net/can/sun4i_can.c +@@ -792,7 +792,7 @@ static int sun4ican_probe(struct platform_device *pdev) + + addr = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(addr)) { +- err = -EBUSY; ++ err = PTR_ERR(addr); + goto exit; + } + +diff --git a/drivers/net/dsa/b53/b53_srab.c b/drivers/net/dsa/b53/b53_srab.c +index 0a1be5259be0..38cd8285ac67 100644 +--- a/drivers/net/dsa/b53/b53_srab.c ++++ b/drivers/net/dsa/b53/b53_srab.c +@@ -609,7 +609,7 @@ static int b53_srab_probe(struct platform_device *pdev) + + priv->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->regs)) +- return -ENOMEM; ++ return PTR_ERR(priv->regs); + + dev = b53_switch_alloc(&pdev->dev, &b53_srab_ops, priv); + if (!dev) +diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c +index b95425a63a13..797dc48536cc 100644 +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -818,10 +818,15 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port) + PCR_MATRIX_MASK, PCR_MATRIX(MT7530_ALL_MEMBERS)); + + /* Trapped into security mode allows packet forwarding through VLAN +- * table lookup. ++ * table lookup. CPU port is set to fallback mode to let untagged ++ * frames pass through. + */ +- mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK, +- MT7530_PORT_SECURITY_MODE); ++ if (dsa_is_cpu_port(ds, port)) ++ mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK, ++ MT7530_PORT_FALLBACK_MODE); ++ else ++ mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK, ++ MT7530_PORT_SECURITY_MODE); + + /* Set the port as a user port which is to be able to recognize VID + * from incoming packets before fetching entry within the VLAN table. +diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h +index 0e7e36d8f994..3ef7b5a6fc22 100644 +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -148,6 +148,12 @@ enum mt7530_port_mode { + /* Port Matrix Mode: Frames are forwarded by the PCR_MATRIX members. */ + MT7530_PORT_MATRIX_MODE = PORT_VLAN(0), + ++ /* Fallback Mode: Forward received frames with ingress ports that do ++ * not belong to the VLAN member. Frames whose VID is not listed on ++ * the VLAN table are forwarded by the PCR_MATRIX members. ++ */ ++ MT7530_PORT_FALLBACK_MODE = PORT_VLAN(1), ++ + /* Security Mode: Discard any frame due to ingress membership + * violation or VID missed on the VLAN table. + */ +diff --git a/drivers/net/ethernet/apple/bmac.c b/drivers/net/ethernet/apple/bmac.c +index a58185b1d8bf..3e3711b60d01 100644 +--- a/drivers/net/ethernet/apple/bmac.c ++++ b/drivers/net/ethernet/apple/bmac.c +@@ -1182,7 +1182,7 @@ bmac_get_station_address(struct net_device *dev, unsigned char *ea) + int i; + unsigned short data; + +- for (i = 0; i < 6; i++) ++ for (i = 0; i < 3; i++) + { + reset_and_select_srom(dev); + data = read_srom(dev, i + EnetAddressOffset/2, SROMAddressBits); +diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c +index 0d101c00286f..ab1b4a77b4a3 100644 +--- a/drivers/net/ethernet/freescale/ucc_geth.c ++++ b/drivers/net/ethernet/freescale/ucc_geth.c +@@ -42,6 +42,7 @@ + #include <soc/fsl/qe/ucc.h> + #include <soc/fsl/qe/ucc_fast.h> + #include <asm/machdep.h> ++#include <net/sch_generic.h> + + #include "ucc_geth.h" + +@@ -1548,11 +1549,8 @@ static int ugeth_disable(struct ucc_geth_private *ugeth, enum comm_dir mode) + + static void ugeth_quiesce(struct ucc_geth_private *ugeth) + { +- /* Prevent any further xmits, plus detach the device. */ +- netif_device_detach(ugeth->ndev); +- +- /* Wait for any current xmits to finish. */ +- netif_tx_disable(ugeth->ndev); ++ /* Prevent any further xmits */ ++ netif_tx_stop_all_queues(ugeth->ndev); + + /* Disable the interrupt to avoid NAPI rescheduling. */ + disable_irq(ugeth->ug_info->uf_info.irq); +@@ -1565,7 +1563,10 @@ static void ugeth_activate(struct ucc_geth_private *ugeth) + { + napi_enable(&ugeth->napi); + enable_irq(ugeth->ug_info->uf_info.irq); +- netif_device_attach(ugeth->ndev); ++ ++ /* allow to xmit again */ ++ netif_tx_wake_all_queues(ugeth->ndev); ++ __netdev_watchdog_up(ugeth->ndev); + } + + /* Called every time the controller might need to be made +diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c +index 7a0d785b826c..17243bb5ba91 100644 +--- a/drivers/net/ethernet/marvell/pxa168_eth.c ++++ b/drivers/net/ethernet/marvell/pxa168_eth.c +@@ -1418,7 +1418,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) + + pep->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(pep->base)) { +- err = -ENOMEM; ++ err = PTR_ERR(pep->base); + goto err_netdev; + } + +diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c +index 49a6a9167af4..fc168f85e7af 100644 +--- a/drivers/net/ethernet/smsc/smsc911x.c ++++ b/drivers/net/ethernet/smsc/smsc911x.c +@@ -2493,20 +2493,20 @@ static int smsc911x_drv_probe(struct platform_device *pdev) + + retval = smsc911x_init(dev); + if (retval < 0) +- goto out_disable_resources; ++ goto out_init_fail; + + netif_carrier_off(dev); + + retval = smsc911x_mii_init(pdev, dev); + if (retval) { + SMSC_WARN(pdata, probe, "Error %i initialising mii", retval); +- goto out_disable_resources; ++ goto out_init_fail; + } + + retval = register_netdev(dev); + if (retval) { + SMSC_WARN(pdata, probe, "Error %i registering device", retval); +- goto out_disable_resources; ++ goto out_init_fail; + } else { + SMSC_TRACE(pdata, probe, + "Network interface: \"%s\"", dev->name); +@@ -2547,9 +2547,10 @@ static int smsc911x_drv_probe(struct platform_device *pdev) + + return 0; + +-out_disable_resources: ++out_init_fail: + pm_runtime_put(&pdev->dev); + pm_runtime_disable(&pdev->dev); ++out_disable_resources: + (void)smsc911x_disable_resources(pdev); + out_enable_resources_fail: + smsc911x_free_resources(pdev); +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +index 6ae13dc19510..02102c781a8c 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +@@ -319,6 +319,19 @@ static int ipq806x_gmac_probe(struct platform_device *pdev) + /* Enable PTP clock */ + regmap_read(gmac->nss_common, NSS_COMMON_CLK_GATE, &val); + val |= NSS_COMMON_CLK_GATE_PTP_EN(gmac->id); ++ switch (gmac->phy_mode) { ++ case PHY_INTERFACE_MODE_RGMII: ++ val |= NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) | ++ NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id); ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ val |= NSS_COMMON_CLK_GATE_GMII_RX_EN(gmac->id) | ++ NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id); ++ break; ++ default: ++ /* We don't get here; the switch above will have errored out */ ++ unreachable(); ++ } + regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val); + + if (gmac->phy_mode == PHY_INTERFACE_MODE_SGMII) { +diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c +index ecdbde539eb7..4eb14b174c1a 100644 +--- a/drivers/net/ethernet/ti/cpsw_ale.c ++++ b/drivers/net/ethernet/ti/cpsw_ale.c +@@ -917,7 +917,7 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params) + + ale = devm_kzalloc(params->dev, sizeof(*ale), GFP_KERNEL); + if (!ale) +- return NULL; ++ return ERR_PTR(-ENOMEM); + + ale->p0_untag_vid_mask = + devm_kmalloc_array(params->dev, BITS_TO_LONGS(VLAN_N_VID), +diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c +index 97a058ca60ac..d0b6c418a870 100644 +--- a/drivers/net/ethernet/ti/cpsw_priv.c ++++ b/drivers/net/ethernet/ti/cpsw_priv.c +@@ -490,9 +490,9 @@ int cpsw_init_common(struct cpsw_common *cpsw, void __iomem *ss_regs, + ale_params.ale_ports = CPSW_ALE_PORTS_NUM; + + cpsw->ale = cpsw_ale_create(&ale_params); +- if (!cpsw->ale) { ++ if (IS_ERR(cpsw->ale)) { + dev_err(dev, "error initializing ale engine\n"); +- return -ENODEV; ++ return PTR_ERR(cpsw->ale); + } + + dma_params.dev = dev; +diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c +index fb36115e9c51..fdbae734acce 100644 +--- a/drivers/net/ethernet/ti/netcp_ethss.c ++++ b/drivers/net/ethernet/ti/netcp_ethss.c +@@ -3704,9 +3704,9 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev, + ale_params.nu_switch_ale = true; + } + gbe_dev->ale = cpsw_ale_create(&ale_params); +- if (!gbe_dev->ale) { ++ if (IS_ERR(gbe_dev->ale)) { + dev_err(gbe_dev->dev, "error initializing ale engine\n"); +- ret = -ENODEV; ++ ret = PTR_ERR(gbe_dev->ale); + goto free_sec_ports; + } else { + dev_dbg(gbe_dev->dev, "Created a gbe ale engine\n"); +diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c +index 28e3c5c0e3c3..faca0d84f5af 100644 +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -1239,7 +1239,7 @@ int phy_sfp_probe(struct phy_device *phydev, + const struct sfp_upstream_ops *ops) + { + struct sfp_bus *bus; +- int ret; ++ int ret = 0; + + if (phydev->mdio.dev.fwnode) { + bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode); +@@ -1251,7 +1251,7 @@ int phy_sfp_probe(struct phy_device *phydev, + ret = sfp_bus_add_upstream(bus, phydev, ops); + sfp_bus_put(bus); + } +- return 0; ++ return ret; + } + EXPORT_SYMBOL(phy_sfp_probe); + +diff --git a/drivers/net/wireless/cisco/airo.c b/drivers/net/wireless/cisco/airo.c +index 8363f91df7ea..827bb6d74815 100644 +--- a/drivers/net/wireless/cisco/airo.c ++++ b/drivers/net/wireless/cisco/airo.c +@@ -1925,6 +1925,10 @@ static netdev_tx_t mpi_start_xmit(struct sk_buff *skb, + airo_print_err(dev->name, "%s: skb == NULL!",__func__); + return NETDEV_TX_OK; + } ++ if (skb_padto(skb, ETH_ZLEN)) { ++ dev->stats.tx_dropped++; ++ return NETDEV_TX_OK; ++ } + npacks = skb_queue_len (&ai->txq); + + if (npacks >= MAXTXQ - 1) { +@@ -2127,6 +2131,10 @@ static netdev_tx_t airo_start_xmit(struct sk_buff *skb, + airo_print_err(dev->name, "%s: skb == NULL!", __func__); + return NETDEV_TX_OK; + } ++ if (skb_padto(skb, ETH_ZLEN)) { ++ dev->stats.tx_dropped++; ++ return NETDEV_TX_OK; ++ } + + /* Find a vacant FID */ + for( i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++ ); +@@ -2201,6 +2209,10 @@ static netdev_tx_t airo_start_xmit11(struct sk_buff *skb, + airo_print_err(dev->name, "%s: skb == NULL!", __func__); + return NETDEV_TX_OK; + } ++ if (skb_padto(skb, ETH_ZLEN)) { ++ dev->stats.tx_dropped++; ++ return NETDEV_TX_OK; ++ } + + /* Find a vacant FID */ + for( i = MAX_FIDS / 2; i < MAX_FIDS && (fids[i] & 0xffff0000); i++ ); +diff --git a/drivers/net/wireless/intersil/p54/p54usb.c b/drivers/net/wireless/intersil/p54/p54usb.c +index b94764c88750..ff0e30c0c14c 100644 +--- a/drivers/net/wireless/intersil/p54/p54usb.c ++++ b/drivers/net/wireless/intersil/p54/p54usb.c +@@ -61,6 +61,7 @@ static const struct usb_device_id p54u_table[] = { + {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */ + {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */ + {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ ++ {USB_DEVICE(0x124a, 0x4026)}, /* AirVasT USB wireless device */ + {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */ + {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */ + {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */ +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02.h b/drivers/net/wireless/mediatek/mt76/mt76x02.h +index 0ca0bbfe8769..c7c601f0348a 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02.h ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02.h +@@ -211,6 +211,7 @@ static inline bool is_mt76x0(struct mt76x02_dev *dev) + static inline bool is_mt76x2(struct mt76x02_dev *dev) + { + return mt76_chip(&dev->mt76) == 0x7612 || ++ mt76_chip(&dev->mt76) == 0x7632 || + mt76_chip(&dev->mt76) == 0x7662 || + mt76_chip(&dev->mt76) == 0x7602; + } +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +index b64ad816cc25..a6a14621e8a9 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +@@ -18,6 +18,7 @@ static const struct usb_device_id mt76x2u_device_table[] = { + { USB_DEVICE(0x7392, 0xb711) }, /* Edimax EW 7722 UAC */ + { USB_DEVICE(0x0846, 0x9053) }, /* Netgear A6210 */ + { USB_DEVICE(0x045e, 0x02e6) }, /* XBox One Wireless Adapter */ ++ { USB_DEVICE(0x045e, 0x02fe) }, /* XBox One Wireless Adapter */ + { }, + }; + +diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c +index 3717eea37ecb..5f0ad8b32e3a 100644 +--- a/drivers/scsi/scsi_pm.c ++++ b/drivers/scsi/scsi_pm.c +@@ -80,6 +80,10 @@ static int scsi_dev_type_resume(struct device *dev, + dev_dbg(dev, "scsi resume: %d\n", err); + + if (err == 0) { ++ bool was_runtime_suspended; ++ ++ was_runtime_suspended = pm_runtime_suspended(dev); ++ + pm_runtime_disable(dev); + err = pm_runtime_set_active(dev); + pm_runtime_enable(dev); +@@ -93,8 +97,10 @@ static int scsi_dev_type_resume(struct device *dev, + */ + if (!err && scsi_is_sdev_device(dev)) { + struct scsi_device *sdev = to_scsi_device(dev); +- +- blk_set_runtime_active(sdev->request_queue); ++ if (was_runtime_suspended) ++ blk_post_runtime_resume(sdev->request_queue, 0); ++ else ++ blk_set_runtime_active(sdev->request_queue); + } + } + +diff --git a/drivers/staging/media/ipu3/include/intel-ipu3.h b/drivers/staging/media/ipu3/include/intel-ipu3.h +index 1c9c3ba4d518..a607b0158c81 100644 +--- a/drivers/staging/media/ipu3/include/intel-ipu3.h ++++ b/drivers/staging/media/ipu3/include/intel-ipu3.h +@@ -450,7 +450,7 @@ struct ipu3_uapi_awb_fr_config_s { + __u32 bayer_sign; + __u8 bayer_nf; + __u8 reserved2[7]; +-} __attribute__((aligned(32))) __packed; ++} __packed; + + /** + * struct ipu3_uapi_4a_config - 4A config +@@ -466,7 +466,8 @@ struct ipu3_uapi_4a_config { + struct ipu3_uapi_ae_grid_config ae_grd_config; + __u8 padding[20]; + struct ipu3_uapi_af_config_s af_config; +- struct ipu3_uapi_awb_fr_config_s awb_fr_config; ++ struct ipu3_uapi_awb_fr_config_s awb_fr_config ++ __attribute__((aligned(32))); + } __packed; + + /** +@@ -2477,7 +2478,7 @@ struct ipu3_uapi_acc_param { + struct ipu3_uapi_yuvp1_yds_config yds2 __attribute__((aligned(32))); + struct ipu3_uapi_yuvp2_tcc_static_config tcc __attribute__((aligned(32))); + struct ipu3_uapi_anr_config anr; +- struct ipu3_uapi_awb_fr_config_s awb_fr __attribute__((aligned(32))); ++ struct ipu3_uapi_awb_fr_config_s awb_fr; + struct ipu3_uapi_ae_config ae; + struct ipu3_uapi_af_config_s af; + struct ipu3_uapi_awb_config awb; +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 832e042531bc..c6e1f76a6ee0 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -822,6 +822,7 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p) + goto err; + + ctx->flags = p->flags; ++ init_waitqueue_head(&ctx->sqo_wait); + init_waitqueue_head(&ctx->cq_wait); + INIT_LIST_HEAD(&ctx->cq_overflow_list); + init_completion(&ctx->completions[0]); +@@ -4261,12 +4262,13 @@ static int io_req_defer(struct io_kiocb *req, const struct io_uring_sqe *sqe) + if (!req_need_defer(req) && list_empty_careful(&ctx->defer_list)) + return 0; + +- if (!req->io && io_alloc_async_ctx(req)) +- return -EAGAIN; +- +- ret = io_req_defer_prep(req, sqe); +- if (ret < 0) +- return ret; ++ if (!req->io) { ++ if (io_alloc_async_ctx(req)) ++ return -EAGAIN; ++ ret = io_req_defer_prep(req, sqe); ++ if (ret < 0) ++ return ret; ++ } + + spin_lock_irq(&ctx->completion_lock); + if (!req_need_defer(req) && list_empty(&ctx->defer_list)) { +@@ -4821,9 +4823,15 @@ fail_req: + io_double_put_req(req); + } + } else if (req->flags & REQ_F_FORCE_ASYNC) { +- ret = io_req_defer_prep(req, sqe); +- if (unlikely(ret < 0)) +- goto fail_req; ++ if (!req->io) { ++ ret = -EAGAIN; ++ if (io_alloc_async_ctx(req)) ++ goto fail_req; ++ ret = io_req_defer_prep(req, sqe); ++ if (unlikely(ret < 0)) ++ goto fail_req; ++ } ++ + /* + * Never try inline submit of IOSQE_ASYNC is set, go straight + * to async execution. +@@ -5216,6 +5224,7 @@ static int io_sq_thread(void *data) + finish_wait(&ctx->sqo_wait, &wait); + + ctx->rings->sq_flags &= ~IORING_SQ_NEED_WAKEUP; ++ ret = 0; + continue; + } + finish_wait(&ctx->sqo_wait, &wait); +@@ -6004,7 +6013,6 @@ static int io_sq_offload_start(struct io_ring_ctx *ctx, + { + int ret; + +- init_waitqueue_head(&ctx->sqo_wait); + mmgrab(current->mm); + ctx->sqo_mm = current->mm; + +diff --git a/include/uapi/linux/mmc/ioctl.h b/include/uapi/linux/mmc/ioctl.h +index 00c08120f3ba..27a39847d55c 100644 +--- a/include/uapi/linux/mmc/ioctl.h ++++ b/include/uapi/linux/mmc/ioctl.h +@@ -3,6 +3,7 @@ + #define LINUX_MMC_IOCTL_H + + #include <linux/types.h> ++#include <linux/major.h> + + struct mmc_ioc_cmd { + /* +diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c +index 6f87352f8219..41ca996568df 100644 +--- a/kernel/cgroup/rstat.c ++++ b/kernel/cgroup/rstat.c +@@ -33,12 +33,9 @@ void cgroup_rstat_updated(struct cgroup *cgrp, int cpu) + return; + + /* +- * Paired with the one in cgroup_rstat_cpu_pop_updated(). Either we +- * see NULL updated_next or they see our updated stat. +- */ +- smp_mb(); +- +- /* ++ * Speculative already-on-list test. This may race leading to ++ * temporary inaccuracies, which is fine. ++ * + * Because @parent's updated_children is terminated with @parent + * instead of NULL, we can tell whether @cgrp is on the list by + * testing the next pointer for NULL. +@@ -134,13 +131,6 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos, + *nextp = rstatc->updated_next; + rstatc->updated_next = NULL; + +- /* +- * Paired with the one in cgroup_rstat_cpu_updated(). +- * Either they see NULL updated_next or we see their +- * updated stat. +- */ +- smp_mb(); +- + return pos; + } + +diff --git a/kernel/relay.c b/kernel/relay.c +index ade14fb7ce2e..4b760ec16342 100644 +--- a/kernel/relay.c ++++ b/kernel/relay.c +@@ -581,6 +581,11 @@ struct rchan *relay_open(const char *base_filename, + return NULL; + + chan->buf = alloc_percpu(struct rchan_buf *); ++ if (!chan->buf) { ++ kfree(chan); ++ return NULL; ++ } ++ + chan->version = RELAYFS_CHANNEL_VERSION; + chan->n_subbufs = n_subbufs; + chan->subbuf_size = subbuf_size; +diff --git a/mm/mremap.c b/mm/mremap.c +index d28f08a36b96..3a097e02cafe 100644 +--- a/mm/mremap.c ++++ b/mm/mremap.c +@@ -266,7 +266,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma, + new_pmd = alloc_new_pmd(vma->vm_mm, vma, new_addr); + if (!new_pmd) + break; +- if (is_swap_pmd(*old_pmd) || pmd_trans_huge(*old_pmd)) { ++ if (is_swap_pmd(*old_pmd) || pmd_trans_huge(*old_pmd) || pmd_devmap(*old_pmd)) { + if (extent == HPAGE_PMD_SIZE) { + bool moved; + /* See comment in move_ptes() */ +diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c +index cc826c2767a3..fbc2ee6d46fc 100644 +--- a/security/integrity/evm/evm_crypto.c ++++ b/security/integrity/evm/evm_crypto.c +@@ -209,7 +209,7 @@ static int evm_calc_hmac_or_hash(struct dentry *dentry, + data->hdr.length = crypto_shash_digestsize(desc->tfm); + + error = -ENODATA; +- list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) { ++ list_for_each_entry_lockless(xattr, &evm_config_xattrnames, list) { + bool is_ima = false; + + if (strcmp(xattr->name, XATTR_NAME_IMA) == 0) +diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c +index f9a81b187fae..a2c393385db0 100644 +--- a/security/integrity/evm/evm_main.c ++++ b/security/integrity/evm/evm_main.c +@@ -99,7 +99,7 @@ static int evm_find_protected_xattrs(struct dentry *dentry) + if (!(inode->i_opflags & IOP_XATTR)) + return -EOPNOTSUPP; + +- list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) { ++ list_for_each_entry_lockless(xattr, &evm_config_xattrnames, list) { + error = __vfs_getxattr(dentry, inode, xattr->name, NULL, 0); + if (error < 0) { + if (error == -ENODATA) +@@ -230,7 +230,7 @@ static int evm_protected_xattr(const char *req_xattr_name) + struct xattr_list *xattr; + + namelen = strlen(req_xattr_name); +- list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) { ++ list_for_each_entry_lockless(xattr, &evm_config_xattrnames, list) { + if ((strlen(xattr->name) == namelen) + && (strncmp(req_xattr_name, xattr->name, namelen) == 0)) { + found = 1; +diff --git a/security/integrity/evm/evm_secfs.c b/security/integrity/evm/evm_secfs.c +index c11c1f7b3ddd..0f37ef27268d 100644 +--- a/security/integrity/evm/evm_secfs.c ++++ b/security/integrity/evm/evm_secfs.c +@@ -234,7 +234,14 @@ static ssize_t evm_write_xattrs(struct file *file, const char __user *buf, + goto out; + } + +- /* Guard against races in evm_read_xattrs */ ++ /* ++ * xattr_list_mutex guards against races in evm_read_xattrs(). ++ * Entries are only added to the evm_config_xattrnames list ++ * and never deleted. Therefore, the list is traversed ++ * using list_for_each_entry_lockless() without holding ++ * the mutex in evm_calc_hmac_or_hash(), evm_find_protected_xattrs() ++ * and evm_protected_xattr(). ++ */ + mutex_lock(&xattr_list_mutex); + list_for_each_entry(tmp, &evm_config_xattrnames, list) { + if (strcmp(xattr->name, tmp->name) == 0) { +diff --git a/tools/arch/x86/include/uapi/asm/unistd.h b/tools/arch/x86/include/uapi/asm/unistd.h +index 196fdd02b8b1..30d7d04d72d6 100644 +--- a/tools/arch/x86/include/uapi/asm/unistd.h ++++ b/tools/arch/x86/include/uapi/asm/unistd.h +@@ -3,7 +3,7 @@ + #define _UAPI_ASM_X86_UNISTD_H + + /* x32 syscall flag bit */ +-#define __X32_SYSCALL_BIT 0x40000000UL ++#define __X32_SYSCALL_BIT 0x40000000 + + #ifndef __KERNEL__ + # ifdef __i386__ +diff --git a/tools/testing/selftests/drivers/net/mlxsw/qos_mc_aware.sh b/tools/testing/selftests/drivers/net/mlxsw/qos_mc_aware.sh +index 24dd8ed48580..b025daea062d 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/qos_mc_aware.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/qos_mc_aware.sh +@@ -300,7 +300,7 @@ test_uc_aware() + local i + + for ((i = 0; i < attempts; ++i)); do +- if $ARPING -c 1 -I $h1 -b 192.0.2.66 -q -w 0.1; then ++ if $ARPING -c 1 -I $h1 -b 192.0.2.66 -q -w 1; then + ((passes++)) + fi + +diff --git a/tools/testing/selftests/wireguard/qemu/Makefile b/tools/testing/selftests/wireguard/qemu/Makefile +index 90598a425c18..4bdd6c1a19d3 100644 +--- a/tools/testing/selftests/wireguard/qemu/Makefile ++++ b/tools/testing/selftests/wireguard/qemu/Makefile +@@ -44,7 +44,7 @@ endef + $(eval $(call tar_download,MUSL,musl,1.2.0,.tar.gz,https://musl.libc.org/releases/,c6de7b191139142d3f9a7b5b702c9cae1b5ee6e7f57e582da9328629408fd4e8)) + $(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c)) + $(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d)) +-$(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae)) ++$(eval $(call tar_download,IPROUTE2,iproute2,5.6.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,1b5b0e25ce6e23da7526ea1da044e814ad85ba761b10dd29c2b027c056b04692)) + $(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c)) + $(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa)) + $(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))