commit:     c6f7629f1024ad9cb61d14f92590cd45acfecb2d
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Mon Sep 16 12:22:48 2019 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Mon Sep 16 12:22:48 2019 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=c6f7629f

Linux patch 4.14.144

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

 0000_README               |   4 +
 1143_linux-4.14.144.patch | 699 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 703 insertions(+)

diff --git a/0000_README b/0000_README
index 3e99608..af1af17 100644
--- a/0000_README
+++ b/0000_README
@@ -615,6 +615,10 @@ Patch:  1142_linux-4.14.143.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.143
 
+Patch:  1143_linux-4.14.144.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.144
+
 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/1143_linux-4.14.144.patch b/1143_linux-4.14.144.patch
new file mode 100644
index 0000000..f7f4c4f
--- /dev/null
+++ b/1143_linux-4.14.144.patch
@@ -0,0 +1,699 @@
+diff --git a/Makefile b/Makefile
+index caa2fba089a5..4aa0dfec9b9b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 143
++SUBLEVEL = 144
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts 
b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
+index e720f40bbd5d..3f8f528099a8 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
+@@ -77,6 +77,7 @@
+               pinctrl-0 = <&usb30_host_drv>;
+               regulator-name = "vcc_host_5v";
+               regulator-always-on;
++              regulator-boot-on;
+               vin-supply = <&vcc_sys>;
+       };
+ 
+@@ -87,6 +88,7 @@
+               pinctrl-0 = <&usb20_host_drv>;
+               regulator-name = "vcc_host1_5v";
+               regulator-always-on;
++              regulator-boot-on;
+               vin-supply = <&vcc_sys>;
+       };
+ 
+diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
+index 4f2e18266e34..8c04c51a6e14 100644
+--- a/arch/powerpc/kernel/head_64.S
++++ b/arch/powerpc/kernel/head_64.S
+@@ -897,6 +897,7 @@ p_toc:     .8byte  __toc_start + 0x8000 - 0b
+ /*
+  * This is where the main kernel code starts.
+  */
++__REF
+ start_here_multiplatform:
+       /* set up the TOC */
+       bl      relative_toc
+@@ -972,6 +973,7 @@ start_here_multiplatform:
+       RFI
+       b       .       /* prevent speculative execution */
+ 
++      .previous
+       /* This is where all platforms converge execution */
+ 
+ start_here_common:
+diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
+index b10531372d7f..5e5da2073fdf 100644
+--- a/arch/powerpc/kernel/process.c
++++ b/arch/powerpc/kernel/process.c
+@@ -475,13 +475,14 @@ void giveup_all(struct task_struct *tsk)
+       if (!tsk->thread.regs)
+               return;
+ 
++      check_if_tm_restore_required(tsk);
++
+       usermsr = tsk->thread.regs->msr;
+ 
+       if ((usermsr & msr_all_available) == 0)
+               return;
+ 
+       msr_check_and_set(msr_all_available);
+-      check_if_tm_restore_required(tsk);
+ 
+       WARN_ON((usermsr & MSR_VSX) && !((usermsr & MSR_FP) && (usermsr & 
MSR_VEC)));
+ 
+diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c
+index 14071a57c926..f5d74e8db432 100644
+--- a/drivers/clk/clk-s2mps11.c
++++ b/drivers/clk/clk-s2mps11.c
+@@ -255,7 +255,7 @@ MODULE_DEVICE_TABLE(platform, s2mps11_clk_id);
+  * This requires of_device_id table.  In the same time this will not change 
the
+  * actual *device* matching so do not add .of_match_table.
+  */
+-static const struct of_device_id s2mps11_dt_match[] = {
++static const struct of_device_id s2mps11_dt_match[] __used = {
+       {
+               .compatible = "samsung,s2mps11-clk",
+               .data = (void *)S2MPS11X,
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
+index 50cc060cc552..4394c209cb2b 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
+@@ -264,7 +264,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void 
**msg,
+ 
+               if ((HIGH_WORD(ebx) & MESSAGE_STATUS_SUCCESS) == 0) {
+                       kfree(reply);
+-
++                      reply = NULL;
+                       if ((HIGH_WORD(ebx) & MESSAGE_STATUS_CPT) != 0) {
+                               /* A checkpoint occurred. Retry. */
+                               continue;
+@@ -288,7 +288,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void 
**msg,
+ 
+               if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0) {
+                       kfree(reply);
+-
++                      reply = NULL;
+                       if ((HIGH_WORD(ecx) & MESSAGE_STATUS_CPT) != 0) {
+                               /* A checkpoint occurred. Retry. */
+                               continue;
+@@ -300,10 +300,8 @@ static int vmw_recv_msg(struct rpc_channel *channel, void 
**msg,
+               break;
+       }
+ 
+-      if (retries == RETRIES) {
+-              kfree(reply);
++      if (!reply)
+               return -EINVAL;
+-      }
+ 
+       *msg_len = reply_len;
+       *msg     = reply;
+diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
+index 63052c5e5f82..7f5dfa169d0f 100644
+--- a/drivers/pci/dwc/pci-dra7xx.c
++++ b/drivers/pci/dwc/pci-dra7xx.c
+@@ -227,6 +227,7 @@ static int dra7xx_pcie_intx_map(struct irq_domain *domain, 
unsigned int irq,
+ 
+ static const struct irq_domain_ops intx_domain_ops = {
+       .map = dra7xx_pcie_intx_map,
++      .xlate = pci_irqd_intx_xlate,
+ };
+ 
+ static int dra7xx_pcie_init_irq_domain(struct pcie_port *pp)
+@@ -270,7 +271,7 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, 
void *arg)
+       case INTC:
+       case INTD:
+               generic_handle_irq(irq_find_mapping(dra7xx->irq_domain,
+-                                                  ffs(reg)));
++                                                  ffs(reg) - 1));
+               break;
+       }
+ 
+diff --git a/drivers/pci/dwc/pcie-designware-ep.c 
b/drivers/pci/dwc/pcie-designware-ep.c
+index abcbf0770358..71795db41261 100644
+--- a/drivers/pci/dwc/pcie-designware-ep.c
++++ b/drivers/pci/dwc/pcie-designware-ep.c
+@@ -74,8 +74,7 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, 
enum pci_barno bar,
+       u32 free_win;
+       struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
+ 
+-      free_win = find_first_zero_bit(&ep->ib_window_map,
+-                                     sizeof(ep->ib_window_map));
++      free_win = find_first_zero_bit(ep->ib_window_map, ep->num_ib_windows);
+       if (free_win >= ep->num_ib_windows) {
+               dev_err(pci->dev, "no free inbound window\n");
+               return -EINVAL;
+@@ -89,7 +88,7 @@ static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, 
enum pci_barno bar,
+       }
+ 
+       ep->bar_to_atu[bar] = free_win;
+-      set_bit(free_win, &ep->ib_window_map);
++      set_bit(free_win, ep->ib_window_map);
+ 
+       return 0;
+ }
+@@ -100,8 +99,7 @@ static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, 
phys_addr_t phys_addr,
+       u32 free_win;
+       struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
+ 
+-      free_win = find_first_zero_bit(&ep->ob_window_map,
+-                                     sizeof(ep->ob_window_map));
++      free_win = find_first_zero_bit(ep->ob_window_map, ep->num_ob_windows);
+       if (free_win >= ep->num_ob_windows) {
+               dev_err(pci->dev, "no free outbound window\n");
+               return -EINVAL;
+@@ -110,7 +108,7 @@ static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, 
phys_addr_t phys_addr,
+       dw_pcie_prog_outbound_atu(pci, free_win, PCIE_ATU_TYPE_MEM,
+                                 phys_addr, pci_addr, size);
+ 
+-      set_bit(free_win, &ep->ob_window_map);
++      set_bit(free_win, ep->ob_window_map);
+       ep->outbound_addr[free_win] = phys_addr;
+ 
+       return 0;
+@@ -125,7 +123,7 @@ static void dw_pcie_ep_clear_bar(struct pci_epc *epc, enum 
pci_barno bar)
+       dw_pcie_ep_reset_bar(pci, bar);
+ 
+       dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_INBOUND);
+-      clear_bit(atu_index, &ep->ib_window_map);
++      clear_bit(atu_index, ep->ib_window_map);
+ }
+ 
+ static int dw_pcie_ep_set_bar(struct pci_epc *epc, enum pci_barno bar,
+@@ -181,7 +179,7 @@ static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, 
phys_addr_t addr)
+               return;
+ 
+       dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_OUTBOUND);
+-      clear_bit(atu_index, &ep->ob_window_map);
++      clear_bit(atu_index, ep->ob_window_map);
+ }
+ 
+ static int dw_pcie_ep_map_addr(struct pci_epc *epc, phys_addr_t addr,
+@@ -302,12 +300,32 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
+               dev_err(dev, "unable to read *num-ib-windows* property\n");
+               return ret;
+       }
++      if (ep->num_ib_windows > MAX_IATU_IN) {
++              dev_err(dev, "invalid *num-ib-windows*\n");
++              return -EINVAL;
++      }
+ 
+       ret = of_property_read_u32(np, "num-ob-windows", &ep->num_ob_windows);
+       if (ret < 0) {
+               dev_err(dev, "unable to read *num-ob-windows* property\n");
+               return ret;
+       }
++      if (ep->num_ob_windows > MAX_IATU_OUT) {
++              dev_err(dev, "invalid *num-ob-windows*\n");
++              return -EINVAL;
++      }
++
++      ep->ib_window_map = devm_kzalloc(dev, sizeof(long) *
++                                       BITS_TO_LONGS(ep->num_ib_windows),
++                                       GFP_KERNEL);
++      if (!ep->ib_window_map)
++              return -ENOMEM;
++
++      ep->ob_window_map = devm_kzalloc(dev, sizeof(long) *
++                                       BITS_TO_LONGS(ep->num_ob_windows),
++                                       GFP_KERNEL);
++      if (!ep->ob_window_map)
++              return -ENOMEM;
+ 
+       addr = devm_kzalloc(dev, sizeof(phys_addr_t) * ep->num_ob_windows,
+                           GFP_KERNEL);
+diff --git a/drivers/pci/dwc/pcie-designware.h 
b/drivers/pci/dwc/pcie-designware.h
+index 5af29d125c7e..ba9dedc31bfa 100644
+--- a/drivers/pci/dwc/pcie-designware.h
++++ b/drivers/pci/dwc/pcie-designware.h
+@@ -114,6 +114,10 @@
+ #define MAX_MSI_IRQS                  32
+ #define MAX_MSI_CTRLS                 (MAX_MSI_IRQS / 32)
+ 
++/* Maximum number of inbound/outbound iATUs */
++#define MAX_IATU_IN                   256
++#define MAX_IATU_OUT                  256
++
+ struct pcie_port;
+ struct dw_pcie;
+ struct dw_pcie_ep;
+@@ -193,8 +197,8 @@ struct dw_pcie_ep {
+       size_t                  page_size;
+       u8                      bar_to_atu[6];
+       phys_addr_t             *outbound_addr;
+-      unsigned long           ib_window_map;
+-      unsigned long           ob_window_map;
++      unsigned long           *ib_window_map;
++      unsigned long           *ob_window_map;
+       u32                     num_ib_windows;
+       u32                     num_ob_windows;
+ };
+diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c
+index 3cc98c07dcd3..682fc58e1f75 100644
+--- a/drivers/vhost/test.c
++++ b/drivers/vhost/test.c
+@@ -23,6 +23,12 @@
+  * Using this limit prevents one virtqueue from starving others. */
+ #define VHOST_TEST_WEIGHT 0x80000
+ 
++/* Max number of packets transferred before requeueing the job.
++ * Using this limit prevents one virtqueue from starving others with
++ * pkts.
++ */
++#define VHOST_TEST_PKT_WEIGHT 256
++
+ enum {
+       VHOST_TEST_VQ = 0,
+       VHOST_TEST_VQ_MAX = 1,
+@@ -81,10 +87,8 @@ static void handle_vq(struct vhost_test *n)
+               }
+               vhost_add_used_and_signal(&n->dev, vq, head, 0);
+               total_len += len;
+-              if (unlikely(total_len >= VHOST_TEST_WEIGHT)) {
+-                      vhost_poll_queue(&vq->poll);
++              if (unlikely(vhost_exceeds_weight(vq, 0, total_len)))
+                       break;
+-              }
+       }
+ 
+       mutex_unlock(&vq->mutex);
+@@ -116,7 +120,8 @@ static int vhost_test_open(struct inode *inode, struct 
file *f)
+       dev = &n->dev;
+       vqs[VHOST_TEST_VQ] = &n->vqs[VHOST_TEST_VQ];
+       n->vqs[VHOST_TEST_VQ].handle_kick = handle_vq_kick;
+-      vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX);
++      vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX,
++                     VHOST_TEST_PKT_WEIGHT, VHOST_TEST_WEIGHT);
+ 
+       f->private_data = n;
+ 
+diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
+index 88fa81c482e8..3d7bea15c57b 100644
+--- a/drivers/vhost/vhost.c
++++ b/drivers/vhost/vhost.c
+@@ -2066,7 +2066,7 @@ static int get_indirect(struct vhost_virtqueue *vq,
+               /* If this is an input descriptor, increment that count. */
+               if (access == VHOST_ACCESS_WO) {
+                       *in_num += ret;
+-                      if (unlikely(log)) {
++                      if (unlikely(log && ret)) {
+                               log[*log_num].addr = vhost64_to_cpu(vq, 
desc.addr);
+                               log[*log_num].len = vhost32_to_cpu(vq, 
desc.len);
+                               ++*log_num;
+@@ -2209,7 +2209,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
+                       /* If this is an input descriptor,
+                        * increment that count. */
+                       *in_num += ret;
+-                      if (unlikely(log)) {
++                      if (unlikely(log && ret)) {
+                               log[*log_num].addr = vhost64_to_cpu(vq, 
desc.addr);
+                               log[*log_num].len = vhost32_to_cpu(vq, 
desc.len);
+                               ++*log_num;
+diff --git a/include/net/ipv6_frag.h b/include/net/ipv6_frag.h
+index 28aa9b30aece..1f77fb4dc79d 100644
+--- a/include/net/ipv6_frag.h
++++ b/include/net/ipv6_frag.h
+@@ -94,7 +94,6 @@ ip6frag_expire_frag_queue(struct net *net, struct frag_queue 
*fq)
+               goto out;
+ 
+       head->dev = dev;
+-      skb_get(head);
+       spin_unlock(&fq->q.lock);
+ 
+       icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0);
+diff --git a/include/net/xfrm.h b/include/net/xfrm.h
+index bdf185ae93db..57b8b11cf7d4 100644
+--- a/include/net/xfrm.h
++++ b/include/net/xfrm.h
+@@ -1366,6 +1366,23 @@ static inline int xfrm_state_kern(const struct 
xfrm_state *x)
+       return atomic_read(&x->tunnel_users);
+ }
+ 
++static inline bool xfrm_id_proto_valid(u8 proto)
++{
++      switch (proto) {
++      case IPPROTO_AH:
++      case IPPROTO_ESP:
++      case IPPROTO_COMP:
++#if IS_ENABLED(CONFIG_IPV6)
++      case IPPROTO_ROUTING:
++      case IPPROTO_DSTOPTS:
++#endif
++              return true;
++      default:
++              return false;
++      }
++}
++
++/* IPSEC_PROTO_ANY only matches 3 IPsec protocols, 0 could match all. */
+ static inline int xfrm_id_proto_match(u8 proto, u8 userproto)
+ {
+       return (!userproto || proto == userproto ||
+diff --git a/kernel/module.c b/kernel/module.c
+index 4b372c14d9a1..468567591241 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -1695,6 +1695,8 @@ static int add_usage_links(struct module *mod)
+       return ret;
+ }
+ 
++static void module_remove_modinfo_attrs(struct module *mod, int end);
++
+ static int module_add_modinfo_attrs(struct module *mod)
+ {
+       struct module_attribute *attr;
+@@ -1709,24 +1711,34 @@ static int module_add_modinfo_attrs(struct module *mod)
+               return -ENOMEM;
+ 
+       temp_attr = mod->modinfo_attrs;
+-      for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) {
++      for (i = 0; (attr = modinfo_attrs[i]); i++) {
+               if (!attr->test || attr->test(mod)) {
+                       memcpy(temp_attr, attr, sizeof(*temp_attr));
+                       sysfs_attr_init(&temp_attr->attr);
+                       error = sysfs_create_file(&mod->mkobj.kobj,
+                                       &temp_attr->attr);
++                      if (error)
++                              goto error_out;
+                       ++temp_attr;
+               }
+       }
++
++      return 0;
++
++error_out:
++      if (i > 0)
++              module_remove_modinfo_attrs(mod, --i);
+       return error;
+ }
+ 
+-static void module_remove_modinfo_attrs(struct module *mod)
++static void module_remove_modinfo_attrs(struct module *mod, int end)
+ {
+       struct module_attribute *attr;
+       int i;
+ 
+       for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) {
++              if (end >= 0 && i > end)
++                      break;
+               /* pick a field to test for end of list */
+               if (!attr->attr.name)
+                       break;
+@@ -1814,7 +1826,7 @@ static int mod_sysfs_setup(struct module *mod,
+       return 0;
+ 
+ out_unreg_modinfo_attrs:
+-      module_remove_modinfo_attrs(mod);
++      module_remove_modinfo_attrs(mod, -1);
+ out_unreg_param:
+       module_param_sysfs_remove(mod);
+ out_unreg_holders:
+@@ -1850,7 +1862,7 @@ static void mod_sysfs_fini(struct module *mod)
+ {
+ }
+ 
+-static void module_remove_modinfo_attrs(struct module *mod)
++static void module_remove_modinfo_attrs(struct module *mod, int end)
+ {
+ }
+ 
+@@ -1866,7 +1878,7 @@ static void init_param_lock(struct module *mod)
+ static void mod_sysfs_teardown(struct module *mod)
+ {
+       del_usage_links(mod);
+-      module_remove_modinfo_attrs(mod);
++      module_remove_modinfo_attrs(mod, -1);
+       module_param_sysfs_remove(mod);
+       kobject_put(mod->mkobj.drivers_dir);
+       kobject_put(mod->holders_dir);
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index 0a4e882d4308..c298d47888ed 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -4206,6 +4206,8 @@ static void __account_cfs_rq_runtime(struct cfs_rq 
*cfs_rq, u64 delta_exec)
+       if (likely(cfs_rq->runtime_remaining > 0))
+               return;
+ 
++      if (cfs_rq->throttled)
++              return;
+       /*
+        * if we're unable to extend our runtime we resched so that the active
+        * hierarchy can be throttled
+@@ -4402,6 +4404,9 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth 
*cfs_b,
+               if (!cfs_rq_throttled(cfs_rq))
+                       goto next;
+ 
++              /* By the above check, this should never be true */
++              SCHED_WARN_ON(cfs_rq->runtime_remaining > 0);
++
+               runtime = -cfs_rq->runtime_remaining + 1;
+               if (runtime > remaining)
+                       runtime = remaining;
+diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
+index 5bd9b389f8c9..8b3f9441b3a0 100644
+--- a/net/batman-adv/bat_iv_ogm.c
++++ b/net/batman-adv/bat_iv_ogm.c
+@@ -450,17 +450,23 @@ static u8 batadv_hop_penalty(u8 tq, const struct 
batadv_priv *bat_priv)
+  * batadv_iv_ogm_aggr_packet - checks if there is another OGM attached
+  * @buff_pos: current position in the skb
+  * @packet_len: total length of the skb
+- * @tvlv_len: tvlv length of the previously considered OGM
++ * @ogm_packet: potential OGM in buffer
+  *
+  * Return: true if there is enough space for another OGM, false otherwise.
+  */
+-static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
+-                                    __be16 tvlv_len)
++static bool
++batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
++                        const struct batadv_ogm_packet *ogm_packet)
+ {
+       int next_buff_pos = 0;
+ 
+-      next_buff_pos += buff_pos + BATADV_OGM_HLEN;
+-      next_buff_pos += ntohs(tvlv_len);
++      /* check if there is enough space for the header */
++      next_buff_pos += buff_pos + sizeof(*ogm_packet);
++      if (next_buff_pos > packet_len)
++              return false;
++
++      /* check if there is enough space for the optional TVLV */
++      next_buff_pos += ntohs(ogm_packet->tvlv_len);
+ 
+       return (next_buff_pos <= packet_len) &&
+              (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
+@@ -488,7 +494,7 @@ static void batadv_iv_ogm_send_to_if(struct 
batadv_forw_packet *forw_packet,
+ 
+       /* adjust all flags and log packets */
+       while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
+-                                       batadv_ogm_packet->tvlv_len)) {
++                                       batadv_ogm_packet)) {
+               /* we might have aggregated direct link packets with an
+                * ordinary base packet
+                */
+@@ -1838,7 +1844,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
+ 
+       /* unpack the aggregated packets and process them one by one */
+       while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
+-                                       ogm_packet->tvlv_len)) {
++                                       ogm_packet)) {
+               batadv_iv_ogm_process(skb, ogm_offset, if_incoming);
+ 
+               ogm_offset += BATADV_OGM_HLEN;
+diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c
+index ab13b4d58733..edb35bcc046d 100644
+--- a/net/batman-adv/netlink.c
++++ b/net/batman-adv/netlink.c
+@@ -110,7 +110,7 @@ batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int 
attrtype)
+ {
+       struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype);
+ 
+-      return attr ? nla_get_u32(attr) : 0;
++      return (attr && nla_len(attr) == sizeof(u32)) ? nla_get_u32(attr) : 0;
+ }
+ 
+ /**
+diff --git a/net/key/af_key.c b/net/key/af_key.c
+index ac38b47e9f86..f8f7065f7b62 100644
+--- a/net/key/af_key.c
++++ b/net/key/af_key.c
+@@ -1951,8 +1951,10 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct 
sadb_x_ipsecrequest *rq)
+ 
+       if (rq->sadb_x_ipsecrequest_mode == 0)
+               return -EINVAL;
++      if (!xfrm_id_proto_valid(rq->sadb_x_ipsecrequest_proto))
++              return -EINVAL;
+ 
+-      t->id.proto = rq->sadb_x_ipsecrequest_proto; /* XXX check proto */
++      t->id.proto = rq->sadb_x_ipsecrequest_proto;
+       if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
+               return -EINVAL;
+       t->mode = mode;
+diff --git a/net/vmw_vsock/hyperv_transport.c 
b/net/vmw_vsock/hyperv_transport.c
+index 52ac3e49c7ef..ec72a5edaa1b 100644
+--- a/net/vmw_vsock/hyperv_transport.c
++++ b/net/vmw_vsock/hyperv_transport.c
+@@ -320,6 +320,11 @@ static void hvs_close_connection(struct vmbus_channel 
*chan)
+       lock_sock(sk);
+       hvs_do_close_lock_held(vsock_sk(sk), true);
+       release_sock(sk);
++
++      /* Release the refcnt for the channel that's opened in
++       * hvs_open_connection().
++       */
++      sock_put(sk);
+ }
+ 
+ static void hvs_open_connection(struct vmbus_channel *chan)
+@@ -389,6 +394,9 @@ static void hvs_open_connection(struct vmbus_channel *chan)
+       }
+ 
+       set_per_channel_state(chan, conn_from_host ? new : sk);
++
++      /* This reference will be dropped by hvs_close_connection(). */
++      sock_hold(conn_from_host ? new : sk);
+       vmbus_set_chn_rescind_callback(chan, hvs_close_connection);
+ 
+       /* Set the pending send size to max packet size to always get
+diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
+index 7c093de68780..bd16e6882017 100644
+--- a/net/xfrm/xfrm_state.c
++++ b/net/xfrm/xfrm_state.c
+@@ -2330,7 +2330,7 @@ void xfrm_state_fini(struct net *net)
+       unsigned int sz;
+ 
+       flush_work(&net->xfrm.state_hash_work);
+-      xfrm_state_flush(net, IPSEC_PROTO_ANY, false);
++      xfrm_state_flush(net, 0, false);
+       flush_work(&xfrm_state_gc_work);
+ 
+       WARN_ON(!list_empty(&net->xfrm.state_all));
+diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
+index 150c58dc8a7b..339a070da597 100644
+--- a/net/xfrm/xfrm_user.c
++++ b/net/xfrm/xfrm_user.c
+@@ -1489,20 +1489,8 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl 
*ut, u16 family)
+                       return -EINVAL;
+               }
+ 
+-              switch (ut[i].id.proto) {
+-              case IPPROTO_AH:
+-              case IPPROTO_ESP:
+-              case IPPROTO_COMP:
+-#if IS_ENABLED(CONFIG_IPV6)
+-              case IPPROTO_ROUTING:
+-              case IPPROTO_DSTOPTS:
+-#endif
+-              case IPSEC_PROTO_ANY:
+-                      break;
+-              default:
++              if (!xfrm_id_proto_valid(ut[i].id.proto))
+                       return -EINVAL;
+-              }
+-
+       }
+ 
+       return 0;
+diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
+index c4a9ddb174bc..5aa75a0a1ced 100755
+--- a/scripts/decode_stacktrace.sh
++++ b/scripts/decode_stacktrace.sh
+@@ -78,7 +78,7 @@ parse_symbol() {
+       fi
+ 
+       # Strip out the base of the path
+-      code=${code//^$basepath/""}
++      code=${code#$basepath/}
+ 
+       # In the case of inlines, move everything to same line
+       code=${code//$'\n'/' '}
+diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c
+index d3ea73171a3d..8b1cf237b96e 100644
+--- a/sound/pci/hda/hda_auto_parser.c
++++ b/sound/pci/hda/hda_auto_parser.c
+@@ -828,6 +828,8 @@ static void apply_fixup(struct hda_codec *codec, int id, 
int action, int depth)
+       while (id >= 0) {
+               const struct hda_fixup *fix = codec->fixup_list + id;
+ 
++              if (++depth > 10)
++                      break;
+               if (fix->chained_before)
+                       apply_fixup(codec, fix->chain_id, action, depth + 1);
+ 
+@@ -867,8 +869,6 @@ static void apply_fixup(struct hda_codec *codec, int id, 
int action, int depth)
+               }
+               if (!fix->chained || fix->chained_before)
+                       break;
+-              if (++depth > 10)
+-                      break;
+               id = fix->chain_id;
+       }
+ }
+diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
+index ec9dda536d89..28ef409a9e6a 100644
+--- a/sound/pci/hda/hda_generic.c
++++ b/sound/pci/hda/hda_generic.c
+@@ -5854,7 +5854,8 @@ int snd_hda_gen_init(struct hda_codec *codec)
+       if (spec->init_hook)
+               spec->init_hook(codec);
+ 
+-      snd_hda_apply_verbs(codec);
++      if (!spec->skip_verbs)
++              snd_hda_apply_verbs(codec);
+ 
+       init_multi_out(codec);
+       init_extra_out(codec);
+diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h
+index d82c09db0276..17a6bff8e94e 100644
+--- a/sound/pci/hda/hda_generic.h
++++ b/sound/pci/hda/hda_generic.h
+@@ -237,6 +237,7 @@ struct hda_gen_spec {
+       unsigned int indep_hp_enabled:1; /* independent HP enabled */
+       unsigned int have_aamix_ctl:1;
+       unsigned int hp_mic_jack_modes:1;
++      unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */
+ 
+       /* additional mute flags (only effective with auto_mute_via_amp=1) */
+       u64 mute_bits;
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 32115e0b26c9..6deb96a301d3 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -781,9 +781,11 @@ static int alc_init(struct hda_codec *codec)
+       if (spec->init_hook)
+               spec->init_hook(codec);
+ 
++      spec->gen.skip_verbs = 1; /* applied in below */
+       snd_hda_gen_init(codec);
+       alc_fix_pll(codec);
+       alc_auto_init_amp(codec, spec->init_amp);
++      snd_hda_apply_verbs(codec); /* apply verbs here after own init */
+ 
+       snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
+ 
+@@ -6586,6 +6588,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", 
ALC294_FIXUP_LENOVO_MIC_LOCATION),
+       SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", 
ALC294_FIXUP_LENOVO_MIC_LOCATION),
+       SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", 
ALC294_FIXUP_LENOVO_MIC_LOCATION),
++      SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", 
ALC283_FIXUP_HEADSET_MIC),
+       SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", 
ALC269_FIXUP_DMIC_THINKPAD_ACPI),
+       SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
+       SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", 
ALC269_FIXUP_DMIC_THINKPAD_ACPI),
+@@ -8287,6 +8290,7 @@ static int patch_alc680(struct hda_codec *codec)
+ static const struct hda_device_id snd_hda_id_realtek[] = {
+       HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
+       HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
++      HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
+       HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
+       HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
+       HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),

Reply via email to