commit: 393593668bea9feb99e59b8b931d8bd663b5ef29 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Tue Oct 1 10:10:20 2019 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Tue Oct 1 10:10:20 2019 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=39359366
Linux patch 4.19.76 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1075_linux-4.19.76.patch | 2525 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2529 insertions(+) diff --git a/0000_README b/0000_README index 050c323..871922b 100644 --- a/0000_README +++ b/0000_README @@ -339,6 +339,10 @@ Patch: 1074_linux-4.19.75.patch From: https://www.kernel.org Desc: Linux 4.19.75 +Patch: 1075_linux-4.19.76.patch +From: https://www.kernel.org +Desc: Linux 4.19.76 + 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/1075_linux-4.19.76.patch b/1075_linux-4.19.76.patch new file mode 100644 index 0000000..5f0f12f --- /dev/null +++ b/1075_linux-4.19.76.patch @@ -0,0 +1,2525 @@ +diff --git a/Makefile b/Makefile +index 4bf6f24916bf..9cb471a75a1b 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 19 +-SUBLEVEL = 75 ++SUBLEVEL = 76 + EXTRAVERSION = + NAME = "People's Front" + +diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h +index ff3866473afe..d8d886dee54e 100644 +--- a/arch/powerpc/include/asm/opal.h ++++ b/arch/powerpc/include/asm/opal.h +@@ -275,7 +275,7 @@ int64_t opal_xive_get_vp_info(uint64_t vp, + int64_t opal_xive_set_vp_info(uint64_t vp, + uint64_t flags, + uint64_t report_cl_pair); +-int64_t opal_xive_allocate_irq(uint32_t chip_id); ++int64_t opal_xive_allocate_irq_raw(uint32_t chip_id); + int64_t opal_xive_free_irq(uint32_t girq); + int64_t opal_xive_sync(uint32_t type, uint32_t id); + int64_t opal_xive_dump(uint32_t type, uint32_t id); +diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S +index f4875fe3f8ff..74215ebda142 100644 +--- a/arch/powerpc/platforms/powernv/opal-wrappers.S ++++ b/arch/powerpc/platforms/powernv/opal-wrappers.S +@@ -303,7 +303,7 @@ OPAL_CALL(opal_xive_set_queue_info, OPAL_XIVE_SET_QUEUE_INFO); + OPAL_CALL(opal_xive_donate_page, OPAL_XIVE_DONATE_PAGE); + OPAL_CALL(opal_xive_alloc_vp_block, OPAL_XIVE_ALLOCATE_VP_BLOCK); + OPAL_CALL(opal_xive_free_vp_block, OPAL_XIVE_FREE_VP_BLOCK); +-OPAL_CALL(opal_xive_allocate_irq, OPAL_XIVE_ALLOCATE_IRQ); ++OPAL_CALL(opal_xive_allocate_irq_raw, OPAL_XIVE_ALLOCATE_IRQ); + OPAL_CALL(opal_xive_free_irq, OPAL_XIVE_FREE_IRQ); + OPAL_CALL(opal_xive_get_vp_info, OPAL_XIVE_GET_VP_INFO); + OPAL_CALL(opal_xive_set_vp_info, OPAL_XIVE_SET_VP_INFO); +diff --git a/arch/powerpc/sysdev/xive/native.c b/arch/powerpc/sysdev/xive/native.c +index 5b20a678d755..6d5b28022452 100644 +--- a/arch/powerpc/sysdev/xive/native.c ++++ b/arch/powerpc/sysdev/xive/native.c +@@ -235,6 +235,17 @@ static bool xive_native_match(struct device_node *node) + return of_device_is_compatible(node, "ibm,opal-xive-vc"); + } + ++static s64 opal_xive_allocate_irq(u32 chip_id) ++{ ++ s64 irq = opal_xive_allocate_irq_raw(chip_id); ++ ++ /* ++ * Old versions of skiboot can incorrectly return 0xffffffff to ++ * indicate no space, fix it up here. ++ */ ++ return irq == 0xffffffff ? OPAL_RESOURCE : irq; ++} ++ + #ifdef CONFIG_SMP + static int xive_native_get_ipi(unsigned int cpu, struct xive_cpu *xc) + { +diff --git a/block/blk-core.c b/block/blk-core.c +index af635f878f96..074ae9376189 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -1165,7 +1165,7 @@ int blk_init_allocated_queue(struct request_queue *q) + { + WARN_ON_ONCE(q->mq_ops); + +- q->fq = blk_alloc_flush_queue(q, NUMA_NO_NODE, q->cmd_size); ++ q->fq = blk_alloc_flush_queue(q, NUMA_NO_NODE, q->cmd_size, GFP_KERNEL); + if (!q->fq) + return -ENOMEM; + +diff --git a/block/blk-flush.c b/block/blk-flush.c +index 76487948a27f..87fc49daa2b4 100644 +--- a/block/blk-flush.c ++++ b/block/blk-flush.c +@@ -566,12 +566,12 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, + EXPORT_SYMBOL(blkdev_issue_flush); + + struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, +- int node, int cmd_size) ++ int node, int cmd_size, gfp_t flags) + { + struct blk_flush_queue *fq; + int rq_sz = sizeof(struct request); + +- fq = kzalloc_node(sizeof(*fq), GFP_KERNEL, node); ++ fq = kzalloc_node(sizeof(*fq), flags, node); + if (!fq) + goto fail; + +@@ -579,7 +579,7 @@ struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, + spin_lock_init(&fq->mq_flush_lock); + + rq_sz = round_up(rq_sz + cmd_size, cache_line_size()); +- fq->flush_rq = kzalloc_node(rq_sz, GFP_KERNEL, node); ++ fq->flush_rq = kzalloc_node(rq_sz, flags, node); + if (!fq->flush_rq) + goto fail_rq; + +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 455fda99255a..7ea85ec52026 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -2198,12 +2198,12 @@ static int blk_mq_init_hctx(struct request_queue *q, + * runtime + */ + hctx->ctxs = kmalloc_array_node(nr_cpu_ids, sizeof(void *), +- GFP_KERNEL, node); ++ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY, node); + if (!hctx->ctxs) + goto unregister_cpu_notifier; + +- if (sbitmap_init_node(&hctx->ctx_map, nr_cpu_ids, ilog2(8), GFP_KERNEL, +- node)) ++ if (sbitmap_init_node(&hctx->ctx_map, nr_cpu_ids, ilog2(8), ++ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY, node)) + goto free_ctxs; + + hctx->nr_ctx = 0; +@@ -2216,7 +2216,8 @@ static int blk_mq_init_hctx(struct request_queue *q, + set->ops->init_hctx(hctx, set->driver_data, hctx_idx)) + goto free_bitmap; + +- hctx->fq = blk_alloc_flush_queue(q, hctx->numa_node, set->cmd_size); ++ hctx->fq = blk_alloc_flush_queue(q, hctx->numa_node, set->cmd_size, ++ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY); + if (!hctx->fq) + goto exit_hctx; + +@@ -2460,8 +2461,6 @@ void blk_mq_release(struct request_queue *q) + struct blk_mq_hw_ctx *hctx; + unsigned int i; + +- cancel_delayed_work_sync(&q->requeue_work); +- + /* hctx kobj stays in hctx */ + queue_for_each_hw_ctx(q, hctx, i) { + if (!hctx) +@@ -2530,12 +2529,14 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set, + + node = blk_mq_hw_queue_to_node(q->mq_map, i); + hctxs[i] = kzalloc_node(blk_mq_hw_ctx_size(set), +- GFP_KERNEL, node); ++ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY, ++ node); + if (!hctxs[i]) + break; + +- if (!zalloc_cpumask_var_node(&hctxs[i]->cpumask, GFP_KERNEL, +- node)) { ++ if (!zalloc_cpumask_var_node(&hctxs[i]->cpumask, ++ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY, ++ node)) { + kfree(hctxs[i]); + hctxs[i] = NULL; + break; +diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c +index 3772671cf2bc..bab47a17b96f 100644 +--- a/block/blk-sysfs.c ++++ b/block/blk-sysfs.c +@@ -836,6 +836,9 @@ static void __blk_release_queue(struct work_struct *work) + + blk_free_queue_stats(q->stats); + ++ if (q->mq_ops) ++ cancel_delayed_work_sync(&q->requeue_work); ++ + blk_exit_rl(q, &q->root_rl); + + if (q->queue_tags) +diff --git a/block/blk.h b/block/blk.h +index 977d4b5d968d..11e4ca2f2cd4 100644 +--- a/block/blk.h ++++ b/block/blk.h +@@ -124,7 +124,7 @@ static inline void __blk_get_queue(struct request_queue *q) + } + + struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, +- int node, int cmd_size); ++ int node, int cmd_size, gfp_t flags); + void blk_free_flush_queue(struct blk_flush_queue *q); + + int blk_init_rl(struct request_list *rl, struct request_queue *q, +diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c +index d73afb562ad9..1a23e7aa74df 100644 +--- a/drivers/acpi/acpi_video.c ++++ b/drivers/acpi/acpi_video.c +@@ -73,6 +73,12 @@ module_param(report_key_events, int, 0644); + MODULE_PARM_DESC(report_key_events, + "0: none, 1: output changes, 2: brightness changes, 3: all"); + ++static int hw_changes_brightness = -1; ++module_param(hw_changes_brightness, int, 0644); ++MODULE_PARM_DESC(hw_changes_brightness, ++ "Set this to 1 on buggy hw which changes the brightness itself when " ++ "a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness"); ++ + /* + * Whether the struct acpi_video_device_attrib::device_id_scheme bit should be + * assumed even if not actually set. +@@ -418,6 +424,14 @@ static int video_set_report_key_events(const struct dmi_system_id *id) + return 0; + } + ++static int video_hw_changes_brightness( ++ const struct dmi_system_id *d) ++{ ++ if (hw_changes_brightness == -1) ++ hw_changes_brightness = 1; ++ return 0; ++} ++ + static const struct dmi_system_id video_dmi_table[] = { + /* + * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 +@@ -542,6 +556,21 @@ static const struct dmi_system_id video_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"), + }, + }, ++ /* ++ * Some machines change the brightness themselves when a brightness ++ * hotkey gets pressed, despite us telling them not to. In this case ++ * acpi_video_device_notify() should only call backlight_force_update( ++ * BACKLIGHT_UPDATE_HOTKEY) and not do anything else. ++ */ ++ { ++ /* https://bugzilla.kernel.org/show_bug.cgi?id=204077 */ ++ .callback = video_hw_changes_brightness, ++ .ident = "Packard Bell EasyNote MZ35", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"), ++ }, ++ }, + {} + }; + +@@ -1625,6 +1654,14 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data) + bus = video_device->video; + input = bus->input; + ++ if (hw_changes_brightness > 0) { ++ if (video_device->backlight) ++ backlight_force_update(video_device->backlight, ++ BACKLIGHT_UPDATE_HOTKEY); ++ acpi_notifier_call_chain(device, event, 0); ++ return; ++ } ++ + switch (event) { + case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */ + brightness_switch_event(video_device, event); +diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c +index 1342f8e6025c..8d1cd2479e36 100644 +--- a/drivers/bluetooth/btrtl.c ++++ b/drivers/bluetooth/btrtl.c +@@ -639,6 +639,26 @@ int btrtl_setup_realtek(struct hci_dev *hdev) + } + EXPORT_SYMBOL_GPL(btrtl_setup_realtek); + ++int btrtl_shutdown_realtek(struct hci_dev *hdev) ++{ ++ struct sk_buff *skb; ++ int ret; ++ ++ /* According to the vendor driver, BT must be reset on close to avoid ++ * firmware crash. ++ */ ++ skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT); ++ if (IS_ERR(skb)) { ++ ret = PTR_ERR(skb); ++ bt_dev_err(hdev, "HCI reset during shutdown failed"); ++ return ret; ++ } ++ kfree_skb(skb); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(btrtl_shutdown_realtek); ++ + static unsigned int btrtl_convert_baudrate(u32 device_baudrate) + { + switch (device_baudrate) { +diff --git a/drivers/bluetooth/btrtl.h b/drivers/bluetooth/btrtl.h +index f5e36f3993a8..852f27d4ee28 100644 +--- a/drivers/bluetooth/btrtl.h ++++ b/drivers/bluetooth/btrtl.h +@@ -65,6 +65,7 @@ void btrtl_free(struct btrtl_device_info *btrtl_dev); + int btrtl_download_firmware(struct hci_dev *hdev, + struct btrtl_device_info *btrtl_dev); + int btrtl_setup_realtek(struct hci_dev *hdev); ++int btrtl_shutdown_realtek(struct hci_dev *hdev); + int btrtl_get_uart_settings(struct hci_dev *hdev, + struct btrtl_device_info *btrtl_dev, + unsigned int *controller_baudrate, +@@ -93,6 +94,11 @@ static inline int btrtl_setup_realtek(struct hci_dev *hdev) + return -EOPNOTSUPP; + } + ++static inline int btrtl_shutdown_realtek(struct hci_dev *hdev) ++{ ++ return -EOPNOTSUPP; ++} ++ + static inline int btrtl_get_uart_settings(struct hci_dev *hdev, + struct btrtl_device_info *btrtl_dev, + unsigned int *controller_baudrate, +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 09c83dc2ef67..08936bf696d3 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -391,6 +391,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x13d3, 0x3526), .driver_info = BTUSB_REALTEK }, + { USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK }, + ++ /* Additional Realtek 8822CE Bluetooth devices */ ++ { USB_DEVICE(0x04ca, 0x4005), .driver_info = BTUSB_REALTEK }, ++ + /* Silicon Wave based devices */ + { USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE }, + +@@ -3128,6 +3131,7 @@ static int btusb_probe(struct usb_interface *intf, + #ifdef CONFIG_BT_HCIBTUSB_RTL + if (id->driver_info & BTUSB_REALTEK) { + hdev->setup = btrtl_setup_realtek; ++ hdev->shutdown = btrtl_shutdown_realtek; + + /* Realtek devices lose their updated firmware over suspend, + * but the USB hub doesn't notice any status change. +diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c +index 064315edd289..634ae487c372 100644 +--- a/drivers/crypto/talitos.c ++++ b/drivers/crypto/talitos.c +@@ -3124,6 +3124,7 @@ static int talitos_remove(struct platform_device *ofdev) + break; + case CRYPTO_ALG_TYPE_AEAD: + crypto_unregister_aead(&t_alg->algt.alg.aead); ++ break; + case CRYPTO_ALG_TYPE_AHASH: + crypto_unregister_ahash(&t_alg->algt.alg.hash); + break; +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/Makefile b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +index 95f332ee3e7e..16614d73a5fc 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/calcs/Makefile +@@ -32,6 +32,10 @@ endif + + calcs_ccflags := -mhard-float -msse $(cc_stack_align) + ++ifdef CONFIG_CC_IS_CLANG ++calcs_ccflags += -msse2 ++endif ++ + CFLAGS_dcn_calcs.o := $(calcs_ccflags) + CFLAGS_dcn_calc_auto.o := $(calcs_ccflags) + CFLAGS_dcn_calc_math.o := $(calcs_ccflags) -Wno-tautological-compare +diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile +index d97ca6528f9d..934ffe1b4b00 100644 +--- a/drivers/gpu/drm/amd/display/dc/dml/Makefile ++++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile +@@ -32,6 +32,10 @@ endif + + dml_ccflags := -mhard-float -msse $(cc_stack_align) + ++ifdef CONFIG_CC_IS_CLANG ++dml_ccflags += -msse2 ++endif ++ + CFLAGS_display_mode_lib.o := $(dml_ccflags) + CFLAGS_display_pipe_clocks.o := $(dml_ccflags) + CFLAGS_dml1_display_rq_dlg_calc.o := $(dml_ccflags) +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c +index c9a15baf2c10..0adfc5392cd3 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c +@@ -1222,17 +1222,14 @@ static int smu8_dpm_force_dpm_level(struct pp_hwmgr *hwmgr, + + static int smu8_dpm_powerdown_uvd(struct pp_hwmgr *hwmgr) + { +- if (PP_CAP(PHM_PlatformCaps_UVDPowerGating)) { +- smu8_nbdpm_pstate_enable_disable(hwmgr, true, true); ++ if (PP_CAP(PHM_PlatformCaps_UVDPowerGating)) + return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_UVDPowerOFF); +- } + return 0; + } + + static int smu8_dpm_powerup_uvd(struct pp_hwmgr *hwmgr) + { + if (PP_CAP(PHM_PlatformCaps_UVDPowerGating)) { +- smu8_nbdpm_pstate_enable_disable(hwmgr, false, true); + return smum_send_msg_to_smc_with_parameter( + hwmgr, + PPSMC_MSG_UVDPowerON, +diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c +index d18b7e27ef64..c0b26135dbd5 100644 +--- a/drivers/gpu/drm/drm_probe_helper.c ++++ b/drivers/gpu/drm/drm_probe_helper.c +@@ -581,6 +581,9 @@ static void output_poll_execute(struct work_struct *work) + enum drm_connector_status old_status; + bool repoll = false, changed; + ++ if (!dev->mode_config.poll_enabled) ++ return; ++ + /* Pick up any changes detected by the probe functions. */ + changed = dev->mode_config.delayed_event; + dev->mode_config.delayed_event = false; +@@ -735,7 +738,11 @@ EXPORT_SYMBOL(drm_kms_helper_poll_init); + */ + void drm_kms_helper_poll_fini(struct drm_device *dev) + { +- drm_kms_helper_poll_disable(dev); ++ if (!dev->mode_config.poll_enabled) ++ return; ++ ++ dev->mode_config.poll_enabled = false; ++ cancel_delayed_work_sync(&dev->mode_config.output_poll_work); + } + EXPORT_SYMBOL(drm_kms_helper_poll_fini); + +diff --git a/drivers/gpu/drm/nouveau/dispnv50/head.c b/drivers/gpu/drm/nouveau/dispnv50/head.c +index d81a99bb2ac3..b041ffb3af27 100644 +--- a/drivers/gpu/drm/nouveau/dispnv50/head.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/head.c +@@ -169,14 +169,34 @@ nv50_head_atomic_check_view(struct nv50_head_atom *armh, + */ + switch (mode) { + case DRM_MODE_SCALE_CENTER: +- asyh->view.oW = min((u16)umode->hdisplay, asyh->view.oW); +- asyh->view.oH = min((u16)umode_vdisplay, asyh->view.oH); +- /* fall-through */ ++ /* NOTE: This will cause scaling when the input is ++ * larger than the output. ++ */ ++ asyh->view.oW = min(asyh->view.iW, asyh->view.oW); ++ asyh->view.oH = min(asyh->view.iH, asyh->view.oH); ++ break; + case DRM_MODE_SCALE_ASPECT: +- if (asyh->view.oH < asyh->view.oW) { ++ /* Determine whether the scaling should be on width or on ++ * height. This is done by comparing the aspect ratios of the ++ * sizes. If the output AR is larger than input AR, that means ++ * we want to change the width (letterboxed on the ++ * left/right), otherwise on the height (letterboxed on the ++ * top/bottom). ++ * ++ * E.g. 4:3 (1.333) AR image displayed on a 16:10 (1.6) AR ++ * screen will have letterboxes on the left/right. However a ++ * 16:9 (1.777) AR image on that same screen will have ++ * letterboxes on the top/bottom. ++ * ++ * inputAR = iW / iH; outputAR = oW / oH ++ * outputAR > inputAR is equivalent to oW * iH > iW * oH ++ */ ++ if (asyh->view.oW * asyh->view.iH > asyh->view.iW * asyh->view.oH) { ++ /* Recompute output width, i.e. left/right letterbox */ + u32 r = (asyh->view.iW << 19) / asyh->view.iH; + asyh->view.oW = ((asyh->view.oH * r) + (r / 2)) >> 19; + } else { ++ /* Recompute output height, i.e. top/bottom letterbox */ + u32 r = (asyh->view.iH << 19) / asyh->view.iW; + asyh->view.oH = ((asyh->view.oW * r) + (r / 2)) >> 19; + } +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 4a2fa57ddcb8..0eeb273fb73d 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -559,6 +559,7 @@ + #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A 0x0b4a + #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a + #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A 0x094a ++#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0941 0x0941 + #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641 0x0641 + + #define USB_VENDOR_ID_HUION 0x256c +diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c +index 596227ddb6e0..17d6123f7930 100644 +--- a/drivers/hid/hid-lg.c ++++ b/drivers/hid/hid-lg.c +@@ -763,7 +763,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) + + if (!buf) { + ret = -ENOMEM; +- goto err_free; ++ goto err_stop; + } + + ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf), +@@ -795,9 +795,12 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) + ret = lg4ff_init(hdev); + + if (ret) +- goto err_free; ++ goto err_stop; + + return 0; ++ ++err_stop: ++ hid_hw_stop(hdev); + err_free: + kfree(drv_data); + return ret; +@@ -808,8 +811,7 @@ static void lg_remove(struct hid_device *hdev) + struct lg_drv_data *drv_data = hid_get_drvdata(hdev); + if (drv_data->quirks & LG_FF4) + lg4ff_deinit(hdev); +- else +- hid_hw_stop(hdev); ++ hid_hw_stop(hdev); + kfree(drv_data); + } + +diff --git a/drivers/hid/hid-lg4ff.c b/drivers/hid/hid-lg4ff.c +index 512d67e1aae3..4b26928cb2b6 100644 +--- a/drivers/hid/hid-lg4ff.c ++++ b/drivers/hid/hid-lg4ff.c +@@ -1483,7 +1483,6 @@ int lg4ff_deinit(struct hid_device *hid) + } + } + #endif +- hid_hw_stop(hid); + drv_data->device_props = NULL; + + kfree(entry); +diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c +index 87eda34ea2f8..d3773251b374 100644 +--- a/drivers/hid/hid-prodikeys.c ++++ b/drivers/hid/hid-prodikeys.c +@@ -555,10 +555,14 @@ static void pcmidi_setup_extra_keys( + + static int pcmidi_set_operational(struct pcmidi_snd *pm) + { ++ int rc; ++ + if (pm->ifnum != 1) + return 0; /* only set up ONCE for interace 1 */ + +- pcmidi_get_output_report(pm); ++ rc = pcmidi_get_output_report(pm); ++ if (rc < 0) ++ return rc; + pcmidi_submit_output_report(pm, 0xc1); + return 0; + } +@@ -687,7 +691,11 @@ static int pcmidi_snd_initialise(struct pcmidi_snd *pm) + spin_lock_init(&pm->rawmidi_in_lock); + + init_sustain_timers(pm); +- pcmidi_set_operational(pm); ++ err = pcmidi_set_operational(pm); ++ if (err < 0) { ++ pk_error("failed to find output report\n"); ++ goto fail_register; ++ } + + /* register it */ + err = snd_card_register(card); +diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c +index e553f6fae7a4..a407fd2399ff 100644 +--- a/drivers/hid/hid-quirks.c ++++ b/drivers/hid/hid-quirks.c +@@ -94,6 +94,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0941), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, +diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +index 31f1023214d3..09f2c617b09f 100644 +--- a/drivers/hid/hid-sony.c ++++ b/drivers/hid/hid-sony.c +@@ -2806,7 +2806,6 @@ err_stop: + sony_cancel_work_sync(sc); + sony_remove_dev_list(sc); + sony_release_device_id(sc); +- hid_hw_stop(hdev); + return ret; + } + +@@ -2868,6 +2867,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) + */ + if (!(hdev->claimed & HID_CLAIMED_INPUT)) { + hid_err(hdev, "failed to claim input\n"); ++ hid_hw_stop(hdev); + return -ENODEV; + } + +diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c +index 4a44e48e08b2..c7cff929b419 100644 +--- a/drivers/hid/hidraw.c ++++ b/drivers/hid/hidraw.c +@@ -378,7 +378,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, + + mutex_lock(&minors_lock); + dev = hidraw_table[minor]; +- if (!dev) { ++ if (!dev || !dev->exist) { + ret = -ENODEV; + goto out; + } +diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c +index af5ad6a56ae4..9271f7290005 100644 +--- a/drivers/infiniband/core/cq.c ++++ b/drivers/infiniband/core/cq.c +@@ -112,12 +112,12 @@ static void ib_cq_poll_work(struct work_struct *work) + IB_POLL_BATCH); + if (completed >= IB_POLL_BUDGET_WORKQUEUE || + ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0) +- queue_work(ib_comp_wq, &cq->work); ++ queue_work(cq->comp_wq, &cq->work); + } + + static void ib_cq_completion_workqueue(struct ib_cq *cq, void *private) + { +- queue_work(ib_comp_wq, &cq->work); ++ queue_work(cq->comp_wq, &cq->work); + } + + /** +@@ -175,9 +175,12 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private, + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + break; + case IB_POLL_WORKQUEUE: ++ case IB_POLL_UNBOUND_WORKQUEUE: + cq->comp_handler = ib_cq_completion_workqueue; + INIT_WORK(&cq->work, ib_cq_poll_work); + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); ++ cq->comp_wq = (cq->poll_ctx == IB_POLL_WORKQUEUE) ? ++ ib_comp_wq : ib_comp_unbound_wq; + break; + default: + ret = -EINVAL; +@@ -213,6 +216,7 @@ void ib_free_cq(struct ib_cq *cq) + irq_poll_disable(&cq->iop); + break; + case IB_POLL_WORKQUEUE: ++ case IB_POLL_UNBOUND_WORKQUEUE: + cancel_work_sync(&cq->work); + break; + default: +diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c +index db3b6271f09d..6d8ac51a39cc 100644 +--- a/drivers/infiniband/core/device.c ++++ b/drivers/infiniband/core/device.c +@@ -61,6 +61,7 @@ struct ib_client_data { + }; + + struct workqueue_struct *ib_comp_wq; ++struct workqueue_struct *ib_comp_unbound_wq; + struct workqueue_struct *ib_wq; + EXPORT_SYMBOL_GPL(ib_wq); + +@@ -1166,10 +1167,19 @@ static int __init ib_core_init(void) + goto err; + } + ++ ib_comp_unbound_wq = ++ alloc_workqueue("ib-comp-unb-wq", ++ WQ_UNBOUND | WQ_HIGHPRI | WQ_MEM_RECLAIM | ++ WQ_SYSFS, WQ_UNBOUND_MAX_ACTIVE); ++ if (!ib_comp_unbound_wq) { ++ ret = -ENOMEM; ++ goto err_comp; ++ } ++ + ret = class_register(&ib_class); + if (ret) { + pr_warn("Couldn't create InfiniBand device class\n"); +- goto err_comp; ++ goto err_comp_unbound; + } + + ret = rdma_nl_init(); +@@ -1218,6 +1228,8 @@ err_ibnl: + rdma_nl_exit(); + err_sysfs: + class_unregister(&ib_class); ++err_comp_unbound: ++ destroy_workqueue(ib_comp_unbound_wq); + err_comp: + destroy_workqueue(ib_comp_wq); + err: +@@ -1236,6 +1248,7 @@ static void __exit ib_core_cleanup(void) + addr_cleanup(); + rdma_nl_exit(); + class_unregister(&ib_class); ++ destroy_workqueue(ib_comp_unbound_wq); + destroy_workqueue(ib_comp_wq); + /* Make sure that any pending umem accounting work is done. */ + destroy_workqueue(ib_wq); +diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c +index 7586c1dd73f1..74aa3e651bc3 100644 +--- a/drivers/infiniband/core/mad.c ++++ b/drivers/infiniband/core/mad.c +@@ -3190,7 +3190,7 @@ static int ib_mad_port_open(struct ib_device *device, + } + + port_priv->cq = ib_alloc_cq(port_priv->device, port_priv, cq_size, 0, +- IB_POLL_WORKQUEUE); ++ IB_POLL_UNBOUND_WORKQUEUE); + if (IS_ERR(port_priv->cq)) { + dev_err(&device->dev, "Couldn't create ib_mad CQ\n"); + ret = PTR_ERR(port_priv->cq); +diff --git a/drivers/infiniband/core/restrack.c b/drivers/infiniband/core/restrack.c +index f67fa24b3aff..279f0ae65912 100644 +--- a/drivers/infiniband/core/restrack.c ++++ b/drivers/infiniband/core/restrack.c +@@ -225,7 +225,9 @@ void rdma_restrack_del(struct rdma_restrack_entry *res) + up_write(&dev->res.rwsem); + + out: +- if (res->task) ++ if (res->task) { + put_task_struct(res->task); ++ res->task = NULL; ++ } + } + EXPORT_SYMBOL(rdma_restrack_del); +diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c +index 9ba73e11757d..e7549a2b1482 100644 +--- a/drivers/irqchip/irq-gic-v3-its.c ++++ b/drivers/irqchip/irq-gic-v3-its.c +@@ -2514,14 +2514,13 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq, + struct its_node *its = its_dev->its; + int i; + ++ bitmap_release_region(its_dev->event_map.lpi_map, ++ its_get_event_id(irq_domain_get_irq_data(domain, virq)), ++ get_count_order(nr_irqs)); ++ + for (i = 0; i < nr_irqs; i++) { + struct irq_data *data = irq_domain_get_irq_data(domain, + virq + i); +- u32 event = its_get_event_id(data); +- +- /* Mark interrupt index as unused */ +- clear_bit(event, its_dev->event_map.lpi_map); +- + /* Nuke the entry in the domain */ + irq_domain_reset_irq_data(data); + } +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index e6c7a84bb1df..2321643974da 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -1768,7 +1768,6 @@ static int run_cache_set(struct cache_set *c) + set_gc_sectors(c); + + if (CACHE_SYNC(&c->sb)) { +- LIST_HEAD(journal); + struct bkey *k; + struct jset *j; + +diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c +index 1030c42add05..3dd668f69405 100644 +--- a/drivers/md/dm-zoned-target.c ++++ b/drivers/md/dm-zoned-target.c +@@ -133,8 +133,6 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone, + + atomic_inc(&bioctx->ref); + generic_make_request(clone); +- if (clone->bi_status == BLK_STS_IOERR) +- return -EIO; + + if (bio_op(bio) == REQ_OP_WRITE && dmz_is_seq(zone)) + zone->wp_block += nr_blocks; +diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c +index 8b450fc53202..15a5e98b3d45 100644 +--- a/drivers/media/i2c/tvp5150.c ++++ b/drivers/media/i2c/tvp5150.c +@@ -828,7 +828,7 @@ static int tvp5150_s_ctrl(struct v4l2_ctrl *ctrl) + return 0; + case V4L2_CID_HUE: + tvp5150_write(sd, TVP5150_HUE_CTL, ctrl->val); +- break; ++ return 0; + case V4L2_CID_TEST_PATTERN: + decoder->enable = ctrl->val ? false : true; + tvp5150_selmux(sd); +diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c +index 72428b6bfc47..ba44ea6d497e 100644 +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -1627,29 +1627,35 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, + continue; + } + +- if (time_after(jiffies, timeo) && !chip_ready(map, adr)){ ++ /* ++ * We check "time_after" and "!chip_good" before checking ++ * "chip_good" to avoid the failure due to scheduling. ++ */ ++ if (time_after(jiffies, timeo) && !chip_good(map, adr, datum)) { + xip_enable(map, chip, adr); + printk(KERN_WARNING "MTD %s(): software timeout\n", __func__); + xip_disable(map, chip, adr); ++ ret = -EIO; + break; + } + +- if (chip_ready(map, adr)) ++ if (chip_good(map, adr, datum)) + break; + + /* Latency issues. Drop the lock, wait a while and retry */ + UDELAY(map, chip, adr, 1); + } ++ + /* Did we succeed? */ +- if (!chip_good(map, adr, datum)) { ++ if (ret) { + /* reset on all failures. */ + map_write(map, CMD(0xF0), chip->start); + /* FIXME - should have reset delay before continuing */ + +- if (++retry_cnt <= MAX_RETRIES) ++ if (++retry_cnt <= MAX_RETRIES) { ++ ret = 0; + goto retry; +- +- ret = -EIO; ++ } + } + xip_enable(map, chip, adr); + op_done: +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index 5a57be66a487..aa067a7a72d4 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -1999,8 +1999,11 @@ static void __ibmvnic_reset(struct work_struct *work) + rwi = get_next_rwi(adapter); + while (rwi) { + if (adapter->state == VNIC_REMOVING || +- adapter->state == VNIC_REMOVED) +- goto out; ++ adapter->state == VNIC_REMOVED) { ++ kfree(rwi); ++ rc = EBUSY; ++ break; ++ } + + if (adapter->force_reset_recovery) { + adapter->force_reset_recovery = false; +@@ -2026,7 +2029,7 @@ static void __ibmvnic_reset(struct work_struct *work) + netdev_dbg(adapter->netdev, "Reset failed\n"); + free_all_rwi(adapter); + } +-out: ++ + adapter->resetting = false; + if (we_lock_rtnl) + rtnl_unlock(); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h +index da52e60d4437..d79e177f8990 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h +@@ -210,6 +210,7 @@ static const char mlx5e_priv_flags[][ETH_GSTRING_LEN] = { + "tx_cqe_moder", + "rx_cqe_compress", + "rx_striding_rq", ++ "rx_no_csum_complete", + }; + + enum mlx5e_priv_flag { +@@ -217,6 +218,7 @@ enum mlx5e_priv_flag { + MLX5E_PFLAG_TX_CQE_BASED_MODER = (1 << 1), + MLX5E_PFLAG_RX_CQE_COMPRESS = (1 << 2), + MLX5E_PFLAG_RX_STRIDING_RQ = (1 << 3), ++ MLX5E_PFLAG_RX_NO_CSUM_COMPLETE = (1 << 4), + }; + + #define MLX5E_SET_PFLAG(params, pflag, enable) \ +@@ -298,6 +300,7 @@ struct mlx5e_dcbx_dp { + enum { + MLX5E_RQ_STATE_ENABLED, + MLX5E_RQ_STATE_AM, ++ MLX5E_RQ_STATE_NO_CSUM_COMPLETE, + }; + + struct mlx5e_cq { +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +index 2b9350f4c752..10d72c83714d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +@@ -1510,6 +1510,28 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable) + return 0; + } + ++static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable) ++{ ++ struct mlx5e_priv *priv = netdev_priv(netdev); ++ struct mlx5e_channels *channels = &priv->channels; ++ struct mlx5e_channel *c; ++ int i; ++ ++ if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || ++ priv->channels.params.xdp_prog) ++ return 0; ++ ++ for (i = 0; i < channels->num; i++) { ++ c = channels->c[i]; ++ if (enable) ++ __set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state); ++ else ++ __clear_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state); ++ } ++ ++ return 0; ++} ++ + static int mlx5e_handle_pflag(struct net_device *netdev, + u32 wanted_flags, + enum mlx5e_priv_flag flag, +@@ -1561,6 +1583,12 @@ static int mlx5e_set_priv_flags(struct net_device *netdev, u32 pflags) + err = mlx5e_handle_pflag(netdev, pflags, + MLX5E_PFLAG_RX_STRIDING_RQ, + set_pflag_rx_striding_rq); ++ if (err) ++ goto out; ++ ++ err = mlx5e_handle_pflag(netdev, pflags, ++ MLX5E_PFLAG_RX_NO_CSUM_COMPLETE, ++ set_pflag_rx_no_csum_complete); + + out: + mutex_unlock(&priv->state_lock); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +index 83ab2c0e6b61..7e6706333fa8 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +@@ -934,6 +934,13 @@ static int mlx5e_open_rq(struct mlx5e_channel *c, + if (params->rx_dim_enabled) + __set_bit(MLX5E_RQ_STATE_AM, &c->rq.state); + ++ /* We disable csum_complete when XDP is enabled since ++ * XDP programs might manipulate packets which will render ++ * skb->checksum incorrect. ++ */ ++ if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE) || c->xdp) ++ __set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state); ++ + return 0; + + err_destroy_rq: +@@ -4533,6 +4540,7 @@ void mlx5e_build_nic_params(struct mlx5_core_dev *mdev, + params->rx_cqe_compress_def = slow_pci_heuristic(mdev); + + MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS, params->rx_cqe_compress_def); ++ MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE, false); + + /* RQ */ + /* Prefer Striding RQ, unless any of the following holds: +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +index d3f794d4fb96..df49dc143c47 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +@@ -37,6 +37,7 @@ + #include <net/busy_poll.h> + #include <net/ip6_checksum.h> + #include <net/page_pool.h> ++#include <net/inet_ecn.h> + #include "en.h" + #include "en_tc.h" + #include "eswitch.h" +@@ -688,27 +689,110 @@ static inline void mlx5e_skb_set_hash(struct mlx5_cqe64 *cqe, + skb_set_hash(skb, be32_to_cpu(cqe->rss_hash_result), ht); + } + +-static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth) ++static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth, ++ __be16 *proto) + { +- __be16 ethertype = ((struct ethhdr *)skb->data)->h_proto; ++ *proto = ((struct ethhdr *)skb->data)->h_proto; ++ *proto = __vlan_get_protocol(skb, *proto, network_depth); + +- ethertype = __vlan_get_protocol(skb, ethertype, network_depth); +- return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6)); ++ if (*proto == htons(ETH_P_IP)) ++ return pskb_may_pull(skb, *network_depth + sizeof(struct iphdr)); ++ ++ if (*proto == htons(ETH_P_IPV6)) ++ return pskb_may_pull(skb, *network_depth + sizeof(struct ipv6hdr)); ++ ++ return false; + } + +-static u32 mlx5e_get_fcs(const struct sk_buff *skb) ++static inline void mlx5e_enable_ecn(struct mlx5e_rq *rq, struct sk_buff *skb) + { +- const void *fcs_bytes; +- u32 _fcs_bytes; ++ int network_depth = 0; ++ __be16 proto; ++ void *ip; ++ int rc; + +- fcs_bytes = skb_header_pointer(skb, skb->len - ETH_FCS_LEN, +- ETH_FCS_LEN, &_fcs_bytes); ++ if (unlikely(!is_last_ethertype_ip(skb, &network_depth, &proto))) ++ return; ++ ++ ip = skb->data + network_depth; ++ rc = ((proto == htons(ETH_P_IP)) ? IP_ECN_set_ce((struct iphdr *)ip) : ++ IP6_ECN_set_ce(skb, (struct ipv6hdr *)ip)); ++ ++ rq->stats->ecn_mark += !!rc; ++} ++ ++static u8 get_ip_proto(struct sk_buff *skb, int network_depth, __be16 proto) ++{ ++ void *ip_p = skb->data + network_depth; + +- return __get_unaligned_cpu32(fcs_bytes); ++ return (proto == htons(ETH_P_IP)) ? ((struct iphdr *)ip_p)->protocol : ++ ((struct ipv6hdr *)ip_p)->nexthdr; + } + + #define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN) + ++#define MAX_PADDING 8 ++ ++static void ++tail_padding_csum_slow(struct sk_buff *skb, int offset, int len, ++ struct mlx5e_rq_stats *stats) ++{ ++ stats->csum_complete_tail_slow++; ++ skb->csum = csum_block_add(skb->csum, ++ skb_checksum(skb, offset, len, 0), ++ offset); ++} ++ ++static void ++tail_padding_csum(struct sk_buff *skb, int offset, ++ struct mlx5e_rq_stats *stats) ++{ ++ u8 tail_padding[MAX_PADDING]; ++ int len = skb->len - offset; ++ void *tail; ++ ++ if (unlikely(len > MAX_PADDING)) { ++ tail_padding_csum_slow(skb, offset, len, stats); ++ return; ++ } ++ ++ tail = skb_header_pointer(skb, offset, len, tail_padding); ++ if (unlikely(!tail)) { ++ tail_padding_csum_slow(skb, offset, len, stats); ++ return; ++ } ++ ++ stats->csum_complete_tail++; ++ skb->csum = csum_block_add(skb->csum, csum_partial(tail, len, 0), offset); ++} ++ ++static void ++mlx5e_skb_padding_csum(struct sk_buff *skb, int network_depth, __be16 proto, ++ struct mlx5e_rq_stats *stats) ++{ ++ struct ipv6hdr *ip6; ++ struct iphdr *ip4; ++ int pkt_len; ++ ++ switch (proto) { ++ case htons(ETH_P_IP): ++ ip4 = (struct iphdr *)(skb->data + network_depth); ++ pkt_len = network_depth + ntohs(ip4->tot_len); ++ break; ++ case htons(ETH_P_IPV6): ++ ip6 = (struct ipv6hdr *)(skb->data + network_depth); ++ pkt_len = network_depth + sizeof(*ip6) + ntohs(ip6->payload_len); ++ break; ++ default: ++ return; ++ } ++ ++ if (likely(pkt_len >= skb->len)) ++ return; ++ ++ tail_padding_csum(skb, pkt_len, stats); ++} ++ + static inline void mlx5e_handle_csum(struct net_device *netdev, + struct mlx5_cqe64 *cqe, + struct mlx5e_rq *rq, +@@ -717,6 +801,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + { + struct mlx5e_rq_stats *stats = rq->stats; + int network_depth = 0; ++ __be16 proto; + + if (unlikely(!(netdev->features & NETIF_F_RXCSUM))) + goto csum_none; +@@ -727,6 +812,10 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + return; + } + ++ /* True when explicitly set via priv flag, or XDP prog is loaded */ ++ if (test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state)) ++ goto csum_unnecessary; ++ + /* CQE csum doesn't cover padding octets in short ethernet + * frames. And the pad field is appended prior to calculating + * and appending the FCS field. +@@ -738,7 +827,10 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + if (short_frame(skb->len)) + goto csum_unnecessary; + +- if (likely(is_last_ethertype_ip(skb, &network_depth))) { ++ if (likely(is_last_ethertype_ip(skb, &network_depth, &proto))) { ++ if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP)) ++ goto csum_unnecessary; ++ + skb->ip_summed = CHECKSUM_COMPLETE; + skb->csum = csum_unfold((__force __sum16)cqe->check_sum); + if (network_depth > ETH_HLEN) +@@ -749,10 +841,8 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + skb->csum = csum_partial(skb->data + ETH_HLEN, + network_depth - ETH_HLEN, + skb->csum); +- if (unlikely(netdev->features & NETIF_F_RXFCS)) +- skb->csum = csum_block_add(skb->csum, +- (__force __wsum)mlx5e_get_fcs(skb), +- skb->len - ETH_FCS_LEN); ++ ++ mlx5e_skb_padding_csum(skb, network_depth, proto, stats); + stats->csum_complete++; + return; + } +@@ -775,6 +865,8 @@ csum_none: + stats->csum_none++; + } + ++#define MLX5E_CE_BIT_MASK 0x80 ++ + static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe, + u32 cqe_bcnt, + struct mlx5e_rq *rq, +@@ -819,6 +911,10 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe, + skb->mark = be32_to_cpu(cqe->sop_drop_qpn) & MLX5E_TC_FLOW_ID_MASK; + + mlx5e_handle_csum(netdev, cqe, rq, skb, !!lro_num_seg); ++ /* checking CE bit in cqe - MSB in ml_path field */ ++ if (unlikely(cqe->ml_path & MLX5E_CE_BIT_MASK)) ++ mlx5e_enable_ecn(rq, skb); ++ + skb->protocol = eth_type_trans(skb, netdev); + } + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +index 7047cc293545..8255d797ea94 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +@@ -53,10 +53,13 @@ static const struct counter_desc sw_stats_desc[] = { + + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) }, ++ { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) }, ++ { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) }, ++ { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) }, + { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) }, +@@ -144,9 +147,12 @@ void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv) + s->rx_bytes += rq_stats->bytes; + s->rx_lro_packets += rq_stats->lro_packets; + s->rx_lro_bytes += rq_stats->lro_bytes; ++ s->rx_ecn_mark += rq_stats->ecn_mark; + s->rx_removed_vlan_packets += rq_stats->removed_vlan_packets; + s->rx_csum_none += rq_stats->csum_none; + s->rx_csum_complete += rq_stats->csum_complete; ++ s->rx_csum_complete_tail += rq_stats->csum_complete_tail; ++ s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow; + s->rx_csum_unnecessary += rq_stats->csum_unnecessary; + s->rx_csum_unnecessary_inner += rq_stats->csum_unnecessary_inner; + s->rx_xdp_drop += rq_stats->xdp_drop; +@@ -1137,6 +1143,8 @@ static const struct counter_desc rq_stats_desc[] = { + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) }, ++ { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) }, ++ { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) }, +@@ -1144,6 +1152,7 @@ static const struct counter_desc rq_stats_desc[] = { + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) }, ++ { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) }, + { MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) }, +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +index 0ad7a165443a..3ea8033ed6bd 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +@@ -66,10 +66,13 @@ struct mlx5e_sw_stats { + u64 tx_nop; + u64 rx_lro_packets; + u64 rx_lro_bytes; ++ u64 rx_ecn_mark; + u64 rx_removed_vlan_packets; + u64 rx_csum_unnecessary; + u64 rx_csum_none; + u64 rx_csum_complete; ++ u64 rx_csum_complete_tail; ++ u64 rx_csum_complete_tail_slow; + u64 rx_csum_unnecessary_inner; + u64 rx_xdp_drop; + u64 rx_xdp_redirect; +@@ -179,11 +182,14 @@ struct mlx5e_rq_stats { + u64 packets; + u64 bytes; + u64 csum_complete; ++ u64 csum_complete_tail; ++ u64 csum_complete_tail_slow; + u64 csum_unnecessary; + u64 csum_unnecessary_inner; + u64 csum_none; + u64 lro_packets; + u64 lro_bytes; ++ u64 ecn_mark; + u64 removed_vlan_packets; + u64 xdp_drop; + u64 xdp_redirect; +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +index d1c1a8069c7e..5e1e671d2002 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +@@ -315,7 +315,7 @@ out: + } + + void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- enum nl80211_band band) ++ enum nl80211_band band, bool update) + { + struct ieee80211_hw *hw = mvm->hw; + struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); +@@ -324,7 +324,8 @@ void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, + struct ieee80211_supported_band *sband; + struct iwl_tlc_config_cmd cfg_cmd = { + .sta_id = mvmsta->sta_id, +- .max_ch_width = rs_fw_bw_from_sta_bw(sta), ++ .max_ch_width = update ? ++ rs_fw_bw_from_sta_bw(sta) : RATE_MCS_CHAN_WIDTH_20, + .flags = cpu_to_le16(rs_fw_set_config_flags(mvm, sta)), + .chains = rs_fw_set_active_chains(iwl_mvm_get_valid_tx_ant(mvm)), + .max_mpdu_len = cpu_to_le16(sta->max_amsdu_len), +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +index 6b9c670fcef8..6f4508d62a97 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +@@ -4113,7 +4113,7 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, + enum nl80211_band band, bool update) + { + if (iwl_mvm_has_tlc_offload(mvm)) +- rs_fw_rate_init(mvm, sta, band); ++ rs_fw_rate_init(mvm, sta, band, update); + else + rs_drv_rate_init(mvm, sta, band, update); + } +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h +index 8e7f993e2911..d0f47899f284 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h +@@ -461,7 +461,7 @@ void rs_remove_sta_debugfs(void *mvm, void *mvm_sta); + + void iwl_mvm_rs_add_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta); + void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- enum nl80211_band band); ++ enum nl80211_band band, bool update); + int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, + bool enable); + void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +index ffae299c3492..5615ce55cef5 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -671,7 +671,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) + if (info.control.vif->type == NL80211_IFTYPE_P2P_DEVICE || + info.control.vif->type == NL80211_IFTYPE_AP || + info.control.vif->type == NL80211_IFTYPE_ADHOC) { +- if (info.control.vif->type == NL80211_IFTYPE_P2P_DEVICE) ++ if (!ieee80211_is_data(hdr->frame_control)) + sta_id = mvmvif->bcast_sta.sta_id; + else + sta_id = mvmvif->mcast_sta.sta_id; +diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c +index 5dadc964ad3b..5c2849846641 100644 +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -2706,8 +2706,8 @@ static int hv_pci_remove(struct hv_device *hdev) + /* Remove the bus from PCI's point of view. */ + pci_lock_rescan_remove(); + pci_stop_root_bus(hbus->pci_bus); +- pci_remove_root_bus(hbus->pci_bus); + hv_pci_remove_slots(hbus); ++ pci_remove_root_bus(hbus->pci_bus); + pci_unlock_rescan_remove(); + hbus->state = hv_pcibus_removed; + } +diff --git a/drivers/pinctrl/sprd/pinctrl-sprd.c b/drivers/pinctrl/sprd/pinctrl-sprd.c +index 78c2f548b25f..8f3468d9f848 100644 +--- a/drivers/pinctrl/sprd/pinctrl-sprd.c ++++ b/drivers/pinctrl/sprd/pinctrl-sprd.c +@@ -159,10 +159,8 @@ struct sprd_pinctrl { + struct sprd_pinctrl_soc_info *info; + }; + +-enum sprd_pinconf_params { +- SPRD_PIN_CONFIG_CONTROL = PIN_CONFIG_END + 1, +- SPRD_PIN_CONFIG_SLEEP_MODE = PIN_CONFIG_END + 2, +-}; ++#define SPRD_PIN_CONFIG_CONTROL (PIN_CONFIG_END + 1) ++#define SPRD_PIN_CONFIG_SLEEP_MODE (PIN_CONFIG_END + 2) + + static int sprd_pinctrl_get_id_by_name(struct sprd_pinctrl *sprd_pctl, + const char *name) +diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c +index 5a2757a7f408..5358a80d854f 100644 +--- a/drivers/power/supply/power_supply_sysfs.c ++++ b/drivers/power/supply/power_supply_sysfs.c +@@ -131,7 +131,8 @@ static ssize_t power_supply_show_property(struct device *dev, + dev_dbg(dev, "driver has no data for `%s' property\n", + attr->attr.name); + else if (ret != -ENODEV && ret != -EAGAIN) +- dev_err(dev, "driver failed to report `%s' property: %zd\n", ++ dev_err_ratelimited(dev, ++ "driver failed to report `%s' property: %zd\n", + attr->attr.name, ret); + return ret; + } +diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c +index fc08e46a93ca..34ff4bbc8de1 100644 +--- a/drivers/scsi/qla2xxx/qla_gs.c ++++ b/drivers/scsi/qla2xxx/qla_gs.c +@@ -4045,6 +4045,41 @@ out: + } + } + ++static int qla2x00_post_gnnft_gpnft_done_work(struct scsi_qla_host *vha, ++ srb_t *sp, int cmd) ++{ ++ struct qla_work_evt *e; ++ ++ if (cmd != QLA_EVT_GPNFT_DONE && cmd != QLA_EVT_GNNFT_DONE) ++ return QLA_PARAMETER_ERROR; ++ ++ e = qla2x00_alloc_work(vha, cmd); ++ if (!e) ++ return QLA_FUNCTION_FAILED; ++ ++ e->u.iosb.sp = sp; ++ ++ return qla2x00_post_work(vha, e); ++} ++ ++static int qla2x00_post_nvme_gpnft_done_work(struct scsi_qla_host *vha, ++ srb_t *sp, int cmd) ++{ ++ struct qla_work_evt *e; ++ ++ if (cmd != QLA_EVT_GPNFT) ++ return QLA_PARAMETER_ERROR; ++ ++ e = qla2x00_alloc_work(vha, cmd); ++ if (!e) ++ return QLA_FUNCTION_FAILED; ++ ++ e->u.gpnft.fc4_type = FC4_TYPE_NVME; ++ e->u.gpnft.sp = sp; ++ ++ return qla2x00_post_work(vha, e); ++} ++ + static void qla2x00_find_free_fcp_nvme_slot(struct scsi_qla_host *vha, + struct srb *sp) + { +@@ -4145,22 +4180,36 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) + { + struct srb *sp = s; + struct scsi_qla_host *vha = sp->vha; +- struct qla_work_evt *e; + struct ct_sns_req *ct_req = + (struct ct_sns_req *)sp->u.iocb_cmd.u.ctarg.req; + u16 cmd = be16_to_cpu(ct_req->command); + u8 fc4_type = sp->gen2; + unsigned long flags; ++ int rc; + + /* gen2 field is holding the fc4type */ + ql_dbg(ql_dbg_disc, vha, 0xffff, + "Async done-%s res %x FC4Type %x\n", + sp->name, res, sp->gen2); + ++ sp->rc = res; + if (res) { + unsigned long flags; ++ const char *name = sp->name; ++ ++ /* ++ * We are in an Interrupt context, queue up this ++ * sp for GNNFT_DONE work. This will allow all ++ * the resource to get freed up. ++ */ ++ rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp, ++ QLA_EVT_GNNFT_DONE); ++ if (rc) { ++ /* Cleanup here to prevent memory leak */ ++ qla24xx_sp_unmap(vha, sp); ++ sp->free(sp); ++ } + +- sp->free(sp); + spin_lock_irqsave(&vha->work_lock, flags); + vha->scan.scan_flags &= ~SF_SCANNING; + vha->scan.scan_retry++; +@@ -4171,9 +4220,9 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) + set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + } else { +- ql_dbg(ql_dbg_disc, sp->vha, 0xffff, +- "Async done-%s rescan failed on all retries\n", +- sp->name); ++ ql_dbg(ql_dbg_disc, vha, 0xffff, ++ "Async done-%s rescan failed on all retries.\n", ++ name); + } + return; + } +@@ -4188,77 +4237,31 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) + vha->scan.scan_flags &= ~SF_SCANNING; + spin_unlock_irqrestore(&vha->work_lock, flags); + +- e = qla2x00_alloc_work(vha, QLA_EVT_GPNFT); +- if (!e) { +- /* +- * please ignore kernel warning. Otherwise, +- * we have mem leak. +- */ +- if (sp->u.iocb_cmd.u.ctarg.req) { +- dma_free_coherent(&vha->hw->pdev->dev, +- sp->u.iocb_cmd.u.ctarg.req_allocated_size, +- sp->u.iocb_cmd.u.ctarg.req, +- sp->u.iocb_cmd.u.ctarg.req_dma); +- sp->u.iocb_cmd.u.ctarg.req = NULL; +- } +- if (sp->u.iocb_cmd.u.ctarg.rsp) { +- dma_free_coherent(&vha->hw->pdev->dev, +- sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, +- sp->u.iocb_cmd.u.ctarg.rsp, +- sp->u.iocb_cmd.u.ctarg.rsp_dma); +- sp->u.iocb_cmd.u.ctarg.rsp = NULL; +- } +- +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async done-%s unable to alloc work element\n", +- sp->name); +- sp->free(sp); ++ sp->rc = res; ++ rc = qla2x00_post_nvme_gpnft_done_work(vha, sp, QLA_EVT_GPNFT); ++ if (!rc) { ++ qla24xx_sp_unmap(vha, sp); + set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); + set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); + return; + } +- e->u.gpnft.fc4_type = FC4_TYPE_NVME; +- sp->rc = res; +- e->u.gpnft.sp = sp; +- +- qla2x00_post_work(vha, e); +- return; + } + +- if (cmd == GPN_FT_CMD) +- e = qla2x00_alloc_work(vha, QLA_EVT_GPNFT_DONE); +- else +- e = qla2x00_alloc_work(vha, QLA_EVT_GNNFT_DONE); +- if (!e) { +- /* please ignore kernel warning. Otherwise, we have mem leak. */ +- if (sp->u.iocb_cmd.u.ctarg.req) { +- dma_free_coherent(&vha->hw->pdev->dev, +- sp->u.iocb_cmd.u.ctarg.req_allocated_size, +- sp->u.iocb_cmd.u.ctarg.req, +- sp->u.iocb_cmd.u.ctarg.req_dma); +- sp->u.iocb_cmd.u.ctarg.req = NULL; +- } +- if (sp->u.iocb_cmd.u.ctarg.rsp) { +- dma_free_coherent(&vha->hw->pdev->dev, +- sp->u.iocb_cmd.u.ctarg.rsp_allocated_size, +- sp->u.iocb_cmd.u.ctarg.rsp, +- sp->u.iocb_cmd.u.ctarg.rsp_dma); +- sp->u.iocb_cmd.u.ctarg.rsp = NULL; +- } ++ if (cmd == GPN_FT_CMD) { ++ del_timer(&sp->u.iocb_cmd.timer); ++ rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp, ++ QLA_EVT_GPNFT_DONE); ++ } else { ++ rc = qla2x00_post_gnnft_gpnft_done_work(vha, sp, ++ QLA_EVT_GNNFT_DONE); ++ } + +- ql_dbg(ql_dbg_disc, vha, 0xffff, +- "Async done-%s unable to alloc work element\n", +- sp->name); +- sp->free(sp); ++ if (rc) { ++ qla24xx_sp_unmap(vha, sp); + set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); + set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); + return; + } +- +- sp->rc = res; +- e->u.iosb.sp = sp; +- +- qla2x00_post_work(vha, e); + } + + /* +@@ -4357,7 +4360,6 @@ void qla24xx_async_gpnft_done(scsi_qla_host_t *vha, srb_t *sp) + { + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s enter\n", __func__); +- del_timer(&sp->u.iocb_cmd.timer); + qla24xx_async_gnnft(vha, sp, sp->gen2); + } + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 39a8f4a671aa..7c1f36b69bdc 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -54,7 +54,7 @@ qla2x00_sp_timeout(struct timer_list *t) + unsigned long flags; + struct qla_hw_data *ha = sp->vha->hw; + +- WARN_ON(irqs_disabled()); ++ WARN_ON_ONCE(irqs_disabled()); + spin_lock_irqsave(&ha->hardware_lock, flags); + req = sp->qpair->req; + req->outstanding_cmds[sp->handle] = NULL; +@@ -796,6 +796,9 @@ qla24xx_async_gnl_sp_done(void *s, int res) + sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1], + sp->u.iocb_cmd.u.mbx.in_mb[2]); + ++ if (res == QLA_FUNCTION_TIMEOUT) ++ return; ++ + memset(&ea, 0, sizeof(ea)); + ea.sp = sp; + ea.rc = res; +@@ -979,17 +982,13 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) + "Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n", + sp->name, res, fcport->port_name, mb[1], mb[2]); + +- fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); +- +- if (res == QLA_FUNCTION_TIMEOUT) +- return; +- + if (res == QLA_FUNCTION_TIMEOUT) { + dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, + sp->u.iocb_cmd.u.mbx.in_dma); + return; + } + ++ fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); + memset(&ea, 0, sizeof(ea)); + ea.event = FCME_GPDB_DONE; + ea.fcport = fcport; +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index cc9e846a3865..094be406cde4 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -553,7 +553,50 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) + oparams.fid = pfid; + oparams.reconnect = false; + ++ /* ++ * We do not hold the lock for the open because in case ++ * SMB2_open needs to reconnect, it will end up calling ++ * cifs_mark_open_files_invalid() which takes the lock again ++ * thus causing a deadlock ++ */ ++ mutex_unlock(&tcon->crfid.fid_mutex); + rc = SMB2_open(xid, &oparams, &srch_path, &oplock, NULL, NULL, NULL); ++ mutex_lock(&tcon->crfid.fid_mutex); ++ ++ /* ++ * Now we need to check again as the cached root might have ++ * been successfully re-opened from a concurrent process ++ */ ++ ++ if (tcon->crfid.is_valid) { ++ /* work was already done */ ++ ++ /* stash fids for close() later */ ++ struct cifs_fid fid = { ++ .persistent_fid = pfid->persistent_fid, ++ .volatile_fid = pfid->volatile_fid, ++ }; ++ ++ /* ++ * Caller expects this func to set pfid to a valid ++ * cached root, so we copy the existing one and get a ++ * reference ++ */ ++ memcpy(pfid, tcon->crfid.fid, sizeof(*pfid)); ++ kref_get(&tcon->crfid.refcount); ++ ++ mutex_unlock(&tcon->crfid.fid_mutex); ++ ++ if (rc == 0) { ++ /* close extra handle outside of critical section */ ++ SMB2_close(xid, tcon, fid.persistent_fid, ++ fid.volatile_fid); ++ } ++ return 0; ++ } ++ ++ /* Cached root is still invalid, continue normaly */ ++ + if (rc == 0) { + memcpy(tcon->crfid.fid, pfid, sizeof(struct cifs_fid)); + tcon->crfid.tcon = tcon; +@@ -561,6 +604,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) + kref_init(&tcon->crfid.refcount); + kref_get(&tcon->crfid.refcount); + } ++ + mutex_unlock(&tcon->crfid.fid_mutex); + return rc; + } +diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c +index 59d0472013f4..388500eec729 100644 +--- a/fs/f2fs/checkpoint.c ++++ b/fs/f2fs/checkpoint.c +@@ -849,6 +849,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + unsigned int cp_blks = 1 + __cp_payload(sbi); + block_t cp_blk_no; + int i; ++ int err; + + sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks), + GFP_KERNEL); +@@ -876,6 +877,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + } else if (cp2) { + cur_page = cp2; + } else { ++ err = -EFSCORRUPTED; + goto fail_no_cp; + } + +@@ -888,8 +890,10 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + sbi->cur_cp_pack = 2; + + /* Sanity checking of checkpoint */ +- if (f2fs_sanity_check_ckpt(sbi)) ++ if (f2fs_sanity_check_ckpt(sbi)) { ++ err = -EFSCORRUPTED; + goto free_fail_no_cp; ++ } + + if (cp_blks <= 1) + goto done; +@@ -903,8 +907,10 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + unsigned char *ckpt = (unsigned char *)sbi->ckpt; + + cur_page = f2fs_get_meta_page(sbi, cp_blk_no + i); +- if (IS_ERR(cur_page)) ++ if (IS_ERR(cur_page)) { ++ err = PTR_ERR(cur_page); + goto free_fail_no_cp; ++ } + sit_bitmap_ptr = page_address(cur_page); + memcpy(ckpt + i * blk_size, sit_bitmap_ptr, blk_size); + f2fs_put_page(cur_page, 1); +@@ -919,7 +925,7 @@ free_fail_no_cp: + f2fs_put_page(cp2, 1); + fail_no_cp: + kfree(sbi->ckpt); +- return -EINVAL; ++ return err; + } + + static void __add_dirty_inode(struct inode *inode, enum inode_type type) +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 4d02e76b648a..9511466bc785 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -449,7 +449,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) + + if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr, + __is_meta_io(fio) ? META_GENERIC : DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + + trace_f2fs_submit_page_bio(page, fio); + f2fs_trace_ios(fio, 0); +@@ -1071,7 +1071,7 @@ next_block: + + if (__is_valid_data_blkaddr(blkaddr) && + !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto sync_out; + } + +@@ -1755,7 +1755,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) + + if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, + DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + + ipu_force = true; + fio->need_lock = LOCK_DONE; +@@ -1781,7 +1781,7 @@ got_it: + if (__is_valid_data_blkaddr(fio->old_blkaddr) && + !f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, + DATA_GENERIC)) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto out_writepage; + } + /* +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 44ea7ac69ef4..fb216488d67a 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -3487,3 +3487,7 @@ extern void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate, + #endif + + #endif ++ ++#define EFSBADCRC EBADMSG /* Bad CRC detected */ ++#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ ++ +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index d44b57a363ff..dd29a49143f5 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -636,7 +636,7 @@ static int ra_data_block(struct inode *inode, pgoff_t index) + + if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr, + DATA_GENERIC))) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto put_page; + } + got_it: +diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c +index 92703efde36e..6bbb5f6801e2 100644 +--- a/fs/f2fs/inline.c ++++ b/fs/f2fs/inline.c +@@ -146,7 +146,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) + "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, " + "run fsck to fix.", + __func__, dn->inode->i_ino, dn->data_blkaddr); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + f2fs_bug_on(F2FS_P_SB(page), PageWriteback(page)); +@@ -389,7 +389,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage, + "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, " + "run fsck to fix.", + __func__, dir->i_ino, dn.data_blkaddr); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + goto out; + } + +diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c +index 0f31df01e36c..540d45759621 100644 +--- a/fs/f2fs/inode.c ++++ b/fs/f2fs/inode.c +@@ -76,7 +76,7 @@ static int __written_first_block(struct f2fs_sb_info *sbi, + if (!__is_valid_data_blkaddr(addr)) + return 1; + if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + return 0; + } + +@@ -361,7 +361,7 @@ static int do_read_inode(struct inode *inode) + + if (!sanity_check_inode(inode, node_page)) { + f2fs_put_page(node_page, 1); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + /* check data exist */ +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index e2d9edad758c..aa8f19e1bdb3 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -40,7 +40,7 @@ int f2fs_check_nid_range(struct f2fs_sb_info *sbi, nid_t nid) + f2fs_msg(sbi->sb, KERN_WARNING, + "%s: out-of-range nid=%x, run fsck to fix.", + __func__, nid); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + return 0; + } +@@ -1284,7 +1284,7 @@ static int read_node_page(struct page *page, int op_flags) + if (PageUptodate(page)) { + if (!f2fs_inode_chksum_verify(sbi, page)) { + ClearPageUptodate(page); +- return -EBADMSG; ++ return -EFSBADCRC; + } + return LOCKED_PAGE; + } +@@ -1370,7 +1370,7 @@ repeat: + } + + if (!f2fs_inode_chksum_verify(sbi, page)) { +- err = -EBADMSG; ++ err = -EFSBADCRC; + goto out_err; + } + page_hit: +diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c +index bf5c5f4fa77e..0b224f4a4a65 100644 +--- a/fs/f2fs/recovery.c ++++ b/fs/f2fs/recovery.c +@@ -491,7 +491,7 @@ retry_dn: + "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u", + inode->i_ino, ofs_of_node(dn.node_page), + ofs_of_node(page)); +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto err; + } + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 92f72bb5aff4..10d5dcdb34be 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -2657,7 +2657,7 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) + if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { + f2fs_msg(sbi->sb, KERN_WARNING, + "Found FS corruption, run fsck to fix."); +- return -EIO; ++ return -EFSCORRUPTED; + } + + /* start/end segment number in main_area */ +@@ -3079,7 +3079,7 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) + + if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) { + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EFAULT; ++ return -EFSCORRUPTED; + } + + stat_inc_inplace_blocks(fio->sbi); +@@ -3261,11 +3261,6 @@ static int read_compacted_summaries(struct f2fs_sb_info *sbi) + seg_i = CURSEG_I(sbi, i); + segno = le32_to_cpu(ckpt->cur_data_segno[i]); + blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]); +- if (blk_off > ENTRIES_IN_SUM) { +- f2fs_bug_on(sbi, 1); +- f2fs_put_page(page, 1); +- return -EFAULT; +- } + seg_i->next_segno = segno; + reset_curseg(sbi, i, 0); + seg_i->alloc_type = ckpt->alloc_type[i]; +@@ -3971,7 +3966,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + "Wrong journal entry on segno %u", + start); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + break; + } + +@@ -4012,7 +4007,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + "SIT is corrupted node# %u vs %u", + total_node_blocks, valid_node_count(sbi)); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + } + + return err; +@@ -4103,6 +4098,41 @@ static int build_dirty_segmap(struct f2fs_sb_info *sbi) + return init_victim_secmap(sbi); + } + ++static int sanity_check_curseg(struct f2fs_sb_info *sbi) ++{ ++ int i; ++ ++ /* ++ * In LFS/SSR curseg, .next_blkoff should point to an unused blkaddr; ++ * In LFS curseg, all blkaddr after .next_blkoff should be unused. ++ */ ++ for (i = 0; i < NO_CHECK_TYPE; i++) { ++ struct curseg_info *curseg = CURSEG_I(sbi, i); ++ struct seg_entry *se = get_seg_entry(sbi, curseg->segno); ++ unsigned int blkofs = curseg->next_blkoff; ++ ++ if (f2fs_test_bit(blkofs, se->cur_valid_map)) ++ goto out; ++ ++ if (curseg->alloc_type == SSR) ++ continue; ++ ++ for (blkofs += 1; blkofs < sbi->blocks_per_seg; blkofs++) { ++ if (!f2fs_test_bit(blkofs, se->cur_valid_map)) ++ continue; ++out: ++ f2fs_msg(sbi->sb, KERN_ERR, ++ "Current segment's next free block offset is " ++ "inconsistent with bitmap, logtype:%u, " ++ "segno:%u, type:%u, next_blkoff:%u, blkofs:%u", ++ i, curseg->segno, curseg->alloc_type, ++ curseg->next_blkoff, blkofs); ++ return -EFSCORRUPTED; ++ } ++ } ++ return 0; ++} ++ + /* + * Update min, max modified time for cost-benefit GC algorithm + */ +@@ -4198,6 +4228,10 @@ int f2fs_build_segment_manager(struct f2fs_sb_info *sbi) + if (err) + return err; + ++ err = sanity_check_curseg(sbi); ++ if (err) ++ return err; ++ + init_min_max_mtime(sbi); + return 0; + } +diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h +index 5079532cb176..9c2a55ad61bc 100644 +--- a/fs/f2fs/segment.h ++++ b/fs/f2fs/segment.h +@@ -684,7 +684,7 @@ static inline int check_block_count(struct f2fs_sb_info *sbi, + "Mismatch valid blocks %d vs. %d", + GET_SIT_VBLOCKS(raw_sit), valid_blocks); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + /* check segment usage, and check boundary of a given segment number */ +@@ -694,7 +694,7 @@ static inline int check_block_count(struct f2fs_sb_info *sbi, + "Wrong valid blocks %d or segno %u", + GET_SIT_VBLOCKS(raw_sit), segno); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + return 0; + } +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 1871031e2d5e..fdafcfd8b20e 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2413,11 +2413,11 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) + } + } + for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) { +- for (j = i; j < NR_CURSEG_DATA_TYPE; j++) { ++ for (j = 0; j < NR_CURSEG_DATA_TYPE; j++) { + if (le32_to_cpu(ckpt->cur_node_segno[i]) == + le32_to_cpu(ckpt->cur_data_segno[j])) { + f2fs_msg(sbi->sb, KERN_ERR, +- "Data segment (%u) and Data segment (%u)" ++ "Node segment (%u) and Data segment (%u)" + " has the same segno: %u", i, j, + le32_to_cpu(ckpt->cur_node_segno[i])); + return 1; +@@ -2616,7 +2616,7 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi, + f2fs_msg(sb, KERN_ERR, + "Can't find valid F2FS filesystem in %dth superblock", + block + 1); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + brelse(bh); + continue; + } +diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c +index 88e30f7cf9e1..1dae74f7ccca 100644 +--- a/fs/f2fs/xattr.c ++++ b/fs/f2fs/xattr.c +@@ -349,7 +349,7 @@ static int lookup_all_xattrs(struct inode *inode, struct page *ipage, + + *xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name); + if (!*xe) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto out; + } + check: +@@ -625,7 +625,7 @@ static int __f2fs_setxattr(struct inode *inode, int index, + /* find entry with wanted name. */ + here = __find_xattr(base_addr, last_base_addr, index, len, name); + if (!here) { +- error = -EFAULT; ++ error = -EFSCORRUPTED; + goto exit; + } + +diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c +index 06a7da8dbda5..38dc0b43c366 100644 +--- a/fs/xfs/libxfs/xfs_bmap.c ++++ b/fs/xfs/libxfs/xfs_bmap.c +@@ -3841,15 +3841,28 @@ xfs_bmapi_read( + XFS_STATS_INC(mp, xs_blk_mapr); + + ifp = XFS_IFORK_PTR(ip, whichfork); ++ if (!ifp) { ++ /* No CoW fork? Return a hole. */ ++ if (whichfork == XFS_COW_FORK) { ++ mval->br_startoff = bno; ++ mval->br_startblock = HOLESTARTBLOCK; ++ mval->br_blockcount = len; ++ mval->br_state = XFS_EXT_NORM; ++ *nmap = 1; ++ return 0; ++ } + +- /* No CoW fork? Return a hole. */ +- if (whichfork == XFS_COW_FORK && !ifp) { +- mval->br_startoff = bno; +- mval->br_startblock = HOLESTARTBLOCK; +- mval->br_blockcount = len; +- mval->br_state = XFS_EXT_NORM; +- *nmap = 1; +- return 0; ++ /* ++ * A missing attr ifork implies that the inode says we're in ++ * extents or btree format but failed to pass the inode fork ++ * verifier while trying to load it. Treat that as a file ++ * corruption too. ++ */ ++#ifdef DEBUG ++ xfs_alert(mp, "%s: inode %llu missing fork %d", ++ __func__, ip->i_ino, whichfork); ++#endif /* DEBUG */ ++ return -EFSCORRUPTED; + } + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { +diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h +index 412c2820626d..b7d63c3970d1 100644 +--- a/include/rdma/ib_verbs.h ++++ b/include/rdma/ib_verbs.h +@@ -71,6 +71,7 @@ + + extern struct workqueue_struct *ib_wq; + extern struct workqueue_struct *ib_comp_wq; ++extern struct workqueue_struct *ib_comp_unbound_wq; + + union ib_gid { + u8 raw[16]; +@@ -1576,9 +1577,10 @@ struct ib_ah { + typedef void (*ib_comp_handler)(struct ib_cq *cq, void *cq_context); + + enum ib_poll_context { +- IB_POLL_DIRECT, /* caller context, no hw completions */ +- IB_POLL_SOFTIRQ, /* poll from softirq context */ +- IB_POLL_WORKQUEUE, /* poll from workqueue */ ++ IB_POLL_DIRECT, /* caller context, no hw completions */ ++ IB_POLL_SOFTIRQ, /* poll from softirq context */ ++ IB_POLL_WORKQUEUE, /* poll from workqueue */ ++ IB_POLL_UNBOUND_WORKQUEUE, /* poll from unbound workqueue */ + }; + + struct ib_cq { +@@ -1595,6 +1597,7 @@ struct ib_cq { + struct irq_poll iop; + struct work_struct work; + }; ++ struct workqueue_struct *comp_wq; + /* + * Implementation details of the RDMA core, don't use in drivers: + */ +diff --git a/init/initramfs.c b/init/initramfs.c +index cd5fb00fcb54..dab8d63459f6 100644 +--- a/init/initramfs.c ++++ b/init/initramfs.c +@@ -524,7 +524,7 @@ static void __init free_initrd(void) + unsigned long crashk_start = (unsigned long)__va(crashk_res.start); + unsigned long crashk_end = (unsigned long)__va(crashk_res.end); + #endif +- if (do_retain_initrd) ++ if (do_retain_initrd || !initrd_start) + goto skip; + + #ifdef CONFIG_KEXEC_CORE +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index e810e8cb17e1..1e272f6a01e7 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -3605,6 +3605,9 @@ static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) + unsigned int depth; + int i; + ++ if (unlikely(!debug_locks)) ++ return 0; ++ + depth = curr->lockdep_depth; + /* + * This function is about (re)setting the class of a held lock, +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index 0adcddb211fa..3e7badb3ac2d 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -5545,11 +5545,6 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev, + return send_conn_param_neg_reply(hdev, handle, + HCI_ERROR_UNKNOWN_CONN_ID); + +- if (min < hcon->le_conn_min_interval || +- max > hcon->le_conn_max_interval) +- return send_conn_param_neg_reply(hdev, handle, +- HCI_ERROR_INVALID_LL_PARAMS); +- + if (hci_check_conn_params(min, max, latency, timeout)) + return send_conn_param_neg_reply(hdev, handle, + HCI_ERROR_INVALID_LL_PARAMS); +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index a54dadf4a6ca..260ef5426e0c 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -5287,14 +5287,7 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn, + + memset(&rsp, 0, sizeof(rsp)); + +- if (min < hcon->le_conn_min_interval || +- max > hcon->le_conn_max_interval) { +- BT_DBG("requested connection interval exceeds current bounds."); +- err = -EINVAL; +- } else { +- err = hci_check_conn_params(min, max, latency, to_multiplier); +- } +- ++ err = hci_check_conn_params(min, max, latency, to_multiplier); + if (err) + rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED); + else +diff --git a/net/ipv4/raw_diag.c b/net/ipv4/raw_diag.c +index c200065ef9a5..6367ecdf76c4 100644 +--- a/net/ipv4/raw_diag.c ++++ b/net/ipv4/raw_diag.c +@@ -23,9 +23,6 @@ raw_get_hashinfo(const struct inet_diag_req_v2 *r) + return &raw_v6_hashinfo; + #endif + } else { +- pr_warn_once("Unexpected inet family %d\n", +- r->sdiag_family); +- WARN_ON_ONCE(1); + return ERR_PTR(-EINVAL); + } + } +diff --git a/net/netfilter/nft_socket.c b/net/netfilter/nft_socket.c +index d7f3776dfd71..637ce3e8c575 100644 +--- a/net/netfilter/nft_socket.c ++++ b/net/netfilter/nft_socket.c +@@ -47,9 +47,6 @@ static void nft_socket_eval(const struct nft_expr *expr, + return; + } + +- /* So that subsequent socket matching not to require other lookups. */ +- skb->sk = sk; +- + switch(priv->key) { + case NFT_SOCKET_TRANSPARENT: + nft_reg_store8(dest, inet_sk_transparent(sk)); +@@ -66,6 +63,9 @@ static void nft_socket_eval(const struct nft_expr *expr, + WARN_ON(1); + regs->verdict.code = NFT_BREAK; + } ++ ++ if (sk != skb->sk) ++ sock_gen_put(sk); + } + + static const struct nla_policy nft_socket_policy[NFTA_SOCKET_MAX + 1] = { +diff --git a/net/rds/bind.c b/net/rds/bind.c +index 0f4398e7f2a7..93e336535d3b 100644 +--- a/net/rds/bind.c ++++ b/net/rds/bind.c +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2019 Oracle and/or its affiliates. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU +@@ -239,34 +239,33 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) + goto out; + } + +- sock_set_flag(sk, SOCK_RCU_FREE); +- ret = rds_add_bound(rs, binding_addr, &port, scope_id); +- if (ret) +- goto out; +- +- if (rs->rs_transport) { /* previously bound */ ++ /* The transport can be set using SO_RDS_TRANSPORT option before the ++ * socket is bound. ++ */ ++ if (rs->rs_transport) { + trans = rs->rs_transport; +- if (trans->laddr_check(sock_net(sock->sk), ++ if (!trans->laddr_check || ++ trans->laddr_check(sock_net(sock->sk), + binding_addr, scope_id) != 0) { + ret = -ENOPROTOOPT; +- rds_remove_bound(rs); +- } else { +- ret = 0; ++ goto out; + } +- goto out; +- } +- trans = rds_trans_get_preferred(sock_net(sock->sk), binding_addr, +- scope_id); +- if (!trans) { +- ret = -EADDRNOTAVAIL; +- rds_remove_bound(rs); +- pr_info_ratelimited("RDS: %s could not find a transport for %pI6c, load rds_tcp or rds_rdma?\n", +- __func__, binding_addr); +- goto out; ++ } else { ++ trans = rds_trans_get_preferred(sock_net(sock->sk), ++ binding_addr, scope_id); ++ if (!trans) { ++ ret = -EADDRNOTAVAIL; ++ pr_info_ratelimited("RDS: %s could not find a transport for %pI6c, load rds_tcp or rds_rdma?\n", ++ __func__, binding_addr); ++ goto out; ++ } ++ rs->rs_transport = trans; + } + +- rs->rs_transport = trans; +- ret = 0; ++ sock_set_flag(sk, SOCK_RCU_FREE); ++ ret = rds_add_bound(rs, binding_addr, &port, scope_id); ++ if (ret) ++ rs->rs_transport = NULL; + + out: + release_sock(sk); +diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c +index be7cd140b2a3..b06cc5e50412 100644 +--- a/net/sched/sch_api.c ++++ b/net/sched/sch_api.c +@@ -1831,6 +1831,8 @@ static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, + cl = cops->find(q, portid); + if (!cl) + return; ++ if (!cops->tcf_block) ++ return; + block = cops->tcf_block(q, cl, NULL); + if (!block) + return; +diff --git a/sound/firewire/dice/dice-alesis.c b/sound/firewire/dice/dice-alesis.c +index 218292bdace6..f5b325263b67 100644 +--- a/sound/firewire/dice/dice-alesis.c ++++ b/sound/firewire/dice/dice-alesis.c +@@ -15,7 +15,7 @@ alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = { + + static const unsigned int + alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = { +- {10, 10, 8}, /* Tx0 = Analog + S/PDIF. */ ++ {10, 10, 4}, /* Tx0 = Analog + S/PDIF. */ + {16, 8, 0}, /* Tx1 = ADAT1 + ADAT2. */ + }; + +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index c3e3d80ff720..0b24c5ce2fd6 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2662,8 +2662,7 @@ static const struct pci_device_id azx_ids[] = { + AZX_DCAPS_PM_RUNTIME }, + /* AMD Raven */ + { PCI_DEVICE(0x1022, 0x15e3), +- .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB | +- AZX_DCAPS_PM_RUNTIME }, ++ .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_AMD_SB }, + /* ATI HDMI */ + { PCI_DEVICE(0x1002, 0x0002), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, +diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c +index fd476fb40e1b..677dcc0aca97 100644 +--- a/sound/pci/hda/patch_analog.c ++++ b/sound/pci/hda/patch_analog.c +@@ -370,6 +370,7 @@ static const struct hda_fixup ad1986a_fixups[] = { + + static const struct snd_pci_quirk ad1986a_fixup_tbl[] = { + SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_FIXUP_LAPTOP_IMIC), ++ SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9V", AD1986A_FIXUP_LAPTOP_IMIC), + SND_PCI_QUIRK(0x1043, 0x1443, "ASUS Z99He", AD1986A_FIXUP_EAPD), + SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8JN", AD1986A_FIXUP_EAPD), + SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8100, "ASUS P5", AD1986A_FIXUP_3STACK), +diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c +index 0a648229e643..09b2967befd9 100644 +--- a/sound/soc/fsl/fsl_ssi.c ++++ b/sound/soc/fsl/fsl_ssi.c +@@ -1439,8 +1439,10 @@ static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi) + * different name to register the device. + */ + if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) { +- sprop = of_get_property(of_find_node_by_path("/"), +- "compatible", NULL); ++ struct device_node *root = of_find_node_by_path("/"); ++ ++ sprop = of_get_property(root, "compatible", NULL); ++ of_node_put(root); + /* Strip "fsl," in the compatible name if applicable */ + p = strrchr(sprop, ','); + if (p) +diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c +index 08a5152e635a..e7620017e725 100644 +--- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c ++++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c +@@ -42,6 +42,7 @@ struct cht_mc_private { + struct clk *mclk; + struct snd_soc_jack jack; + bool ts3a227e_present; ++ int quirks; + }; + + static int platform_clock_control(struct snd_soc_dapm_widget *w, +@@ -53,6 +54,10 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w, + struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card); + int ret; + ++ /* See the comment in snd_cht_mc_probe() */ ++ if (ctx->quirks & QUIRK_PMC_PLT_CLK_0) ++ return 0; ++ + codec_dai = snd_soc_card_get_codec_dai(card, CHT_CODEC_DAI); + if (!codec_dai) { + dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n"); +@@ -222,6 +227,10 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) + "jack detection gpios not added, error %d\n", ret); + } + ++ /* See the comment in snd_cht_mc_probe() */ ++ if (ctx->quirks & QUIRK_PMC_PLT_CLK_0) ++ return 0; ++ + /* + * The firmware might enable the clock at + * boot (this information may or may not +@@ -420,16 +429,15 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + int ret_val = 0; + struct cht_mc_private *drv; + const char *mclk_name; +- int quirks = 0; +- +- dmi_id = dmi_first_match(cht_max98090_quirk_table); +- if (dmi_id) +- quirks = (unsigned long)dmi_id->driver_data; + + drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); + if (!drv) + return -ENOMEM; + ++ dmi_id = dmi_first_match(cht_max98090_quirk_table); ++ if (dmi_id) ++ drv->quirks = (unsigned long)dmi_id->driver_data; ++ + drv->ts3a227e_present = acpi_dev_found("104C227E"); + if (!drv->ts3a227e_present) { + /* no need probe TI jack detection chip */ +@@ -446,7 +454,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + snd_soc_card_cht.dev = &pdev->dev; + snd_soc_card_set_drvdata(&snd_soc_card_cht, drv); + +- if (quirks & QUIRK_PMC_PLT_CLK_0) ++ if (drv->quirks & QUIRK_PMC_PLT_CLK_0) + mclk_name = "pmc_plt_clk_0"; + else + mclk_name = "pmc_plt_clk_3"; +@@ -459,6 +467,21 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + return PTR_ERR(drv->mclk); + } + ++ /* ++ * Boards which have the MAX98090's clk connected to clk_0 do not seem ++ * to like it if we muck with the clock. If we disable the clock when ++ * it is unused we get "max98090 i2c-193C9890:00: PLL unlocked" errors ++ * and the PLL never seems to lock again. ++ * So for these boards we enable it here once and leave it at that. ++ */ ++ if (drv->quirks & QUIRK_PMC_PLT_CLK_0) { ++ ret_val = clk_prepare_enable(drv->mclk); ++ if (ret_val < 0) { ++ dev_err(&pdev->dev, "MCLK enable error: %d\n", ret_val); ++ return ret_val; ++ } ++ } ++ + ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cht); + if (ret_val) { + dev_err(&pdev->dev, +@@ -469,11 +492,23 @@ static int snd_cht_mc_probe(struct platform_device *pdev) + return ret_val; + } + ++static int snd_cht_mc_remove(struct platform_device *pdev) ++{ ++ struct snd_soc_card *card = platform_get_drvdata(pdev); ++ struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card); ++ ++ if (ctx->quirks & QUIRK_PMC_PLT_CLK_0) ++ clk_disable_unprepare(ctx->mclk); ++ ++ return 0; ++} ++ + static struct platform_driver snd_cht_mc_driver = { + .driver = { + .name = "cht-bsw-max98090", + }, + .probe = snd_cht_mc_probe, ++ .remove = snd_cht_mc_remove, + }; + + module_platform_driver(snd_cht_mc_driver) +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index d71e01954975..60d00091f64b 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -1449,6 +1449,8 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, + case 0x152a: /* Thesycon devices */ + case 0x25ce: /* Mytek devices */ + case 0x2ab6: /* T+A devices */ ++ case 0x3842: /* EVGA */ ++ case 0xc502: /* HiBy devices */ + if (fp->dsd_raw) + return SNDRV_PCM_FMTBIT_DSD_U32_BE; + break; +diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c +index dd0b68d1f4be..482025b72839 100644 +--- a/tools/lib/bpf/bpf.c ++++ b/tools/lib/bpf/bpf.c +@@ -75,6 +75,17 @@ static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + return syscall(__NR_bpf, cmd, attr, size); + } + ++static inline int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size) ++{ ++ int fd; ++ ++ do { ++ fd = sys_bpf(BPF_PROG_LOAD, attr, size); ++ } while (fd < 0 && errno == EAGAIN); ++ ++ return fd; ++} ++ + int bpf_create_map_xattr(const struct bpf_create_map_attr *create_attr) + { + __u32 name_len = create_attr->name ? strlen(create_attr->name) : 0; +@@ -218,7 +229,7 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, + memcpy(attr.prog_name, load_attr->name, + min(name_len, BPF_OBJ_NAME_LEN - 1)); + +- fd = sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); ++ fd = sys_bpf_prog_load(&attr, sizeof(attr)); + if (fd >= 0 || !log_buf || !log_buf_sz) + return fd; + +@@ -227,7 +238,7 @@ int bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr, + attr.log_size = log_buf_sz; + attr.log_level = 1; + log_buf[0] = 0; +- return sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); ++ return sys_bpf_prog_load(&attr, sizeof(attr)); + } + + int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns, +@@ -268,7 +279,7 @@ int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns, + attr.kern_version = kern_version; + attr.prog_flags = strict_alignment ? BPF_F_STRICT_ALIGNMENT : 0; + +- return sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); ++ return sys_bpf_prog_load(&attr, sizeof(attr)); + } + + int bpf_map_update_elem(int fd, const void *key, const void *value, +diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile +index 88158239622b..20f67fcf378d 100644 +--- a/tools/objtool/Makefile ++++ b/tools/objtool/Makefile +@@ -35,7 +35,7 @@ INCLUDES := -I$(srctree)/tools/include \ + -I$(srctree)/tools/arch/$(HOSTARCH)/include/uapi \ + -I$(srctree)/tools/objtool/arch/$(ARCH)/include + WARNINGS := $(EXTRA_WARNINGS) -Wno-switch-default -Wno-switch-enum -Wno-packed +-CFLAGS += -Werror $(WARNINGS) $(KBUILD_HOSTCFLAGS) -g $(INCLUDES) $(LIBELF_FLAGS) ++CFLAGS := -Werror $(WARNINGS) $(KBUILD_HOSTCFLAGS) -g $(INCLUDES) $(LIBELF_FLAGS) + LDFLAGS += $(LIBELF_LIBS) $(LIBSUBCMD) $(KBUILD_HOSTLDFLAGS) + + # Allow old libelf to be used: