hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IAFWQH ---------------------------------------- zram_slot_free_notify() tries to lock zram slot and may fail. In that case. the zspool memory allocated to the zram slot couldn't be freed, and then we couldn't unbind memcg for the zspool. So, we should guarantee this function frees memory successfully. commit 3c9959e02547 ("zram: fix lockdep warning of free block handling") uses zram_slot_trylock() in zram_slot_free_notify() to avoid deadlock, due to zram_slot_free_notify() could be called in softirq context by end_swap_bio_read(). However, after commit e914d8f00391 ("mm: fix unexpected zeroed page mapping with zram swap"), zram_slot_free_notify() couldn't be called in softirq context. So, use zram_slot_lock() in zram_slot_free_notify(). Signed-off-by: Jinjiang Tu <tujinjiang@huawei.com> --- drivers/block/multi_pool_zram/multi_pool_zram_drv.c | 13 ++----------- drivers/block/multi_pool_zram/multi_pool_zram_drv.h | 1 - 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/drivers/block/multi_pool_zram/multi_pool_zram_drv.c b/drivers/block/multi_pool_zram/multi_pool_zram_drv.c index 69a899ae98b5..987dadebaf07 100644 --- a/drivers/block/multi_pool_zram/multi_pool_zram_drv.c +++ b/drivers/block/multi_pool_zram/multi_pool_zram_drv.c @@ -48,11 +48,6 @@ static void zram_free_page(struct zram *zram, size_t index); static int zram_read_page(struct zram *zram, struct page *page, u32 index, struct bio *parent); -static int zram_slot_trylock(struct zram *zram, u32 index) -{ - return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags); -} - static void zram_slot_lock(struct zram *zram, u32 index) { bit_spin_lock(ZRAM_LOCK, &zram->table[index].flags); @@ -265,7 +260,7 @@ static ssize_t debug_stat_show(struct device *dev, "version: %d\n%8llu %8llu\n", version, (u64)atomic64_read(&zram->stats.writestall), - (u64)atomic64_read(&zram->stats.miss_free)); + 0ULL); up_read(&zram->init_lock); return ret; @@ -705,11 +700,7 @@ static void zram_slot_free_notify(struct block_device *bdev, zram = bdev->bd_disk->private_data; atomic64_inc(&zram->stats.notify_free); - if (!zram_slot_trylock(zram, index)) { - atomic64_inc(&zram->stats.miss_free); - return; - } - + zram_slot_lock(zram, index); zram_free_page(zram, index); zram_slot_unlock(zram, index); } diff --git a/drivers/block/multi_pool_zram/multi_pool_zram_drv.h b/drivers/block/multi_pool_zram/multi_pool_zram_drv.h index e320f395d121..7d96139a94df 100644 --- a/drivers/block/multi_pool_zram/multi_pool_zram_drv.h +++ b/drivers/block/multi_pool_zram/multi_pool_zram_drv.h @@ -63,7 +63,6 @@ struct zram_stats { atomic64_t huge_pages_since; /* no. of huge pages since zram set up */ atomic64_t pages_stored; /* no. of pages currently stored */ atomic64_t writestall; /* no. of write slow paths */ - atomic64_t miss_free; /* no. of missed free */ }; struct zram { -- 2.43.0