static void zram_account_writeback_rollback(struct zram *zram)
{
- lockdep_assert_held_read(&zram->init_lock);
+ lockdep_assert_held_write(&zram->init_lock);
if (zram->wb_limit_enable)
zram->bd_wb_limit += 1UL << (PAGE_SHIFT - 12);
static void zram_account_writeback_submit(struct zram *zram)
{
- lockdep_assert_held_read(&zram->init_lock);
+ lockdep_assert_held_write(&zram->init_lock);
if (zram->wb_limit_enable && zram->bd_wb_limit > 0)
zram->bd_wb_limit -= 1UL << (PAGE_SHIFT - 12);
ssize_t ret = len;
int err, mode = 0;
- guard(rwsem_read)(&zram->init_lock);
+ guard(rwsem_write)(&zram->init_lock);
if (!init_done(zram))
return -EINVAL;
- /* Do not permit concurrent post-processing actions. */
- if (atomic_xchg(&zram->pp_in_progress, 1))
- return -EAGAIN;
-
- if (!zram->backing_dev) {
- ret = -ENODEV;
- goto out;
- }
+ if (!zram->backing_dev)
+ return -ENODEV;
pp_ctl = init_pp_ctl();
- if (!pp_ctl) {
- ret = -ENOMEM;
- goto out;
- }
+ if (!pp_ctl)
+ return -ENOMEM;
wb_ctl = init_wb_ctl(zram);
if (!wb_ctl) {
out:
release_pp_ctl(zram, pp_ctl);
release_wb_ctl(wb_ctl);
- atomic_set(&zram->pp_in_progress, 0);
return ret;
}
if (threshold >= huge_class_size)
return -EINVAL;
- guard(rwsem_read)(&zram->init_lock);
+ guard(rwsem_write)(&zram->init_lock);
if (!init_done(zram))
return -EINVAL;
- /* Do not permit concurrent post-processing actions. */
- if (atomic_xchg(&zram->pp_in_progress, 1))
- return -EAGAIN;
-
if (algo) {
bool found = false;
if (page)
__free_page(page);
release_pp_ctl(zram, ctl);
- atomic_set(&zram->pp_in_progress, 0);
return ret;
}
#endif
zram->disksize = 0;
zram_destroy_comps(zram);
memset(&zram->stats, 0, sizeof(zram->stats));
- atomic_set(&zram->pp_in_progress, 0);
reset_bdev(zram);
comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor);
zram->disk->fops = &zram_devops;
zram->disk->private_data = zram;
snprintf(zram->disk->disk_name, 16, "zram%d", device_id);
- atomic_set(&zram->pp_in_progress, 0);
zram_comp_params_reset(zram);
comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor);