* [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5)
@ 2024-10-28 7:35 Nam Cao
2024-10-28 7:35 ` [PATCH 01/12] hrtimers: Delete hrtimer_init() Nam Cao
` (11 more replies)
0 siblings, 12 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Greg Kroah-Hartman, Jens Axboe, Kalle Valo,
Steven Rostedt
This is the fifth part of a 5-part series (split for convenience). All 5
parts are:
Part 1: https://lore.kernel.org/lkml/cover.1729864615.git.namcao@linutronix.de
Part 2: https://lore.kernel.org/lkml/cover.1729864823.git.namcao@linutronix.de
Part 3: https://lore.kernel.org/lkml/cover.1729865232.git.namcao@linutronix.de
Part 4: https://lore.kernel.org/lkml/cover.1729865485.git.namcao@linutronix.de
Part 5: https://lore.kernel.org/lkml/cover.1729865740.git.namcao@linutronix.de
To use hrtimer, hrtimer_init() (or one of its variant) must be called, and
also the timer's callfack function must be setup separately.
That can cause misuse of hrtimer. For example, because:
- The callback function is not setup
- The callback function is setup while it is not safe to do so
To prevent misuse of hrtimer, this series:
- Introduce new functions hrtimer_setup*(). These new functions are
similar to hrtimer_init*(), except that they also sanity-check and
initialize the callback function.
- Introduce hrtimer_update_function() which checks that it is safe to
change the callback function. The 'function' field of hrtimer is then
made private.
- Convert all users to use the new functions.
- Some minor cleanups on the way.
Most conversion patches were created using Coccinelle with the sematic
patch below; except for tricky cases that Coccinelle cannot handle, or for
some cases where a Coccinelle's bug regarding 100 column limit is
triggered. Any patches not mentioning Coccinelle were done manually.
virtual patch
@@ expression timer, clock, mode, func; @@
- hrtimer_init(timer, clock, mode);
...
- timer->function = func;
+ hrtimer_setup(timer, func, clock, mode);
@@ expression timer, clock, mode, func; @@
- hrtimer_init(&timer, clock, mode);
...
- timer.function = func;
+ hrtimer_setup(&timer, func, clock, mode);
@@ expression timer, clock, mode, func; @@
- hrtimer_init_on_stack(&timer, clock, mode);
...
- timer.function = func;
+ hrtimer_setup_on_stack(&timer, func, clock, mode);
@@ expression timer, clock, mode; @@
- hrtimer_init_sleeper_on_stack(timer, clock, mode);
+ hrtimer_setup_sleeper_on_stack(timer, clock, mode);
Signed-off-by: Nam Cao <namcao@linutronix.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kalle Valo <kvalo@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Nam Cao (12):
hrtimers: Delete hrtimer_init()
hrtimers: Switch to use __htimer_setup()
hrtimers: Merge __hrtimer_init() into __hrtimer_setup()
serial: xilinx_uartps: Use helper function hrtimer_update_function()
io_uring: Use helper function hrtimer_update_function()
wifi: rt2x00: Switch to use hrtimer_update_function()
hrtimers: Make callback function pointer private
hrtimers: Remove unnecessary NULL check in hrtimer_start_range_ns()
hrtimers: Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper()
hrtimers: Rename debug_init() to debug_setup()
hrtimers: Rename debug_init_on_stack() to debug_setup_on_stack()
tracing/timers: Rename hrtimer_init event to hrtimer_setup
Documentation/trace/ftrace.rst | 4 +-
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 2 +-
.../net/wireless/ralink/rt2x00/rt2800usb.c | 2 +-
drivers/tty/serial/xilinx_uartps.c | 4 +-
include/linux/hrtimer.h | 4 +-
include/linux/hrtimer_types.h | 4 +-
include/trace/events/timer.h | 8 +--
io_uring/io_uring.c | 2 +-
kernel/time/hrtimer.c | 69 +++++--------------
kernel/time/timer_list.c | 2 +-
tools/perf/tests/shell/trace_btf_enum.sh | 2 +-
11 files changed, 35 insertions(+), 68 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 01/12] hrtimers: Delete hrtimer_init()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 02/12] hrtimers: Switch to use __htimer_setup() Nam Cao
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
hrtimer_init() is unused. Delete it.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
include/linux/hrtimer.h | 2 --
include/linux/hrtimer_types.h | 2 +-
kernel/time/hrtimer.c | 20 --------------------
3 files changed, 1 insertion(+), 23 deletions(-)
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 7ef5f7ef31a9..47103a0f6691 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -226,8 +226,6 @@ static inline void hrtimer_cancel_wait_running(struct hrtimer *timer)
/* Exported timer functions: */
/* Initialize timers: */
-extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
- enum hrtimer_mode mode);
extern void hrtimer_setup(struct hrtimer *timer, enum hrtimer_restart (*function)(struct hrtimer *),
clockid_t clock_id, enum hrtimer_mode mode);
extern void hrtimer_setup_on_stack(struct hrtimer *timer,
diff --git a/include/linux/hrtimer_types.h b/include/linux/hrtimer_types.h
index ad66a3081735..7c5b27daa89d 100644
--- a/include/linux/hrtimer_types.h
+++ b/include/linux/hrtimer_types.h
@@ -34,7 +34,7 @@ enum hrtimer_restart {
* @is_hard: Set if hrtimer will be expired in hard interrupt context
* even on RT.
*
- * The hrtimer structure must be initialized by hrtimer_init()
+ * The hrtimer structure must be initialized by hrtimer_setup()
*/
struct hrtimer {
struct timerqueue_node node;
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 55e9ffbcd49a..60cb805a6b0b 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1588,26 +1588,6 @@ static void __hrtimer_setup(struct hrtimer *timer,
timer->function = function;
}
-/**
- * hrtimer_init - initialize a timer to the given clock
- * @timer: the timer to be initialized
- * @clock_id: the clock to be used
- * @mode: The modes which are relevant for initialization:
- * HRTIMER_MODE_ABS, HRTIMER_MODE_REL, HRTIMER_MODE_ABS_SOFT,
- * HRTIMER_MODE_REL_SOFT
- *
- * The PINNED variants of the above can be handed in,
- * but the PINNED bit is ignored as pinning happens
- * when the hrtimer is started
- */
-void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
- enum hrtimer_mode mode)
-{
- debug_init(timer, clock_id, mode);
- __hrtimer_init(timer, clock_id, mode);
-}
-EXPORT_SYMBOL_GPL(hrtimer_init);
-
/**
* hrtimer_setup - initialize a timer to the given clock
* @timer: the timer to be initialized
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 02/12] hrtimers: Switch to use __htimer_setup()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
2024-10-28 7:35 ` [PATCH 01/12] hrtimers: Delete hrtimer_init() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 03/12] hrtimers: Merge __hrtimer_init() into __hrtimer_setup() Nam Cao
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
__hrtimer_init_sleeper() calls __hrtimer_init() and also setups the
callback function. But there is already __hrtimer_setup() which does both
actions.
Switch to use __hrtimer_setup() to simplify the code.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 60cb805a6b0b..45225fdf7cd2 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -2009,8 +2009,7 @@ static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
mode |= HRTIMER_MODE_HARD;
}
- __hrtimer_init(&sl->timer, clock_id, mode);
- sl->timer.function = hrtimer_wakeup;
+ __hrtimer_setup(&sl->timer, hrtimer_wakeup, clock_id, mode);
sl->task = current;
}
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 03/12] hrtimers: Merge __hrtimer_init() into __hrtimer_setup()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
2024-10-28 7:35 ` [PATCH 01/12] hrtimers: Delete hrtimer_init() Nam Cao
2024-10-28 7:35 ` [PATCH 02/12] hrtimers: Switch to use __htimer_setup() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 04/12] serial: xilinx_uartps: Use helper function hrtimer_update_function() Nam Cao
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
__hrtimer_init() is only called by __hrtimer_setup(), therefore simplify by
merging __hrtimer_init()'s code into __hrtimer_setup().
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 45225fdf7cd2..cf362d93a323 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1540,8 +1540,9 @@ static enum hrtimer_restart hrtimer_dummy_timeout(struct hrtimer *unused)
return HRTIMER_NORESTART;
}
-static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
- enum hrtimer_mode mode)
+static void __hrtimer_setup(struct hrtimer *timer,
+ enum hrtimer_restart (*function)(struct hrtimer *),
+ clockid_t clock_id, enum hrtimer_mode mode)
{
bool softtimer = !!(mode & HRTIMER_MODE_SOFT);
struct hrtimer_cpu_base *cpu_base;
@@ -1574,13 +1575,6 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
timer->is_hard = !!(mode & HRTIMER_MODE_HARD);
timer->base = &cpu_base->clock_base[base];
timerqueue_init(&timer->node);
-}
-
-static void __hrtimer_setup(struct hrtimer *timer,
- enum hrtimer_restart (*function)(struct hrtimer *),
- clockid_t clock_id, enum hrtimer_mode mode)
-{
- __hrtimer_init(timer, clock_id, mode);
if (WARN_ON_ONCE(!function))
timer->function = hrtimer_dummy_timeout;
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 04/12] serial: xilinx_uartps: Use helper function hrtimer_update_function()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (2 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 03/12] hrtimers: Merge __hrtimer_init() into __hrtimer_setup() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 05/12] io_uring: " Nam Cao
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Greg Kroah-Hartman
There is a new helper function hrtimer_update_function() to change the
hrtimer's callback function, which also performs additional runtime check
that it is safe to change the callback.
Use the helper function instead of accessing 'function' directly.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/tty/serial/xilinx_uartps.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 4e9a63590c82..680db4830ab5 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -454,7 +454,7 @@ static void cdns_uart_handle_tx(void *dev_id)
if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED &&
(kfifo_is_empty(&tport->xmit_fifo) || uart_tx_stopped(port))) {
- cdns_uart->tx_timer.function = &cdns_rs485_rx_callback;
+ hrtimer_update_function(&cdns_uart->tx_timer, cdns_rs485_rx_callback);
hrtimer_start(&cdns_uart->tx_timer,
ns_to_ktime(cdns_calc_after_tx_delay(cdns_uart)), HRTIMER_MODE_REL);
}
@@ -734,7 +734,7 @@ static void cdns_uart_start_tx(struct uart_port *port)
if (cdns_uart->port->rs485.flags & SER_RS485_ENABLED) {
if (!cdns_uart->rs485_tx_started) {
- cdns_uart->tx_timer.function = &cdns_rs485_tx_callback;
+ hrtimer_update_function(&cdns_uart->tx_timer, cdns_rs485_tx_callback);
cdns_rs485_tx_setup(cdns_uart);
return hrtimer_start(&cdns_uart->tx_timer,
ms_to_ktime(port->rs485.delay_rts_before_send),
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 05/12] io_uring: Use helper function hrtimer_update_function()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (3 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 04/12] serial: xilinx_uartps: Use helper function hrtimer_update_function() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 06/12] wifi: rt2x00: Switch to use hrtimer_update_function() Nam Cao
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Jens Axboe
There is a new helper function hrtimer_update_function() to change the
hrtimer's callback function, which also performs additional runtime check
that it is safe to change the callback.
Use the helper function instead of accessing 'function' directly.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
Cc: Jens Axboe <axboe@kernel.dk>
---
io_uring/io_uring.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index 0842aa3f60e7..5a3c2d647467 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -2423,7 +2423,7 @@ static enum hrtimer_restart io_cqring_min_timer_wakeup(struct hrtimer *timer)
goto out_wake;
}
- iowq->t.function = io_cqring_timer_wakeup;
+ hrtimer_update_function(&iowq->t, io_cqring_timer_wakeup);
hrtimer_set_expires(timer, iowq->timeout);
return HRTIMER_RESTART;
out_wake:
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 06/12] wifi: rt2x00: Switch to use hrtimer_update_function()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (4 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 05/12] io_uring: " Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 07/12] hrtimers: Make callback function pointer private Nam Cao
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Kalle Valo
There is a new helper function hrtimer_update_function() to change the
hrtimer's callback function, which also performs additional runtime check
that it is safe to change the callback.
Use the helper function instead of accessing 'function' directly.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
Cc: Kalle Valo <kvalo@kernel.org>
---
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 2 +-
drivers/net/wireless/ralink/rt2x00/rt2800usb.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
index 5323acff962a..45775ecdf221 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
@@ -842,7 +842,7 @@ int rt2800mmio_probe_hw(struct rt2x00_dev *rt2x00dev)
/*
* Set txstatus timer function.
*/
- rt2x00dev->txstatus_timer.function = rt2800mmio_tx_sta_fifo_timeout;
+ hrtimer_update_function(&rt2x00dev->txstatus_timer, rt2800mmio_tx_sta_fifo_timeout);
/*
* Overwrite TX done handler
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
index 160bef79acdb..b51a23300ba2 100644
--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
@@ -618,7 +618,7 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
/*
* Set txstatus timer function.
*/
- rt2x00dev->txstatus_timer.function = rt2800usb_tx_sta_fifo_timeout;
+ hrtimer_update_function(&rt2x00dev->txstatus_timer, rt2800usb_tx_sta_fifo_timeout);
/*
* Overwrite TX done handler
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 07/12] hrtimers: Make callback function pointer private
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (5 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 06/12] wifi: rt2x00: Switch to use hrtimer_update_function() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 08/12] hrtimers: Remove unnecessary NULL check in hrtimer_start_range_ns() Nam Cao
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Steven Rostedt
Make the field 'function' of struct hrtimer private, to prevent users from
changing this field in an unsafe way. hrtimer_update_function() should be
used if the callback function needs to be changed.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
Cc: Steven Rostedt <rostedt@goodmis.org>
---
include/linux/hrtimer.h | 2 +-
include/linux/hrtimer_types.h | 2 +-
include/trace/events/timer.h | 4 ++--
kernel/time/hrtimer.c | 8 ++++----
kernel/time/timer_list.c | 2 +-
5 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 47103a0f6691..38983c2e1dd4 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -339,7 +339,7 @@ static inline void hrtimer_update_function(struct hrtimer *timer,
if (WARN_ON_ONCE(!function))
return;
- timer->function = function;
+ ACCESS_PRIVATE(timer, function) = function;
}
/* Forward a hrtimer so it expires after now: */
diff --git a/include/linux/hrtimer_types.h b/include/linux/hrtimer_types.h
index 7c5b27daa89d..8fbbb6bdf7a1 100644
--- a/include/linux/hrtimer_types.h
+++ b/include/linux/hrtimer_types.h
@@ -39,7 +39,7 @@ enum hrtimer_restart {
struct hrtimer {
struct timerqueue_node node;
ktime_t _softexpires;
- enum hrtimer_restart (*function)(struct hrtimer *);
+ enum hrtimer_restart (*__private function)(struct hrtimer *);
struct hrtimer_clock_base *base;
u8 state;
u8 is_rel;
diff --git a/include/trace/events/timer.h b/include/trace/events/timer.h
index 1ef58a04fc57..f8c906be4cd0 100644
--- a/include/trace/events/timer.h
+++ b/include/trace/events/timer.h
@@ -235,7 +235,7 @@ TRACE_EVENT(hrtimer_start,
TP_fast_assign(
__entry->hrtimer = hrtimer;
- __entry->function = hrtimer->function;
+ __entry->function = ACCESS_PRIVATE(hrtimer, function);
__entry->expires = hrtimer_get_expires(hrtimer);
__entry->softexpires = hrtimer_get_softexpires(hrtimer);
__entry->mode = mode;
@@ -271,7 +271,7 @@ TRACE_EVENT(hrtimer_expire_entry,
TP_fast_assign(
__entry->hrtimer = hrtimer;
__entry->now = *now;
- __entry->function = hrtimer->function;
+ __entry->function = ACCESS_PRIVATE(hrtimer, function);
),
TP_printk("hrtimer=%p function=%ps now=%llu",
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index cf362d93a323..d11697492bdb 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1276,7 +1276,7 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
struct hrtimer_clock_base *base;
unsigned long flags;
- if (WARN_ON_ONCE(!timer->function))
+ if (WARN_ON_ONCE(!ACCESS_PRIVATE(timer, function)))
return;
/*
* Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft
@@ -1577,9 +1577,9 @@ static void __hrtimer_setup(struct hrtimer *timer,
timerqueue_init(&timer->node);
if (WARN_ON_ONCE(!function))
- timer->function = hrtimer_dummy_timeout;
+ ACCESS_PRIVATE(timer, function) = hrtimer_dummy_timeout;
else
- timer->function = function;
+ ACCESS_PRIVATE(timer, function) = function;
}
/**
@@ -1691,7 +1691,7 @@ static void __run_hrtimer(struct hrtimer_cpu_base *cpu_base,
raw_write_seqcount_barrier(&base->seq);
__remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE, 0);
- fn = timer->function;
+ fn = ACCESS_PRIVATE(timer, function);
/*
* Clear the 'is relative' flag for the TIME_LOW_RES case. If the
diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c
index 1c311c46da50..958dd4194684 100644
--- a/kernel/time/timer_list.c
+++ b/kernel/time/timer_list.c
@@ -46,7 +46,7 @@ static void
print_timer(struct seq_file *m, struct hrtimer *taddr, struct hrtimer *timer,
int idx, u64 now)
{
- SEQ_printf(m, " #%d: <%pK>, %ps", idx, taddr, timer->function);
+ SEQ_printf(m, " #%d: <%pK>, %ps", idx, taddr, ACCESS_PRIVATE(timer, function));
SEQ_printf(m, ", S:%02x", timer->state);
SEQ_printf(m, "\n");
SEQ_printf(m, " # expires at %Lu-%Lu nsecs [in %Ld to %Ld nsecs]\n",
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 08/12] hrtimers: Remove unnecessary NULL check in hrtimer_start_range_ns()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (6 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 07/12] hrtimers: Make callback function pointer private Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 09/12] hrtimers: Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper() Nam Cao
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
The 'function' field of struct hrtimer can only be changed using
hrtimer_setup*() or hrtimer_update_function(), and both already null-check
'function'. Therefore, null-checking 'function' in hrtimer_start_range_ns()
is not necessary.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index d11697492bdb..2e03b07cbdac 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1276,8 +1276,6 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
struct hrtimer_clock_base *base;
unsigned long flags;
- if (WARN_ON_ONCE(!ACCESS_PRIVATE(timer, function)))
- return;
/*
* Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft
* match on CONFIG_PREEMPT_RT = n. With PREEMPT_RT check the hard
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 09/12] hrtimers: Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (7 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 08/12] hrtimers: Remove unnecessary NULL check in hrtimer_start_range_ns() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 10/12] hrtimers: Rename debug_init() to debug_setup() Nam Cao
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
All the hrtimer_init*() functions have been renamed to hrtimer_setup*().
Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper() as well, to
keep the names consistent.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 2e03b07cbdac..36d55ce57810 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1964,7 +1964,7 @@ void hrtimer_sleeper_start_expires(struct hrtimer_sleeper *sl,
* Make the enqueue delivery mode check work on RT. If the sleeper
* was initialized for hard interrupt delivery, force the mode bit.
* This is a special case for hrtimer_sleepers because
- * __hrtimer_init_sleeper() determines the delivery mode on RT so the
+ * __hrtimer_setup_sleeper() determines the delivery mode on RT so the
* fiddling with this decision is avoided at the call sites.
*/
if (IS_ENABLED(CONFIG_PREEMPT_RT) && sl->timer.is_hard)
@@ -1974,8 +1974,8 @@ void hrtimer_sleeper_start_expires(struct hrtimer_sleeper *sl,
}
EXPORT_SYMBOL_GPL(hrtimer_sleeper_start_expires);
-static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
- clockid_t clock_id, enum hrtimer_mode mode)
+static void __hrtimer_setup_sleeper(struct hrtimer_sleeper *sl,
+ clockid_t clock_id, enum hrtimer_mode mode)
{
/*
* On PREEMPT_RT enabled kernels hrtimers which are not explicitly
@@ -2015,7 +2015,7 @@ void hrtimer_setup_sleeper_on_stack(struct hrtimer_sleeper *sl,
clockid_t clock_id, enum hrtimer_mode mode)
{
debug_init_on_stack(&sl->timer, clock_id, mode);
- __hrtimer_init_sleeper(sl, clock_id, mode);
+ __hrtimer_setup_sleeper(sl, clock_id, mode);
}
EXPORT_SYMBOL_GPL(hrtimer_setup_sleeper_on_stack);
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 10/12] hrtimers: Rename debug_init() to debug_setup()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (8 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 09/12] hrtimers: Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 11/12] hrtimers: Rename debug_init_on_stack() to debug_setup_on_stack() Nam Cao
2024-10-28 7:35 ` [PATCH 12/12] tracing/timers: Rename hrtimer_init event to hrtimer_setup Nam Cao
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
All the hrtimer_init*() functions have been renamed to hrtimer_setup*().
Rename debug_init() to debug_setup() as well, to keep the names consistent.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 36d55ce57810..6c29d988e145 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -448,9 +448,7 @@ static inline void debug_hrtimer_activate(struct hrtimer *timer,
static inline void debug_hrtimer_deactivate(struct hrtimer *timer) { }
#endif
-static inline void
-debug_init(struct hrtimer *timer, clockid_t clockid,
- enum hrtimer_mode mode)
+static inline void debug_setup(struct hrtimer *timer, clockid_t clockid, enum hrtimer_mode mode)
{
debug_hrtimer_init(timer);
trace_hrtimer_init(timer, clockid, mode);
@@ -1596,7 +1594,7 @@ static void __hrtimer_setup(struct hrtimer *timer,
void hrtimer_setup(struct hrtimer *timer, enum hrtimer_restart (*function)(struct hrtimer *),
clockid_t clock_id, enum hrtimer_mode mode)
{
- debug_init(timer, clock_id, mode);
+ debug_setup(timer, clock_id, mode);
__hrtimer_setup(timer, function, clock_id, mode);
}
EXPORT_SYMBOL_GPL(hrtimer_setup);
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 11/12] hrtimers: Rename debug_init_on_stack() to debug_setup_on_stack()
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (9 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 10/12] hrtimers: Rename debug_init() to debug_setup() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
2024-10-28 7:35 ` [PATCH 12/12] tracing/timers: Rename hrtimer_init event to hrtimer_setup Nam Cao
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao
All the hrtimer_init*() functions have been renamed to hrtimer_setup*().
Rename debug_init_on_stack() to debug_setup_on_stack() as well, to keep the
names consistent.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
kernel/time/hrtimer.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 6c29d988e145..48bd61ee9d50 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -454,8 +454,8 @@ static inline void debug_setup(struct hrtimer *timer, clockid_t clockid, enum hr
trace_hrtimer_init(timer, clockid, mode);
}
-static inline void debug_init_on_stack(struct hrtimer *timer, clockid_t clockid,
- enum hrtimer_mode mode)
+static inline void debug_setup_on_stack(struct hrtimer *timer, clockid_t clockid,
+ enum hrtimer_mode mode)
{
debug_hrtimer_init_on_stack(timer);
trace_hrtimer_init(timer, clockid, mode);
@@ -1613,7 +1613,7 @@ void hrtimer_setup_on_stack(struct hrtimer *timer,
enum hrtimer_restart (*function)(struct hrtimer *),
clockid_t clock_id, enum hrtimer_mode mode)
{
- debug_init_on_stack(timer, clock_id, mode);
+ debug_setup_on_stack(timer, clock_id, mode);
__hrtimer_setup(timer, function, clock_id, mode);
}
EXPORT_SYMBOL_GPL(hrtimer_setup_on_stack);
@@ -2012,7 +2012,7 @@ static void __hrtimer_setup_sleeper(struct hrtimer_sleeper *sl,
void hrtimer_setup_sleeper_on_stack(struct hrtimer_sleeper *sl,
clockid_t clock_id, enum hrtimer_mode mode)
{
- debug_init_on_stack(&sl->timer, clock_id, mode);
+ debug_setup_on_stack(&sl->timer, clock_id, mode);
__hrtimer_setup_sleeper(sl, clock_id, mode);
}
EXPORT_SYMBOL_GPL(hrtimer_setup_sleeper_on_stack);
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 12/12] tracing/timers: Rename hrtimer_init event to hrtimer_setup
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
` (10 preceding siblings ...)
2024-10-28 7:35 ` [PATCH 11/12] hrtimers: Rename debug_init_on_stack() to debug_setup_on_stack() Nam Cao
@ 2024-10-28 7:35 ` Nam Cao
11 siblings, 0 replies; 13+ messages in thread
From: Nam Cao @ 2024-10-28 7:35 UTC (permalink / raw)
To: Anna-Maria Behnsen, Frederic Weisbecker, Thomas Gleixner,
Andreas Hindborg, Alice Ryhl, Miguel Ojeda, Kees Cook,
linux-kernel
Cc: Nam Cao, Steven Rostedt
The function hrtimer_init() doesn't exist anymore. It was replaced by
hrtimer_setup().
Thus, rename the hrtimer_init trace event to hrtimer_setup to keep it
consistent.
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
Cc: Steven Rostedt <rostedt@goodmis.org>
---
Documentation/trace/ftrace.rst | 4 ++--
include/trace/events/timer.h | 4 ++--
kernel/time/hrtimer.c | 4 ++--
tools/perf/tests/shell/trace_btf_enum.sh | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/Documentation/trace/ftrace.rst b/Documentation/trace/ftrace.rst
index 4073ca48af4a..502783e7a9b5 100644
--- a/Documentation/trace/ftrace.rst
+++ b/Documentation/trace/ftrace.rst
@@ -3070,7 +3070,7 @@ Notice that we lost the sys_nanosleep.
# cat set_ftrace_filter
hrtimer_run_queues
hrtimer_run_pending
- hrtimer_init
+ hrtimer_setup
hrtimer_cancel
hrtimer_try_to_cancel
hrtimer_forward
@@ -3108,7 +3108,7 @@ Again, now we want to append.
# cat set_ftrace_filter
hrtimer_run_queues
hrtimer_run_pending
- hrtimer_init
+ hrtimer_setup
hrtimer_cancel
hrtimer_try_to_cancel
hrtimer_forward
diff --git a/include/trace/events/timer.h b/include/trace/events/timer.h
index f8c906be4cd0..1641ae3e6ca0 100644
--- a/include/trace/events/timer.h
+++ b/include/trace/events/timer.h
@@ -185,12 +185,12 @@ TRACE_EVENT(timer_base_idle,
{ HRTIMER_MODE_REL_PINNED_HARD, "REL|PINNED|HARD" })
/**
- * hrtimer_init - called when the hrtimer is initialized
+ * hrtimer_setup - called when the hrtimer is initialized
* @hrtimer: pointer to struct hrtimer
* @clockid: the hrtimers clock
* @mode: the hrtimers mode
*/
-TRACE_EVENT(hrtimer_init,
+TRACE_EVENT(hrtimer_setup,
TP_PROTO(struct hrtimer *hrtimer, clockid_t clockid,
enum hrtimer_mode mode),
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 48bd61ee9d50..58118b46f62c 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -451,14 +451,14 @@ static inline void debug_hrtimer_deactivate(struct hrtimer *timer) { }
static inline void debug_setup(struct hrtimer *timer, clockid_t clockid, enum hrtimer_mode mode)
{
debug_hrtimer_init(timer);
- trace_hrtimer_init(timer, clockid, mode);
+ trace_hrtimer_setup(timer, clockid, mode);
}
static inline void debug_setup_on_stack(struct hrtimer *timer, clockid_t clockid,
enum hrtimer_mode mode)
{
debug_hrtimer_init_on_stack(timer);
- trace_hrtimer_init(timer, clockid, mode);
+ trace_hrtimer_setup(timer, clockid, mode);
}
static inline void debug_activate(struct hrtimer *timer,
diff --git a/tools/perf/tests/shell/trace_btf_enum.sh b/tools/perf/tests/shell/trace_btf_enum.sh
index 5a3b8a5a9b5c..6ac6887d057d 100755
--- a/tools/perf/tests/shell/trace_btf_enum.sh
+++ b/tools/perf/tests/shell/trace_btf_enum.sh
@@ -6,7 +6,7 @@ err=0
set -e
syscall="landlock_add_rule"
-non_syscall="timer:hrtimer_init,timer:hrtimer_start"
+non_syscall="timer:hrtimer_setup,timer:hrtimer_start"
TESTPROG="perf test -w landlock"
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-10-28 7:36 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-28 7:35 [PATCH 00/12] hrtimers: Switch to new hrtimer interface functions (5/5) Nam Cao
2024-10-28 7:35 ` [PATCH 01/12] hrtimers: Delete hrtimer_init() Nam Cao
2024-10-28 7:35 ` [PATCH 02/12] hrtimers: Switch to use __htimer_setup() Nam Cao
2024-10-28 7:35 ` [PATCH 03/12] hrtimers: Merge __hrtimer_init() into __hrtimer_setup() Nam Cao
2024-10-28 7:35 ` [PATCH 04/12] serial: xilinx_uartps: Use helper function hrtimer_update_function() Nam Cao
2024-10-28 7:35 ` [PATCH 05/12] io_uring: " Nam Cao
2024-10-28 7:35 ` [PATCH 06/12] wifi: rt2x00: Switch to use hrtimer_update_function() Nam Cao
2024-10-28 7:35 ` [PATCH 07/12] hrtimers: Make callback function pointer private Nam Cao
2024-10-28 7:35 ` [PATCH 08/12] hrtimers: Remove unnecessary NULL check in hrtimer_start_range_ns() Nam Cao
2024-10-28 7:35 ` [PATCH 09/12] hrtimers: Rename __hrtimer_init_sleeper() to __hrtimer_setup_sleeper() Nam Cao
2024-10-28 7:35 ` [PATCH 10/12] hrtimers: Rename debug_init() to debug_setup() Nam Cao
2024-10-28 7:35 ` [PATCH 11/12] hrtimers: Rename debug_init_on_stack() to debug_setup_on_stack() Nam Cao
2024-10-28 7:35 ` [PATCH 12/12] tracing/timers: Rename hrtimer_init event to hrtimer_setup Nam Cao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox