summaryrefslogtreecommitdiff
path: root/drivers/md/dm-bio-prison-v2.c
diff options
context:
space:
mode:
authorMingzhe Zou <mingzhe.zou@easystack.cn>2022-01-07 11:21:13 +0300
committerColy Li <colyli@suse.de>2022-03-06 17:33:37 +0300
commit7b1002f7cfe581930f63787a0b3de0144e61ed55 (patch)
treeb348bdf5de00503d4ca530cce6880dd15b88832d /drivers/md/dm-bio-prison-v2.c
parent13d4ef0f66b7ee9415e101e213acaf94a0cb28ee (diff)
downloadlinux-7b1002f7cfe581930f63787a0b3de0144e61ed55.tar.xz
bcache: fixup bcache_dev_sectors_dirty_add() multithreaded CPU false sharing
When attaching a cached device (a.k.a backing device) to a cache device, bch_sectors_dirty_init() is called to count dirty sectors and stripes (see what bcache_dev_sectors_dirty_add() does) on the cache device. When bcache_dev_sectors_dirty_add() is called, set_bit(stripe, d->full_dirty_stripes) or clear_bit(stripe, d->full_dirty_stripes) operation will always be performed. In full_dirty_stripes, each 1bit represents stripe_size (8192) sectors (512B), so 1bit=4MB (8192*512), and each CPU cache line=64B=512bit=2048MB. When 20 threads process a cached disk with 100G dirty data, a single thread processes about 23M at a time, and 20 threads total 460M. These full_dirty_stripes bits corresponding to the 460M data is likely to fall in the same CPU cache line. When one of these threads performs a set_bit or clear_bit operation, the same CPU cache line of other threads will become invalid and must read the full_dirty_stripes from the main memory again. Compared with single thread, the time of a bcache_dev_sectors_dirty_add() call is increased by about 50 times in our test (100G dirty data, 20 threads, bcache_dev_sectors_dirty_add() is called more than 20 million times). This patch tries to test_bit before set_bit or clear_bit operation. Therefore, a lot of force set and clear operations will be avoided, and most of bcache_dev_sectors_dirty_add() calls will only read CPU cache line. Signed-off-by: Mingzhe Zou <mingzhe.zou@easystack.cn> Signed-off-by: Coly Li <colyli@suse.de>
Diffstat (limited to 'drivers/md/dm-bio-prison-v2.c')
0 files changed, 0 insertions, 0 deletions