On 07/01, Chao Yu wrote: > On 2020/7/1 9:59, Chao Yu wrote: > > On 2020/7/1 4:56, Jaegeuk Kim wrote: > >> On 06/30, Nathan Chancellor wrote: > >>> On Mon, Jun 29, 2020 at 01:27:20PM -0700, Jaegeuk Kim wrote: > >>>> If two readahead threads having same offset enter in readpages, every > >>>> read > >>>> IOs are split and issued to the disk which giving lower bandwidth. > >>>> > >>>> This patch tries to avoid redundant readahead calls. > >>>> > >>>> Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> > >>>> --- > >>>> v3: > >>>> - use READ|WRITE_ONCE > >>>> v2: > >>>> - add missing code to bypass read > >>>> > >>>> fs/f2fs/data.c | 18 ++++++++++++++++++ > >>>> fs/f2fs/f2fs.h | 1 + > >>>> fs/f2fs/super.c | 2 ++ > >>>> 3 files changed, 21 insertions(+) > >>>> > >>>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > >>>> index 995cf78b23c5e..360b4c9080d97 100644 > >>>> --- a/fs/f2fs/data.c > >>>> +++ b/fs/f2fs/data.c > >>>> @@ -2296,6 +2296,7 @@ static int f2fs_mpage_readpages(struct inode > >>>> *inode, > >>>> unsigned nr_pages = rac ? readahead_count(rac) : 1; > >>>> unsigned max_nr_pages = nr_pages; > >>>> int ret = 0; > >>>> + bool drop_ra = false; > >>>> > >>>> map.m_pblk = 0; > >>>> map.m_lblk = 0; > >>>> @@ -2306,10 +2307,24 @@ static int f2fs_mpage_readpages(struct inode > >>>> *inode, > >>>> map.m_seg_type = NO_CHECK_TYPE; > >>>> map.m_may_create = false; > >>>> > >>>> + /* > >>>> + * Two readahead threads for same address range can cause race > >>>> condition > >>>> + * which fragments sequential read IOs. So let's avoid each > >>>> other. > >>>> + */ > >>>> + if (rac && readahead_count(rac)) { > >>>> + if (READ_ONCE(F2FS_I(inode)->ra_offset) == > >>>> readahead_index(rac)) > >>>> + drop_ra = true; > >>>> + else > >>>> + WRITE_ONCE(F2FS_I(inode)->ra_offset, > >>>> + readahead_index(rac)); > >>>> + } > >>>> + > >>>> for (; nr_pages; nr_pages--) { > >>>> if (rac) { > >>>> page = readahead_page(rac); > >>>> prefetchw(&page->flags); > >>>> + if (drop_ra) > >>>> + goto next_page; > >>> > >>> When CONFIG_F2FS_FS_COMPRESSION is not set (i.e. x86_64 defconfig + > >>> CONFIG_F2FS_FS=y): > >>> > >>> $ make -skj"$(nproc)" O=out distclean defconfig fs/f2fs/data.o > >>> ../fs/f2fs/data.c: In function ‘f2fs_mpage_readpages’: > >>> ../fs/f2fs/data.c:2327:5: error: label ‘next_page’ used but not defined > >>> 2327 | goto next_page; > >>> | ^~~~ > >>> ... > >> > >> Thanks. I pushed the fix for -next. > >> https://lore.kernel.org/linux-f2fs-devel/1be18397-7fc6-703e-121b-e210e1013...@infradead.org/T/#t > > It will hang the kernel because we missed to unlock those cached pages, > I changed to 'goto set_error_page', the issue was gone.
How about v4? > > Thanks, > > > > > Reviewed-by: Chao Yu <yuch...@huawei.com> > > > > Thanks, > > > >> > >> Thanks, > >> > >>> > >>> Cheers, > >>> Nathan > >>> > >>> > >>> _______________________________________________ > >>> Linux-f2fs-devel mailing list > >>> linux-f2fs-de...@lists.sourceforge.net > >>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > >> > >> > >> _______________________________________________ > >> Linux-f2fs-devel mailing list > >> linux-f2fs-de...@lists.sourceforge.net > >> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > >> > > > > > > _______________________________________________ > > Linux-f2fs-devel mailing list > > linux-f2fs-de...@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel > >