commit:     cfd87ce56cdbd24ab63c8547291d3978fbc3e7d3
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 13 11:36:23 2018 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Dec 13 11:36:23 2018 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=cfd87ce5

proj/linux-patches: Linux patch 4.9.145

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README              |    4 +
 1144_linux-4.9.145.patch | 1369 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1373 insertions(+)

diff --git a/0000_README b/0000_README
index 094617d..23dcff1 100644
--- a/0000_README
+++ b/0000_README
@@ -619,6 +619,10 @@ Patch:  1143_linux-4.9.144.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.144
 
+Patch:  1144_linux-4.9.145.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.145
+
 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/1144_linux-4.9.145.patch b/1144_linux-4.9.145.patch
new file mode 100644
index 0000000..6224165
--- /dev/null
+++ b/1144_linux-4.9.145.patch
@@ -0,0 +1,1369 @@
+diff --git a/Makefile b/Makefile
+index c62b2b529724..1499c7ba2874 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 144
++SUBLEVEL = 145
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+@@ -512,13 +512,15 @@ endif
+ ifeq ($(cc-name),clang)
+ ifneq ($(CROSS_COMPILE),)
+ CLANG_TARGET  := -target $(notdir $(CROSS_COMPILE:%-=%))
+-GCC_TOOLCHAIN := $(realpath $(dir $(shell which $(LD)))/..)
++GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
++CLANG_PREFIX  := --prefix=$(GCC_TOOLCHAIN_DIR)
++GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
+ endif
+ ifneq ($(GCC_TOOLCHAIN),)
+ CLANG_GCC_TC  := -gcc-toolchain $(GCC_TOOLCHAIN)
+ endif
+-KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
+-KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
++KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
++KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
+ KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
+ KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
+diff --git a/arch/arc/configs/zebu_hs_defconfig 
b/arch/arc/configs/zebu_hs_defconfig
+index 9f6166be7145..3346829b02bb 100644
+--- a/arch/arc/configs/zebu_hs_defconfig
++++ b/arch/arc/configs/zebu_hs_defconfig
+@@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
+ # CONFIG_UTS_NS is not set
+ # CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
+ CONFIG_EXPERT=y
+ CONFIG_PERF_EVENTS=y
+ # CONFIG_COMPAT_BRK is not set
+diff --git a/arch/arc/configs/zebu_hs_smp_defconfig 
b/arch/arc/configs/zebu_hs_smp_defconfig
+index 44e9693f4257..4471f9c37d7e 100644
+--- a/arch/arc/configs/zebu_hs_smp_defconfig
++++ b/arch/arc/configs/zebu_hs_smp_defconfig
+@@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
+ # CONFIG_UTS_NS is not set
+ # CONFIG_PID_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
+ CONFIG_EMBEDDED=y
+ CONFIG_PERF_EVENTS=y
+ # CONFIG_VM_EVENT_COUNTERS is not set
+diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c
+index 55c1782e3623..2ceb5a26f860 100644
+--- a/drivers/dma/cppi41.c
++++ b/drivers/dma/cppi41.c
+@@ -717,8 +717,22 @@ static int cppi41_stop_chan(struct dma_chan *chan)
+ 
+       desc_phys = lower_32_bits(c->desc_phys);
+       desc_num = (desc_phys - cdd->descs_phys) / sizeof(struct cppi41_desc);
+-      if (!cdd->chan_busy[desc_num])
++      if (!cdd->chan_busy[desc_num]) {
++              struct cppi41_channel *cc, *_ct;
++
++              /*
++               * channels might still be in the pendling list if
++               * cppi41_dma_issue_pending() is called after
++               * cppi41_runtime_suspend() is called
++               */
++              list_for_each_entry_safe(cc, _ct, &cdd->pending, node) {
++                      if (cc != c)
++                              continue;
++                      list_del(&cc->node);
++                      break;
++              }
+               return 0;
++      }
+ 
+       ret = cppi41_tear_down_chan(c);
+       if (ret)
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 8913f357e78f..6f4c84d824e6 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -965,6 +965,7 @@
+ #define USB_VENDOR_ID_SYMBOL          0x05e0
+ #define USB_DEVICE_ID_SYMBOL_SCANNER_1        0x0800
+ #define USB_DEVICE_ID_SYMBOL_SCANNER_2        0x1300
++#define USB_DEVICE_ID_SYMBOL_SCANNER_3        0x1200
+ 
+ #define USB_VENDOR_ID_SYNAPTICS               0x06cb
+ #define USB_DEVICE_ID_SYNAPTICS_TP    0x0001
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index 5ff6dd8147b6..fc7ada26457e 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -324,6 +324,9 @@ static const struct hid_device_id hid_battery_quirks[] = {
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM,
+               USB_DEVICE_ID_ELECOM_BM084),
+         HID_BATTERY_QUIRK_IGNORE },
++      { HID_USB_DEVICE(USB_VENDOR_ID_SYMBOL,
++              USB_DEVICE_ID_SYMBOL_SCANNER_3),
++        HID_BATTERY_QUIRK_IGNORE },
+       {}
+ };
+ 
+diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
+index 2558a381e118..f8c8537f0587 100644
+--- a/drivers/iommu/intel-iommu.c
++++ b/drivers/iommu/intel-iommu.c
+@@ -3054,7 +3054,7 @@ static int copy_context_table(struct intel_iommu *iommu,
+                       }
+ 
+                       if (old_ce)
+-                              iounmap(old_ce);
++                              memunmap(old_ce);
+ 
+                       ret = 0;
+                       if (devfn < 0x80)
+diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
+index f846f0140a9d..7dc2f8d415b6 100644
+--- a/drivers/iommu/intel-svm.c
++++ b/drivers/iommu/intel-svm.c
+@@ -558,7 +558,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
+                       pr_err("%s: Page request without PASID: %08llx 
%08llx\n",
+                              iommu->name, ((unsigned long long *)req)[0],
+                              ((unsigned long long *)req)[1]);
+-                      goto bad_req;
++                      goto no_pasid;
+               }
+ 
+               if (!svm || svm->pasid != req->pasid) {
+diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
+index 85b5e75c7faa..3d2e9ca78f02 100644
+--- a/drivers/iommu/ipmmu-vmsa.c
++++ b/drivers/iommu/ipmmu-vmsa.c
+@@ -372,6 +372,9 @@ static int ipmmu_domain_init_context(struct 
ipmmu_vmsa_domain *domain)
+ 
+ static void ipmmu_domain_destroy_context(struct ipmmu_vmsa_domain *domain)
+ {
++      if (!domain->mmu)
++              return;
++
+       /*
+        * Disable the context. Flush the TLB as required when modifying the
+        * context registers.
+diff --git a/drivers/media/platform/omap3isp/isp.c 
b/drivers/media/platform/omap3isp/isp.c
+index 1e98b4845ea1..a21b12c5c085 100644
+--- a/drivers/media/platform/omap3isp/isp.c
++++ b/drivers/media/platform/omap3isp/isp.c
+@@ -1591,6 +1591,8 @@ static void isp_pm_complete(struct device *dev)
+ 
+ static void isp_unregister_entities(struct isp_device *isp)
+ {
++      media_device_unregister(&isp->media_dev);
++
+       omap3isp_csi2_unregister_entities(&isp->isp_csi2a);
+       omap3isp_ccp2_unregister_entities(&isp->isp_ccp2);
+       omap3isp_ccdc_unregister_entities(&isp->isp_ccdc);
+@@ -1601,7 +1603,6 @@ static void isp_unregister_entities(struct isp_device 
*isp)
+       omap3isp_stat_unregister_entities(&isp->isp_hist);
+ 
+       v4l2_device_unregister(&isp->v4l2_dev);
+-      media_device_unregister(&isp->media_dev);
+       media_device_cleanup(&isp->media_dev);
+ }
+ 
+diff --git a/drivers/mtd/nand/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c
+index dc4943134649..9f6c9a34b9eb 100644
+--- a/drivers/mtd/nand/qcom_nandc.c
++++ b/drivers/mtd/nand/qcom_nandc.c
+@@ -142,15 +142,15 @@
+ #define       NAND_VERSION_MINOR_SHIFT        16
+ 
+ /* NAND OP_CMDs */
+-#define       PAGE_READ                       0x2
+-#define       PAGE_READ_WITH_ECC              0x3
+-#define       PAGE_READ_WITH_ECC_SPARE        0x4
+-#define       PROGRAM_PAGE                    0x6
+-#define       PAGE_PROGRAM_WITH_ECC           0x7
+-#define       PROGRAM_PAGE_SPARE              0x9
+-#define       BLOCK_ERASE                     0xa
+-#define       FETCH_ID                        0xb
+-#define       RESET_DEVICE                    0xd
++#define       OP_PAGE_READ                    0x2
++#define       OP_PAGE_READ_WITH_ECC           0x3
++#define       OP_PAGE_READ_WITH_ECC_SPARE     0x4
++#define       OP_PROGRAM_PAGE                 0x6
++#define       OP_PAGE_PROGRAM_WITH_ECC        0x7
++#define       OP_PROGRAM_PAGE_SPARE           0x9
++#define       OP_BLOCK_ERASE                  0xa
++#define       OP_FETCH_ID                     0xb
++#define       OP_RESET_DEVICE                 0xd
+ 
+ /* Default Value for NAND_DEV_CMD_VLD */
+ #define NAND_DEV_CMD_VLD_VAL          (READ_START_VLD | WRITE_START_VLD | \
+@@ -425,11 +425,11 @@ static void update_rw_regs(struct qcom_nand_host *host, 
int num_cw, bool read)
+ 
+       if (read) {
+               if (host->use_ecc)
+-                      cmd = PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE;
++                      cmd = OP_PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE;
+               else
+-                      cmd = PAGE_READ | PAGE_ACC | LAST_PAGE;
++                      cmd = OP_PAGE_READ | PAGE_ACC | LAST_PAGE;
+       } else {
+-                      cmd = PROGRAM_PAGE | PAGE_ACC | LAST_PAGE;
++              cmd = OP_PROGRAM_PAGE | PAGE_ACC | LAST_PAGE;
+       }
+ 
+       if (host->use_ecc) {
+@@ -662,7 +662,7 @@ static int nandc_param(struct qcom_nand_host *host)
+        * in use. we configure the controller to perform a raw read of 512
+        * bytes to read onfi params
+        */
+-      nandc_set_reg(nandc, NAND_FLASH_CMD, PAGE_READ | PAGE_ACC | LAST_PAGE);
++      nandc_set_reg(nandc, NAND_FLASH_CMD, OP_PAGE_READ | PAGE_ACC | 
LAST_PAGE);
+       nandc_set_reg(nandc, NAND_ADDR0, 0);
+       nandc_set_reg(nandc, NAND_ADDR1, 0);
+       nandc_set_reg(nandc, NAND_DEV0_CFG0, 0 << CW_PER_PAGE
+@@ -715,7 +715,7 @@ static int erase_block(struct qcom_nand_host *host, int 
page_addr)
+       struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
+ 
+       nandc_set_reg(nandc, NAND_FLASH_CMD,
+-                    BLOCK_ERASE | PAGE_ACC | LAST_PAGE);
++                    OP_BLOCK_ERASE | PAGE_ACC | LAST_PAGE);
+       nandc_set_reg(nandc, NAND_ADDR0, page_addr);
+       nandc_set_reg(nandc, NAND_ADDR1, 0);
+       nandc_set_reg(nandc, NAND_DEV0_CFG0,
+@@ -746,7 +746,7 @@ static int read_id(struct qcom_nand_host *host, int column)
+       if (column == -1)
+               return 0;
+ 
+-      nandc_set_reg(nandc, NAND_FLASH_CMD, FETCH_ID);
++      nandc_set_reg(nandc, NAND_FLASH_CMD, OP_FETCH_ID);
+       nandc_set_reg(nandc, NAND_ADDR0, column);
+       nandc_set_reg(nandc, NAND_ADDR1, 0);
+       nandc_set_reg(nandc, NAND_FLASH_CHIP_SELECT, DM_EN);
+@@ -766,7 +766,7 @@ static int reset(struct qcom_nand_host *host)
+       struct nand_chip *chip = &host->chip;
+       struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
+ 
+-      nandc_set_reg(nandc, NAND_FLASH_CMD, RESET_DEVICE);
++      nandc_set_reg(nandc, NAND_FLASH_CMD, OP_RESET_DEVICE);
+       nandc_set_reg(nandc, NAND_EXEC_CMD, 1);
+ 
+       write_reg_dma(nandc, NAND_FLASH_CMD, 1);
+diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c
+index 788459f6bf5c..9b2c3bd00f8b 100644
+--- a/drivers/net/can/rcar/rcar_can.c
++++ b/drivers/net/can/rcar/rcar_can.c
+@@ -24,6 +24,9 @@
+ 
+ #define RCAR_CAN_DRV_NAME     "rcar_can"
+ 
++#define RCAR_SUPPORTED_CLOCKS (BIT(CLKR_CLKP1) | BIT(CLKR_CLKP2) | \
++                               BIT(CLKR_CLKEXT))
++
+ /* Mailbox configuration:
+  * mailbox 60 - 63 - Rx FIFO mailboxes
+  * mailbox 56 - 59 - Tx FIFO mailboxes
+@@ -789,7 +792,7 @@ static int rcar_can_probe(struct platform_device *pdev)
+               goto fail_clk;
+       }
+ 
+-      if (clock_select >= ARRAY_SIZE(clock_names)) {
++      if (!(BIT(clock_select) & RCAR_SUPPORTED_CLOCKS)) {
+               err = -EINVAL;
+               dev_err(&pdev->dev, "invalid CAN clock selected\n");
+               goto fail_clk;
+diff --git a/drivers/net/ethernet/amd/sunlance.c 
b/drivers/net/ethernet/amd/sunlance.c
+index 9b56b40259dc..3153465d4d02 100644
+--- a/drivers/net/ethernet/amd/sunlance.c
++++ b/drivers/net/ethernet/amd/sunlance.c
+@@ -1419,7 +1419,7 @@ static int sparc_lance_probe_one(struct platform_device 
*op,
+ 
+                       prop = of_get_property(nd, "tpe-link-test?", NULL);
+                       if (!prop)
+-                              goto no_link_test;
++                              goto node_put;
+ 
+                       if (strcmp(prop, "true")) {
+                               printk(KERN_NOTICE "SunLance: warning: 
overriding option "
+@@ -1428,6 +1428,8 @@ static int sparc_lance_probe_one(struct platform_device 
*op,
+                                      "to [email protected]\n");
+                               auxio_set_lte(AUXIO_LTE_ON);
+                       }
++node_put:
++                      of_node_put(nd);
+ no_link_test:
+                       lp->auto_select = 1;
+                       lp->tpe = 0;
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+index f3f2d66432ab..d5e4c42662b6 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+@@ -2187,6 +2187,13 @@ void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, 
u8 idu_sb_id,
+ #define PMF_DMAE_C(bp)                        (BP_PORT(bp) * 
MAX_DMAE_C_PER_PORT + \
+                                        E1HVN_MAX)
+ 
++/* Following is the DMAE channel number allocation for the clients.
++ *   MFW: OCBB/OCSD implementations use DMAE channels 14/15 respectively.
++ *   Driver: 0-3 and 8-11 (for PF dmae operations)
++ *           4 and 12 (for stats requests)
++ */
++#define BNX2X_FW_DMAE_C                 13 /* Channel for FW DMAE operations 
*/
++
+ /* PCIE link and speed */
+ #define PCICFG_LINK_WIDTH             0x1f00000
+ #define PCICFG_LINK_WIDTH_SHIFT               20
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
+index cea6bdcde33f..bf760c9cff6a 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
+@@ -6149,6 +6149,7 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp,
+       rdata->sd_vlan_tag      = cpu_to_le16(start_params->sd_vlan_tag);
+       rdata->path_id          = BP_PATH(bp);
+       rdata->network_cos_mode = start_params->network_cos_mode;
++      rdata->dmae_cmd_id      = BNX2X_FW_DMAE_C;
+ 
+       rdata->vxlan_dst_port   = cpu_to_le16(start_params->vxlan_dst_port);
+       rdata->geneve_dst_port  = cpu_to_le16(start_params->geneve_dst_port);
+diff --git a/drivers/net/ethernet/faraday/ftmac100.c 
b/drivers/net/ethernet/faraday/ftmac100.c
+index dce5f7b7f772..05e1f923f49e 100644
+--- a/drivers/net/ethernet/faraday/ftmac100.c
++++ b/drivers/net/ethernet/faraday/ftmac100.c
+@@ -865,11 +865,10 @@ static irqreturn_t ftmac100_interrupt(int irq, void 
*dev_id)
+       struct net_device *netdev = dev_id;
+       struct ftmac100 *priv = netdev_priv(netdev);
+ 
+-      if (likely(netif_running(netdev))) {
+-              /* Disable interrupts for polling */
+-              ftmac100_disable_all_int(priv);
++      /* Disable interrupts for polling */
++      ftmac100_disable_all_int(priv);
++      if (likely(netif_running(netdev)))
+               napi_schedule(&priv->napi);
+-      }
+ 
+       return IRQ_HANDLED;
+ }
+diff --git a/drivers/net/ethernet/mellanox/mlx4/alloc.c 
b/drivers/net/ethernet/mellanox/mlx4/alloc.c
+index 249a4584401a..b89a34fa3601 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/alloc.c
++++ b/drivers/net/ethernet/mellanox/mlx4/alloc.c
+@@ -339,7 +339,7 @@ void mlx4_zone_allocator_destroy(struct 
mlx4_zone_allocator *zone_alloc)
+ static u32 __mlx4_alloc_from_zone(struct mlx4_zone_entry *zone, int count,
+                                 int align, u32 skip_mask, u32 *puid)
+ {
+-      u32 uid;
++      u32 uid = 0;
+       u32 res;
+       struct mlx4_zone_allocator *zone_alloc = zone->allocator;
+       struct mlx4_zone_entry *curr_node;
+diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h 
b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+index 086920b615af..df5d86fa0a92 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+@@ -542,8 +542,8 @@ struct slave_list {
+ struct resource_allocator {
+       spinlock_t alloc_lock; /* protect quotas */
+       union {
+-              int res_reserved;
+-              int res_port_rsvd[MLX4_MAX_PORTS];
++              unsigned int res_reserved;
++              unsigned int res_port_rsvd[MLX4_MAX_PORTS];
+       };
+       union {
+               int res_free;
+diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c 
b/drivers/net/ethernet/mellanox/mlx4/mr.c
+index 395b5463cfd9..3637474cab8a 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/mr.c
++++ b/drivers/net/ethernet/mellanox/mlx4/mr.c
+@@ -366,6 +366,7 @@ int mlx4_mr_hw_write_mpt(struct mlx4_dev *dev, struct 
mlx4_mr *mmr,
+                       container_of((void *)mpt_entry, struct mlx4_cmd_mailbox,
+                                    buf);
+ 
++              (*mpt_entry)->lkey = 0;
+               err = mlx4_SW2HW_MPT(dev, mailbox, key);
+       }
+ 
+diff --git a/drivers/net/ethernet/qlogic/qed/qed_int.c 
b/drivers/net/ethernet/qlogic/qed/qed_int.c
+index 2adedc6fb6cf..fd19372db2f8 100644
+--- a/drivers/net/ethernet/qlogic/qed/qed_int.c
++++ b/drivers/net/ethernet/qlogic/qed/qed_int.c
+@@ -2135,6 +2135,8 @@ static int qed_int_attentions(struct qed_hwfn *p_hwfn)
+        */
+       do {
+               index = p_sb_attn->sb_index;
++              /* finish reading index before the loop condition */
++              dma_rmb();
+               attn_bits = le32_to_cpu(p_sb_attn->atten_bits);
+               attn_acks = le32_to_cpu(p_sb_attn->atten_ack);
+       } while (index != p_sb_attn->sb_index);
+diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c 
b/drivers/net/ethernet/qlogic/qed/qed_main.c
+index 1ed13a165e58..a769196628d9 100644
+--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
++++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
+@@ -1395,9 +1395,9 @@ static int qed_drain(struct qed_dev *cdev)
+                       return -EBUSY;
+               }
+               rc = qed_mcp_drain(hwfn, ptt);
++              qed_ptt_release(hwfn, ptt);
+               if (rc)
+                       return rc;
+-              qed_ptt_release(hwfn, ptt);
+       }
+ 
+       return 0;
+diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
+index 9670aa23ffb9..94b05dd827af 100644
+--- a/drivers/net/team/team.c
++++ b/drivers/net/team/team.c
+@@ -989,8 +989,6 @@ static void team_port_disable(struct team *team,
+       team->en_port_count--;
+       team_queue_override_port_del(team, port);
+       team_adjust_ops(team);
+-      team_notify_peers(team);
+-      team_mcast_rejoin(team);
+       team_lower_state_changed(port);
+ }
+ 
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
+index e7584b842dce..eb5db94f5745 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
+@@ -193,6 +193,9 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
+               }
+               break;
+       case BRCMU_CHSPEC_D11AC_BW_160:
++              ch->bw = BRCMU_CHAN_BW_160;
++              ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,
++                                       BRCMU_CHSPEC_D11AC_SB_SHIFT);
+               switch (ch->sb) {
+               case BRCMU_CHAN_SB_LLL:
+                       ch->control_ch_num -= CH_70MHZ_APART;
+diff --git a/drivers/net/wireless/mac80211_hwsim.c 
b/drivers/net/wireless/mac80211_hwsim.c
+index cbb3e902e347..0852a1aad075 100644
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -2633,6 +2633,10 @@ static int mac80211_hwsim_new_radio(struct genl_info 
*info,
+       if (param->no_vif)
+               ieee80211_hw_set(hw, NO_AUTO_VIF);
+ 
++      tasklet_hrtimer_init(&data->beacon_timer,
++                           mac80211_hwsim_beacon,
++                           CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
++
+       err = ieee80211_register_hw(hw);
+       if (err < 0) {
+               printk(KERN_DEBUG "mac80211_hwsim: ieee80211_register_hw failed 
(%d)\n",
+@@ -2657,10 +2661,6 @@ static int mac80211_hwsim_new_radio(struct genl_info 
*info,
+                                   data->debugfs,
+                                   data, &hwsim_simulate_radar);
+ 
+-      tasklet_hrtimer_init(&data->beacon_timer,
+-                           mac80211_hwsim_beacon,
+-                           CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+-
+       spin_lock_bh(&hwsim_radio_lock);
+       list_add_tail(&data->list, &hwsim_radios);
+       spin_unlock_bh(&hwsim_radio_lock);
+diff --git a/drivers/s390/virtio/virtio_ccw.c 
b/drivers/s390/virtio/virtio_ccw.c
+index 8688ad4c825f..3493d449911c 100644
+--- a/drivers/s390/virtio/virtio_ccw.c
++++ b/drivers/s390/virtio/virtio_ccw.c
+@@ -59,6 +59,7 @@ struct virtio_ccw_device {
+       unsigned int revision; /* Transport revision */
+       wait_queue_head_t wait_q;
+       spinlock_t lock;
++      struct mutex io_lock; /* Serializes I/O requests */
+       struct list_head virtqueues;
+       unsigned long indicators;
+       unsigned long indicators2;
+@@ -307,6 +308,7 @@ static int ccw_io_helper(struct virtio_ccw_device *vcdev,
+       unsigned long flags;
+       int flag = intparm & VIRTIO_CCW_INTPARM_MASK;
+ 
++      mutex_lock(&vcdev->io_lock);
+       do {
+               spin_lock_irqsave(get_ccwdev_lock(vcdev->cdev), flags);
+               ret = ccw_device_start(vcdev->cdev, ccw, intparm, 0, 0);
+@@ -319,7 +321,9 @@ static int ccw_io_helper(struct virtio_ccw_device *vcdev,
+               cpu_relax();
+       } while (ret == -EBUSY);
+       wait_event(vcdev->wait_q, doing_io(vcdev, flag) == 0);
+-      return ret ? ret : vcdev->err;
++      ret = ret ? ret : vcdev->err;
++      mutex_unlock(&vcdev->io_lock);
++      return ret;
+ }
+ 
+ static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev,
+@@ -837,6 +841,7 @@ static void virtio_ccw_get_config(struct virtio_device 
*vdev,
+       int ret;
+       struct ccw1 *ccw;
+       void *config_area;
++      unsigned long flags;
+ 
+       ccw = kzalloc(sizeof(*ccw), GFP_DMA | GFP_KERNEL);
+       if (!ccw)
+@@ -855,11 +860,13 @@ static void virtio_ccw_get_config(struct virtio_device 
*vdev,
+       if (ret)
+               goto out_free;
+ 
++      spin_lock_irqsave(&vcdev->lock, flags);
+       memcpy(vcdev->config, config_area, offset + len);
+-      if (buf)
+-              memcpy(buf, &vcdev->config[offset], len);
+       if (vcdev->config_ready < offset + len)
+               vcdev->config_ready = offset + len;
++      spin_unlock_irqrestore(&vcdev->lock, flags);
++      if (buf)
++              memcpy(buf, config_area + offset, len);
+ 
+ out_free:
+       kfree(config_area);
+@@ -873,6 +880,7 @@ static void virtio_ccw_set_config(struct virtio_device 
*vdev,
+       struct virtio_ccw_device *vcdev = to_vc_device(vdev);
+       struct ccw1 *ccw;
+       void *config_area;
++      unsigned long flags;
+ 
+       ccw = kzalloc(sizeof(*ccw), GFP_DMA | GFP_KERNEL);
+       if (!ccw)
+@@ -885,9 +893,11 @@ static void virtio_ccw_set_config(struct virtio_device 
*vdev,
+       /* Make sure we don't overwrite fields. */
+       if (vcdev->config_ready < offset)
+               virtio_ccw_get_config(vdev, 0, NULL, offset);
++      spin_lock_irqsave(&vcdev->lock, flags);
+       memcpy(&vcdev->config[offset], buf, len);
+       /* Write the config area to the host. */
+       memcpy(config_area, vcdev->config, sizeof(vcdev->config));
++      spin_unlock_irqrestore(&vcdev->lock, flags);
+       ccw->cmd_code = CCW_CMD_WRITE_CONF;
+       ccw->flags = 0;
+       ccw->count = offset + len;
+@@ -1233,6 +1243,7 @@ static int virtio_ccw_online(struct ccw_device *cdev)
+       init_waitqueue_head(&vcdev->wait_q);
+       INIT_LIST_HEAD(&vcdev->virtqueues);
+       spin_lock_init(&vcdev->lock);
++      mutex_init(&vcdev->io_lock);
+ 
+       spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+       dev_set_drvdata(&cdev->dev, vcdev);
+diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
+index 03054c0e7689..3c3e8115f73d 100644
+--- a/drivers/scsi/sr_ioctl.c
++++ b/drivers/scsi/sr_ioctl.c
+@@ -187,30 +187,25 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
+       struct scsi_device *SDev;
+       struct scsi_sense_hdr sshdr;
+       int result, err = 0, retries = 0;
+-      struct request_sense *sense = cgc->sense;
++      unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];
+ 
+       SDev = cd->device;
+ 
+-      if (!sense) {
+-              sense = kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL);
+-              if (!sense) {
+-                      err = -ENOMEM;
+-                      goto out;
+-              }
+-      }
+-
+       retry:
+       if (!scsi_block_when_processing_errors(SDev)) {
+               err = -ENODEV;
+               goto out;
+       }
+ 
+-      memset(sense, 0, sizeof(*sense));
++      memset(sense_buffer, 0, sizeof(sense_buffer));
+       result = scsi_execute(SDev, cgc->cmd, cgc->data_direction,
+-                            cgc->buffer, cgc->buflen, (char *)sense,
++                            cgc->buffer, cgc->buflen, sense_buffer,
+                             cgc->timeout, IOCTL_RETRIES, 0, NULL);
+ 
+-      scsi_normalize_sense((char *)sense, sizeof(*sense), &sshdr);
++      scsi_normalize_sense(sense_buffer, sizeof(sense_buffer), &sshdr);
++
++      if (cgc->sense)
++              memcpy(cgc->sense, sense_buffer, sizeof(*cgc->sense));
+ 
+       /* Minimal error checking.  Ignore cases we know about, and report the 
rest. */
+       if (driver_byte(result) != 0) {
+@@ -261,8 +256,6 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
+ 
+       /* Wake up a process waiting for device */
+       out:
+-      if (!cgc->sense)
+-              kfree(sense);
+       cgc->stat = err;
+       return err;
+ }
+diff --git a/drivers/staging/lustre/lnet/lnet/config.c 
b/drivers/staging/lustre/lnet/lnet/config.c
+index 9e2183ff847e..7a4d5a013797 100644
+--- a/drivers/staging/lustre/lnet/lnet/config.c
++++ b/drivers/staging/lustre/lnet/lnet/config.c
+@@ -354,8 +354,7 @@ lnet_parse_networks(struct list_head *nilist, char 
*networks)
+                               CERROR("Can't allocate net interface name\n");
+                               goto failed;
+                       }
+-                      strncpy(ni->ni_interfaces[niface], iface,
+-                              strlen(iface));
++                      strcpy(ni->ni_interfaces[niface], iface);
+                       niface++;
+                       iface = comma;
+               } while (iface);
+diff --git a/drivers/staging/lustre/lustre/lmv/lmv_obd.c 
b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
+index 9e63171c1ec3..514f078749bb 100644
+--- a/drivers/staging/lustre/lustre/lmv/lmv_obd.c
++++ b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
+@@ -684,7 +684,7 @@ repeat_fid2path:
+               memmove(ptr + strlen(gf->gf_path) + 1, ptr,
+                       strlen(ori_gf->gf_path));
+ 
+-              strncpy(ptr, gf->gf_path, strlen(gf->gf_path));
++              strcpy(ptr, gf->gf_path);
+               ptr += strlen(gf->gf_path);
+               *ptr = '/';
+       }
+diff --git a/drivers/staging/rtl8712/mlme_linux.c 
b/drivers/staging/rtl8712/mlme_linux.c
+index af7c4a47738a..590d43c034e6 100644
+--- a/drivers/staging/rtl8712/mlme_linux.c
++++ b/drivers/staging/rtl8712/mlme_linux.c
+@@ -158,7 +158,7 @@ void r8712_report_sec_ie(struct _adapter *adapter, u8 
authmode, u8 *sec_ie)
+               p = buff;
+               p += sprintf(p, "ASSOCINFO(ReqIEs=");
+               len = sec_ie[1] + 2;
+-              len =  (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX - 1;
++              len =  (len < IW_CUSTOM_MAX) ? len : IW_CUSTOM_MAX;
+               for (i = 0; i < len; i++)
+                       p += sprintf(p, "%02x", sec_ie[i]);
+               p += sprintf(p, ")");
+diff --git a/drivers/staging/rtl8712/rtl871x_mlme.c 
b/drivers/staging/rtl8712/rtl871x_mlme.c
+index c1feef3da26c..9a5da7f84524 100644
+--- a/drivers/staging/rtl8712/rtl871x_mlme.c
++++ b/drivers/staging/rtl8712/rtl871x_mlme.c
+@@ -1365,7 +1365,7 @@ sint r8712_restruct_sec_ie(struct _adapter *adapter, u8 
*in_ie,
+                    u8 *out_ie, uint in_len)
+ {
+       u8 authmode = 0, match;
+-      u8 sec_ie[255], uncst_oui[4], bkup_ie[255];
++      u8 sec_ie[IW_CUSTOM_MAX], uncst_oui[4], bkup_ie[255];
+       u8 wpa_oui[4] = {0x0, 0x50, 0xf2, 0x01};
+       uint ielength, cnt, remove_cnt;
+       int iEntry;
+diff --git a/drivers/tty/serial/8250/8250_mtk.c 
b/drivers/tty/serial/8250/8250_mtk.c
+index ce0cc471bfc3..91db9ca1c6c9 100644
+--- a/drivers/tty/serial/8250/8250_mtk.c
++++ b/drivers/tty/serial/8250/8250_mtk.c
+@@ -225,17 +225,17 @@ static int mtk8250_probe(struct platform_device *pdev)
+ 
+       platform_set_drvdata(pdev, data);
+ 
+-      pm_runtime_enable(&pdev->dev);
+-      if (!pm_runtime_enabled(&pdev->dev)) {
+-              err = mtk8250_runtime_resume(&pdev->dev);
+-              if (err)
+-                      return err;
+-      }
++      err = mtk8250_runtime_resume(&pdev->dev);
++      if (err)
++              return err;
+ 
+       data->line = serial8250_register_8250_port(&uart);
+       if (data->line < 0)
+               return data->line;
+ 
++      pm_runtime_set_active(&pdev->dev);
++      pm_runtime_enable(&pdev->dev);
++
+       return 0;
+ }
+ 
+@@ -246,13 +246,11 @@ static int mtk8250_remove(struct platform_device *pdev)
+       pm_runtime_get_sync(&pdev->dev);
+ 
+       serial8250_unregister_port(data->line);
++      mtk8250_runtime_suspend(&pdev->dev);
+ 
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
+ 
+-      if (!pm_runtime_status_suspended(&pdev->dev))
+-              mtk8250_runtime_suspend(&pdev->dev);
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c
+index c448225ef5ca..f2b0d8cee8ef 100644
+--- a/drivers/tty/serial/kgdboc.c
++++ b/drivers/tty/serial/kgdboc.c
+@@ -232,7 +232,7 @@ static void kgdboc_put_char(u8 chr)
+ 
+ static int param_set_kgdboc_var(const char *kmessage, struct kernel_param *kp)
+ {
+-      int len = strlen(kmessage);
++      size_t len = strlen(kmessage);
+ 
+       if (len >= MAX_CONFIG_LEN) {
+               printk(KERN_ERR "kgdboc: config string too long\n");
+@@ -254,7 +254,7 @@ static int param_set_kgdboc_var(const char *kmessage, 
struct kernel_param *kp)
+ 
+       strcpy(config, kmessage);
+       /* Chop out \n char as a result of echo */
+-      if (config[len - 1] == '\n')
++      if (len && config[len - 1] == '\n')
+               config[len - 1] = '\0';
+ 
+       if (configured == 1)
+diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c
+index c3f9d93ba227..7f2f20b74d1d 100644
+--- a/drivers/tty/tty_port.c
++++ b/drivers/tty/tty_port.c
+@@ -531,7 +531,8 @@ void tty_port_close(struct tty_port *port, struct 
tty_struct *tty,
+       if (tty_port_close_start(port, tty, filp) == 0)
+               return;
+       tty_port_shutdown(port, tty);
+-      set_bit(TTY_IO_ERROR, &tty->flags);
++      if (!port->console)
++              set_bit(TTY_IO_ERROR, &tty->flags);
+       tty_port_close_end(port, tty);
+       tty_port_tty_set(port, NULL);
+ }
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 851f5a553de2..67679f619c3b 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -2225,7 +2225,7 @@ static int usb_enumerate_device_otg(struct usb_device 
*udev)
+               /* descriptor may appear anywhere in config */
+               err = __usb_get_extra_descriptor(udev->rawdescriptors[0],
+                               le16_to_cpu(udev->config[0].desc.wTotalLength),
+-                              USB_DT_OTG, (void **) &desc);
++                              USB_DT_OTG, (void **) &desc, sizeof(*desc));
+               if (err || !(desc->bmAttributes & USB_OTG_HNP))
+                       return 0;
+ 
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 808437c5ec49..cf378b1ed373 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -188,6 +188,10 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* Midiman M-Audio Keystation 88es */
+       { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
++      /* SanDisk Ultra Fit and Ultra Flair */
++      { USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM },
++      { USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM },
++
+       /* M-Systems Flash Disk Pioneers */
+       { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
+index 891261b43c67..f3996ba71a59 100644
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -696,14 +696,14 @@ EXPORT_SYMBOL_GPL(usb_get_current_frame_number);
+  */
+ 
+ int __usb_get_extra_descriptor(char *buffer, unsigned size,
+-                             unsigned char type, void **ptr)
++                             unsigned char type, void **ptr, size_t minsize)
+ {
+       struct usb_descriptor_header *header;
+ 
+       while (size >= sizeof(struct usb_descriptor_header)) {
+               header = (struct usb_descriptor_header *)buffer;
+ 
+-              if (header->bLength < 2) {
++              if (header->bLength < 2 || header->bLength > size) {
+                       printk(KERN_ERR
+                               "%s: bogus descriptor, type %d length %d\n",
+                               usbcore_name,
+@@ -712,7 +712,7 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size,
+                       return -1;
+               }
+ 
+-              if (header->bDescriptorType == type) {
++              if (header->bDescriptorType == type && header->bLength >= 
minsize) {
+                       *ptr = header;
+                       return 0;
+               }
+diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c
+index 1db0626c8bf4..97750f162f01 100644
+--- a/drivers/usb/host/hwa-hc.c
++++ b/drivers/usb/host/hwa-hc.c
+@@ -654,7 +654,7 @@ static int hwahc_security_create(struct hwahc *hwahc)
+       top = itr + itr_size;
+       result = __usb_get_extra_descriptor(usb_dev->rawdescriptors[index],
+                       le16_to_cpu(usb_dev->actconfig->desc.wTotalLength),
+-                      USB_DT_SECURITY, (void **) &secd);
++                      USB_DT_SECURITY, (void **) &secd, sizeof(*secd));
+       if (result == -1) {
+               dev_warn(dev, "BUG? WUSB host has no security descriptors\n");
+               return 0;
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index e9f5f9c32b49..7ff32088cfa4 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -4398,6 +4398,14 @@ static u16 xhci_calculate_u1_timeout(struct xhci_hcd 
*xhci,
+ {
+       unsigned long long timeout_ns;
+ 
++      /* Prevent U1 if service interval is shorter than U1 exit latency */
++      if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
++              if (xhci_service_interval_to_ns(desc) <= udev->u1_params.mel) {
++                      dev_dbg(&udev->dev, "Disable U1, ESIT shorter than exit 
latency\n");
++                      return USB3_LPM_DISABLED;
++              }
++      }
++
+       if (xhci->quirks & XHCI_INTEL_HOST)
+               timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
+       else
+@@ -4454,6 +4462,14 @@ static u16 xhci_calculate_u2_timeout(struct xhci_hcd 
*xhci,
+ {
+       unsigned long long timeout_ns;
+ 
++      /* Prevent U2 if service interval is shorter than U2 exit latency */
++      if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
++              if (xhci_service_interval_to_ns(desc) <= udev->u2_params.mel) {
++                      dev_dbg(&udev->dev, "Disable U2, ESIT shorter than exit 
latency\n");
++                      return USB3_LPM_DISABLED;
++              }
++      }
++
+       if (xhci->quirks & XHCI_INTEL_HOST)
+               timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
+       else
+diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c
+index 2d3c656e0bff..b8092bcf89a2 100644
+--- a/drivers/usb/misc/appledisplay.c
++++ b/drivers/usb/misc/appledisplay.c
+@@ -64,6 +64,7 @@ static const struct usb_device_id appledisplay_table[] = {
+       { APPLEDISPLAY_DEVICE(0x921c) },
+       { APPLEDISPLAY_DEVICE(0x921d) },
+       { APPLEDISPLAY_DEVICE(0x9222) },
++      { APPLEDISPLAY_DEVICE(0x9226) },
+       { APPLEDISPLAY_DEVICE(0x9236) },
+ 
+       /* Terminating entry */
+diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
+index 0ec970ca64ce..f800f89068db 100644
+--- a/drivers/vhost/vsock.c
++++ b/drivers/vhost/vsock.c
+@@ -15,6 +15,7 @@
+ #include <net/sock.h>
+ #include <linux/virtio_vsock.h>
+ #include <linux/vhost.h>
++#include <linux/hashtable.h>
+ 
+ #include <net/af_vsock.h>
+ #include "vhost.h"
+@@ -27,14 +28,14 @@ enum {
+ 
+ /* Used to track all the vhost_vsock instances on the system. */
+ static DEFINE_SPINLOCK(vhost_vsock_lock);
+-static LIST_HEAD(vhost_vsock_list);
++static DEFINE_READ_MOSTLY_HASHTABLE(vhost_vsock_hash, 8);
+ 
+ struct vhost_vsock {
+       struct vhost_dev dev;
+       struct vhost_virtqueue vqs[2];
+ 
+-      /* Link to global vhost_vsock_list, protected by vhost_vsock_lock */
+-      struct list_head list;
++      /* Link to global vhost_vsock_hash, writes use vhost_vsock_lock */
++      struct hlist_node hash;
+ 
+       struct vhost_work send_pkt_work;
+       spinlock_t send_pkt_list_lock;
+@@ -50,12 +51,14 @@ static u32 vhost_transport_get_local_cid(void)
+       return VHOST_VSOCK_DEFAULT_HOST_CID;
+ }
+ 
++/* Callers that dereference the return value must hold vhost_vsock_lock or the
++ * RCU read lock.
++ */
+ static struct vhost_vsock *vhost_vsock_get(u32 guest_cid)
+ {
+       struct vhost_vsock *vsock;
+ 
+-      spin_lock_bh(&vhost_vsock_lock);
+-      list_for_each_entry(vsock, &vhost_vsock_list, list) {
++      hash_for_each_possible_rcu(vhost_vsock_hash, vsock, hash, guest_cid) {
+               u32 other_cid = vsock->guest_cid;
+ 
+               /* Skip instances that have no CID yet */
+@@ -63,11 +66,9 @@ static struct vhost_vsock *vhost_vsock_get(u32 guest_cid)
+                       continue;
+ 
+               if (other_cid == guest_cid) {
+-                      spin_unlock_bh(&vhost_vsock_lock);
+                       return vsock;
+               }
+       }
+-      spin_unlock_bh(&vhost_vsock_lock);
+ 
+       return NULL;
+ }
+@@ -198,9 +199,12 @@ vhost_transport_send_pkt(struct virtio_vsock_pkt *pkt)
+       struct vhost_virtqueue *vq;
+       int len = pkt->len;
+ 
++      rcu_read_lock();
++
+       /* Find the vhost_vsock according to guest context id  */
+       vsock = vhost_vsock_get(le64_to_cpu(pkt->hdr.dst_cid));
+       if (!vsock) {
++              rcu_read_unlock();
+               virtio_transport_free_pkt(pkt);
+               return -ENODEV;
+       }
+@@ -215,6 +219,8 @@ vhost_transport_send_pkt(struct virtio_vsock_pkt *pkt)
+       spin_unlock_bh(&vsock->send_pkt_list_lock);
+ 
+       vhost_work_queue(&vsock->dev, &vsock->send_pkt_work);
++
++      rcu_read_unlock();
+       return len;
+ }
+ 
+@@ -224,12 +230,15 @@ vhost_transport_cancel_pkt(struct vsock_sock *vsk)
+       struct vhost_vsock *vsock;
+       struct virtio_vsock_pkt *pkt, *n;
+       int cnt = 0;
++      int ret = -ENODEV;
+       LIST_HEAD(freeme);
+ 
++      rcu_read_lock();
++
+       /* Find the vhost_vsock according to guest context id  */
+       vsock = vhost_vsock_get(vsk->remote_addr.svm_cid);
+       if (!vsock)
+-              return -ENODEV;
++              goto out;
+ 
+       spin_lock_bh(&vsock->send_pkt_list_lock);
+       list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) {
+@@ -255,7 +264,10 @@ vhost_transport_cancel_pkt(struct vsock_sock *vsk)
+                       vhost_poll_queue(&tx_vq->poll);
+       }
+ 
+-      return 0;
++      ret = 0;
++out:
++      rcu_read_unlock();
++      return ret;
+ }
+ 
+ static struct virtio_vsock_pkt *
+@@ -521,10 +533,6 @@ static int vhost_vsock_dev_open(struct inode *inode, 
struct file *file)
+       spin_lock_init(&vsock->send_pkt_list_lock);
+       INIT_LIST_HEAD(&vsock->send_pkt_list);
+       vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work);
+-
+-      spin_lock_bh(&vhost_vsock_lock);
+-      list_add_tail(&vsock->list, &vhost_vsock_list);
+-      spin_unlock_bh(&vhost_vsock_lock);
+       return 0;
+ 
+ out:
+@@ -565,9 +573,13 @@ static int vhost_vsock_dev_release(struct inode *inode, 
struct file *file)
+       struct vhost_vsock *vsock = file->private_data;
+ 
+       spin_lock_bh(&vhost_vsock_lock);
+-      list_del(&vsock->list);
++      if (vsock->guest_cid)
++              hash_del_rcu(&vsock->hash);
+       spin_unlock_bh(&vhost_vsock_lock);
+ 
++      /* Wait for other CPUs to finish using vsock */
++      synchronize_rcu();
++
+       /* Iterating over all connections for all CIDs to find orphans is
+        * inefficient.  Room for improvement here. */
+       vsock_for_each_connected_socket(vhost_vsock_reset_orphans);
+@@ -607,12 +619,18 @@ static int vhost_vsock_set_cid(struct vhost_vsock 
*vsock, u64 guest_cid)
+               return -EINVAL;
+ 
+       /* Refuse if CID is already in use */
++      spin_lock_bh(&vhost_vsock_lock);
+       other = vhost_vsock_get(guest_cid);
+-      if (other && other != vsock)
++      if (other && other != vsock) {
++              spin_unlock_bh(&vhost_vsock_lock);
+               return -EADDRINUSE;
++      }
++
++      if (vsock->guest_cid)
++              hash_del_rcu(&vsock->hash);
+ 
+-      spin_lock_bh(&vhost_vsock_lock);
+       vsock->guest_cid = guest_cid;
++      hash_add_rcu(vhost_vsock_hash, &vsock->hash, guest_cid);
+       spin_unlock_bh(&vhost_vsock_lock);
+ 
+       return 0;
+diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
+index 331ddd07e505..e98e24eaa6a8 100644
+--- a/fs/cifs/dir.c
++++ b/fs/cifs/dir.c
+@@ -163,7 +163,7 @@ cifs_bp_rename_retry:
+ 
+               cifs_dbg(FYI, "using cifs_sb prepath <%s>\n", cifs_sb->prepath);
+               memcpy(full_path+dfsplen+1, cifs_sb->prepath, pplen-1);
+-              full_path[dfsplen] = '\\';
++              full_path[dfsplen] = dirsep;
+               for (i = 0; i < pplen-1; i++)
+                       if (full_path[dfsplen+1+i] == '/')
+                               full_path[dfsplen+1+i] = CIFS_DIR_SEP(cifs_sb);
+diff --git a/include/linux/usb.h b/include/linux/usb.h
+index eba1f10e8cfd..346665a0c49d 100644
+--- a/include/linux/usb.h
++++ b/include/linux/usb.h
+@@ -336,11 +336,11 @@ struct usb_host_bos {
+ };
+ 
+ int __usb_get_extra_descriptor(char *buffer, unsigned size,
+-      unsigned char type, void **ptr);
++      unsigned char type, void **ptr, size_t min);
+ #define usb_get_extra_descriptor(ifpoint, type, ptr) \
+                               __usb_get_extra_descriptor((ifpoint)->extra, \
+                               (ifpoint)->extralen, \
+-                              type, (void **)ptr)
++                              type, (void **)ptr, sizeof(**(ptr)))
+ 
+ /* ----------------------------------------------------------------------- */
+ 
+diff --git a/include/sound/pcm_params.h b/include/sound/pcm_params.h
+index c704357775fc..2af7bb3ee57d 100644
+--- a/include/sound/pcm_params.h
++++ b/include/sound/pcm_params.h
+@@ -247,11 +247,13 @@ static inline int snd_interval_empty(const struct 
snd_interval *i)
+ static inline int snd_interval_single(const struct snd_interval *i)
+ {
+       return (i->min == i->max || 
+-              (i->min + 1 == i->max && i->openmax));
++              (i->min + 1 == i->max && (i->openmin || i->openmax)));
+ }
+ 
+ static inline int snd_interval_value(const struct snd_interval *i)
+ {
++      if (i->openmin && !i->openmax)
++              return i->max;
+       return i->min;
+ }
+ 
+diff --git a/lib/swiotlb.c b/lib/swiotlb.c
+index b7812df04437..7ff9dc36c2f8 100644
+--- a/lib/swiotlb.c
++++ b/lib/swiotlb.c
+@@ -17,6 +17,8 @@
+  * 08/12/11 beckyb    Add highmem support
+  */
+ 
++#define pr_fmt(fmt) "software IO TLB: " fmt
++
+ #include <linux/cache.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/mm.h>
+@@ -147,20 +149,16 @@ static bool no_iotlb_memory;
+ void swiotlb_print_info(void)
+ {
+       unsigned long bytes = io_tlb_nslabs << IO_TLB_SHIFT;
+-      unsigned char *vstart, *vend;
+ 
+       if (no_iotlb_memory) {
+-              pr_warn("software IO TLB: No low mem\n");
++              pr_warn("No low mem\n");
+               return;
+       }
+ 
+-      vstart = phys_to_virt(io_tlb_start);
+-      vend = phys_to_virt(io_tlb_end);
+-
+-      printk(KERN_INFO "software IO TLB [mem %#010llx-%#010llx] (%luMB) 
mapped at [%p-%p]\n",
++      pr_info("mapped [mem %#010llx-%#010llx] (%luMB)\n",
+              (unsigned long long)io_tlb_start,
+              (unsigned long long)io_tlb_end,
+-             bytes >> 20, vstart, vend - 1);
++             bytes >> 20);
+ }
+ 
+ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
+@@ -234,7 +232,7 @@ swiotlb_init(int verbose)
+       if (io_tlb_start)
+               memblock_free_early(io_tlb_start,
+                                   PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
+-      pr_warn("Cannot allocate SWIOTLB buffer");
++      pr_warn("Cannot allocate buffer");
+       no_iotlb_memory = true;
+ }
+ 
+@@ -276,8 +274,8 @@ swiotlb_late_init_with_default_size(size_t default_size)
+               return -ENOMEM;
+       }
+       if (order != get_order(bytes)) {
+-              printk(KERN_WARNING "Warning: only able to allocate %ld MB "
+-                     "for software IO TLB\n", (PAGE_SIZE << order) >> 20);
++              pr_warn("only able to allocate %ld MB\n",
++                      (PAGE_SIZE << order) >> 20);
+               io_tlb_nslabs = SLABS_PER_PAGE << order;
+       }
+       rc = swiotlb_late_init_with_tbl(vstart, io_tlb_nslabs);
+@@ -691,7 +689,7 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size,
+       return ret;
+ 
+ err_warn:
+-      pr_warn("swiotlb: coherent allocation failed for device %s size=%zu\n",
++      pr_warn("coherent allocation failed for device %s size=%zu\n",
+               dev_name(hwdev), size);
+       dump_stack();
+ 
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 28240ce475d6..3af727d95c17 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3530,8 +3530,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int 
order,
+       enum compact_result compact_result;
+       int compaction_retries;
+       int no_progress_loops;
+-      unsigned long alloc_start = jiffies;
+-      unsigned int stall_timeout = 10 * HZ;
+       unsigned int cpuset_mems_cookie;
+ 
+       /*
+@@ -3704,14 +3702,6 @@ retry:
+       if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_REPEAT))
+               goto nopage;
+ 
+-      /* Make sure we know about allocations which stall for too long */
+-      if (time_after(jiffies, alloc_start + stall_timeout)) {
+-              warn_alloc(gfp_mask,
+-                      "page allocation stalls for %ums, order:%u",
+-                      jiffies_to_msecs(jiffies-alloc_start), order);
+-              stall_timeout += 10 * HZ;
+-      }
+-
+       if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags,
+                                did_some_progress > 0, &no_progress_loops))
+               goto retry;
+diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
+index 57215e3fd1a0..a06b6041f3e0 100644
+--- a/net/batman-adv/fragmentation.c
++++ b/net/batman-adv/fragmentation.c
+@@ -264,7 +264,7 @@ batadv_frag_merge_packets(struct hlist_head *chain)
+       kfree(entry);
+ 
+       packet = (struct batadv_frag_packet *)skb_out->data;
+-      size = ntohs(packet->total_size);
++      size = ntohs(packet->total_size) + hdr_size;
+ 
+       /* Make room for the rest of the fragments. */
+       if (pskb_expand_head(skb_out, 0, size - skb_out->len, GFP_ATOMIC) < 0) {
+diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
+index 760ba8ec2944..5768560cbfc3 100644
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -1025,6 +1025,8 @@ static void ieee80211_do_stop(struct 
ieee80211_sub_if_data *sdata,
+       if (local->open_count == 0)
+               ieee80211_clear_tx_pending(local);
+ 
++      sdata->vif.bss_conf.beacon_int = 0;
++
+       /*
+        * If the interface goes down while suspended, presumably because
+        * the device was unplugged and that happens before our resume,
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index 474655a2aeae..93c332737e86 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -1230,6 +1230,7 @@ ieee80211_rx_h_check_dup(struct ieee80211_rx_data *rx)
+               return RX_CONTINUE;
+ 
+       if (ieee80211_is_ctl(hdr->frame_control) ||
++          ieee80211_is_nullfunc(hdr->frame_control) ||
+           ieee80211_is_qos_nullfunc(hdr->frame_control) ||
+           is_multicast_ether_addr(hdr->addr1))
+               return RX_CONTINUE;
+diff --git a/net/mac80211/status.c b/net/mac80211/status.c
+index 7892bac21eac..246d113bd755 100644
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -660,6 +660,8 @@ void ieee80211_tx_status_noskb(struct ieee80211_hw *hw,
+                       /* Track when last TDLS packet was ACKed */
+                       if (test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH))
+                               sta->status_stats.last_tdls_pkt_time = jiffies;
++              } else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
++                      return;
+               } else {
+                       ieee80211_lost_packet(sta, info);
+               }
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index 58fba4e569e6..6a0fb9dbc1ba 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -434,8 +434,8 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data 
*tx)
+       if (ieee80211_hw_check(&tx->local->hw, QUEUE_CONTROL))
+               info->hw_queue = tx->sdata->vif.cab_queue;
+ 
+-      /* no stations in PS mode */
+-      if (!atomic_read(&ps->num_sta_ps))
++      /* no stations in PS mode and no buffered packets */
++      if (!atomic_read(&ps->num_sta_ps) && skb_queue_empty(&ps->bc_buf))
+               return TX_CONTINUE;
+ 
+       info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM;
+diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
+index 16cea00c959b..591d378d1a18 100644
+--- a/net/sunrpc/auth_gss/auth_gss.c
++++ b/net/sunrpc/auth_gss/auth_gss.c
+@@ -1736,6 +1736,7 @@ priv_release_snd_buf(struct rpc_rqst *rqstp)
+       for (i=0; i < rqstp->rq_enc_pages_num; i++)
+               __free_page(rqstp->rq_enc_pages[i]);
+       kfree(rqstp->rq_enc_pages);
++      rqstp->rq_release_snd_buf = NULL;
+ }
+ 
+ static int
+@@ -1744,6 +1745,9 @@ alloc_enc_pages(struct rpc_rqst *rqstp)
+       struct xdr_buf *snd_buf = &rqstp->rq_snd_buf;
+       int first, last, i;
+ 
++      if (rqstp->rq_release_snd_buf)
++              rqstp->rq_release_snd_buf(rqstp);
++
+       if (snd_buf->page_len == 0) {
+               rqstp->rq_enc_pages_num = 0;
+               return 0;
+diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
+index 123840d827e8..7f430778f418 100644
+--- a/scripts/Kbuild.include
++++ b/scripts/Kbuild.include
+@@ -162,12 +162,13 @@ cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && 
echo $(3) || echo $(4))
+ # cc-ldoption
+ # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
+ cc-ldoption = $(call try-run,\
+-      $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
++      $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c 
/dev/null -o "$$TMP",$(1),$(2))
+ 
+ # ld-option
+ # Usage: LDFLAGS += $(call ld-option, -X)
+ ld-option = $(call try-run,\
+-      $(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o 
"$$TMP",$(1),$(2))
++      $(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -x c /dev/null -c -o 
"$$TMPO"; \
++      $(LD) $(LDFLAGS) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))
+ 
+ # ar-option
+ # Usage: KBUILD_ARFLAGS := $(call ar-option,D)
+diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
+index 79018697b477..3586ab41dec4 100644
+--- a/sound/core/pcm_native.c
++++ b/sound/core/pcm_native.c
+@@ -35,6 +35,7 @@
+ #include <sound/timer.h>
+ #include <sound/minors.h>
+ #include <linux/uio.h>
++#include <linux/delay.h>
+ 
+ /*
+  *  Compatibility
+@@ -78,12 +79,12 @@ static DECLARE_RWSEM(snd_pcm_link_rwsem);
+  * and this may lead to a deadlock when the code path takes read sem
+  * twice (e.g. one in snd_pcm_action_nonatomic() and another in
+  * snd_pcm_stream_lock()).  As a (suboptimal) workaround, let writer to
+- * spin until it gets the lock.
++ * sleep until all the readers are completed without blocking by writer.
+  */
+-static inline void down_write_nonblock(struct rw_semaphore *lock)
++static inline void down_write_nonfifo(struct rw_semaphore *lock)
+ {
+       while (!down_write_trylock(lock))
+-              cond_resched();
++              msleep(1);
+ }
+ 
+ /**
+@@ -1825,7 +1826,7 @@ static int snd_pcm_link(struct snd_pcm_substream 
*substream, int fd)
+               res = -ENOMEM;
+               goto _nolock;
+       }
+-      down_write_nonblock(&snd_pcm_link_rwsem);
++      down_write_nonfifo(&snd_pcm_link_rwsem);
+       write_lock_irq(&snd_pcm_link_rwlock);
+       if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           substream->runtime->status->state != 
substream1->runtime->status->state ||
+@@ -1872,7 +1873,7 @@ static int snd_pcm_unlink(struct snd_pcm_substream 
*substream)
+       struct snd_pcm_substream *s;
+       int res = 0;
+ 
+-      down_write_nonblock(&snd_pcm_link_rwsem);
++      down_write_nonfifo(&snd_pcm_link_rwsem);
+       write_lock_irq(&snd_pcm_link_rwlock);
+       if (!snd_pcm_stream_linked(substream)) {
+               res = -EALREADY;
+@@ -2224,7 +2225,8 @@ int snd_pcm_hw_constraints_complete(struct 
snd_pcm_substream *substream)
+ 
+ static void pcm_release_private(struct snd_pcm_substream *substream)
+ {
+-      snd_pcm_unlink(substream);
++      if (snd_pcm_stream_linked(substream))
++              snd_pcm_unlink(substream);
+ }
+ 
+ void snd_pcm_release_substream(struct snd_pcm_substream *substream)
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 3557e3943ad5..fcd583efe011 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2352,6 +2352,10 @@ static const struct pci_device_id azx_ids[] = {
+       /* AMD Hudson */
+       { PCI_DEVICE(0x1022, 0x780d),
+         .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
++      /* AMD Stoney */
++      { PCI_DEVICE(0x1022, 0x157a),
++        .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB |
++                       AZX_DCAPS_PM_RUNTIME },
+       /* AMD Raven */
+       { PCI_DEVICE(0x1022, 0x15e3),
+         .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB |
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 6c2668b4e3bc..0fd31cff483e 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -4489,9 +4489,18 @@ static void alc_fixup_tpt470_dock(struct hda_codec 
*codec,
+               { 0x19, 0x21a11010 }, /* dock mic */
+               { }
+       };
++      /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
++       * the speaker output becomes too low by some reason on Thinkpads with
++       * ALC298 codec
++       */
++      static hda_nid_t preferred_pairs[] = {
++              0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
++              0
++      };
+       struct alc_spec *spec = codec->spec;
+ 
+       if (action == HDA_FIXUP_ACT_PRE_PROBE) {
++              spec->gen.preferred_dacs = preferred_pairs;
+               spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
+               snd_hda_apply_pincfgs(codec, pincfgs);
+       } else if (action == HDA_FIXUP_ACT_INIT) {
+diff --git a/sound/usb/card.c b/sound/usb/card.c
+index 8906199a83e6..549b9b061694 100644
+--- a/sound/usb/card.c
++++ b/sound/usb/card.c
+@@ -644,9 +644,12 @@ static int usb_audio_probe(struct usb_interface *intf,
+ 
+  __error:
+       if (chip) {
++              /* chip->active is inside the chip->card object,
++               * decrement before memory is possibly returned.
++               */
++              atomic_dec(&chip->active);
+               if (!chip->num_interfaces)
+                       snd_card_free(chip->card);
+-              atomic_dec(&chip->active);
+       }
+       mutex_unlock(&register_mutex);
+       return err;

Reply via email to