commit:     5dd74c704e193a9863d9b3138a3bd8efa8273f3e
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 23 16:37:31 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Jan 23 16:37:31 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=5dd74c70

Linux patch 5.4.92

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

 0000_README             |   4 +
 1091_linux-5.4.92.patch | 756 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 760 insertions(+)

diff --git a/0000_README b/0000_README
index d6e0993..29bc2f5 100644
--- a/0000_README
+++ b/0000_README
@@ -407,6 +407,10 @@ Patch:  1090_linux-5.4.91.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.91
 
+Patch:  1091_linux-5.4.92.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.92
+
 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/1091_linux-5.4.92.patch b/1091_linux-5.4.92.patch
new file mode 100644
index 0000000..65ab41d
--- /dev/null
+++ b/1091_linux-5.4.92.patch
@@ -0,0 +1,756 @@
+diff --git a/Makefile b/Makefile
+index a5edbd4f34145..5bae2206a35e7 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 91
++SUBLEVEL = 92
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+index 6988bbf2576f5..9a77b70ad601b 100644
+--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+@@ -4790,8 +4790,6 @@ static void mvpp2_phylink_validate(struct phylink_config 
*config,
+ 
+       phylink_set(mask, Autoneg);
+       phylink_set_port_modes(mask);
+-      phylink_set(mask, Pause);
+-      phylink_set(mask, Asym_Pause);
+ 
+       switch (state->interface) {
+       case PHY_INTERFACE_MODE_10GKR:
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c 
b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
+index 71c90c8a9e943..c3fc1cc4bb2b9 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c
+@@ -19,7 +19,7 @@
+ #define MLXSW_THERMAL_ASIC_TEMP_NORM  75000   /* 75C */
+ #define MLXSW_THERMAL_ASIC_TEMP_HIGH  85000   /* 85C */
+ #define MLXSW_THERMAL_ASIC_TEMP_HOT   105000  /* 105C */
+-#define MLXSW_THERMAL_ASIC_TEMP_CRIT  110000  /* 110C */
++#define MLXSW_THERMAL_ASIC_TEMP_CRIT  140000  /* 140C */
+ #define MLXSW_THERMAL_HYSTERESIS_TEMP 5000    /* 5C */
+ #define MLXSW_THERMAL_MODULE_TEMP_SHIFT       (MLXSW_THERMAL_HYSTERESIS_TEMP 
* 2)
+ #define MLXSW_THERMAL_ZONE_MAX_NAME   16
+@@ -177,6 +177,12 @@ mlxsw_thermal_module_trips_update(struct device *dev, 
struct mlxsw_core *core,
+       if (err)
+               return err;
+ 
++      if (crit_temp > emerg_temp) {
++              dev_warn(dev, "%s : Critical threshold %d is above emergency 
threshold %d\n",
++                       tz->tzdev->type, crit_temp, emerg_temp);
++              return 0;
++      }
++
+       /* According to the system thermal requirements, the thermal zones are
+        * defined with four trip points. The critical and emergency
+        * temperature thresholds, provided by QSFP module are set as "active"
+@@ -191,11 +197,8 @@ mlxsw_thermal_module_trips_update(struct device *dev, 
struct mlxsw_core *core,
+               tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = crit_temp;
+       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temp = crit_temp;
+       tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temp = emerg_temp;
+-      if (emerg_temp > crit_temp)
+-              tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp +
++      tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp +
+                                       MLXSW_THERMAL_MODULE_TEMP_SHIFT;
+-      else
+-              tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp;
+ 
+       return 0;
+ }
+diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c 
b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+index c692a41e45480..25b6f2ee2beb8 100644
+--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
++++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+@@ -564,11 +564,6 @@ static const struct net_device_ops netxen_netdev_ops = {
+       .ndo_set_features = netxen_set_features,
+ };
+ 
+-static inline bool netxen_function_zero(struct pci_dev *pdev)
+-{
+-      return (PCI_FUNC(pdev->devfn) == 0) ? true : false;
+-}
+-
+ static inline void netxen_set_interrupt_mode(struct netxen_adapter *adapter,
+                                            u32 mode)
+ {
+@@ -664,7 +659,7 @@ static int netxen_setup_intr(struct netxen_adapter 
*adapter)
+       netxen_initialize_interrupt_registers(adapter);
+       netxen_set_msix_bit(pdev, 0);
+ 
+-      if (netxen_function_zero(pdev)) {
++      if (adapter->portnum == 0) {
+               if (!netxen_setup_msi_interrupts(adapter, num_msix))
+                       netxen_set_interrupt_mode(adapter, NETXEN_MSI_MODE);
+               else
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 18c5a9bb6759c..ce5d3e9e5dff4 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -3739,6 +3739,7 @@ static int stmmac_change_mtu(struct net_device *dev, int 
new_mtu)
+ {
+       struct stmmac_priv *priv = netdev_priv(dev);
+       int txfifosz = priv->plat->tx_fifo_size;
++      const int mtu = new_mtu;
+ 
+       if (txfifosz == 0)
+               txfifosz = priv->dma_cap.tx_fifo_size;
+@@ -3756,7 +3757,7 @@ static int stmmac_change_mtu(struct net_device *dev, int 
new_mtu)
+       if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB))
+               return -EINVAL;
+ 
+-      dev->mtu = new_mtu;
++      dev->mtu = mtu;
+ 
+       netdev_update_features(dev);
+ 
+diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
+index 6fa7a009a24a4..f9b359d4e2939 100644
+--- a/drivers/net/usb/rndis_host.c
++++ b/drivers/net/usb/rndis_host.c
+@@ -387,7 +387,7 @@ generic_rndis_bind(struct usbnet *dev, struct 
usb_interface *intf, int flags)
+       reply_len = sizeof *phym;
+       retval = rndis_query(dev, intf, u.buf,
+                            RNDIS_OID_GEN_PHYSICAL_MEDIUM,
+-                           0, (void **) &phym, &reply_len);
++                           reply_len, (void **)&phym, &reply_len);
+       if (retval != 0 || !phym) {
+               /* OID is optional so don't fail here. */
+               phym_unspec = cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED);
+diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c 
b/drivers/scsi/lpfc/lpfc_nportdisc.c
+index 590a49e847626..418d62e945544 100644
+--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
++++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
+@@ -286,7 +286,7 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist 
*ndlp)
+  * This routine is only called if we are SLI3, direct connect pt2pt
+  * mode and the remote NPort issues the PLOGI after link up.
+  */
+-void
++static void
+ lpfc_defer_pt2pt_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *link_mbox)
+ {
+       LPFC_MBOXQ_t *login_mbox;
+@@ -340,7 +340,7 @@ lpfc_defer_pt2pt_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t 
*link_mbox)
+  * This routine is only called if we are SLI4, acting in target
+  * mode and the remote NPort issues the PLOGI after link up.
+  **/
+-void
++static void
+ lpfc_defer_acc_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
+ {
+       struct lpfc_vport *vport = pmb->vport;
+diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
+index 82a0ee09cbe14..1d0c335b0bf88 100644
+--- a/drivers/spi/spi-cadence.c
++++ b/drivers/spi/spi-cadence.c
+@@ -115,6 +115,7 @@ struct cdns_spi {
+       void __iomem *regs;
+       struct clk *ref_clk;
+       struct clk *pclk;
++      unsigned int clk_rate;
+       u32 speed_hz;
+       const u8 *txbuf;
+       u8 *rxbuf;
+@@ -250,7 +251,7 @@ static void cdns_spi_config_clock_freq(struct spi_device 
*spi,
+       u32 ctrl_reg, baud_rate_val;
+       unsigned long frequency;
+ 
+-      frequency = clk_get_rate(xspi->ref_clk);
++      frequency = xspi->clk_rate;
+ 
+       ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR);
+ 
+@@ -558,8 +559,9 @@ static int cdns_spi_probe(struct platform_device *pdev)
+       master->auto_runtime_pm = true;
+       master->mode_bits = SPI_CPOL | SPI_CPHA;
+ 
++      xspi->clk_rate = clk_get_rate(xspi->ref_clk);
+       /* Set to default valid value */
+-      master->max_speed_hz = clk_get_rate(xspi->ref_clk) / 4;
++      master->max_speed_hz = xspi->clk_rate / 4;
+       xspi->speed_hz = master->max_speed_hz;
+ 
+       master->bits_per_word_mask = SPI_BPW_MASK(8);
+diff --git a/drivers/spi/spi-npcm-fiu.c b/drivers/spi/spi-npcm-fiu.c
+index 5ed7c9e017fb1..1e770d6739050 100644
+--- a/drivers/spi/spi-npcm-fiu.c
++++ b/drivers/spi/spi-npcm-fiu.c
+@@ -677,8 +677,7 @@ static int npcm_fiu_probe(struct platform_device *pdev)
+       struct npcm_fiu_spi *fiu;
+       void __iomem *regbase;
+       struct resource *res;
+-      int ret;
+-      int id;
++      int id, ret;
+ 
+       ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
+       if (!ctrl)
+@@ -738,9 +737,9 @@ static int npcm_fiu_probe(struct platform_device *pdev)
+ 
+       ret = devm_spi_register_master(dev, ctrl);
+       if (ret)
+-              return ret;
++              clk_disable_unprepare(fiu->clk);
+ 
+-      return 0;
++      return ret;
+ }
+ 
+ static int npcm_fiu_remove(struct platform_device *pdev)
+diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
+index 5eb62240c7f87..833f51282accc 100644
+--- a/drivers/usb/host/ohci-hcd.c
++++ b/drivers/usb/host/ohci-hcd.c
+@@ -102,7 +102,7 @@ static void io_watchdog_func(struct timer_list *t);
+ 
+ 
+ /* Some boards misreport power switching/overcurrent */
+-static bool distrust_firmware = true;
++static bool distrust_firmware;
+ module_param (distrust_firmware, bool, 0);
+ MODULE_PARM_DESC (distrust_firmware,
+       "true to distrust firmware power/overcurrent setup");
+diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
+index c6070e70dd73d..9c9422e9fac4d 100644
+--- a/drivers/xen/privcmd.c
++++ b/drivers/xen/privcmd.c
+@@ -724,14 +724,15 @@ static long privcmd_ioctl_restrict(struct file *file, 
void __user *udata)
+       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)))
+@@ -741,6 +742,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);
+@@ -775,10 +792,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/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
+index 86e5658651f10..8f077e66e613f 100644
+--- a/fs/nfsd/nfs3xdr.c
++++ b/fs/nfsd/nfs3xdr.c
+@@ -857,9 +857,14 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct 
svc_fh *fhp,
+       if (isdotent(name, namlen)) {
+               if (namlen == 2) {
+                       dchild = dget_parent(dparent);
+-                      /* filesystem root - cannot return filehandle for ".." 
*/
++                      /*
++                       * Don't return filehandle for ".." if we're at
++                       * the filesystem or export root:
++                       */
+                       if (dchild == dparent)
+                               goto out;
++                      if (dparent == exp->ex_path.dentry)
++                              goto out;
+               } else
+                       dchild = dget(dparent);
+       } else
+diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
+index d8fab3ecf5120..180b52419136f 100644
+--- a/include/linux/compiler-gcc.h
++++ b/include/linux/compiler-gcc.h
+@@ -12,6 +12,12 @@
+ 
+ #if GCC_VERSION < 40600
+ # error Sorry, your compiler is too old - please upgrade it.
++#elif defined(CONFIG_ARM64) && GCC_VERSION < 50100
++/*
++ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
++ * https://lore.kernel.org/r/20210107111841.gn1...@shell.armlinux.org.uk
++ */
++# error Sorry, your version of GCC is too old - please use 5.1 or newer.
+ #endif
+ 
+ /*
+diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h
+index 4cad0e784b286..b81f9e1d74b0a 100644
+--- a/include/linux/elfcore.h
++++ b/include/linux/elfcore.h
+@@ -58,6 +58,7 @@ static inline int elf_core_copy_task_xfpregs(struct 
task_struct *t, elf_fpxregse
+ }
+ #endif
+ 
++#if defined(CONFIG_UM) || defined(CONFIG_IA64)
+ /*
+  * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out
+  * extra segments containing the gate DSO contents.  Dumping its
+@@ -72,5 +73,26 @@ elf_core_write_extra_phdrs(struct coredump_params *cprm, 
loff_t offset);
+ extern int
+ elf_core_write_extra_data(struct coredump_params *cprm);
+ extern size_t elf_core_extra_data_size(void);
++#else
++static inline Elf_Half elf_core_extra_phdrs(void)
++{
++      return 0;
++}
++
++static inline int elf_core_write_extra_phdrs(struct coredump_params *cprm, 
loff_t offset)
++{
++      return 1;
++}
++
++static inline int elf_core_write_extra_data(struct coredump_params *cprm)
++{
++      return 1;
++}
++
++static inline size_t elf_core_extra_data_size(void)
++{
++      return 0;
++}
++#endif
+ 
+ #endif /* _LINUX_ELFCORE_H */
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 68139cc2f3ca3..6493c98c86317 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -1480,6 +1480,11 @@ static inline void skb_mark_not_on_list(struct sk_buff 
*skb)
+       skb->next = NULL;
+ }
+ 
++/* Iterate through singly-linked GSO fragments of an skb. */
++#define skb_list_walk_safe(first, skb, next_skb)                              
 \
++      for ((skb) = (first), (next_skb) = (skb) ? (skb)->next : NULL; (skb);  \
++           (skb) = (next_skb), (next_skb) = (skb) ? (skb)->next : NULL)
++
+ static inline void skb_list_del_init(struct sk_buff *skb)
+ {
+       __list_del_entry(&skb->list);
+diff --git a/kernel/Makefile b/kernel/Makefile
+index f2cc0d118a0bc..6aef13053a5c4 100644
+--- a/kernel/Makefile
++++ b/kernel/Makefile
+@@ -93,7 +93,6 @@ obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
+ obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
+ obj-$(CONFIG_TRACEPOINTS) += tracepoint.o
+ obj-$(CONFIG_LATENCYTOP) += latencytop.o
+-obj-$(CONFIG_ELFCORE) += elfcore.o
+ obj-$(CONFIG_FUNCTION_TRACER) += trace/
+ obj-$(CONFIG_TRACING) += trace/
+ obj-$(CONFIG_TRACE_CLOCK) += trace/
+diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
+index b701af27a7799..5a8b4dfdb1419 100644
+--- a/kernel/bpf/cgroup.c
++++ b/kernel/bpf/cgroup.c
+@@ -1057,12 +1057,13 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock 
*sk, int *level,
+               if (ctx.optlen != 0) {
+                       *optlen = ctx.optlen;
+                       *kernel_optval = ctx.optval;
++                      /* export and don't free sockopt buf */
++                      return 0;
+               }
+       }
+ 
+ out:
+-      if (ret)
+-              sockopt_free_buf(&ctx);
++      sockopt_free_buf(&ctx);
+       return ret;
+ }
+ EXPORT_SYMBOL(__cgroup_bpf_run_filter_setsockopt);
+diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
+index 5e28718928cad..a77d2814cac5d 100644
+--- a/kernel/bpf/helpers.c
++++ b/kernel/bpf/helpers.c
+@@ -105,7 +105,7 @@ BPF_CALL_2(bpf_map_peek_elem, struct bpf_map *, map, void 
*, value)
+ }
+ 
+ const struct bpf_func_proto bpf_map_peek_elem_proto = {
+-      .func           = bpf_map_pop_elem,
++      .func           = bpf_map_peek_elem,
+       .gpl_only       = false,
+       .ret_type       = RET_INTEGER,
+       .arg1_type      = ARG_CONST_MAP_PTR,
+diff --git a/kernel/elfcore.c b/kernel/elfcore.c
+deleted file mode 100644
+index 57fb4dcff4349..0000000000000
+--- a/kernel/elfcore.c
++++ /dev/null
+@@ -1,26 +0,0 @@
+-// SPDX-License-Identifier: GPL-2.0
+-#include <linux/elf.h>
+-#include <linux/fs.h>
+-#include <linux/mm.h>
+-#include <linux/binfmts.h>
+-#include <linux/elfcore.h>
+-
+-Elf_Half __weak elf_core_extra_phdrs(void)
+-{
+-      return 0;
+-}
+-
+-int __weak elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t 
offset)
+-{
+-      return 1;
+-}
+-
+-int __weak elf_core_write_extra_data(struct coredump_params *cprm)
+-{
+-      return 1;
+-}
+-
+-size_t __weak elf_core_extra_data_size(void)
+-{
+-      return 0;
+-}
+diff --git a/net/core/filter.c b/net/core/filter.c
+index b040b7bf28582..2fa10fdcf6b1d 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -1475,7 +1475,7 @@ struct bpf_prog *__get_filter(struct sock_fprog *fprog, 
struct sock *sk)
+ 
+       if (copy_from_user(prog->insns, fprog->filter, fsize)) {
+               __bpf_prog_free(prog);
+-              return ERR_PTR(-EFAULT);
++              return ERR_PTR(-EINVAL);
+       }
+ 
+       prog->len = fprog->len;
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 49d923c227a21..961cb5a88c958 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -496,13 +496,17 @@ EXPORT_SYMBOL(__netdev_alloc_skb);
+ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
+                                gfp_t gfp_mask)
+ {
+-      struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
++      struct napi_alloc_cache *nc;
+       struct sk_buff *skb;
+       void *data;
+ 
+       len += NET_SKB_PAD + NET_IP_ALIGN;
+ 
+-      if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) ||
++      /* If requested length is either too small or too big,
++       * we use kmalloc() for skb->head allocation.
++       */
++      if (len <= SKB_WITH_OVERHEAD(1024) ||
++          len > SKB_WITH_OVERHEAD(PAGE_SIZE) ||
+           (gfp_mask & (__GFP_DIRECT_RECLAIM | GFP_DMA))) {
+               skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
+               if (!skb)
+@@ -510,6 +514,7 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, 
unsigned int len,
+               goto skb_success;
+       }
+ 
++      nc = this_cpu_ptr(&napi_alloc_cache);
+       len += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
+       len = SKB_DATA_ALIGN(len);
+ 
+diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c
+index 40829111fe00c..273c921751e49 100644
+--- a/net/core/sock_reuseport.c
++++ b/net/core/sock_reuseport.c
+@@ -302,7 +302,7 @@ select_by_hash:
+                       i = j = reciprocal_scale(hash, socks);
+                       while (reuse->socks[i]->sk_state == TCP_ESTABLISHED) {
+                               i++;
+-                              if (i >= reuse->num_socks)
++                              if (i >= socks)
+                                       i = 0;
+                               if (i == j)
+                                       goto out;
+diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
+index 0fd1c2aa13615..e9ecbb57df455 100644
+--- a/net/dcb/dcbnl.c
++++ b/net/dcb/dcbnl.c
+@@ -1765,6 +1765,8 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr 
*nlh,
+       fn = &reply_funcs[dcb->cmd];
+       if (!fn->cb)
+               return -EOPNOTSUPP;
++      if (fn->type == RTM_SETDCB && !netlink_capable(skb, CAP_NET_ADMIN))
++              return -EPERM;
+ 
+       if (!tb[DCB_ATTR_IFNAME])
+               return -EINVAL;
+diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
+index 5c967764041f4..00210e55b4cd1 100644
+--- a/net/ipv4/esp4.c
++++ b/net/ipv4/esp4.c
+@@ -272,7 +272,6 @@ static int esp_output_udp_encap(struct xfrm_state *x, 
struct sk_buff *skb, struc
+ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct 
esp_info *esp)
+ {
+       u8 *tail;
+-      u8 *vaddr;
+       int nfrags;
+       int esph_offset;
+       struct page *page;
+@@ -314,14 +313,10 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff 
*skb, struct esp_info *
+                       page = pfrag->page;
+                       get_page(page);
+ 
+-                      vaddr = kmap_atomic(page);
+-
+-                      tail = vaddr + pfrag->offset;
++                      tail = page_address(page) + pfrag->offset;
+ 
+                       esp_output_fill_trailer(tail, esp->tfclen, esp->plen, 
esp->proto);
+ 
+-                      kunmap_atomic(vaddr);
+-
+                       nfrags = skb_shinfo(skb)->nr_frags;
+ 
+                       __skb_fill_page_desc(skb, nfrags, page, pfrag->offset,
+diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
+index a3b403ba8f8f0..7a739f16d82b2 100644
+--- a/net/ipv6/esp6.c
++++ b/net/ipv6/esp6.c
+@@ -226,7 +226,6 @@ static void esp_output_fill_trailer(u8 *tail, int tfclen, 
int plen, __u8 proto)
+ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct 
esp_info *esp)
+ {
+       u8 *tail;
+-      u8 *vaddr;
+       int nfrags;
+       struct page *page;
+       struct sk_buff *trailer;
+@@ -259,14 +258,10 @@ int esp6_output_head(struct xfrm_state *x, struct 
sk_buff *skb, struct esp_info
+                       page = pfrag->page;
+                       get_page(page);
+ 
+-                      vaddr = kmap_atomic(page);
+-
+-                      tail = vaddr + pfrag->offset;
++                      tail = page_address(page) + pfrag->offset;
+ 
+                       esp_output_fill_trailer(tail, esp->tfclen, esp->plen, 
esp->proto);
+ 
+-                      kunmap_atomic(vaddr);
+-
+                       nfrags = skb_shinfo(skb)->nr_frags;
+ 
+                       __skb_fill_page_desc(skb, nfrags, page, pfrag->offset,
+diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
+index 78d495581d696..7a80c42fcce2f 100644
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -124,8 +124,43 @@ static int ip6_finish_output2(struct net *net, struct 
sock *sk, struct sk_buff *
+       return -EINVAL;
+ }
+ 
++static int
++ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk,
++                                  struct sk_buff *skb, unsigned int mtu)
++{
++      struct sk_buff *segs, *nskb;
++      netdev_features_t features;
++      int ret = 0;
++
++      /* Please see corresponding comment in ip_finish_output_gso
++       * describing the cases where GSO segment length exceeds the
++       * egress MTU.
++       */
++      features = netif_skb_features(skb);
++      segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
++      if (IS_ERR_OR_NULL(segs)) {
++              kfree_skb(skb);
++              return -ENOMEM;
++      }
++
++      consume_skb(skb);
++
++      skb_list_walk_safe(segs, segs, nskb) {
++              int err;
++
++              skb_mark_not_on_list(segs);
++              err = ip6_fragment(net, sk, segs, ip6_finish_output2);
++              if (err && ret == 0)
++                      ret = err;
++      }
++
++      return ret;
++}
++
+ static int __ip6_finish_output(struct net *net, struct sock *sk, struct 
sk_buff *skb)
+ {
++      unsigned int mtu;
++
+ #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM)
+       /* Policy lookup after SNAT yielded a new policy */
+       if (skb_dst(skb)->xfrm) {
+@@ -134,7 +169,11 @@ static int __ip6_finish_output(struct net *net, struct 
sock *sk, struct sk_buff
+       }
+ #endif
+ 
+-      if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) ||
++      mtu = ip6_skb_dst_mtu(skb);
++      if (skb_is_gso(skb) && !skb_gso_validate_network_len(skb, mtu))
++              return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu);
++
++      if ((skb->len > mtu && !skb_is_gso(skb)) ||
+           dst_allfrag(skb_dst(skb)) ||
+           (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
+               return ip6_fragment(net, sk, skb, ip6_finish_output2);
+diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
+index 2872f7a00e863..de4c871787e2f 100644
+--- a/net/ipv6/sit.c
++++ b/net/ipv6/sit.c
+@@ -1597,8 +1597,11 @@ static int ipip6_newlink(struct net *src_net, struct 
net_device *dev,
+       }
+ 
+ #ifdef CONFIG_IPV6_SIT_6RD
+-      if (ipip6_netlink_6rd_parms(data, &ip6rd))
++      if (ipip6_netlink_6rd_parms(data, &ip6rd)) {
+               err = ipip6_tunnel_update_6rd(nt, &ip6rd);
++              if (err < 0)
++                      unregister_netdevice_queue(dev, NULL);
++      }
+ #endif
+ 
+       return err;
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index 30a0c7c6224b3..da0e285302f9d 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -657,7 +657,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
+               if (!skip_hw && tx->key &&
+                   tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
+                       info->control.hw_key = &tx->key->conf;
+-      } else if (!ieee80211_is_mgmt(hdr->frame_control) && tx->sta &&
++      } else if (ieee80211_is_data_present(hdr->frame_control) && tx->sta &&
+                  test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) {
+               return TX_DROP;
+       }
+@@ -3773,7 +3773,7 @@ void __ieee80211_schedule_txq(struct ieee80211_hw *hw,
+                * get immediately moved to the back of the list on the next
+                * call to ieee80211_next_txq().
+                */
+-              if (txqi->txq.sta &&
++              if (txqi->txq.sta && local->airtime_flags &&
+                   wiphy_ext_feature_isset(local->hw.wiphy,
+                                           
NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
+                       list_add(&txqi->schedule_order,
+diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
+index 6cace43b217ee..916d1f455b218 100644
+--- a/net/rxrpc/input.c
++++ b/net/rxrpc/input.c
+@@ -431,7 +431,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, 
struct sk_buff *skb)
+               return;
+       }
+ 
+-      if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) {
++      if (state == RXRPC_CALL_SERVER_RECV_REQUEST) {
+               unsigned long timo = READ_ONCE(call->next_req_timo);
+               unsigned long now, expect_req_by;
+ 
+diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c
+index 85a9ff8cd236a..2b26c4d229a5a 100644
+--- a/net/rxrpc/key.c
++++ b/net/rxrpc/key.c
+@@ -1110,7 +1110,7 @@ static long rxrpc_read(const struct key *key,
+               default: /* we have a ticket we can't encode */
+                       pr_err("Unsupported key token type (%u)\n",
+                              token->security_index);
+-                      continue;
++                      return -ENOPKG;
+               }
+ 
+               _debug("token[%u]: toksize=%u", ntoks, toksize);
+@@ -1225,7 +1225,9 @@ static long rxrpc_read(const struct key *key,
+                       break;
+ 
+               default:
+-                      break;
++                      pr_err("Unsupported key token type (%u)\n",
++                             token->security_index);
++                      return -ENOPKG;
+               }
+ 
+               ASSERTCMP((unsigned long)xdr - (unsigned long)oldxdr, ==,
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c
+index 1fcc13f6073ef..41abfff6a6a3d 100644
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -1319,7 +1319,7 @@ static int __sctp_setsockopt_connectx(struct sock *sk,
+ 
+       kaddrs = memdup_user(addrs, addrs_size);
+       if (IS_ERR(kaddrs))
+-              return PTR_ERR(kaddrs);
++              return PTR_ERR(kaddrs) == -EFAULT ? -EINVAL : PTR_ERR(kaddrs);
+ 
+       /* Allow security module to validate connectx addresses. */
+       err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_CONNECTX,
+diff --git a/net/tipc/link.c b/net/tipc/link.c
+index a9d8a81e80cfd..f25010261a9e0 100644
+--- a/net/tipc/link.c
++++ b/net/tipc/link.c
+@@ -939,9 +939,7 @@ void tipc_link_reset(struct tipc_link *l)
+ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
+                  struct sk_buff_head *xmitq)
+ {
+-      struct tipc_msg *hdr = buf_msg(skb_peek(list));
+       unsigned int maxwin = l->window;
+-      int imp = msg_importance(hdr);
+       unsigned int mtu = l->mtu;
+       u16 ack = l->rcv_nxt - 1;
+       u16 seqno = l->snd_nxt;
+@@ -950,8 +948,14 @@ int tipc_link_xmit(struct tipc_link *l, struct 
sk_buff_head *list,
+       struct sk_buff_head *backlogq = &l->backlogq;
+       struct sk_buff *skb, *_skb, **tskb;
+       int pkt_cnt = skb_queue_len(list);
++      struct tipc_msg *hdr;
+       int rc = 0;
++      int imp;
++
++      if (pkt_cnt <= 0)
++              return 0;
+ 
++      hdr = buf_msg(skb_peek(list));
+       if (unlikely(msg_size(hdr) > mtu)) {
+               pr_warn("Too large msg, purging xmit list %d %d %d %d %d!\n",
+                       skb_queue_len(list), msg_user(hdr),
+@@ -960,6 +964,7 @@ int tipc_link_xmit(struct tipc_link *l, struct 
sk_buff_head *list,
+               return -EMSGSIZE;
+       }
+ 
++      imp = msg_importance(hdr);
+       /* Allow oversubscription of one data msg per source at congestion */
+       if (unlikely(l->backlog[imp].len >= l->backlog[imp].limit)) {
+               if (imp == TIPC_SYSTEM_IMPORTANCE) {

Reply via email to