]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/md/dm-cache-policy-smq.c
dm cache policy smq: distribute entries to random levels when switching to smq
[karo-tx-linux.git] / drivers / md / dm-cache-policy-smq.c
index f3cec4e6333ccf8f6ddf2542a5cdfd272e50a0a9..c33f4a6e1d7d087a086b492a3b3cc61d13049acd 100644 (file)
@@ -1359,6 +1359,11 @@ static void smq_clear_dirty(struct dm_cache_policy *p, dm_oblock_t oblock)
        spin_unlock_irqrestore(&mq->lock, flags);
 }
 
+static unsigned random_level(dm_cblock_t cblock)
+{
+       return hash_32_generic(from_cblock(cblock), 9) & (NR_CACHE_LEVELS - 1);
+}
+
 static int smq_load_mapping(struct dm_cache_policy *p,
                            dm_oblock_t oblock, dm_cblock_t cblock,
                            uint32_t hint, bool hint_valid)
@@ -1369,7 +1374,7 @@ static int smq_load_mapping(struct dm_cache_policy *p,
        e = alloc_particular_entry(&mq->cache_alloc, from_cblock(cblock));
        e->oblock = oblock;
        e->dirty = false;       /* this gets corrected in a minute */
-       e->level = hint_valid ? min(hint, NR_CACHE_LEVELS - 1) : 1;
+       e->level = hint_valid ? min(hint, NR_CACHE_LEVELS - 1) : random_level(cblock);
        push(mq, e);
 
        return 0;