diff options
| author | Peter Zijlstra <[email protected]> | 2024-07-04 16:00:24 +0200 |
|---|---|---|
| committer | Peter Zijlstra <[email protected]> | 2024-07-04 16:00:24 +0200 |
| commit | 0c8ea05e9b3d8e5287e2a968f2a2e744dfd31b99 (patch) | |
| tree | ba0443b74f063471c5d81d85e795e04e7e1dc79c /lib/dynamic_queue_limits.c | |
| parent | 0ca4da2412da05fb9dd0b5d90dcc8026219f0f29 (diff) | |
| parent | 34b3fc558b537bdf99644dcde539e151716f6331 (diff) | |
Merge branch 'tip/x86/cpu'
The Lunarlake patches rely on the new VFM stuff.
Signed-off-by: Peter Zijlstra <[email protected]>
Diffstat (limited to 'lib/dynamic_queue_limits.c')
| -rw-r--r-- | lib/dynamic_queue_limits.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/dynamic_queue_limits.c b/lib/dynamic_queue_limits.c index a1389db1c30a..e49deddd3de9 100644 --- a/lib/dynamic_queue_limits.c +++ b/lib/dynamic_queue_limits.c @@ -15,12 +15,10 @@ #define POSDIFF(A, B) ((int)((A) - (B)) > 0 ? (A) - (B) : 0) #define AFTER_EQ(A, B) ((int)((A) - (B)) >= 0) -static void dql_check_stall(struct dql *dql) +static void dql_check_stall(struct dql *dql, unsigned short stall_thrs) { - unsigned short stall_thrs; unsigned long now; - stall_thrs = READ_ONCE(dql->stall_thrs); if (!stall_thrs) return; @@ -86,9 +84,16 @@ void dql_completed(struct dql *dql, unsigned int count) { unsigned int inprogress, prev_inprogress, limit; unsigned int ovlimit, completed, num_queued; + unsigned short stall_thrs; bool all_prev_completed; num_queued = READ_ONCE(dql->num_queued); + /* Read stall_thrs in advance since it belongs to the same (first) + * cache line as ->num_queued. This way, dql_check_stall() does not + * need to touch the first cache line again later, reducing the window + * of possible false sharing. + */ + stall_thrs = READ_ONCE(dql->stall_thrs); /* Can't complete more than what's in queue */ BUG_ON(count > num_queued - dql->num_completed); @@ -178,7 +183,7 @@ void dql_completed(struct dql *dql, unsigned int count) dql->num_completed = completed; dql->prev_num_queued = num_queued; - dql_check_stall(dql); + dql_check_stall(dql, stall_thrs); } EXPORT_SYMBOL(dql_completed); |