diff options
Diffstat (limited to 'debian/patches-rt/0131-irqtime-Move-irqtime-entry-accounting-after-irq-offs.patch')
-rw-r--r-- | debian/patches-rt/0131-irqtime-Move-irqtime-entry-accounting-after-irq-offs.patch | 213 |
1 files changed, 0 insertions, 213 deletions
diff --git a/debian/patches-rt/0131-irqtime-Move-irqtime-entry-accounting-after-irq-offs.patch b/debian/patches-rt/0131-irqtime-Move-irqtime-entry-accounting-after-irq-offs.patch deleted file mode 100644 index c1c053119..000000000 --- a/debian/patches-rt/0131-irqtime-Move-irqtime-entry-accounting-after-irq-offs.patch +++ /dev/null @@ -1,213 +0,0 @@ -From fc6569de970c50344e99ed1175ff563278bf65e1 Mon Sep 17 00:00:00 2001 -From: Frederic Weisbecker <frederic@kernel.org> -Date: Wed, 2 Dec 2020 12:57:31 +0100 -Subject: [PATCH 131/296] irqtime: Move irqtime entry accounting after irq - offset incrementation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patches-5.10.35-rt39.tar.xz - -IRQ time entry is currently accounted before HARDIRQ_OFFSET or -SOFTIRQ_OFFSET are incremented. This is convenient to decide to which -index the cputime to account is dispatched. - -Unfortunately it prevents tick_irq_enter() from being called under -HARDIRQ_OFFSET because tick_irq_enter() has to be called before the IRQ -entry accounting due to the necessary clock catch up. As a result we -don't benefit from appropriate lockdep coverage on tick_irq_enter(). - -To prepare for fixing this, move the IRQ entry cputime accounting after -the preempt offset is incremented. This requires the cputime dispatch -code to handle the extra offset. - -Signed-off-by: Frederic Weisbecker <frederic@kernel.org> -Signed-off-by: Thomas Gleixner <tglx@linutronix.de> -Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> -Link: https://lore.kernel.org/r/20201202115732.27827-5-frederic@kernel.org -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - include/linux/hardirq.h | 4 ++-- - include/linux/vtime.h | 34 ++++++++++++++++++++++++---------- - kernel/sched/cputime.c | 18 +++++++++++------- - kernel/softirq.c | 6 +++--- - 4 files changed, 40 insertions(+), 22 deletions(-) - -diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h -index c35b71f8644a..0926e9ca4d85 100644 ---- a/include/linux/hardirq.h -+++ b/include/linux/hardirq.h -@@ -32,9 +32,9 @@ static __always_inline void rcu_irq_enter_check_tick(void) - */ - #define __irq_enter() \ - do { \ -- account_irq_enter_time(current); \ - preempt_count_add(HARDIRQ_OFFSET); \ - lockdep_hardirq_enter(); \ -+ account_hardirq_enter(current); \ - } while (0) - - /* -@@ -62,8 +62,8 @@ void irq_enter_rcu(void); - */ - #define __irq_exit() \ - do { \ -+ account_hardirq_exit(current); \ - lockdep_hardirq_exit(); \ -- account_irq_exit_time(current); \ - preempt_count_sub(HARDIRQ_OFFSET); \ - } while (0) - -diff --git a/include/linux/vtime.h b/include/linux/vtime.h -index 6c9867419615..041d6524d144 100644 ---- a/include/linux/vtime.h -+++ b/include/linux/vtime.h -@@ -83,32 +83,46 @@ static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { } - #endif - - #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE --extern void vtime_account_irq(struct task_struct *tsk); -+extern void vtime_account_irq(struct task_struct *tsk, unsigned int offset); - extern void vtime_account_softirq(struct task_struct *tsk); - extern void vtime_account_hardirq(struct task_struct *tsk); - extern void vtime_flush(struct task_struct *tsk); - #else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ --static inline void vtime_account_irq(struct task_struct *tsk) { } -+static inline void vtime_account_irq(struct task_struct *tsk, unsigned int offset) { } -+static inline void vtime_account_softirq(struct task_struct *tsk) { } -+static inline void vtime_account_hardirq(struct task_struct *tsk) { } - static inline void vtime_flush(struct task_struct *tsk) { } - #endif - - - #ifdef CONFIG_IRQ_TIME_ACCOUNTING --extern void irqtime_account_irq(struct task_struct *tsk); -+extern void irqtime_account_irq(struct task_struct *tsk, unsigned int offset); - #else --static inline void irqtime_account_irq(struct task_struct *tsk) { } -+static inline void irqtime_account_irq(struct task_struct *tsk, unsigned int offset) { } - #endif - --static inline void account_irq_enter_time(struct task_struct *tsk) -+static inline void account_softirq_enter(struct task_struct *tsk) - { -- vtime_account_irq(tsk); -- irqtime_account_irq(tsk); -+ vtime_account_irq(tsk, SOFTIRQ_OFFSET); -+ irqtime_account_irq(tsk, SOFTIRQ_OFFSET); - } - --static inline void account_irq_exit_time(struct task_struct *tsk) -+static inline void account_softirq_exit(struct task_struct *tsk) - { -- vtime_account_irq(tsk); -- irqtime_account_irq(tsk); -+ vtime_account_softirq(tsk); -+ irqtime_account_irq(tsk, 0); -+} -+ -+static inline void account_hardirq_enter(struct task_struct *tsk) -+{ -+ vtime_account_irq(tsk, HARDIRQ_OFFSET); -+ irqtime_account_irq(tsk, HARDIRQ_OFFSET); -+} -+ -+static inline void account_hardirq_exit(struct task_struct *tsk) -+{ -+ vtime_account_hardirq(tsk); -+ irqtime_account_irq(tsk, 0); - } - - #endif /* _LINUX_KERNEL_VTIME_H */ -diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c -index 02163d4260d7..5f611658eeab 100644 ---- a/kernel/sched/cputime.c -+++ b/kernel/sched/cputime.c -@@ -44,12 +44,13 @@ static void irqtime_account_delta(struct irqtime *irqtime, u64 delta, - } - - /* -- * Called before incrementing preempt_count on {soft,}irq_enter -+ * Called after incrementing preempt_count on {soft,}irq_enter - * and before decrementing preempt_count on {soft,}irq_exit. - */ --void irqtime_account_irq(struct task_struct *curr) -+void irqtime_account_irq(struct task_struct *curr, unsigned int offset) - { - struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime); -+ unsigned int pc; - s64 delta; - int cpu; - -@@ -59,6 +60,7 @@ void irqtime_account_irq(struct task_struct *curr) - cpu = smp_processor_id(); - delta = sched_clock_cpu(cpu) - irqtime->irq_start_time; - irqtime->irq_start_time += delta; -+ pc = preempt_count() - offset; - - /* - * We do not account for softirq time from ksoftirqd here. -@@ -66,9 +68,9 @@ void irqtime_account_irq(struct task_struct *curr) - * in that case, so as not to confuse scheduler with a special task - * that do not consume any time, but still wants to run. - */ -- if (hardirq_count()) -+ if (pc & HARDIRQ_MASK) - irqtime_account_delta(irqtime, delta, CPUTIME_IRQ); -- else if (in_serving_softirq() && curr != this_cpu_ksoftirqd()) -+ else if ((pc & SOFTIRQ_OFFSET) && curr != this_cpu_ksoftirqd()) - irqtime_account_delta(irqtime, delta, CPUTIME_SOFTIRQ); - } - -@@ -417,11 +419,13 @@ void vtime_task_switch(struct task_struct *prev) - } - # endif - --void vtime_account_irq(struct task_struct *tsk) -+void vtime_account_irq(struct task_struct *tsk, unsigned int offset) - { -- if (hardirq_count()) { -+ unsigned int pc = preempt_count() - offset; -+ -+ if (pc & HARDIRQ_OFFSET) { - vtime_account_hardirq(tsk); -- } else if (in_serving_softirq()) { -+ } else if (pc & SOFTIRQ_OFFSET) { - vtime_account_softirq(tsk); - } else if (!IS_ENABLED(CONFIG_HAVE_VIRT_CPU_ACCOUNTING_IDLE) && - is_idle_task(tsk)) { -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 617009ccd82c..b8f42b3ba8ca 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -315,10 +315,10 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) - current->flags &= ~PF_MEMALLOC; - - pending = local_softirq_pending(); -- account_irq_enter_time(current); - - __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); - in_hardirq = lockdep_softirq_start(); -+ account_softirq_enter(current); - - restart: - /* Reset the pending bitmask before enabling irqs */ -@@ -365,8 +365,8 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) - wakeup_softirqd(); - } - -+ account_softirq_exit(current); - lockdep_softirq_end(in_hardirq); -- account_irq_exit_time(current); - __local_bh_enable(SOFTIRQ_OFFSET); - WARN_ON_ONCE(in_interrupt()); - current_restore_flags(old_flags, PF_MEMALLOC); -@@ -418,7 +418,7 @@ static inline void __irq_exit_rcu(void) - #else - lockdep_assert_irqs_disabled(); - #endif -- account_irq_exit_time(current); -+ account_hardirq_exit(current); - preempt_count_sub(HARDIRQ_OFFSET); - if (!in_interrupt() && local_softirq_pending()) - invoke_softirq(); --- -2.30.2 - |