From: Frederic Weisbecker <frederic@kernel.org>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Frederic Weisbecker <frederic@kernel.org>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
"Paul E . McKenney" <paulmck@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: [RFC PATCH 2/3] lockdep: Merge hardirq_threaded and irq_config together
Date: Mon, 23 Mar 2020 04:32:06 +0100 [thread overview]
Message-ID: <20200323033207.32370-3-frederic@kernel.org> (raw)
In-Reply-To: <20200323033207.32370-1-frederic@kernel.org>
These fields describe the same state: a code block running in hardirq
that might be threaded under specific configurations.
Merge them together in the same field. Also rename the result as
"hardirq_threadable" as we are talking about a possible state and not
an actual one.
While at it remove the posix cpu timer lockdep functions since we can
call into trace_hardirq_[un]threadable() directly. The need for hrtimer
binders is debatable as well.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
include/linux/irqflags.h | 70 ++++++++++++++--------------------
include/linux/sched.h | 3 +-
kernel/irq/handle.c | 4 +-
kernel/locking/lockdep.c | 2 +-
kernel/time/posix-cpu-timers.c | 6 +--
5 files changed, 35 insertions(+), 50 deletions(-)
diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h
index 28481702460e..f69f93839760 100644
--- a/include/linux/irqflags.h
+++ b/include/linux/irqflags.h
@@ -45,14 +45,14 @@ do { \
current->hardirq_context--; \
} while (0)
-# define trace_hardirq_threaded() \
+# define trace_hardirq_threadable() \
do { \
- current->hardirq_threaded = 1; \
+ current->hardirq_threadable = 1; \
} while (0)
-# define trace_hardirq_unthreaded() \
+# define trace_hardirq_unthreadable() \
do { \
- current->hardirq_threaded = 0; \
+ current->hardirq_threadable = 0; \
} while (0)
# define lockdep_softirq_enter() \
@@ -64,38 +64,16 @@ do { \
current->softirq_context--; \
} while (0)
-# define lockdep_hrtimer_enter(__hrtimer) \
- do { \
- if (!__hrtimer->is_hard) \
- current->irq_config = 1; \
- } while (0)
-
-# define lockdep_hrtimer_exit(__hrtimer) \
- do { \
- if (!__hrtimer->is_hard) \
- current->irq_config = 0; \
- } while (0)
-
-# define lockdep_posixtimer_enter() \
- do { \
- current->irq_config = 1; \
- } while (0)
-
-# define lockdep_posixtimer_exit() \
- do { \
- current->irq_config = 0; \
- } while (0)
-
# define lockdep_irq_work_enter(__work) \
- do { \
- if (!(atomic_read(&__work->flags) & IRQ_WORK_HARD_IRQ))\
- current->irq_config = 1; \
- } while (0)
+do { \
+ if (!(atomic_read(&__work->flags) & IRQ_WORK_HARD_IRQ)) \
+ trace_hardirq_threadable(); \
+} while (0)
# define lockdep_irq_work_exit(__work) \
- do { \
- if (!(atomic_read(&__work->flags) & IRQ_WORK_HARD_IRQ))\
- current->irq_config = 0; \
- } while (0)
+do { \
+ if (!(atomic_read(&__work->flags) & IRQ_WORK_HARD_IRQ)) \
+ trace_hardirq_unthreadable(); \
+} while (0)
#else
# define trace_hardirqs_on() do { } while (0)
@@ -106,18 +84,26 @@ do { \
# define trace_softirqs_enabled(p) 0
# define trace_hardirq_enter() do { } while (0)
# define trace_hardirq_exit() do { } while (0)
-# define trace_hardirq_threaded() do { } while (0)
-# define trace_hardirq_unthreaded() do { } while (0)
+# define trace_hardirq_threadable() do { } while (0)
+# define trace_hardirq_unthreadable() do { } while (0)
# define lockdep_softirq_enter() do { } while (0)
# define lockdep_softirq_exit() do { } while (0)
-# define lockdep_hrtimer_enter(__hrtimer) do { } while (0)
-# define lockdep_hrtimer_exit(__hrtimer) do { } while (0)
-# define lockdep_posixtimer_enter() do { } while (0)
-# define lockdep_posixtimer_exit() do { } while (0)
-# define lockdep_irq_work_enter(__work) do { } while (0)
-# define lockdep_irq_work_exit(__work) do { } while (0)
+# define lockdep_irq_work_enter(__work) do { } while (0)
+# define lockdep_irq_work_exit(__work) do { } while (0)
#endif
+# define lockdep_hrtimer_enter(__hrtimer) \
+do { \
+ if (!__hrtimer->is_hard) \
+ trace_hardirq_threadable(); \
+} while (0)
+
+# define lockdep_hrtimer_exit(__hrtimer) \
+do { \
+ if (!__hrtimer->is_hard) \
+ trace_hardirq_unthreadable(); \
+} while (0)
+
#if defined(CONFIG_IRQSOFF_TRACER) || \
defined(CONFIG_PREEMPT_TRACER)
extern void stop_critical_timings(void);
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 933914cdf219..9918d23b53e7 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -970,7 +970,7 @@ struct task_struct {
#ifdef CONFIG_TRACE_IRQFLAGS
unsigned int irq_events;
- unsigned int hardirq_threaded;
+ unsigned int hardirq_threadable;
unsigned long hardirq_enable_ip;
unsigned long hardirq_disable_ip;
unsigned int hardirq_enable_event;
@@ -983,7 +983,6 @@ struct task_struct {
unsigned int softirq_enable_event;
int softirqs_enabled;
int softirq_context;
- int irq_config;
#endif
#ifdef CONFIG_LOCKDEP
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 39d6cf9f5853..55405879b8ad 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -153,14 +153,14 @@ irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags
!(action->flags & (IRQF_NO_THREAD | IRQF_PERCPU | IRQF_ONESHOT)));
if (threadable)
- trace_hardirq_threaded();
+ trace_hardirq_threadable();
trace_irq_handler_entry(irq, action);
res = action->handler(irq, action->dev_id);
trace_irq_handler_exit(irq, action, res);
if (threadable)
- trace_hardirq_unthreaded();
+ trace_hardirq_unthreadable();
if (WARN_ONCE(!irqs_disabled(),"irq %u handler %pS enabled interrupts\n",
irq, action->handler))
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 0ebf9807d971..1cebaeb790a0 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -4025,7 +4025,7 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next)
/*
* Check if force_irqthreads will run us threaded.
*/
- if (curr->hardirq_threaded || curr->irq_config)
+ if (curr->hardirq_threadable)
curr_inner = LD_WAIT_CONFIG;
else
curr_inner = LD_WAIT_SPIN;
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 2c48a7233b19..d29a06d60206 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -1126,9 +1126,9 @@ void run_posix_cpu_timers(void)
if (!fastpath_timer_check(tsk))
return;
- lockdep_posixtimer_enter();
+ trace_hardirq_threadable();
if (!lock_task_sighand(tsk, &flags)) {
- lockdep_posixtimer_exit();
+ trace_hardirq_unthreadable();
return;
}
/*
@@ -1172,7 +1172,7 @@ void run_posix_cpu_timers(void)
cpu_timer_fire(timer);
spin_unlock(&timer->it_lock);
}
- lockdep_posixtimer_exit();
+ trace_hardirq_unthreadable();
}
/*
--
2.25.0
next prev parent reply other threads:[~2020-03-23 3:32 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-23 3:32 [RFC PATCH 0/3] lockdep/irq: wait-type related cleanups Frederic Weisbecker
2020-03-23 3:32 ` [RFC PATCH 1/3] lockdep/irq: Be more strict about IRQ-threadable code end Frederic Weisbecker
2020-03-23 13:53 ` Peter Zijlstra
2020-03-23 15:30 ` Frederic Weisbecker
2020-03-23 16:31 ` Peter Zijlstra
2020-03-24 3:20 ` Frederic Weisbecker
2020-03-23 3:32 ` Frederic Weisbecker [this message]
2020-03-23 14:02 ` [RFC PATCH 2/3] lockdep: Merge hardirq_threaded and irq_config together Peter Zijlstra
2020-03-23 14:53 ` Sebastian Andrzej Siewior
2020-03-23 16:14 ` Frederic Weisbecker
2020-03-23 3:32 ` [RFC PATCH 3/3] lockdep: Briefly comment current->hardirq_threadable usecases Frederic Weisbecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200323033207.32370-3-frederic@kernel.org \
--to=frederic@kernel.org \
--cc=bigeasy@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.