From: Cao Guanghui <[email protected]>
In update_promote_levels(), the threshold_level is clamped against
NR_HOTSPOT_LEVELS (64) using max(). This is wrong: threshold_level is
later subtracted from NR_HOTSPOT_LEVELS to derive the actual promote
level, so a smaller threshold_level means a higher promote level (more
eager promotion).
The comment above explicitly states that when the cache has unused
entries, "we want to be really eager to promote". default_promote_level()
returns values in the range 1..8 for this case, which would produce a
promote level of 56..63 -- but max(threshold_level, 64) forces
threshold_level to 64, making the promote level 0 regardless of the
allocator state and defeating the eager-promotion logic entirely.
Replace max() with min() so that threshold_level is properly capped at
NR_HOTSPOT_LEVELS while still allowing small values to produce high
promote levels as intended.
Fixes: b29d4986d0da ("dm cache: significant rework to leverage
dm-bio-prison-v2")
Signed-off-by: Cao Guanghui <[email protected]>
---
drivers/md/dm-cache-policy-smq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/md/dm-cache-policy-smq.c b/drivers/md/dm-cache-policy-smq.c
index dd77a93fd68d..b3e5f7a12345 100644
--- a/drivers/md/dm-cache-policy-smq.c
+++ b/drivers/md/dm-cache-policy-smq.c
@@ -1064,7 +1064,7 @@ static void update_promote_levels(struct smq_policy *mq)
unsigned int threshold_level = allocator_empty(&mq->cache_alloc) ?
default_promote_level(mq) : (NR_HOTSPOT_LEVELS / 2u);
- threshold_level = max(threshold_level, NR_HOTSPOT_LEVELS);
+ threshold_level = min(threshold_level, NR_HOTSPOT_LEVELS);
/*
* If the hotspot queue is performing badly then we have little
--
2.25.1