diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2021-07-07 22:23:55 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2021-07-07 22:39:49 +0200 |
commit | c8eff2bb1abeaf5d911fd8a66aed24a549f639c4 (patch) | |
tree | fcd29fe7e619bd1533fd6a3a1fbffc13fbe709f6 /patches/random-make-it-work-on-rt.patch | |
parent | c6725e2f14b523bba0f8fe4472a07aaf8681ad75 (diff) | |
download | linux-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.patch | 166 |
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); - } - |