From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Thu, 19 Dec 2024 01:47:39 +0000 Subject: [PATCH] add wifi6 8852be driver --- kernel/kernel/time/alarmtimer.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 files changed, 36 insertions(+), 4 deletions(-) diff --git a/kernel/kernel/time/alarmtimer.c b/kernel/kernel/time/alarmtimer.c index daeaa71..3a20a9f 100644 --- a/kernel/kernel/time/alarmtimer.c +++ b/kernel/kernel/time/alarmtimer.c @@ -33,6 +33,8 @@ #define CREATE_TRACE_POINTS #include <trace/events/alarmtimer.h> +#undef CREATE_TRACE_POINTS +#include <trace/hooks/wakeupbypass.h> /** * struct alarm_base - Alarm timer bases * @lock: Lock for syncrhonized access to the base @@ -246,6 +248,7 @@ struct rtc_device *rtc; unsigned long flags; struct rtc_time tm; + int wakeup_bypass_enabled = 0; spin_lock_irqsave(&freezer_delta_lock, flags); min = freezer_delta; @@ -253,6 +256,10 @@ type = freezer_alarmtype; freezer_delta = 0; spin_unlock_irqrestore(&freezer_delta_lock, flags); + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); + if (wakeup_bypass_enabled) + return 0; rtc = alarmtimer_get_rtcdev(); /* If we have no rtcdev, just return */ @@ -470,11 +477,35 @@ } EXPORT_SYMBOL_GPL(alarm_forward); -u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) +static u64 __alarm_forward_now(struct alarm *alarm, ktime_t interval, bool throttle) { struct alarm_base *base = &alarm_bases[alarm->type]; + ktime_t now = base->get_ktime(); - return alarm_forward(alarm, base->get_ktime(), interval); + if (IS_ENABLED(CONFIG_HIGH_RES_TIMERS) && throttle) { + /* + * Same issue as with posix_timer_fn(). Timers which are + * periodic but the signal is ignored can starve the system + * with a very small interval. The real fix which was + * promised in the context of posix_timer_fn() never + * materialized, but someone should really work on it. + * + * To prevent DOS fake @now to be 1 jiffie out which keeps + * the overrun accounting correct but creates an + * inconsistency vs. timer_gettime(2). + */ + ktime_t kj = NSEC_PER_SEC / HZ; + + if (interval < kj) + now = ktime_add(now, kj); + } + + return alarm_forward(alarm, now, interval); +} + +u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) +{ + return __alarm_forward_now(alarm, interval, false); } EXPORT_SYMBOL_GPL(alarm_forward_now); @@ -548,9 +579,10 @@ if (posix_timer_event(ptr, si_private) && ptr->it_interval) { /* * Handle ignored signals and rearm the timer. This will go - * away once we handle ignored signals proper. + * away once we handle ignored signals proper. Ensure that + * small intervals cannot starve the system. */ - ptr->it_overrun += alarm_forward_now(alarm, ptr->it_interval); + ptr->it_overrun += __alarm_forward_now(alarm, ptr->it_interval, true); ++ptr->it_requeue_pending; ptr->it_active = 1; result = ALARMTIMER_RESTART; -- Gitblit v1.6.2