mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 15:56:49 +00:00
mac80211: optimize airtime fairness code to reduce cpu usage
Signed-off-by: Felix Fietkau <nbd@nbd.name>
(cherry-picked from commit 87def9efd8
)
This commit is contained in:
parent
5414aa88ae
commit
e1b79b1dc3
@ -0,0 +1,60 @@
|
|||||||
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
|
Date: Tue, 14 Dec 2021 17:53:12 +0100
|
||||||
|
Subject: [PATCH] mac80211: use coarse boottime for airtime fairness code
|
||||||
|
|
||||||
|
The time values used by the airtime fairness code only need to be accurate
|
||||||
|
enough to cover station activity detection.
|
||||||
|
Using ktime_get_coarse_boottime_ns instead of ktime_get_boottime_ns will
|
||||||
|
drop the accuracy down to jiffies intervals, but at the same time saves
|
||||||
|
a lot of CPU cycles in a hot path
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -3834,7 +3834,7 @@ struct ieee80211_txq *ieee80211_next_txq
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = hw_to_local(hw);
|
||||||
|
struct airtime_sched_info *air_sched;
|
||||||
|
- u64 now = ktime_get_boottime_ns();
|
||||||
|
+ u64 now = ktime_get_coarse_boottime_ns();
|
||||||
|
struct ieee80211_txq *ret = NULL;
|
||||||
|
struct airtime_info *air_info;
|
||||||
|
struct txq_info *txqi = NULL;
|
||||||
|
@@ -3961,7 +3961,7 @@ void ieee80211_update_airtime_weight(str
|
||||||
|
u64 weight_sum = 0;
|
||||||
|
|
||||||
|
if (unlikely(!now))
|
||||||
|
- now = ktime_get_boottime_ns();
|
||||||
|
+ now = ktime_get_coarse_boottime_ns();
|
||||||
|
|
||||||
|
lockdep_assert_held(&air_sched->lock);
|
||||||
|
|
||||||
|
@@ -3987,7 +3987,7 @@ void ieee80211_schedule_txq(struct ieee8
|
||||||
|
struct ieee80211_local *local = hw_to_local(hw);
|
||||||
|
struct txq_info *txqi = to_txq_info(txq);
|
||||||
|
struct airtime_sched_info *air_sched;
|
||||||
|
- u64 now = ktime_get_boottime_ns();
|
||||||
|
+ u64 now = ktime_get_coarse_boottime_ns();
|
||||||
|
struct airtime_info *air_info;
|
||||||
|
u8 ac = txq->ac;
|
||||||
|
bool was_active;
|
||||||
|
@@ -4045,7 +4045,7 @@ static void __ieee80211_unschedule_txq(s
|
||||||
|
|
||||||
|
if (!purge)
|
||||||
|
airtime_set_active(air_sched, air_info,
|
||||||
|
- ktime_get_boottime_ns());
|
||||||
|
+ ktime_get_coarse_boottime_ns());
|
||||||
|
|
||||||
|
rb_erase_cached(&txqi->schedule_order,
|
||||||
|
&air_sched->active_txqs);
|
||||||
|
@@ -4133,7 +4133,7 @@ bool ieee80211_txq_may_transmit(struct i
|
||||||
|
if (RB_EMPTY_NODE(&txqi->schedule_order))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
- now = ktime_get_boottime_ns();
|
||||||
|
+ now = ktime_get_coarse_boottime_ns();
|
||||||
|
|
||||||
|
/* Like in ieee80211_next_txq(), make sure the first station in the
|
||||||
|
* scheduling order is eligible for transmission to avoid starvation.
|
Loading…
Reference in New Issue
Block a user