summaryrefslogtreecommitdiff
path: root/patches/random-make-it-work-on-rt.patch
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2021-07-07 22:23:55 +0200
committerThomas Gleixner <tglx@linutronix.de>2021-07-07 22:39:49 +0200
commitc8eff2bb1abeaf5d911fd8a66aed24a549f639c4 (patch)
treefcd29fe7e619bd1533fd6a3a1fbffc13fbe709f6 /patches/random-make-it-work-on-rt.patch
parentc6725e2f14b523bba0f8fe4472a07aaf8681ad75 (diff)
downloadlinux-rt-c8eff2bb1abeaf5d911fd8a66aed24a549f639c4.tar.gz
[ANNOUNCE] v5.13-rt1
Dear RT folks! I'm pleased to announce the v5.13-rt1 patch set. Changes since v5.12-rc3-rt3: - Fast forward to v5.13 - Rework of the locking core bits - Rework of large parts of the mm bits. Thanks to Mel Gorman and Vlastimil Babka for picking this up and polishing it with -mm wizardry. - The latest respin of the printk overhaul from John Ogness - Patch queue reordered Known issues - config dependent build fails on ARM (also in plain v5.13) - netconsole triggers WARN. You can get this release via the git tree at: git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v5.13-rt1 The RT patch against v5.13 can be found here: https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.13/patch-5.13-rt1.patch.xz The split quilt queue is available at: https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.13/patches-5.13-rt1.tar.xz Thanks, tglx Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'patches/random-make-it-work-on-rt.patch')
-rw-r--r--patches/random-make-it-work-on-rt.patch166
1 files changed, 0 insertions, 166 deletions
diff --git a/patches/random-make-it-work-on-rt.patch b/patches/random-make-it-work-on-rt.patch
deleted file mode 100644
index f36de215d032..000000000000
--- a/patches/random-make-it-work-on-rt.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-Subject: random: Make it work on rt
-From: Thomas Gleixner <tglx@linutronix.de>
-Date: Tue, 21 Aug 2012 20:38:50 +0200
-
-Delegate the random insertion to the forced threaded interrupt
-handler. Store the return IP of the hard interrupt handler in the irq
-descriptor and feed it into the random generator as a source of
-entropy.
-
-Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-
----
- arch/x86/kernel/cpu/mshyperv.c | 3 ++-
- drivers/char/random.c | 11 +++++------
- drivers/hv/hyperv_vmbus.h | 1 +
- drivers/hv/vmbus_drv.c | 5 ++++-
- include/linux/irqdesc.h | 1 +
- include/linux/random.h | 2 +-
- kernel/irq/handle.c | 8 +++++++-
- kernel/irq/manage.c | 6 ++++++
- 8 files changed, 27 insertions(+), 10 deletions(-)
-
---- a/arch/x86/kernel/cpu/mshyperv.c
-+++ b/arch/x86/kernel/cpu/mshyperv.c
-@@ -85,11 +85,12 @@ EXPORT_SYMBOL_GPL(hv_remove_vmbus_irq);
- DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_stimer0)
- {
- struct pt_regs *old_regs = set_irq_regs(regs);
-+ u64 ip = regs ? instruction_pointer(regs) : 0;
-
- inc_irq_stat(hyperv_stimer0_count);
- if (hv_stimer0_handler)
- hv_stimer0_handler();
-- add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0);
-+ add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0, ip);
- ack_APIC_irq();
-
- set_irq_regs(old_regs);
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -1252,26 +1252,25 @@ static __u32 get_reg(struct fast_pool *f
- return *ptr;
- }
-
--void add_interrupt_randomness(int irq, int irq_flags)
-+void add_interrupt_randomness(int irq, int irq_flags, __u64 ip)
- {
- struct entropy_store *r;
- struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness);
-- struct pt_regs *regs = get_irq_regs();
- unsigned long now = jiffies;
- cycles_t cycles = random_get_entropy();
- __u32 c_high, j_high;
-- __u64 ip;
-
- if (cycles == 0)
-- cycles = get_reg(fast_pool, regs);
-+ cycles = get_reg(fast_pool, NULL);
- c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0;
- j_high = (sizeof(now) > 4) ? now >> 32 : 0;
- fast_pool->pool[0] ^= cycles ^ j_high ^ irq;
- fast_pool->pool[1] ^= now ^ c_high;
-- ip = regs ? instruction_pointer(regs) : _RET_IP_;
-+ if (!ip)
-+ ip = _RET_IP_;
- fast_pool->pool[2] ^= ip;
- fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 :
-- get_reg(fast_pool, regs);
-+ get_reg(fast_pool, NULL);
-
- fast_mix(fast_pool);
- add_interrupt_bench(cycles);
---- a/drivers/hv/hyperv_vmbus.h
-+++ b/drivers/hv/hyperv_vmbus.h
-@@ -18,6 +18,7 @@
- #include <linux/atomic.h>
- #include <linux/hyperv.h>
- #include <linux/interrupt.h>
-+#include <linux/irq.h>
-
- #include "hv_trace.h"
-
---- a/drivers/hv/vmbus_drv.c
-+++ b/drivers/hv/vmbus_drv.c
-@@ -22,6 +22,7 @@
- #include <linux/clockchips.h>
- #include <linux/cpu.h>
- #include <linux/sched/task_stack.h>
-+#include <linux/irq.h>
-
- #include <linux/delay.h>
- #include <linux/notifier.h>
-@@ -1337,6 +1338,8 @@ static void vmbus_isr(void)
- void *page_addr = hv_cpu->synic_event_page;
- struct hv_message *msg;
- union hv_synic_event_flags *event;
-+ struct pt_regs *regs = get_irq_regs();
-+ u64 ip = regs ? instruction_pointer(regs) : 0;
- bool handled = false;
-
- if (unlikely(page_addr == NULL))
-@@ -1381,7 +1384,7 @@ static void vmbus_isr(void)
- tasklet_schedule(&hv_cpu->msg_dpc);
- }
-
-- add_interrupt_randomness(hv_get_vector(), 0);
-+ add_interrupt_randomness(hv_get_vector(), 0, ip);
- }
-
- /*
---- a/include/linux/irqdesc.h
-+++ b/include/linux/irqdesc.h
-@@ -68,6 +68,7 @@ struct irq_desc {
- unsigned int irqs_unhandled;
- atomic_t threads_handled;
- int threads_handled_last;
-+ u64 random_ip;
- raw_spinlock_t lock;
- struct cpumask *percpu_enabled;
- const struct cpumask *percpu_affinity;
---- a/include/linux/random.h
-+++ b/include/linux/random.h
-@@ -35,7 +35,7 @@ static inline void add_latent_entropy(vo
-
- extern void add_input_randomness(unsigned int type, unsigned int code,
- unsigned int value) __latent_entropy;
--extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy;
-+extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy;
-
- extern void get_random_bytes(void *buf, int nbytes);
- extern int wait_for_random_bytes(void);
---- a/kernel/irq/handle.c
-+++ b/kernel/irq/handle.c
-@@ -192,10 +192,16 @@ irqreturn_t handle_irq_event_percpu(stru
- {
- irqreturn_t retval;
- unsigned int flags = 0;
-+ struct pt_regs *regs = get_irq_regs();
-+ u64 ip = regs ? instruction_pointer(regs) : 0;
-
- retval = __handle_irq_event_percpu(desc, &flags);
-
-- add_interrupt_randomness(desc->irq_data.irq, flags);
-+#ifdef CONFIG_PREEMPT_RT
-+ desc->random_ip = ip;
-+#else
-+ add_interrupt_randomness(desc->irq_data.irq, flags, ip);
-+#endif
-
- if (!noirqdebug)
- note_interrupt(desc, retval);
---- a/kernel/irq/manage.c
-+++ b/kernel/irq/manage.c
-@@ -1247,6 +1247,12 @@ static int irq_thread(void *data)
- if (action_ret == IRQ_WAKE_THREAD)
- irq_wake_secondary(desc, action);
-
-+ if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
-+ migrate_disable();
-+ add_interrupt_randomness(action->irq, 0,
-+ desc->random_ip ^ (unsigned long) action);
-+ migrate_enable();
-+ }
- wake_threads_waitq(desc);
- }
-