Messages in this thread | | | Subject | Re: [PATCH v2 2/2] erofs: decompress in endio if possible | From | Huang Jianan <> | Date | Fri, 5 Mar 2021 16:14:56 +0800 |
| |
On 2021/3/5 16:08, Huang Jianan wrote: > z_erofs_decompressqueue_endio may not be executed in the atomic > context, for example, when dm-verity is turned on. In this scenario, > data can be decompressed directly to get rid of additional kworker > scheduling overhead. Also, it makes no sense to apply synchronous > decompression for such case. > > Signed-off-by: Huang Jianan <huangjianan@oppo.com> > Signed-off-by: Guo Weichao <guoweichao@oppo.com> > --- > fs/erofs/internal.h | 3 +++ > fs/erofs/super.c | 4 ++++ > fs/erofs/zdata.c | 13 +++++++++++-- > 3 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h > index 67a7ec945686..b817cb85d67b 100644 > --- a/fs/erofs/internal.h > +++ b/fs/erofs/internal.h > @@ -70,6 +70,9 @@ struct erofs_sb_info { > > /* pseudo inode to manage cached pages */ > struct inode *managed_cache; > + > + /* decide whether to decompress synchronously */ > + bool readahead_sync_decompress; > #endif /* CONFIG_EROFS_FS_ZIP */ > u32 blocks; > u32 meta_blkaddr; > diff --git a/fs/erofs/super.c b/fs/erofs/super.c > index d5a6b9b888a5..77819efe9b15 100644 > --- a/fs/erofs/super.c > +++ b/fs/erofs/super.c > @@ -175,6 +175,10 @@ static int erofs_read_superblock(struct super_block *sb) > sbi->root_nid = le16_to_cpu(dsb->root_nid); > sbi->inos = le64_to_cpu(dsb->inos); > > +#ifdef CONFIG_EROFS_FS_ZIP > + sbi->readahead_sync_decompress = false; > +#endif > + > sbi->build_time = le64_to_cpu(dsb->build_time); > sbi->build_time_nsec = le32_to_cpu(dsb->build_time_nsec); > > diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c > index 6cb356c4217b..49ffc817dd9e 100644 > --- a/fs/erofs/zdata.c > +++ b/fs/erofs/zdata.c > @@ -706,6 +706,7 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, > goto out; > } > > +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) > { > @@ -720,8 +721,14 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, > return; > } > > - if (!atomic_add_return(bios, &io->pending_bios)) > - queue_work(z_erofs_workqueue, &io->u.work); > + if (!atomic_add_return(bios, &io->pending_bios)) { > + if (in_atomic() || irqs_disabled()) { > + queue_work(z_erofs_workqueue, &io->u.work); > + sbi->readahead_sync_decompress = true; > + } else { > + z_erofs_decompressqueue_work(&io->u.work); > + } > + } > } > > static bool z_erofs_page_is_invalidated(struct page *page) > @@ -1333,6 +1340,8 @@ static void z_erofs_readahead(struct readahead_control *rac) > struct erofs_sb_info *const sbi = EROFS_I_SB(inode); > > unsigned int nr_pages = readahead_count(rac); > + bool sync = (sbi->readahead_sync_decompress && > + nr_pages <= sbi->ctx.max_sync_decompress_pages); > bool sync = (nr_pages <= sbi->ctx.max_sync_decompress_pages); sorry for my mistake here, i will send v3 to fix this. > struct z_erofs_decompress_frontend f = DECOMPRESS_FRONTEND_INIT(inode); > struct page *page, *head = NULL;
| |