Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm cache policy smq: distribute entries to random levels when switching to smq

For smq the 32 bit 'hint' stores the multiqueue level that the entry
should be stored in. If a different policy has been used previously,
and then switched to smq, the hints will be invalid. In which case we
used to put all entries in the bottom level of the multiqueue, and then
redistribute. Redistribution is faster if we put entries with invalid
hints in random levels initially.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Joe Thornber and committed by
Mike Snitzer
9d1b404c 4e781b49

+6 -1
+6 -1
drivers/md/dm-cache-policy-smq.c
··· 1359 1359 spin_unlock_irqrestore(&mq->lock, flags); 1360 1360 } 1361 1361 1362 + static unsigned random_level(dm_cblock_t cblock) 1363 + { 1364 + return hash_32_generic(from_cblock(cblock), 9) & (NR_CACHE_LEVELS - 1); 1365 + } 1366 + 1362 1367 static int smq_load_mapping(struct dm_cache_policy *p, 1363 1368 dm_oblock_t oblock, dm_cblock_t cblock, 1364 1369 uint32_t hint, bool hint_valid) ··· 1374 1369 e = alloc_particular_entry(&mq->cache_alloc, from_cblock(cblock)); 1375 1370 e->oblock = oblock; 1376 1371 e->dirty = false; /* this gets corrected in a minute */ 1377 - e->level = hint_valid ? min(hint, NR_CACHE_LEVELS - 1) : 1; 1372 + e->level = hint_valid ? min(hint, NR_CACHE_LEVELS - 1) : random_level(cblock); 1378 1373 push(mq, e); 1379 1374 1380 1375 return 0;