FAILED: patch "[PATCH] wifi: cfg80211: add an hrtimer based delayed work item" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 7ceba45a6658ce637da334cd0ebf27f4ede6c0fe
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025110956-qualified-stock-5d33@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 7ceba45a6658ce637da334cd0ebf27f4ede6c0fe Mon Sep 17 00:00:00 2001
From: Benjamin Berg <[email protected]>
Date: Tue, 28 Oct 2025 12:58:37 +0200
Subject: [PATCH] wifi: cfg80211: add an hrtimer based delayed work item
The normal timer mechanism assume that timeout further in the future need a lower accuracy. As an example, the granularity for a timer scheduled 4096 ms in the future on a 1000 Hz system is already 512 ms. This granularity is perfectly sufficient for e.g. timeouts, but there are other types of events that will happen at a future point in time and require a higher accuracy.
Add a new wiphy_hrtimer_work type that uses an hrtimer internally. The API is almost identical to the existing wiphy_delayed_work and it can be used as a drop-in replacement after minor adjustments. The work will be scheduled relative to the current time with a slack of 1 millisecond.
include/net/cfg80211.h +78 -0
@@ -6435,6 +6435,11 @@ static inline void wiphy_delayed_work_init(struct wiphy_delayed_work *dwork,* after wiphy_lock() was called. Therefore, wiphy_cancel_work() can * use just cancel_work() instead of cancel_work_sync(), it requires * being in a section protected by wiphy_lock(). +* +* Note that these are scheduled with a timer where the accuracy +* becomes less the longer in the future the scheduled timer is. Use +* wiphy_hrtimer_work_queue() if the timer must be not be late by more +* than approximately 10 percent. */ void wiphy_delayed_work_queue(struct wiphy *wiphy, struct wiphy_delayed_work *dwork,
@@ -6506,6 +6511,79 @@ void wiphy_delayed_work_flush(struct wiphy *wiphy,bool wiphy_delayed_work_pending (struct wiphy *wiphy,struct wiphy_delayed_work *dwork); +struct wiphy_hrtimer_work { +struct wiphy_work work; +struct wiphy *wiphy; +struct hrtimer timer; +}; + +enum hrtimer_restart wiphy_hrtimer_work_timer (struct hrtimer *t); + +static inline void wiphy_hrtimer_work_init (struct wiphy_hrtimer_work *hrwork, +wiphy_work_func_t func) +{ +hrtimer_setup (&hrwork->timer, wiphy_hrtimer_work_timer, +CLOCK_BOOTTIME ,HRTIMER_MODE_REL ); +wiphy_work_init (&hrwork->work, func); +} + +/** +* wiphy_hrtimer_work_queue - queue hrtimer work for the wiphy +* @wiphy: the wiphy to queue for +* @hrwork: the high resolution timer worker +* @delay: the delay given as a ktime_t +* +* Please refer to wiphy_delayed_work_queue(). The difference is that +* the hrtimer work uses a high resolution timer for scheduling. This +* may be needed if timeouts might be scheduled further in the future +* and the accuracy of the normal timer is not sufficient. +* +* Expect a delay of a few milliseconds as the timer is scheduled +* with some slack and some more time may pass between queueing the +* work and its start. +*/ +void wiphy_hrtimer_work_queue (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork, +ktime_t delay); + +/** +* wiphy_hrtimer_work_cancel - cancel previously queued hrtimer work +* @wiphy: the wiphy, for debug purposes +* @hrtimer: the hrtimer work to cancel +* +* Cancel the work *without* waiting for it, this assumes being +* called under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_hrtimer_work_cancel (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrtimer); + +/** +* wiphy_hrtimer_work_flush - flush previously queued hrtimer work +* @wiphy: the wiphy, for debug purposes +* @hrwork: the hrtimer work to flush +* +* Flush the work (i.e. run it if pending). This must be called +* under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_hrtimer_work_flush (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork); + +/** +* wiphy_hrtimer_work_pending - Find out whether a wiphy hrtimer +* work item is currently pending. +* +* @wiphy: the wiphy, for debug purposes +* @hrwork: the hrtimer work in question +* +* Return: true if timer is pending, false otherwise +* +* Please refer to the wiphy_delayed_work_pending() documentation as +* this is the equivalent function for hrtimer based delayed work +* items. +*/ +bool wiphy_hrtimer_work_pending (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork); +/** * enum ieee80211_ap_reg_power - regulatory power for an Access Point *
net/wireless/core.c +56 -0
62 lines not on this page · raw message
net/wireless/trace.h +21 -0
@@ -304,6 +304,27 @@ TRACE_EVENT(wiphy_delayed_work_queue, __entry->delay) ); +TRACE_EVENT (wiphy_hrtimer_work_queue, + TP_PROTO(struct wiphy *wiphy, struct wiphy_work *work, + ktime_t delay), +TP_ARGS (wiphy, work, delay), +TP_STRUCT__entry ( + WIPHY_ENTRY + __field(void *, instance) + __field(void *, func) +__field (ktime_t, delay) + ), +TP_fast_assign ( + WIPHY_ASSIGN; + __entry->instance = work; + __entry->func = work->func; + __entry->delay = delay; + ), +TP_printk (WIPHY_PR_FMT " instance=%p func=%pS delay=%llu" , +WIPHY_PR_ARG , __entry->instance, __entry->func, + __entry->delay) +); + TRACE_EVENT(wiphy_work_worker_start, TP_PROTO(struct wiphy *wiphy), TP_ARGS(wiphy),
Sasha Levin
maintainerPATCH 1/1 wifi: cfg80211: add an hrtimer based delayed work item
From: Benjamin Berg <[email protected]>
[ Upstream commit 7ceba45a6658ce637da334cd0ebf27f4ede6c0fe ]
The normal timer mechanism assume that timeout further in the future need a lower accuracy. As an example, the granularity for a timer scheduled 4096 ms in the future on a 1000 Hz system is already 512 ms. This granularity is perfectly sufficient for e.g. timeouts, but there are other types of events that will happen at a future point in time and require a higher accuracy.
Add a new wiphy_hrtimer_work type that uses an hrtimer internally. The API is almost identical to the existing wiphy_delayed_work and it can be used as a drop-in replacement after minor adjustments. The work will be scheduled relative to the current time with a slack of 1 millisecond.
--- include/net/cfg80211.h | 78 ++++++++++++++++++++++++++++++++++++++++++ net/wireless/core.c | 56 ++++++++++++++++++++++++++++++ net/wireless/trace.h | 21 ++++++++++++ 3 files changed, 155 insertions(+)
include/net/cfg80211.h +78 -0
@@ -6105,6 +6105,11 @@ static inline void wiphy_delayed_work_init(struct wiphy_delayed_work *dwork,* after wiphy_lock() was called. Therefore, wiphy_cancel_work() can * use just cancel_work() instead of cancel_work_sync(), it requires * being in a section protected by wiphy_lock(). +* +* Note that these are scheduled with a timer where the accuracy +* becomes less the longer in the future the scheduled timer is. Use +* wiphy_hrtimer_work_queue() if the timer must be not be late by more +* than approximately 10 percent. */ void wiphy_delayed_work_queue(struct wiphy *wiphy, struct wiphy_delayed_work *dwork,
@@ -6176,6 +6181,79 @@ void wiphy_delayed_work_flush(struct wiphy *wiphy,bool wiphy_delayed_work_pending (struct wiphy *wiphy,struct wiphy_delayed_work *dwork); +struct wiphy_hrtimer_work { +struct wiphy_work work; +struct wiphy *wiphy; +struct hrtimer timer; +}; + +enum hrtimer_restart wiphy_hrtimer_work_timer (struct hrtimer *t); + +static inline void wiphy_hrtimer_work_init (struct wiphy_hrtimer_work *hrwork, +wiphy_work_func_t func) +{ +hrtimer_init (&hrwork->timer,CLOCK_BOOTTIME ,HRTIMER_MODE_REL ); + hrwork->timer.function = wiphy_hrtimer_work_timer; +wiphy_work_init (&hrwork->work, func); +} + +/** +* wiphy_hrtimer_work_queue - queue hrtimer work for the wiphy +* @wiphy: the wiphy to queue for +* @hrwork: the high resolution timer worker +* @delay: the delay given as a ktime_t +* +* Please refer to wiphy_delayed_work_queue(). The difference is that +* the hrtimer work uses a high resolution timer for scheduling. This +* may be needed if timeouts might be scheduled further in the future +* and the accuracy of the normal timer is not sufficient. +* +* Expect a delay of a few milliseconds as the timer is scheduled +* with some slack and some more time may pass between queueing the +* work and its start. +*/ +void wiphy_hrtimer_work_queue (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork, +ktime_t delay); + +/** +* wiphy_hrtimer_work_cancel - cancel previously queued hrtimer work +* @wiphy: the wiphy, for debug purposes +* @hrtimer: the hrtimer work to cancel +* +* Cancel the work *without* waiting for it, this assumes being +* called under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_hrtimer_work_cancel (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrtimer); + +/** +* wiphy_hrtimer_work_flush - flush previously queued hrtimer work +* @wiphy: the wiphy, for debug purposes +* @hrwork: the hrtimer work to flush +* +* Flush the work (i.e. run it if pending). This must be called +* under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_hrtimer_work_flush (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork); + +/** +* wiphy_hrtimer_work_pending - Find out whether a wiphy hrtimer +* work item is currently pending. +* +* @wiphy: the wiphy, for debug purposes +* @hrwork: the hrtimer work in question +* +* Return: true if timer is pending, false otherwise +* +* Please refer to the wiphy_delayed_work_pending() documentation as +* this is the equivalent function for hrtimer based delayed work +* items. +*/ +bool wiphy_hrtimer_work_pending (struct wiphy *wiphy, +struct wiphy_hrtimer_work *hrwork); +/** * enum ieee80211_ap_reg_power - regulatory power for an Access Point *
net/wireless/core.c +56 -0
62 lines not on this page · raw message
net/wireless/trace.h +21 -0
@@ -304,6 +304,27 @@ TRACE_EVENT(wiphy_delayed_work_queue, __entry->delay) ); +TRACE_EVENT (wiphy_hrtimer_work_queue, + TP_PROTO(struct wiphy *wiphy, struct wiphy_work *work, + ktime_t delay), +TP_ARGS (wiphy, work, delay), +TP_STRUCT__entry ( + WIPHY_ENTRY + __field(void *, instance) + __field(void *, func) +__field (ktime_t, delay) + ), +TP_fast_assign ( + WIPHY_ASSIGN; + __entry->instance = work; + __entry->func = work->func; + __entry->delay = delay; + ), +TP_printk (WIPHY_PR_FMT " instance=%p func=%pS delay=%llu" , +WIPHY_PR_ARG , __entry->instance, __entry->func, + __entry->delay) +); + TRACE_EVENT(wiphy_work_worker_start, TP_PROTO(struct wiphy *wiphy), TP_ARGS(wiphy),
Signature · 1 line
2.51.0