Messages in this thread Patch in this message | | | From | Huang Jianan <> | Subject | [PATCH 2/2] erofs: add sysfs node to control sync decompression strategy | Date | Tue, 9 Nov 2021 10:54:45 +0800 |
| |
Although readpage is a synchronous path, there will be no additional kworker scheduling overhead in non-atomic contexts. So we can add a sysfs node to allow disable sync decompression.
Signed-off-by: Huang Jianan <huangjianan@oppo.com> --- fs/erofs/internal.h | 2 +- fs/erofs/super.c | 2 +- fs/erofs/sysfs.c | 6 ++++++ fs/erofs/zdata.c | 9 ++++----- 4 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index d0cd712dc222..1ab96878009d 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -60,7 +60,7 @@ struct erofs_mount_opts { #ifdef CONFIG_EROFS_FS_ZIP /* current strategy of how to use managed cache */ unsigned char cache_strategy; - /* strategy of sync decompression (false - auto, true - force on) */ + /* strategy of sync decompression (false - disable, true - force on) */ bool readahead_sync_decompress; /* threshold for decompression synchronously */ diff --git a/fs/erofs/super.c b/fs/erofs/super.c index abc1da5d1719..26585d865503 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -423,7 +423,7 @@ static void erofs_default_options(struct erofs_fs_context *ctx) #ifdef CONFIG_EROFS_FS_ZIP ctx->opt.cache_strategy = EROFS_ZIP_CACHE_READAROUND; ctx->opt.max_sync_decompress_pages = 3; - ctx->opt.readahead_sync_decompress = false; + ctx->opt.readahead_sync_decompress = true; #endif #ifdef CONFIG_EROFS_FS_XATTR set_opt(&ctx->opt, XATTR_USER); diff --git a/fs/erofs/sysfs.c b/fs/erofs/sysfs.c index c7685f1a8f34..fe67ed490735 100644 --- a/fs/erofs/sysfs.c +++ b/fs/erofs/sysfs.c @@ -16,6 +16,7 @@ enum { enum { struct_erofs_sb_info, + struct_erofs_mount_opts, }; struct erofs_attr { @@ -55,7 +56,10 @@ static struct erofs_attr erofs_attr_##_name = { \ #define ATTR_LIST(name) (&erofs_attr_##name.attr) +EROFS_RW_ATTR_BOOL(readahead_sync_decompress, erofs_mount_opts); + static struct attribute *erofs_attrs[] = { + ATTR_LIST(readahead_sync_decompress), NULL, }; ATTRIBUTE_GROUPS(erofs); @@ -82,6 +86,8 @@ static unsigned char *__struct_ptr(struct erofs_sb_info *sbi, { if (struct_type == struct_erofs_sb_info) return (unsigned char *)sbi + offset; + if (struct_type == struct_erofs_mount_opts) + return (unsigned char *)&sbi->opt + offset; return NULL; } diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index bcb1b91b234f..ad11333b367a 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -776,8 +776,6 @@ static void z_erofs_decompressqueue_work(struct work_struct *work); static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, bool sync, int bios) { - struct erofs_sb_info *const sbi = EROFS_SB(io->sb); - /* wake up the caller thread for sync decompression */ if (sync) { unsigned long flags; @@ -791,10 +789,9 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, if (atomic_add_return(bios, &io->pending_bios)) return; - /* Use workqueue and sync decompression for atomic contexts only */ + /* Use workqueue decompression for atomic contexts only */ if (in_atomic() || irqs_disabled()) { queue_work(z_erofs_workqueue, &io->u.work); - sbi->opt.readahead_sync_decompress = true; return; } z_erofs_decompressqueue_work(&io->u.work); @@ -1454,6 +1451,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_decompress_frontend *f, static int z_erofs_readpage(struct file *file, struct page *page) { struct inode *const inode = page->mapping->host; + struct erofs_sb_info *const sbi = EROFS_I_SB(inode); struct z_erofs_decompress_frontend f = DECOMPRESS_FRONTEND_INIT(inode); struct page *pagepool = NULL; int err; @@ -1469,7 +1467,8 @@ static int z_erofs_readpage(struct file *file, struct page *page) (void)z_erofs_collector_end(&f.clt); /* if some compressed cluster ready, need submit them anyway */ - z_erofs_runqueue(inode->i_sb, &f, &pagepool, true); + z_erofs_runqueue(inode->i_sb, &f, &pagepool, + sbi->opt.readahead_sync_decompress); if (err) erofs_err(inode->i_sb, "failed to read, err [%d]", err); -- 2.25.1
| |