commit:     3240e96272ce4d849415cebbeb38e1cf4ebb66fe
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri Aug  7 19:13:46 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri Aug  7 19:13:46 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=3240e962

Linux patch 4.14.193

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

 0000_README               |   4 +
 1192_linux-4.14.193.patch | 488 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 492 insertions(+)

diff --git a/0000_README b/0000_README
index c4718ce..f21e8e8 100644
--- a/0000_README
+++ b/0000_README
@@ -811,6 +811,10 @@ Patch:  1191_linux-4.14.192.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.192
 
+Patch:  1192_linux-4.14.193.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.193
+
 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/1192_linux-4.14.193.patch b/1192_linux-4.14.193.patch
new file mode 100644
index 0000000..3df9868
--- /dev/null
+++ b/1192_linux-4.14.193.patch
@@ -0,0 +1,488 @@
+diff --git a/Makefile b/Makefile
+index 60570fad811e..b30927f29e2b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 192
++SUBLEVEL = 193
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h
+index a89b4076cde4..72821b4721ad 100644
+--- a/arch/arm/include/asm/percpu.h
++++ b/arch/arm/include/asm/percpu.h
+@@ -16,6 +16,8 @@
+ #ifndef _ASM_ARM_PERCPU_H_
+ #define _ASM_ARM_PERCPU_H_
+ 
++#include <asm/thread_info.h>
++
+ /*
+  * Same as asm-generic/percpu.h, except that we store the per cpu offset
+  * in the TPIDRPRW. TPIDRPRW only exists on V6K and V7
+diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
+index 7e662bdd5cb3..932b2244e709 100644
+--- a/arch/arm/kernel/head-common.S
++++ b/arch/arm/kernel/head-common.S
+@@ -101,6 +101,7 @@ __mmap_switched:
+       str     r2, [r6]                        @ Save atags pointer
+       cmp     r7, #0
+       strne   r0, [r7]                        @ Save control register values
++      mov     lr, #0
+       b       start_kernel
+ ENDPROC(__mmap_switched)
+ 
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index 868d2620b7ac..b202f66fc383 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -1246,6 +1246,7 @@ void add_interrupt_randomness(int irq, int irq_flags)
+ 
+       fast_mix(fast_pool);
+       add_interrupt_bench(cycles);
++      this_cpu_add(net_rand_state.s1, fast_pool->pool[cycles & 3]);
+ 
+       if (unlikely(crng_init == 0)) {
+               if ((fast_pool->count >= 64) &&
+diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
+index 2b3637b40dde..70be4425ae0b 100644
+--- a/drivers/scsi/libsas/sas_ata.c
++++ b/drivers/scsi/libsas/sas_ata.c
+@@ -730,6 +730,7 @@ int sas_discover_sata(struct domain_device *dev)
+       if (res)
+               return res;
+ 
++      sas_discover_event(dev->port, DISCE_PROBE);
+       return 0;
+ }
+ 
+diff --git a/drivers/scsi/libsas/sas_discover.c 
b/drivers/scsi/libsas/sas_discover.c
+index d6365e2fcc60..b200edc665a5 100644
+--- a/drivers/scsi/libsas/sas_discover.c
++++ b/drivers/scsi/libsas/sas_discover.c
+@@ -221,9 +221,13 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev)
+       }
+ }
+ 
+-static void sas_probe_devices(struct asd_sas_port *port)
++static void sas_probe_devices(struct work_struct *work)
+ {
+       struct domain_device *dev, *n;
++      struct sas_discovery_event *ev = to_sas_discovery_event(work);
++      struct asd_sas_port *port = ev->port;
++
++      clear_bit(DISCE_PROBE, &port->disc.pending);
+ 
+       /* devices must be domain members before link recovery and probe */
+       list_for_each_entry(dev, &port->disco_list, disco_list_node) {
+@@ -299,6 +303,7 @@ int sas_discover_end_dev(struct domain_device *dev)
+       res = sas_notify_lldd_dev_found(dev);
+       if (res)
+               return res;
++      sas_discover_event(dev->port, DISCE_PROBE);
+ 
+       return 0;
+ }
+@@ -357,9 +362,13 @@ static void sas_unregister_common_dev(struct asd_sas_port 
*port, struct domain_d
+       sas_put_device(dev);
+ }
+ 
+-void sas_destruct_devices(struct asd_sas_port *port)
++static void sas_destruct_devices(struct work_struct *work)
+ {
+       struct domain_device *dev, *n;
++      struct sas_discovery_event *ev = to_sas_discovery_event(work);
++      struct asd_sas_port *port = ev->port;
++
++      clear_bit(DISCE_DESTRUCT, &port->disc.pending);
+ 
+       list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) {
+               list_del_init(&dev->disco_list_node);
+@@ -370,16 +379,6 @@ void sas_destruct_devices(struct asd_sas_port *port)
+       }
+ }
+ 
+-static void sas_destruct_ports(struct asd_sas_port *port)
+-{
+-      struct sas_port *sas_port, *p;
+-
+-      list_for_each_entry_safe(sas_port, p, &port->sas_port_del_list, 
del_list) {
+-              list_del_init(&sas_port->del_list);
+-              sas_port_delete(sas_port);
+-      }
+-}
+-
+ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
+ {
+       if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
+@@ -394,6 +393,7 @@ void sas_unregister_dev(struct asd_sas_port *port, struct 
domain_device *dev)
+       if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) {
+               sas_rphy_unlink(dev->rphy);
+               list_move_tail(&dev->disco_list_node, &port->destroy_list);
++              sas_discover_event(dev->port, DISCE_DESTRUCT);
+       }
+ }
+ 
+@@ -499,8 +499,6 @@ static void sas_discover_domain(struct work_struct *work)
+               port->port_dev = NULL;
+       }
+ 
+-      sas_probe_devices(port);
+-
+       SAS_DPRINTK("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id,
+                   task_pid_nr(current), error);
+ }
+@@ -534,10 +532,6 @@ static void sas_revalidate_domain(struct work_struct 
*work)
+                   port->id, task_pid_nr(current), res);
+  out:
+       mutex_unlock(&ha->disco_mutex);
+-
+-      sas_destruct_devices(port);
+-      sas_destruct_ports(port);
+-      sas_probe_devices(port);
+ }
+ 
+ /* ---------- Events ---------- */
+@@ -593,8 +587,10 @@ void sas_init_disc(struct sas_discovery *disc, struct 
asd_sas_port *port)
+       static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = {
+               [DISCE_DISCOVER_DOMAIN] = sas_discover_domain,
+               [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
++              [DISCE_PROBE] = sas_probe_devices,
+               [DISCE_SUSPEND] = sas_suspend_devices,
+               [DISCE_RESUME] = sas_resume_devices,
++              [DISCE_DESTRUCT] = sas_destruct_devices,
+       };
+ 
+       disc->pending = 0;
+diff --git a/drivers/scsi/libsas/sas_expander.c 
b/drivers/scsi/libsas/sas_expander.c
+index 84df6cf46760..f77d72f01da9 100644
+--- a/drivers/scsi/libsas/sas_expander.c
++++ b/drivers/scsi/libsas/sas_expander.c
+@@ -1946,8 +1946,7 @@ static void sas_unregister_devs_sas_addr(struct 
domain_device *parent,
+               sas_port_delete_phy(phy->port, phy->phy);
+               sas_device_set_phy(found, phy->port);
+               if (phy->port->num_phys == 0)
+-                      list_add_tail(&phy->port->del_list,
+-                              &parent->port->sas_port_del_list);
++                      sas_port_delete(phy->port);
+               phy->port = NULL;
+       }
+ }
+@@ -2157,7 +2156,7 @@ int sas_ex_revalidate_domain(struct domain_device 
*port_dev)
+       struct domain_device *dev = NULL;
+ 
+       res = sas_find_bcast_dev(port_dev, &dev);
+-      if (res == 0 && dev) {
++      while (res == 0 && dev) {
+               struct expander_device *ex = &dev->ex_dev;
+               int i = 0, phy_id;
+ 
+@@ -2169,6 +2168,9 @@ int sas_ex_revalidate_domain(struct domain_device 
*port_dev)
+                       res = sas_rediscover(dev, phy_id);
+                       i = phy_id + 1;
+               } while (i < ex->num_phys);
++
++              dev = NULL;
++              res = sas_find_bcast_dev(port_dev, &dev);
+       }
+       return res;
+ }
+diff --git a/drivers/scsi/libsas/sas_internal.h 
b/drivers/scsi/libsas/sas_internal.h
+index f3449fde9c5f..c07e08136491 100644
+--- a/drivers/scsi/libsas/sas_internal.h
++++ b/drivers/scsi/libsas/sas_internal.h
+@@ -98,7 +98,6 @@ int sas_try_ata_reset(struct asd_sas_phy *phy);
+ void sas_hae_reset(struct work_struct *work);
+ 
+ void sas_free_device(struct kref *kref);
+-void sas_destruct_devices(struct asd_sas_port *port);
+ 
+ #ifdef CONFIG_SCSI_SAS_HOST_SMP
+ extern void sas_smp_host_handler(struct bsg_job *job, struct Scsi_Host 
*shost);
+diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
+index 5d3244c8f280..d3c5297c6c89 100644
+--- a/drivers/scsi/libsas/sas_port.c
++++ b/drivers/scsi/libsas/sas_port.c
+@@ -66,7 +66,6 @@ static void sas_resume_port(struct asd_sas_phy *phy)
+               rc = sas_notify_lldd_dev_found(dev);
+               if (rc) {
+                       sas_unregister_dev(port, dev);
+-                      sas_destruct_devices(port);
+                       continue;
+               }
+ 
+@@ -220,7 +219,6 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
+ 
+       if (port->num_phys == 1) {
+               sas_unregister_domain_devices(port, gone);
+-              sas_destruct_devices(port);
+               sas_port_delete(port->port);
+               port->port = NULL;
+       } else {
+@@ -325,7 +323,6 @@ static void sas_init_port(struct asd_sas_port *port,
+       INIT_LIST_HEAD(&port->dev_list);
+       INIT_LIST_HEAD(&port->disco_list);
+       INIT_LIST_HEAD(&port->destroy_list);
+-      INIT_LIST_HEAD(&port->sas_port_del_list);
+       spin_lock_init(&port->phy_list_lock);
+       INIT_LIST_HEAD(&port->phy_list);
+       port->ha = sas_ha;
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 5f03a4fabeaa..845b8620afcf 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -3794,6 +3794,11 @@ static ssize_t ext4_direct_IO_read(struct kiocb *iocb, 
struct iov_iter *iter)
+       struct inode *inode = mapping->host;
+       size_t count = iov_iter_count(iter);
+       ssize_t ret;
++      loff_t offset = iocb->ki_pos;
++      loff_t size = i_size_read(inode);
++
++      if (offset >= size)
++              return 0;
+ 
+       /*
+        * Shared inode_lock is enough for us - it protects against concurrent
+diff --git a/include/linux/prandom.h b/include/linux/prandom.h
+new file mode 100644
+index 000000000000..aa16e6468f91
+--- /dev/null
++++ b/include/linux/prandom.h
+@@ -0,0 +1,78 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * include/linux/prandom.h
++ *
++ * Include file for the fast pseudo-random 32-bit
++ * generation.
++ */
++#ifndef _LINUX_PRANDOM_H
++#define _LINUX_PRANDOM_H
++
++#include <linux/types.h>
++#include <linux/percpu.h>
++
++u32 prandom_u32(void);
++void prandom_bytes(void *buf, size_t nbytes);
++void prandom_seed(u32 seed);
++void prandom_reseed_late(void);
++
++struct rnd_state {
++      __u32 s1, s2, s3, s4;
++};
++
++DECLARE_PER_CPU(struct rnd_state, net_rand_state);
++
++u32 prandom_u32_state(struct rnd_state *state);
++void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes);
++void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state);
++
++#define prandom_init_once(pcpu_state)                 \
++      DO_ONCE(prandom_seed_full_state, (pcpu_state))
++
++/**
++ * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro)
++ * @ep_ro: right open interval endpoint
++ *
++ * Returns a pseudo-random number that is in interval [0, ep_ro). Note
++ * that the result depends on PRNG being well distributed in [0, ~0U]
++ * u32 space. Here we use maximally equidistributed combined Tausworthe
++ * generator, that is, prandom_u32(). This is useful when requesting a
++ * random index of an array containing ep_ro elements, for example.
++ *
++ * Returns: pseudo-random number in interval [0, ep_ro)
++ */
++static inline u32 prandom_u32_max(u32 ep_ro)
++{
++      return (u32)(((u64) prandom_u32() * ep_ro) >> 32);
++}
++
++/*
++ * Handle minimum values for seeds
++ */
++static inline u32 __seed(u32 x, u32 m)
++{
++      return (x < m) ? x + m : x;
++}
++
++/**
++ * prandom_seed_state - set seed for prandom_u32_state().
++ * @state: pointer to state structure to receive the seed.
++ * @seed: arbitrary 64-bit value to use as a seed.
++ */
++static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
++{
++      u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
++
++      state->s1 = __seed(i,   2U);
++      state->s2 = __seed(i,   8U);
++      state->s3 = __seed(i,  16U);
++      state->s4 = __seed(i, 128U);
++}
++
++/* Pseudo random number generator from numerical recipes. */
++static inline u32 next_pseudo_random32(u32 seed)
++{
++      return seed * 1664525 + 1013904223;
++}
++
++#endif
+diff --git a/include/linux/random.h b/include/linux/random.h
+index 4024f7d9c77d..8eda8c0cbba7 100644
+--- a/include/linux/random.h
++++ b/include/linux/random.h
+@@ -107,61 +107,12 @@ declare_get_random_var_wait(long)
+ 
+ unsigned long randomize_page(unsigned long start, unsigned long range);
+ 
+-u32 prandom_u32(void);
+-void prandom_bytes(void *buf, size_t nbytes);
+-void prandom_seed(u32 seed);
+-void prandom_reseed_late(void);
+-
+-struct rnd_state {
+-      __u32 s1, s2, s3, s4;
+-};
+-
+-u32 prandom_u32_state(struct rnd_state *state);
+-void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes);
+-void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state);
+-
+-#define prandom_init_once(pcpu_state)                 \
+-      DO_ONCE(prandom_seed_full_state, (pcpu_state))
+-
+-/**
+- * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro)
+- * @ep_ro: right open interval endpoint
+- *
+- * Returns a pseudo-random number that is in interval [0, ep_ro). Note
+- * that the result depends on PRNG being well distributed in [0, ~0U]
+- * u32 space. Here we use maximally equidistributed combined Tausworthe
+- * generator, that is, prandom_u32(). This is useful when requesting a
+- * random index of an array containing ep_ro elements, for example.
+- *
+- * Returns: pseudo-random number in interval [0, ep_ro)
+- */
+-static inline u32 prandom_u32_max(u32 ep_ro)
+-{
+-      return (u32)(((u64) prandom_u32() * ep_ro) >> 32);
+-}
+-
+ /*
+- * Handle minimum values for seeds
++ * This is designed to be standalone for just prandom
++ * users, but for now we include it from <linux/random.h>
++ * for legacy reasons.
+  */
+-static inline u32 __seed(u32 x, u32 m)
+-{
+-      return (x < m) ? x + m : x;
+-}
+-
+-/**
+- * prandom_seed_state - set seed for prandom_u32_state().
+- * @state: pointer to state structure to receive the seed.
+- * @seed: arbitrary 64-bit value to use as a seed.
+- */
+-static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
+-{
+-      u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
+-
+-      state->s1 = __seed(i,   2U);
+-      state->s2 = __seed(i,   8U);
+-      state->s3 = __seed(i,  16U);
+-      state->s4 = __seed(i, 128U);
+-}
++#include <linux/prandom.h>
+ 
+ #ifdef CONFIG_ARCH_RANDOM
+ # include <asm/archrandom.h>
+@@ -192,10 +143,4 @@ static inline bool arch_has_random_seed(void)
+ }
+ #endif
+ 
+-/* Pseudo random number generator from numerical recipes. */
+-static inline u32 next_pseudo_random32(u32 seed)
+-{
+-      return seed * 1664525 + 1013904223;
+-}
+-
+ #endif /* _LINUX_RANDOM_H */
+diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
+index 1b1cf9eff3b5..a966d281dedc 100644
+--- a/include/scsi/libsas.h
++++ b/include/scsi/libsas.h
+@@ -87,8 +87,10 @@ enum discover_event {
+       DISCE_DISCOVER_DOMAIN   = 0U,
+       DISCE_REVALIDATE_DOMAIN = 1,
+       DISCE_PORT_GONE         = 2,
++      DISCE_PROBE             = 3,
+       DISCE_SUSPEND           = 4,
+       DISCE_RESUME            = 5,
++      DISCE_DESTRUCT          = 6,
+       DISC_NUM_EVENTS         = 7,
+ };
+ 
+@@ -267,7 +269,6 @@ struct asd_sas_port {
+       struct list_head dev_list;
+       struct list_head disco_list;
+       struct list_head destroy_list;
+-      struct list_head sas_port_del_list;
+       enum   sas_linkrate linkrate;
+ 
+       struct sas_work work;
+diff --git a/include/scsi/scsi_transport_sas.h 
b/include/scsi/scsi_transport_sas.h
+index 05ec927a3c72..62895b405933 100644
+--- a/include/scsi/scsi_transport_sas.h
++++ b/include/scsi/scsi_transport_sas.h
+@@ -156,7 +156,6 @@ struct sas_port {
+ 
+       struct mutex            phy_list_mutex;
+       struct list_head        phy_list;
+-      struct list_head        del_list; /* libsas only */
+ };
+ 
+ #define dev_to_sas_port(d) \
+diff --git a/kernel/time/timer.c b/kernel/time/timer.c
+index 7e88c87c3554..d4bc272e03ee 100644
+--- a/kernel/time/timer.c
++++ b/kernel/time/timer.c
+@@ -44,6 +44,7 @@
+ #include <linux/sched/debug.h>
+ #include <linux/slab.h>
+ #include <linux/compat.h>
++#include <linux/random.h>
+ 
+ #include <linux/uaccess.h>
+ #include <asm/unistd.h>
+@@ -1595,6 +1596,13 @@ void update_process_times(int user_tick)
+       scheduler_tick();
+       if (IS_ENABLED(CONFIG_POSIX_TIMERS))
+               run_posix_cpu_timers(p);
++
++      /* The current CPU might make use of net randoms without receiving IRQs
++       * to renew them often enough. Let's update the net_rand_state from a
++       * non-constant value that's not affine to the number of calls to make
++       * sure it's updated when there's some activity (we don't care in idle).
++       */
++      this_cpu_add(net_rand_state.s1, rol32(jiffies, 24) + user_tick);
+ }
+ 
+ /**
+diff --git a/lib/random32.c b/lib/random32.c
+index 0a90cb0e0fb6..6e2c48ab8072 100644
+--- a/lib/random32.c
++++ b/lib/random32.c
+@@ -48,7 +48,7 @@ static inline void prandom_state_selftest(void)
+ }
+ #endif
+ 
+-static DEFINE_PER_CPU(struct rnd_state, net_rand_state) __latent_entropy;
++DEFINE_PER_CPU(struct rnd_state, net_rand_state);
+ 
+ /**
+  *    prandom_u32_state - seeded pseudo-random number generator.

Reply via email to