mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-06 21:19:01 +00:00
- legacy received upstream patches - current had broken headers installation + few missing patches - dev was bumped to 5.8.y
488 lines
15 KiB
Diff
488 lines
15 KiB
Diff
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.
|