commit:     859e4d8ee635ad9842c3059fe7eedb7c82759803
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Feb  3 23:42:47 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Feb  3 23:42:47 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=859e4d8e

Linux patch 4.19.173

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

 0000_README               |   4 +
 1172_linux-4.19.173.patch | 887 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 891 insertions(+)

diff --git a/0000_README b/0000_README
index a202ba1..0bd69fd 100644
--- a/0000_README
+++ b/0000_README
@@ -727,6 +727,10 @@ Patch:  1171_linux-4.19.172.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.172
 
+Patch:  1172_linux-4.19.173.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.173
+
 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/1172_linux-4.19.173.patch b/1172_linux-4.19.173.patch
new file mode 100644
index 0000000..e037fd5
--- /dev/null
+++ b/1172_linux-4.19.173.patch
@@ -0,0 +1,887 @@
+diff --git a/Makefile b/Makefile
+index 7da0ddd650521..5770b9d8026b9 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 172
++SUBLEVEL = 173
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi 
b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
+index b8044681006c6..2df4694c0d3bd 100644
+--- a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
+@@ -278,7 +278,7 @@
+ 
+                       /* VDD_AUD_1P8: Audio codec */
+                       reg_aud_1p8v: ldo3 {
+-                              regulator-name = "vdd1p8";
++                              regulator-name = "vdd1p8a";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+diff --git a/arch/arm/mach-imx/suspend-imx6.S 
b/arch/arm/mach-imx/suspend-imx6.S
+index 7d84b617af481..99d2e296082c7 100644
+--- a/arch/arm/mach-imx/suspend-imx6.S
++++ b/arch/arm/mach-imx/suspend-imx6.S
+@@ -73,6 +73,7 @@
+ #define MX6Q_CCM_CCR  0x0
+ 
+       .align 3
++      .arm
+ 
+       .macro  sync_l2_cache
+ 
+diff --git a/arch/x86/kvm/pmu_intel.c b/arch/x86/kvm/pmu_intel.c
+index 2ab8c20c8bfad..611f9e60f8154 100644
+--- a/arch/x86/kvm/pmu_intel.c
++++ b/arch/x86/kvm/pmu_intel.c
+@@ -29,7 +29,7 @@ static struct kvm_event_hw_type_mapping intel_arch_events[] 
= {
+       [4] = { 0x2e, 0x41, PERF_COUNT_HW_CACHE_MISSES },
+       [5] = { 0xc4, 0x00, PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
+       [6] = { 0xc5, 0x00, PERF_COUNT_HW_BRANCH_MISSES },
+-      [7] = { 0x00, 0x30, PERF_COUNT_HW_REF_CPU_CYCLES },
++      [7] = { 0x00, 0x03, PERF_COUNT_HW_REF_CPU_CYCLES },
+ };
+ 
+ /* mapping between fixed pmc index and intel_arch_events array */
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 7096578ef7370..8e4eef73531a5 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -102,6 +102,7 @@ static u64 __read_mostly cr4_reserved_bits = 
CR4_RESERVED_BITS;
+ 
+ static void update_cr8_intercept(struct kvm_vcpu *vcpu);
+ static void process_nmi(struct kvm_vcpu *vcpu);
++static void process_smi(struct kvm_vcpu *vcpu);
+ static void enter_smm(struct kvm_vcpu *vcpu);
+ static void __kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
+ static void store_regs(struct kvm_vcpu *vcpu);
+@@ -3499,6 +3500,10 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct 
kvm_vcpu *vcpu,
+                                              struct kvm_vcpu_events *events)
+ {
+       process_nmi(vcpu);
++
++      if (kvm_check_request(KVM_REQ_SMI, vcpu))
++              process_smi(vcpu);
++
+       /*
+        * FIXME: pass injected and pending separately.  This is only
+        * needed for nested virtualization, whose state cannot be
+diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
+index 8940054d6250f..b3b92c54cba8d 100644
+--- a/drivers/acpi/device_sysfs.c
++++ b/drivers/acpi/device_sysfs.c
+@@ -259,20 +259,12 @@ int __acpi_device_uevent_modalias(struct acpi_device 
*adev,
+       if (add_uevent_var(env, "MODALIAS="))
+               return -ENOMEM;
+ 
+-      len = create_pnp_modalias(adev, &env->buf[env->buflen - 1],
+-                                sizeof(env->buf) - env->buflen);
+-      if (len < 0)
+-              return len;
+-
+-      env->buflen += len;
+-      if (!adev->data.of_compatible)
+-              return 0;
+-
+-      if (len > 0 && add_uevent_var(env, "MODALIAS="))
+-              return -ENOMEM;
+-
+-      len = create_of_modalias(adev, &env->buf[env->buflen - 1],
+-                               sizeof(env->buf) - env->buflen);
++      if (adev->data.of_compatible)
++              len = create_of_modalias(adev, &env->buf[env->buflen - 1],
++                                       sizeof(env->buf) - env->buflen);
++      else
++              len = create_pnp_modalias(adev, &env->buf[env->buflen - 1],
++                                        sizeof(env->buf) - env->buflen);
+       if (len < 0)
+               return len;
+ 
+diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
+index 517318bb350cf..81b955670b120 100644
+--- a/drivers/block/nbd.c
++++ b/drivers/block/nbd.c
+@@ -966,6 +966,12 @@ static int nbd_add_socket(struct nbd_device *nbd, 
unsigned long arg,
+       if (!sock)
+               return err;
+ 
++      /*
++       * We need to make sure we don't get any errant requests while we're
++       * reallocating the ->socks array.
++       */
++      blk_mq_freeze_queue(nbd->disk->queue);
++
+       if (!netlink && !nbd->task_setup &&
+           !test_bit(NBD_BOUND, &config->runtime_flags))
+               nbd->task_setup = current;
+@@ -1004,10 +1010,12 @@ static int nbd_add_socket(struct nbd_device *nbd, 
unsigned long arg,
+       nsock->cookie = 0;
+       socks[config->num_connections++] = nsock;
+       atomic_inc(&config->live_connections);
++      blk_mq_unfreeze_queue(nbd->disk->queue);
+ 
+       return 0;
+ 
+ put_socket:
++      blk_mq_unfreeze_queue(nbd->disk->queue);
+       sockfd_put(sock);
+       return err;
+ }
+diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
+index adc0e3ed01c24..d4ceee3825f8d 100644
+--- a/drivers/block/xen-blkfront.c
++++ b/drivers/block/xen-blkfront.c
+@@ -936,7 +936,8 @@ static void blkif_set_queue_limits(struct blkfront_info 
*info)
+       if (info->feature_discard) {
+               blk_queue_flag_set(QUEUE_FLAG_DISCARD, rq);
+               blk_queue_max_discard_sectors(rq, get_capacity(gd));
+-              rq->limits.discard_granularity = info->discard_granularity;
++              rq->limits.discard_granularity = info->discard_granularity ?:
++                                               info->physical_sector_size;
+               rq->limits.discard_alignment = info->discard_alignment;
+               if (info->feature_secdiscard)
+                       blk_queue_flag_set(QUEUE_FLAG_SECERASE, rq);
+@@ -2169,19 +2170,12 @@ static void blkfront_closing(struct blkfront_info 
*info)
+ 
+ static void blkfront_setup_discard(struct blkfront_info *info)
+ {
+-      int err;
+-      unsigned int discard_granularity;
+-      unsigned int discard_alignment;
+-
+       info->feature_discard = 1;
+-      err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
+-              "discard-granularity", "%u", &discard_granularity,
+-              "discard-alignment", "%u", &discard_alignment,
+-              NULL);
+-      if (!err) {
+-              info->discard_granularity = discard_granularity;
+-              info->discard_alignment = discard_alignment;
+-      }
++      info->discard_granularity = xenbus_read_unsigned(info->xbdev->otherend,
++                                                       "discard-granularity",
++                                                       0);
++      info->discard_alignment = xenbus_read_unsigned(info->xbdev->otherend,
++                                                     "discard-alignment", 0);
+       info->feature_secdiscard =
+               !!xenbus_read_unsigned(info->xbdev->otherend, "discard-secure",
+                                      0);
+diff --git a/drivers/infiniband/hw/cxgb4/qp.c 
b/drivers/infiniband/hw/cxgb4/qp.c
+index a9e3a11bea54a..caa6a502c37e2 100644
+--- a/drivers/infiniband/hw/cxgb4/qp.c
++++ b/drivers/infiniband/hw/cxgb4/qp.c
+@@ -2485,7 +2485,7 @@ int c4iw_ib_query_qp(struct ib_qp *ibqp, struct 
ib_qp_attr *attr,
+       init_attr->cap.max_send_wr = qhp->attr.sq_num_entries;
+       init_attr->cap.max_recv_wr = qhp->attr.rq_num_entries;
+       init_attr->cap.max_send_sge = qhp->attr.sq_max_sges;
+-      init_attr->cap.max_recv_sge = qhp->attr.sq_max_sges;
++      init_attr->cap.max_recv_sge = qhp->attr.rq_max_sges;
+       init_attr->cap.max_inline_data = T4_MAX_SEND_INLINE;
+       init_attr->sq_sig_type = qhp->sq_sig_all ? IB_SIGNAL_ALL_WR : 0;
+       return 0;
+diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
+index d936ff765fe4a..3f0c2c1ef0cb2 100644
+--- a/drivers/iommu/dmar.c
++++ b/drivers/iommu/dmar.c
+@@ -1029,8 +1029,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+ {
+       struct intel_iommu *iommu;
+       u32 ver, sts;
+-      int agaw = 0;
+-      int msagaw = 0;
++      int agaw = -1;
++      int msagaw = -1;
+       int err;
+ 
+       if (!drhd->reg_base_addr) {
+@@ -1055,17 +1055,28 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+       }
+ 
+       err = -EINVAL;
+-      agaw = iommu_calculate_agaw(iommu);
+-      if (agaw < 0) {
+-              pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
+-                      iommu->seq_id);
+-              goto err_unmap;
++      if (cap_sagaw(iommu->cap) == 0) {
++              pr_info("%s: No supported address widths. Not attempting DMA 
translation.\n",
++                      iommu->name);
++              drhd->ignored = 1;
+       }
+-      msagaw = iommu_calculate_max_sagaw(iommu);
+-      if (msagaw < 0) {
+-              pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
+-                      iommu->seq_id);
+-              goto err_unmap;
++
++      if (!drhd->ignored) {
++              agaw = iommu_calculate_agaw(iommu);
++              if (agaw < 0) {
++                      pr_err("Cannot get a valid agaw for iommu (seq_id = 
%d)\n",
++                             iommu->seq_id);
++                      drhd->ignored = 1;
++              }
++      }
++      if (!drhd->ignored) {
++              msagaw = iommu_calculate_max_sagaw(iommu);
++              if (msagaw < 0) {
++                      pr_err("Cannot get a valid max agaw for iommu (seq_id = 
%d)\n",
++                             iommu->seq_id);
++                      drhd->ignored = 1;
++                      agaw = -1;
++              }
+       }
+       iommu->agaw = agaw;
+       iommu->msagaw = msagaw;
+@@ -1092,7 +1103,12 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+ 
+       raw_spin_lock_init(&iommu->register_lock);
+ 
+-      if (intel_iommu_enabled) {
++      /*
++       * This is only for hotplug; at boot time intel_iommu_enabled won't
++       * be set yet. When intel_iommu_init() runs, it registers the units
++       * present at boot time, then sets intel_iommu_enabled.
++       */
++      if (intel_iommu_enabled && !drhd->ignored) {
+               err = iommu_device_sysfs_add(&iommu->iommu, NULL,
+                                            intel_iommu_groups,
+                                            "%s", iommu->name);
+@@ -1107,6 +1123,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
+       }
+ 
+       drhd->iommu = iommu;
++      iommu->drhd = drhd;
+ 
+       return 0;
+ 
+@@ -1121,7 +1138,7 @@ error:
+ 
+ static void free_iommu(struct intel_iommu *iommu)
+ {
+-      if (intel_iommu_enabled) {
++      if (intel_iommu_enabled && !iommu->drhd->ignored) {
+               iommu_device_unregister(&iommu->iommu);
+               iommu_device_sysfs_remove(&iommu->iommu);
+       }
+diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
+index 005b839f6eb9e..ec4c957c36b6c 100644
+--- a/drivers/leds/led-triggers.c
++++ b/drivers/leds/led-triggers.c
+@@ -317,14 +317,15 @@ void led_trigger_event(struct led_trigger *trig,
+                       enum led_brightness brightness)
+ {
+       struct led_classdev *led_cdev;
++      unsigned long flags;
+ 
+       if (!trig)
+               return;
+ 
+-      read_lock(&trig->leddev_list_lock);
++      read_lock_irqsave(&trig->leddev_list_lock, flags);
+       list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
+               led_set_brightness(led_cdev, brightness);
+-      read_unlock(&trig->leddev_list_lock);
++      read_unlock_irqrestore(&trig->leddev_list_lock, flags);
+ }
+ EXPORT_SYMBOL_GPL(led_trigger_event);
+ 
+@@ -335,11 +336,12 @@ static void led_trigger_blink_setup(struct led_trigger 
*trig,
+                            int invert)
+ {
+       struct led_classdev *led_cdev;
++      unsigned long flags;
+ 
+       if (!trig)
+               return;
+ 
+-      read_lock(&trig->leddev_list_lock);
++      read_lock_irqsave(&trig->leddev_list_lock, flags);
+       list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) {
+               if (oneshot)
+                       led_blink_set_oneshot(led_cdev, delay_on, delay_off,
+@@ -347,7 +349,7 @@ static void led_trigger_blink_setup(struct led_trigger 
*trig,
+               else
+                       led_blink_set(led_cdev, delay_on, delay_off);
+       }
+-      read_unlock(&trig->leddev_list_lock);
++      read_unlock_irqrestore(&trig->leddev_list_lock, flags);
+ }
+ 
+ void led_trigger_blink(struct led_trigger *trig,
+diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
+index cf3df733d9605..6ea6038b9d364 100644
+--- a/drivers/media/rc/rc-main.c
++++ b/drivers/media/rc/rc-main.c
+@@ -1875,6 +1875,8 @@ int rc_register_device(struct rc_dev *dev)
+                       goto out_raw;
+       }
+ 
++      dev->registered = true;
++
+       rc = device_add(&dev->dev);
+       if (rc)
+               goto out_rx_free;
+@@ -1884,8 +1886,6 @@ int rc_register_device(struct rc_dev *dev)
+                dev->device_name ?: "Unspecified device", path ?: "N/A");
+       kfree(path);
+ 
+-      dev->registered = true;
+-
+       /*
+        * once the the input device is registered in rc_setup_rx_device,
+        * userspace can open the input device and rc_open() will be called
+diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
+index 953c6fdc75cc4..1bd181b33c24f 100644
+--- a/drivers/net/can/dev.c
++++ b/drivers/net/can/dev.c
+@@ -1142,7 +1142,7 @@ static int can_fill_info(struct sk_buff *skb, const 
struct net_device *dev)
+ {
+       struct can_priv *priv = netdev_priv(dev);
+       struct can_ctrlmode cm = {.flags = priv->ctrlmode};
+-      struct can_berr_counter bec;
++      struct can_berr_counter bec = { };
+       enum can_state state = priv->state;
+ 
+       if (priv->do_get_state)
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 
b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+index b16e0f45d28c5..a38a0c86705ab 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+@@ -1004,6 +1004,7 @@ static struct mlx5_flow_table 
*__mlx5_create_flow_table(struct mlx5_flow_namespa
+ destroy_ft:
+       root->cmds->destroy_flow_table(root->dev, ft);
+ free_ft:
++      rhltable_destroy(&ft->fgs_hash);
+       kfree(ft);
+ unlock_root:
+       mutex_unlock(&root->chain_lock);
+diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
+index 3eb034a5a659b..8a1e9dba1249e 100644
+--- a/drivers/net/team/team.c
++++ b/drivers/net/team/team.c
+@@ -998,7 +998,8 @@ static void __team_compute_features(struct team *team)
+       unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE |
+                                       IFF_XMIT_DST_RELEASE_PERM;
+ 
+-      list_for_each_entry(port, &team->port_list, list) {
++      rcu_read_lock();
++      list_for_each_entry_rcu(port, &team->port_list, list) {
+               vlan_features = netdev_increment_features(vlan_features,
+                                       port->dev->vlan_features,
+                                       TEAM_VLAN_FEATURES);
+@@ -1012,6 +1013,7 @@ static void __team_compute_features(struct team *team)
+               if (port->dev->hard_header_len > max_hard_header_len)
+                       max_hard_header_len = port->dev->hard_header_len;
+       }
++      rcu_read_unlock();
+ 
+       team->dev->vlan_features = vlan_features;
+       team->dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
+@@ -1027,9 +1029,7 @@ static void __team_compute_features(struct team *team)
+ 
+ static void team_compute_features(struct team *team)
+ {
+-      mutex_lock(&team->lock);
+       __team_compute_features(team);
+-      mutex_unlock(&team->lock);
+       netdev_change_features(team->dev);
+ }
+ 
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 1b48d71dbc284..bdfe88c754dfe 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1284,6 +1284,7 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x0b3c, 0xc00a, 6)},    /* Olivetti Olicard 160 */
+       {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)},    /* Olivetti Olicard 500 */
+       {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)},    /* Cinterion PLxx */
++      {QMI_QUIRK_SET_DTR(0x1e2d, 0x006f, 8)}, /* Cinterion PLS83/PLS63 */
+       {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)},    /* Cinterion PHxx,PXxx */
+       {QMI_FIXED_INTF(0x1e2d, 0x0063, 10)},   /* Cinterion ALASxx (1 RmNet) */
+       {QMI_FIXED_INTF(0x1e2d, 0x0082, 4)},    /* Cinterion PHxx,PXxx (2 
RmNet) */
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+index f48c7cac122e9..fcda33482887b 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+@@ -2126,7 +2126,8 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans 
*trans, u32 addr,
+ 
+       while (offs < dwords) {
+               /* limit the time we spin here under lock to 1/2s */
+-              ktime_t timeout = ktime_add_us(ktime_get(), 500 * 
USEC_PER_MSEC);
++              unsigned long end = jiffies + HZ / 2;
++              bool resched = false;
+ 
+               if (iwl_trans_grab_nic_access(trans, &flags)) {
+                       iwl_write32(trans, HBUS_TARG_MEM_RADDR,
+@@ -2137,14 +2138,15 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans 
*trans, u32 addr,
+                                                       HBUS_TARG_MEM_RDAT);
+                               offs++;
+ 
+-                              /* calling ktime_get is expensive so
+-                               * do it once in 128 reads
+-                               */
+-                              if (offs % 128 == 0 && ktime_after(ktime_get(),
+-                                                                 timeout))
++                              if (time_after(jiffies, end)) {
++                                      resched = true;
+                                       break;
++                              }
+                       }
+                       iwl_trans_release_nic_access(trans, &flags);
++
++                      if (resched)
++                              cond_resched();
+               } else {
+                       return -EBUSY;
+               }
+diff --git a/drivers/net/wireless/mediatek/mt7601u/dma.c 
b/drivers/net/wireless/mediatek/mt7601u/dma.c
+index 47cebb2ec05c5..5aacabd32923e 100644
+--- a/drivers/net/wireless/mediatek/mt7601u/dma.c
++++ b/drivers/net/wireless/mediatek/mt7601u/dma.c
+@@ -160,8 +160,7 @@ mt7601u_rx_process_entry(struct mt7601u_dev *dev, struct 
mt7601u_dma_buf_rx *e)
+ 
+       if (new_p) {
+               /* we have one extra ref from the allocator */
+-              __free_pages(e->p, MT_RX_ORDER);
+-
++              put_page(e->p);
+               e->p = new_p;
+       }
+ }
+@@ -318,7 +317,6 @@ static int mt7601u_dma_submit_tx(struct mt7601u_dev *dev,
+       }
+ 
+       e = &q->e[q->end];
+-      e->skb = skb;
+       usb_fill_bulk_urb(e->urb, usb_dev, snd_pipe, skb->data, skb->len,
+                         mt7601u_complete_tx, q);
+       ret = usb_submit_urb(e->urb, GFP_ATOMIC);
+@@ -336,6 +334,7 @@ static int mt7601u_dma_submit_tx(struct mt7601u_dev *dev,
+ 
+       q->end = (q->end + 1) % q->entries;
+       q->used++;
++      e->skb = skb;
+ 
+       if (q->used >= q->entries)
+               ieee80211_stop_queue(dev->hw, skb_get_queue_mapping(skb));
+diff --git a/drivers/soc/atmel/soc.c b/drivers/soc/atmel/soc.c
+index 4dd03b099c893..76117405d8411 100644
+--- a/drivers/soc/atmel/soc.c
++++ b/drivers/soc/atmel/soc.c
+@@ -254,8 +254,21 @@ struct soc_device * __init at91_soc_init(const struct 
at91_soc *socs)
+       return soc_dev;
+ }
+ 
++static const struct of_device_id at91_soc_allowed_list[] __initconst = {
++      { .compatible = "atmel,at91rm9200", },
++      { .compatible = "atmel,at91sam9", },
++      { .compatible = "atmel,sama5", },
++      { .compatible = "atmel,samv7", },
++      { }
++};
++
+ static int __init atmel_soc_device_init(void)
+ {
++      struct device_node *np = of_find_node_by_path("/");
++
++      if (!of_match_node(at91_soc_allowed_list, np))
++              return 0;
++
+       at91_soc_init(socs);
+ 
+       return 0;
+diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
+index 7e6e682104dc4..a8486432be05a 100644
+--- a/drivers/xen/privcmd.c
++++ b/drivers/xen/privcmd.c
+@@ -743,14 +743,15 @@ static int remap_pfn_fn(pte_t *ptep, pgtable_t token, 
unsigned long addr,
+       return 0;
+ }
+ 
+-static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
++static long privcmd_ioctl_mmap_resource(struct file *file,
++                              struct privcmd_mmap_resource __user *udata)
+ {
+       struct privcmd_data *data = file->private_data;
+       struct mm_struct *mm = current->mm;
+       struct vm_area_struct *vma;
+       struct privcmd_mmap_resource kdata;
+       xen_pfn_t *pfns = NULL;
+-      struct xen_mem_acquire_resource xdata;
++      struct xen_mem_acquire_resource xdata = { };
+       int rc;
+ 
+       if (copy_from_user(&kdata, udata, sizeof(kdata)))
+@@ -760,6 +761,22 @@ static long privcmd_ioctl_mmap_resource(struct file 
*file, void __user *udata)
+       if (data->domid != DOMID_INVALID && data->domid != kdata.dom)
+               return -EPERM;
+ 
++      /* Both fields must be set or unset */
++      if (!!kdata.addr != !!kdata.num)
++              return -EINVAL;
++
++      xdata.domid = kdata.dom;
++      xdata.type = kdata.type;
++      xdata.id = kdata.id;
++
++      if (!kdata.addr && !kdata.num) {
++              /* Query the size of the resource. */
++              rc = HYPERVISOR_memory_op(XENMEM_acquire_resource, &xdata);
++              if (rc)
++                      return rc;
++              return __put_user(xdata.nr_frames, &udata->num);
++      }
++
+       down_write(&mm->mmap_sem);
+ 
+       vma = find_vma(mm, kdata.addr);
+@@ -793,10 +810,6 @@ static long privcmd_ioctl_mmap_resource(struct file 
*file, void __user *udata)
+       } else
+               vma->vm_private_data = PRIV_VMA_LOCKED;
+ 
+-      memset(&xdata, 0, sizeof(xdata));
+-      xdata.domid = kdata.dom;
+-      xdata.type = kdata.type;
+-      xdata.id = kdata.id;
+       xdata.frame = kdata.idx;
+       xdata.nr_frames = kdata.num;
+       set_xen_guest_handle(xdata.frame_list, pfns);
+diff --git a/drivers/xen/xenbus/xenbus_probe.c 
b/drivers/xen/xenbus/xenbus_probe.c
+index 14ccf13ab8fa1..786494bb7f20b 100644
+--- a/drivers/xen/xenbus/xenbus_probe.c
++++ b/drivers/xen/xenbus/xenbus_probe.c
+@@ -714,6 +714,23 @@ static bool xs_hvm_defer_init_for_callback(void)
+ #endif
+ }
+ 
++static int xenbus_probe_thread(void *unused)
++{
++      DEFINE_WAIT(w);
++
++      /*
++       * We actually just want to wait for *any* trigger of xb_waitq,
++       * and run xenbus_probe() the moment it occurs.
++       */
++      prepare_to_wait(&xb_waitq, &w, TASK_INTERRUPTIBLE);
++      schedule();
++      finish_wait(&xb_waitq, &w);
++
++      DPRINTK("probing");
++      xenbus_probe();
++      return 0;
++}
++
+ static int __init xenbus_probe_initcall(void)
+ {
+       /*
+@@ -725,6 +742,20 @@ static int __init xenbus_probe_initcall(void)
+            !xs_hvm_defer_init_for_callback()))
+               xenbus_probe();
+ 
++      /*
++       * For XS_LOCAL, spawn a thread which will wait for xenstored
++       * or a xenstore-stubdom to be started, then probe. It will be
++       * triggered when communication starts happening, by waiting
++       * on xb_waitq.
++       */
++      if (xen_store_domain_type == XS_LOCAL) {
++              struct task_struct *probe_task;
++
++              probe_task = kthread_run(xenbus_probe_thread, NULL,
++                                       "xenbus_probe");
++              if (IS_ERR(probe_task))
++                      return PTR_ERR(probe_task);
++      }
+       return 0;
+ }
+ device_initcall(xenbus_probe_initcall);
+diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
+index 46ca5592b8b0d..4b165aa5a2561 100644
+--- a/fs/nfs/pnfs.c
++++ b/fs/nfs/pnfs.c
+@@ -2320,6 +2320,7 @@ out_forget:
+       spin_unlock(&ino->i_lock);
+       lseg->pls_layout = lo;
+       NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg);
++      pnfs_free_lseg_list(&free_me);
+       return ERR_PTR(-EAGAIN);
+ }
+ 
+diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
+index 539f4a84412f4..786df33c00203 100644
+--- a/include/linux/intel-iommu.h
++++ b/include/linux/intel-iommu.h
+@@ -472,6 +472,8 @@ struct intel_iommu {
+       struct iommu_device iommu;  /* IOMMU core code handle */
+       int             node;
+       u32             flags;      /* Software defined flags */
++
++      struct dmar_drhd_unit *drhd;
+ };
+ 
+ /* PCI domain-device relationship */
+diff --git a/include/net/tcp.h b/include/net/tcp.h
+index 0d4501f44e00d..afbe1d3991f21 100644
+--- a/include/net/tcp.h
++++ b/include/net/tcp.h
+@@ -1961,7 +1961,7 @@ void tcp_mark_skb_lost(struct sock *sk, struct sk_buff 
*skb);
+ void tcp_newreno_mark_lost(struct sock *sk, bool snd_una_advanced);
+ extern s32 tcp_rack_skb_timeout(struct tcp_sock *tp, struct sk_buff *skb,
+                               u32 reo_wnd);
+-extern void tcp_rack_mark_lost(struct sock *sk);
++extern bool tcp_rack_mark_lost(struct sock *sk);
+ extern void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
+                            u64 xmit_time);
+ extern void tcp_rack_reo_timeout(struct sock *sk);
+diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
+index faeec8255e7e0..6b3d7f7211dd6 100644
+--- a/kernel/kexec_core.c
++++ b/kernel/kexec_core.c
+@@ -1130,7 +1130,6 @@ int kernel_kexec(void)
+ 
+ #ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context) {
+-              lock_system_sleep();
+               pm_prepare_console();
+               error = freeze_processes();
+               if (error) {
+@@ -1193,7 +1192,6 @@ int kernel_kexec(void)
+               thaw_processes();
+  Restore_console:
+               pm_restore_console();
+-              unlock_system_sleep();
+       }
+ #endif
+ 
+diff --git a/kernel/power/swap.c b/kernel/power/swap.c
+index d7f6c1a288d33..e9494c29f1ca4 100644
+--- a/kernel/power/swap.c
++++ b/kernel/power/swap.c
+@@ -491,10 +491,10 @@ static int swap_writer_finish(struct swap_map_handle 
*handle,
+               unsigned int flags, int error)
+ {
+       if (!error) {
+-              flush_swap_writer(handle);
+               pr_info("S");
+               error = mark_swapfiles(handle, flags);
+               pr_cont("|\n");
++              flush_swap_writer(handle);
+       }
+ 
+       if (error)
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index aa025cfda77bf..5ffc85c8952a0 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -2750,7 +2750,8 @@ static void tcp_identify_packet_loss(struct sock *sk, 
int *ack_flag)
+       } else if (tcp_is_rack(sk)) {
+               u32 prior_retrans = tp->retrans_out;
+ 
+-              tcp_rack_mark_lost(sk);
++              if (tcp_rack_mark_lost(sk))
++                      *ack_flag &= ~FLAG_SET_XMIT_TIMER;
+               if (prior_retrans > tp->retrans_out)
+                       *ack_flag |= FLAG_LOST_RETRANS;
+       }
+@@ -3693,9 +3694,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
+ 
+       if (tp->tlp_high_seq)
+               tcp_process_tlp_ack(sk, ack, flag);
+-      /* If needed, reset TLP/RTO timer; RACK may later override this. */
+-      if (flag & FLAG_SET_XMIT_TIMER)
+-              tcp_set_xmit_timer(sk);
+ 
+       if (tcp_ack_is_dubious(sk, flag)) {
+               is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP));
+@@ -3703,6 +3701,10 @@ static int tcp_ack(struct sock *sk, const struct 
sk_buff *skb, int flag)
+                                     &rexmit);
+       }
+ 
++      /* If needed, reset TLP/RTO timer when RACK doesn't set. */
++      if (flag & FLAG_SET_XMIT_TIMER)
++              tcp_set_xmit_timer(sk);
++
+       if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP))
+               sk_dst_confirm(sk);
+ 
+diff --git a/net/ipv4/tcp_recovery.c b/net/ipv4/tcp_recovery.c
+index c81aadff769b2..0d96decba13df 100644
+--- a/net/ipv4/tcp_recovery.c
++++ b/net/ipv4/tcp_recovery.c
+@@ -109,13 +109,13 @@ static void tcp_rack_detect_loss(struct sock *sk, u32 
*reo_timeout)
+       }
+ }
+ 
+-void tcp_rack_mark_lost(struct sock *sk)
++bool tcp_rack_mark_lost(struct sock *sk)
+ {
+       struct tcp_sock *tp = tcp_sk(sk);
+       u32 timeout;
+ 
+       if (!tp->rack.advanced)
+-              return;
++              return false;
+ 
+       /* Reset the advanced flag to avoid unnecessary queue scanning */
+       tp->rack.advanced = 0;
+@@ -125,6 +125,7 @@ void tcp_rack_mark_lost(struct sock *sk)
+               inet_csk_reset_xmit_timer(sk, ICSK_TIME_REO_TIMEOUT,
+                                         timeout, inet_csk(sk)->icsk_rto);
+       }
++      return !!timeout;
+ }
+ 
+ /* Record the most recently (re)sent time among the (s)acked packets
+diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
+index a879d8071712b..fc715bba59146 100644
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -1051,6 +1051,7 @@ enum queue_stop_reason {
+       IEEE80211_QUEUE_STOP_REASON_FLUSH,
+       IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN,
+       IEEE80211_QUEUE_STOP_REASON_RESERVE_TID,
++      IEEE80211_QUEUE_STOP_REASON_IFTYPE_CHANGE,
+ 
+       IEEE80211_QUEUE_STOP_REASONS,
+ };
+diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
+index 152d4365f9616..511ca6f74239d 100644
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -1542,6 +1542,10 @@ static int ieee80211_runtime_change_iftype(struct 
ieee80211_sub_if_data *sdata,
+       if (ret)
+               return ret;
+ 
++      ieee80211_stop_vif_queues(local, sdata,
++                                IEEE80211_QUEUE_STOP_REASON_IFTYPE_CHANGE);
++      synchronize_net();
++
+       ieee80211_do_stop(sdata, false);
+ 
+       ieee80211_teardown_sdata(sdata);
+@@ -1562,6 +1566,8 @@ static int ieee80211_runtime_change_iftype(struct 
ieee80211_sub_if_data *sdata,
+       err = ieee80211_do_open(&sdata->wdev, false);
+       WARN(err, "type change: do_open returned %d", err);
+ 
++      ieee80211_wake_vif_queues(local, sdata,
++                                IEEE80211_QUEUE_STOP_REASON_IFTYPE_CHANGE);
+       return ret;
+ }
+ 
+diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c
+index eb7f9a5f2aeb7..4e544044fc2de 100644
+--- a/net/netfilter/nft_dynset.c
++++ b/net/netfilter/nft_dynset.c
+@@ -213,8 +213,10 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
+               nft_set_ext_add_length(&priv->tmpl, NFT_SET_EXT_EXPR,
+                                      priv->expr->ops->size);
+       if (set->flags & NFT_SET_TIMEOUT) {
+-              if (timeout || set->timeout)
++              if (timeout || set->timeout) {
++                      nft_set_ext_add(&priv->tmpl, NFT_SET_EXT_TIMEOUT);
+                       nft_set_ext_add(&priv->tmpl, NFT_SET_EXT_EXPIRATION);
++              }
+       }
+ 
+       priv->timeout = timeout;
+diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
+index 310872a9d6602..4884e1987562a 100644
+--- a/net/nfc/netlink.c
++++ b/net/nfc/netlink.c
+@@ -871,6 +871,7 @@ static int nfc_genl_stop_poll(struct sk_buff *skb, struct 
genl_info *info)
+ 
+       if (!dev->polling) {
+               device_unlock(&dev->dev);
++              nfc_put_device(dev);
+               return -EINVAL;
+       }
+ 
+diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c
+index b927730d9ab06..57a07ab80d924 100644
+--- a/net/nfc/rawsock.c
++++ b/net/nfc/rawsock.c
+@@ -117,7 +117,7 @@ static int rawsock_connect(struct socket *sock, struct 
sockaddr *_addr,
+       if (addr->target_idx > dev->target_next_idx - 1 ||
+           addr->target_idx < dev->target_next_idx - dev->n_targets) {
+               rc = -EINVAL;
+-              goto error;
++              goto put_dev;
+       }
+ 
+       rc = nfc_activate_target(dev, addr->target_idx, addr->nfc_protocol);
+diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c
+index 7778f0fb48cf4..7ecfbff1f0d08 100644
+--- a/net/rxrpc/call_accept.c
++++ b/net/rxrpc/call_accept.c
+@@ -211,6 +211,7 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx)
+       tail = b->peer_backlog_tail;
+       while (CIRC_CNT(head, tail, size) > 0) {
+               struct rxrpc_peer *peer = b->peer_backlog[tail];
++              rxrpc_put_local(peer->local);
+               kfree(peer);
+               tail = (tail + 1) & (size - 1);
+       }
+diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c
+index 69102fda9ebd4..76a80a41615be 100644
+--- a/net/wireless/wext-core.c
++++ b/net/wireless/wext-core.c
+@@ -896,8 +896,9 @@ out:
+ int call_commit_handler(struct net_device *dev)
+ {
+ #ifdef CONFIG_WIRELESS_EXT
+-      if ((netif_running(dev)) &&
+-         (dev->wireless_handlers->standard[0] != NULL))
++      if (netif_running(dev) &&
++          dev->wireless_handlers &&
++          dev->wireless_handlers->standard[0])
+               /* Call the commit handler on the driver */
+               return dev->wireless_handlers->standard[0](dev, NULL,
+                                                          NULL, NULL);
+diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c
+index 0ee13d12782fb..fcba8a139f61e 100644
+--- a/net/xfrm/xfrm_input.c
++++ b/net/xfrm/xfrm_input.c
+@@ -420,7 +420,7 @@ resume:
+               /* only the first xfrm gets the encap type */
+               encap_type = 0;
+ 
+-              if (async && x->repl->recheck(x, skb, seq)) {
++              if (x->repl->recheck(x, skb, seq)) {
+                       XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
+                       goto drop_unlock;
+               }
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index 939f3adf075aa..e9aea82f370de 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -2101,8 +2101,8 @@ struct dst_entry *xfrm_lookup_with_ifid(struct net *net,
+               xflo.flags = flags;
+ 
+               /* To accelerate a bit...  */
+-              if ((dst_orig->flags & DST_NOXFRM) ||
+-                  !net->xfrm.policy_count[XFRM_POLICY_OUT])
++              if (!if_id && ((dst_orig->flags & DST_NOXFRM) ||
++                             !net->xfrm.policy_count[XFRM_POLICY_OUT]))
+                       goto nopol;
+ 
+               xdst = xfrm_bundle_lookup(net, fl, family, dir, &xflo, if_id);
+diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
+index efba9057b2b61..0046ea78abd25 100644
+--- a/sound/pci/hda/patch_via.c
++++ b/sound/pci/hda/patch_via.c
+@@ -1056,7 +1056,7 @@ static const struct hda_fixup via_fixups[] = {
+ static const struct snd_pci_quirk vt2002p_fixups[] = {
+       SND_PCI_QUIRK(0x1043, 0x1487, "Asus G75", VIA_FIXUP_ASUS_G75),
+       SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST),
+-      SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", 
VIA_FIXUP_POWER_SAVE),
++      SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", VIA_FIXUP_POWER_SAVE),
+       {}
+ };
+ 

Reply via email to