commit:     55290dfd472ad243ed25eea59e4fc6a24470ee6c
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sun May  1 17:04:13 2022 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sun May  1 17:04:13 2022 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=55290dfd

Linux patch 4.19.241

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

 0000_README               |   4 +
 1240_linux-4.19.241.patch | 486 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 490 insertions(+)

diff --git a/0000_README b/0000_README
index 72dcbc8d..467db0c8 100644
--- a/0000_README
+++ b/0000_README
@@ -999,6 +999,10 @@ Patch:  1239_linux-4.19.240.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.240
 
+Patch:  1240_linux-4.19.241.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.241
+
 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/1240_linux-4.19.241.patch b/1240_linux-4.19.241.patch
new file mode 100644
index 00000000..3d258971
--- /dev/null
+++ b/1240_linux-4.19.241.patch
@@ -0,0 +1,486 @@
+diff --git a/Makefile b/Makefile
+index 546e52f8a05fa..58fb76d1d7d38 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 240
++SUBLEVEL = 241
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c
+index 9cfd3ac027b71..7fc0806bbdc91 100644
+--- a/arch/ia64/kernel/kprobes.c
++++ b/arch/ia64/kernel/kprobes.c
+@@ -409,10 +409,83 @@ static void kretprobe_trampoline(void)
+ {
+ }
+ 
++/*
++ * At this point the target function has been tricked into
++ * returning into our trampoline.  Lookup the associated instance
++ * and then:
++ *    - call the handler function
++ *    - cleanup by marking the instance as unused
++ *    - long jump back to the original return address
++ */
+ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
+ {
+-      regs->cr_iip = __kretprobe_trampoline_handler(regs,
+-              dereference_function_descriptor(kretprobe_trampoline), NULL);
++      struct kretprobe_instance *ri = NULL;
++      struct hlist_head *head, empty_rp;
++      struct hlist_node *tmp;
++      unsigned long flags, orig_ret_address = 0;
++      unsigned long trampoline_address =
++              (unsigned 
long)dereference_function_descriptor(kretprobe_trampoline);
++
++      INIT_HLIST_HEAD(&empty_rp);
++      kretprobe_hash_lock(current, &head, &flags);
++
++      /*
++       * It is possible to have multiple instances associated with a given
++       * task either because an multiple functions in the call path
++       * have a return probe installed on them, and/or more than one return
++       * return probe was registered for a target function.
++       *
++       * We can handle this because:
++       *     - instances are always inserted at the head of the list
++       *     - when multiple return probes are registered for the same
++       *       function, the first instance's ret_addr will point to the
++       *       real return address, and all the rest will point to
++       *       kretprobe_trampoline
++       */
++      hlist_for_each_entry_safe(ri, tmp, head, hlist) {
++              if (ri->task != current)
++                      /* another task is sharing our hash bucket */
++                      continue;
++
++              orig_ret_address = (unsigned long)ri->ret_addr;
++              if (orig_ret_address != trampoline_address)
++                      /*
++                       * This is the real return address. Any other
++                       * instances associated with this task are for
++                       * other calls deeper on the call stack
++                       */
++                      break;
++      }
++
++      regs->cr_iip = orig_ret_address;
++
++      hlist_for_each_entry_safe(ri, tmp, head, hlist) {
++              if (ri->task != current)
++                      /* another task is sharing our hash bucket */
++                      continue;
++
++              if (ri->rp && ri->rp->handler)
++                      ri->rp->handler(ri, regs);
++
++              orig_ret_address = (unsigned long)ri->ret_addr;
++              recycle_rp_inst(ri, &empty_rp);
++
++              if (orig_ret_address != trampoline_address)
++                      /*
++                       * This is the real return address. Any other
++                       * instances associated with this task are for
++                       * other calls deeper on the call stack
++                       */
++                      break;
++      }
++      kretprobe_assert(ri, orig_ret_address, trampoline_address);
++
++      kretprobe_hash_unlock(current, &flags);
++
++      hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
++              hlist_del(&ri->hlist);
++              kfree(ri);
++      }
+       /*
+        * By returning a non-zero value, we are telling
+        * kprobe_handler() that we don't want the post_handler
+@@ -425,7 +498,6 @@ void __kprobes arch_prepare_kretprobe(struct 
kretprobe_instance *ri,
+                                     struct pt_regs *regs)
+ {
+       ri->ret_addr = (kprobe_opcode_t *)regs->b0;
+-      ri->fp = NULL;
+ 
+       /* Replace the return addr with trampoline addr */
+       regs->b0 = (unsigned 
long)dereference_function_descriptor(kretprobe_trampoline);
+diff --git a/arch/powerpc/include/asm/exception-64s.h 
b/arch/powerpc/include/asm/exception-64s.h
+index 35fb5b11955a0..4fdae1c182df8 100644
+--- a/arch/powerpc/include/asm/exception-64s.h
++++ b/arch/powerpc/include/asm/exception-64s.h
+@@ -48,11 +48,12 @@
+ #define EX_CCR                52
+ #define EX_CFAR               56
+ #define EX_PPR                64
++#define EX_LR         72
+ #if defined(CONFIG_RELOCATABLE)
+-#define EX_CTR                72
+-#define EX_SIZE               10      /* size in u64 units */
++#define EX_CTR                80
++#define EX_SIZE               11      /* size in u64 units */
+ #else
+-#define EX_SIZE               9       /* size in u64 units */
++#define EX_SIZE               10      /* size in u64 units */
+ #endif
+ 
+ /*
+@@ -60,14 +61,6 @@
+  */
+ #define MAX_MCE_DEPTH 4
+ 
+-/*
+- * EX_LR is only used in EXSLB and where it does not overlap with EX_DAR
+- * EX_CCR similarly with DSISR, but being 4 byte registers there is a hole
+- * in the save area so it's not necessary to overlap them. Could be used
+- * for future savings though if another 4 byte register was to be saved.
+- */
+-#define EX_LR         EX_DAR
+-
+ /*
+  * EX_R3 is only used by the bad_stack handler. bad_stack reloads and
+  * saves DAR from SPRN_DAR, and EX_DAR is not used. So EX_R3 can overlap
+@@ -243,10 +236,22 @@
+  * PPR save/restore macros used in exceptions_64s.S  
+  * Used for P7 or later processors
+  */
+-#define SAVE_PPR(area, ra, rb)                                                
\
++#define SAVE_PPR(area, ra)                                            \
++BEGIN_FTR_SECTION_NESTED(940)                                         \
++      ld      ra,area+EX_PPR(r13);    /* Read PPR from paca */        \
++      std     ra,RESULT(r1);          /* Store PPR in RESULT for now */ \
++END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,940)
++
++/*
++ * This is called after we are finished accessing 'area', so we can now take
++ * SLB faults accessing the thread struct, which will use PACA_EXSLB area.
++ * This is required because the large_addr_slb handler uses EXSLB and it also
++ * uses the common exception macros including this PPR saving.
++ */
++#define MOVE_PPR_TO_THREAD(ra, rb)                                    \
+ BEGIN_FTR_SECTION_NESTED(940)                                         \
+       ld      ra,PACACURRENT(r13);                                    \
+-      ld      rb,area+EX_PPR(r13);    /* Read PPR from paca */        \
++      ld      rb,RESULT(r1);          /* Read PPR from stack */       \
+       std     rb,TASKTHREADPPR(ra);                                   \
+ END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,940)
+ 
+@@ -515,9 +520,11 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
+ 3:    EXCEPTION_PROLOG_COMMON_1();                                       \
+       beq     4f;                     /* if from kernel mode          */ \
+       ACCOUNT_CPU_USER_ENTRY(r13, r9, r10);                              \
+-      SAVE_PPR(area, r9, r10);                                           \
++      SAVE_PPR(area, r9);                                                \
+ 4:    EXCEPTION_PROLOG_COMMON_2(area)                                    \
+-      EXCEPTION_PROLOG_COMMON_3(n)                                       \
++      beq     5f;                     /* if from kernel mode          */ \
++      MOVE_PPR_TO_THREAD(r9, r10);                                       \
++5:    EXCEPTION_PROLOG_COMMON_3(n)                                       \
+       ACCOUNT_STOLEN_TIME
+ 
+ /* Save original regs values from save area to stack frame. */
+diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
+index 60662771bd465..940132e705c15 100644
+--- a/drivers/block/Kconfig
++++ b/drivers/block/Kconfig
+@@ -39,6 +39,22 @@ config BLK_DEV_FD
+         To compile this driver as a module, choose M here: the
+         module will be called floppy.
+ 
++config BLK_DEV_FD_RAWCMD
++      bool "Support for raw floppy disk commands (DEPRECATED)"
++      depends on BLK_DEV_FD
++      help
++        If you want to use actual physical floppies and expect to do
++        special low-level hardware accesses to them (access and use
++        non-standard formats, for example), then enable this.
++
++        Note that the code enabled by this option is rarely used and
++        might be unstable or insecure, and distros should not enable it.
++
++        Note: FDRAWCMD is deprecated and will be removed from the kernel
++        in the near future.
++
++        If unsure, say N.
++
+ config AMIGA_FLOPPY
+       tristate "Amiga floppy support"
+       depends on AMIGA
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index e6e95e67c40ee..97c8fc4d6e7bd 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -3023,6 +3023,8 @@ static const char *drive_name(int type, int drive)
+               return "(null)";
+ }
+ 
++#ifdef CONFIG_BLK_DEV_FD_RAWCMD
++
+ /* raw commands */
+ static void raw_cmd_done(int flag)
+ {
+@@ -3234,6 +3236,35 @@ static int raw_cmd_ioctl(int cmd, void __user *param)
+       return ret;
+ }
+ 
++static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
++                              void __user *param)
++{
++      int ret;
++
++      pr_warn_once("Note: FDRAWCMD is deprecated and will be removed from the 
kernel in the near future.\n");
++
++      if (type)
++              return -EINVAL;
++      if (lock_fdc(drive))
++              return -EINTR;
++      set_floppy(drive);
++      ret = raw_cmd_ioctl(cmd, param);
++      if (ret == -EINTR)
++              return -EINTR;
++      process_fd_request();
++      return ret;
++}
++
++#else /* CONFIG_BLK_DEV_FD_RAWCMD */
++
++static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
++                              void __user *param)
++{
++      return -EOPNOTSUPP;
++}
++
++#endif
++
+ static int invalidate_drive(struct block_device *bdev)
+ {
+       /* invalidate the buffer track to force a reread */
+@@ -3421,7 +3452,6 @@ static int fd_locked_ioctl(struct block_device *bdev, 
fmode_t mode, unsigned int
+ {
+       int drive = (long)bdev->bd_disk->private_data;
+       int type = ITYPE(UDRS->fd_device);
+-      int i;
+       int ret;
+       int size;
+       union inparam {
+@@ -3572,16 +3602,7 @@ static int fd_locked_ioctl(struct block_device *bdev, 
fmode_t mode, unsigned int
+               outparam = UDRWE;
+               break;
+       case FDRAWCMD:
+-              if (type)
+-                      return -EINVAL;
+-              if (lock_fdc(drive))
+-                      return -EINTR;
+-              set_floppy(drive);
+-              i = raw_cmd_ioctl(cmd, (void __user *)param);
+-              if (i == -EINTR)
+-                      return -EINTR;
+-              process_fd_request();
+-              return i;
++              return floppy_raw_cmd_ioctl(type, drive, cmd, (void __user 
*)param);
+       case FDTWADDLE:
+               if (lock_fdc(drive))
+                       return -EINTR;
+diff --git a/drivers/lightnvm/Kconfig b/drivers/lightnvm/Kconfig
+index 20706da7aa1cf..38cd49a3aeed1 100644
+--- a/drivers/lightnvm/Kconfig
++++ b/drivers/lightnvm/Kconfig
+@@ -4,7 +4,7 @@
+ 
+ menuconfig NVM
+       bool "Open-Channel SSD target support"
+-      depends on BLOCK && PCI
++      depends on BLOCK && PCI && BROKEN
+       select BLK_DEV_NVME
+       help
+         Say Y here to get to enable Open-channel SSDs.
+diff --git a/drivers/media/platform/vicodec/vicodec-core.c 
b/drivers/media/platform/vicodec/vicodec-core.c
+index 7a33a52eaccaa..9d2e1ce536ec0 100644
+--- a/drivers/media/platform/vicodec/vicodec-core.c
++++ b/drivers/media/platform/vicodec/vicodec-core.c
+@@ -1297,12 +1297,12 @@ static int vicodec_release(struct file *file)
+       struct video_device *vfd = video_devdata(file);
+       struct vicodec_ctx *ctx = file2ctx(file);
+ 
+-      v4l2_fh_del(&ctx->fh);
+-      v4l2_fh_exit(&ctx->fh);
+-      v4l2_ctrl_handler_free(&ctx->hdl);
+       mutex_lock(vfd->lock);
+       v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
+       mutex_unlock(vfd->lock);
++      v4l2_fh_del(&ctx->fh);
++      v4l2_fh_exit(&ctx->fh);
++      v4l2_ctrl_handler_free(&ctx->hdl);
+       kfree(ctx);
+ 
+       return 0;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c 
b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
+index 729df169faa21..8b50afcdb52df 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
++++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
+@@ -68,6 +68,10 @@
+ #define TSE_PCS_USE_SGMII_ENA                         BIT(0)
+ #define TSE_PCS_IF_USE_SGMII                          0x03
+ 
++#define SGMII_ADAPTER_CTRL_REG                                0x00
++#define SGMII_ADAPTER_DISABLE                         0x0001
++#define SGMII_ADAPTER_ENABLE                          0x0000
++
+ #define AUTONEGO_LINK_TIMER                           20
+ 
+ static int tse_pcs_reset(void __iomem *base, struct tse_pcs *pcs)
+@@ -209,8 +213,12 @@ void tse_pcs_fix_mac_speed(struct tse_pcs *pcs, struct 
phy_device *phy_dev,
+                          unsigned int speed)
+ {
+       void __iomem *tse_pcs_base = pcs->tse_pcs_base;
++      void __iomem *sgmii_adapter_base = pcs->sgmii_adapter_base;
+       u32 val;
+ 
++      writew(SGMII_ADAPTER_ENABLE,
++             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
++
+       pcs->autoneg = phy_dev->autoneg;
+ 
+       if (phy_dev->autoneg == AUTONEG_ENABLE) {
+diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h 
b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
+index 254199f2efdbf..2f5882450b06a 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
++++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
+@@ -21,10 +21,6 @@
+ #include <linux/phy.h>
+ #include <linux/timer.h>
+ 
+-#define SGMII_ADAPTER_CTRL_REG                0x00
+-#define SGMII_ADAPTER_ENABLE          0x0000
+-#define SGMII_ADAPTER_DISABLE         0x0001
+-
+ struct tse_pcs {
+       struct device *dev;
+       void __iomem *tse_pcs_base;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+index 32ead4a4b4604..33407df6bea69 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+@@ -29,6 +29,9 @@
+ 
+ #include "altr_tse_pcs.h"
+ 
++#define SGMII_ADAPTER_CTRL_REG                          0x00
++#define SGMII_ADAPTER_DISABLE                           0x0001
++
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII 0x2
+@@ -62,14 +65,16 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, 
unsigned int speed)
+ {
+       struct socfpga_dwmac *dwmac = (struct socfpga_dwmac *)priv;
+       void __iomem *splitter_base = dwmac->splitter_base;
++      void __iomem *tse_pcs_base = dwmac->pcs.tse_pcs_base;
+       void __iomem *sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base;
+       struct device *dev = dwmac->dev;
+       struct net_device *ndev = dev_get_drvdata(dev);
+       struct phy_device *phy_dev = ndev->phydev;
+       u32 val;
+ 
+-      writew(SGMII_ADAPTER_DISABLE,
+-             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
++      if ((tse_pcs_base) && (sgmii_adapter_base))
++              writew(SGMII_ADAPTER_DISABLE,
++                     sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
+ 
+       if (splitter_base) {
+               val = readl(splitter_base + EMAC_SPLITTER_CTRL_REG);
+@@ -91,9 +96,7 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned 
int speed)
+               writel(val, splitter_base + EMAC_SPLITTER_CTRL_REG);
+       }
+ 
+-      writew(SGMII_ADAPTER_ENABLE,
+-             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
+-      if (phy_dev)
++      if (tse_pcs_base && sgmii_adapter_base)
+               tse_pcs_fix_mac_speed(&dwmac->pcs, phy_dev, speed);
+ }
+ 
+diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
+index 29431e3eebee3..87094189af740 100644
+--- a/drivers/net/hamradio/6pack.c
++++ b/drivers/net/hamradio/6pack.c
+@@ -311,7 +311,6 @@ static void sp_setup(struct net_device *dev)
+ {
+       /* Finish setting up the DEVICE info. */
+       dev->netdev_ops         = &sp_netdev_ops;
+-      dev->needs_free_netdev  = true;
+       dev->mtu                = SIXP_MTU;
+       dev->hard_header_len    = AX25_MAX_HEADER_LEN;
+       dev->header_ops         = &ax25_header_ops;
+@@ -679,9 +678,11 @@ static void sixpack_close(struct tty_struct *tty)
+       del_timer_sync(&sp->tx_t);
+       del_timer_sync(&sp->resync_t);
+ 
+-      /* Free all 6pack frame buffers. */
++      /* Free all 6pack frame buffers after unreg. */
+       kfree(sp->rbuff);
+       kfree(sp->xbuff);
++
++      free_netdev(sp->dev);
+ }
+ 
+ /* Perform I/O control on an active 6pack channel. */
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
+index 5eee26cf9011f..d30256ac35372 100644
+--- a/net/sched/cls_u32.c
++++ b/net/sched/cls_u32.c
+@@ -404,15 +404,20 @@ static int u32_init(struct tcf_proto *tp)
+       return 0;
+ }
+ 
+-static int u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n,
+-                         bool free_pf)
++static void __u32_destroy_key(struct tc_u_knode *n)
+ {
+       struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
+ 
+       tcf_exts_destroy(&n->exts);
+-      tcf_exts_put_net(&n->exts);
+       if (ht && --ht->refcnt == 0)
+               kfree(ht);
++      kfree(n);
++}
++
++static void u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n,
++                          bool free_pf)
++{
++      tcf_exts_put_net(&n->exts);
+ #ifdef CONFIG_CLS_U32_PERF
+       if (free_pf)
+               free_percpu(n->pf);
+@@ -421,8 +426,7 @@ static int u32_destroy_key(struct tcf_proto *tp, struct 
tc_u_knode *n,
+       if (free_pf)
+               free_percpu(n->pcpu_success);
+ #endif
+-      kfree(n);
+-      return 0;
++      __u32_destroy_key(n);
+ }
+ 
+ /* u32_delete_key_rcu should be called when free'ing a copied
+@@ -965,13 +969,13 @@ static int u32_change(struct net *net, struct sk_buff 
*in_skb,
+                                   tca[TCA_RATE], ovr, extack);
+ 
+               if (err) {
+-                      u32_destroy_key(tp, new, false);
++                      __u32_destroy_key(new);
+                       return err;
+               }
+ 
+               err = u32_replace_hw_knode(tp, new, flags, extack);
+               if (err) {
+-                      u32_destroy_key(tp, new, false);
++                      __u32_destroy_key(new);
+                       return err;
+               }
+ 

Reply via email to