RE: [f2fs-dev] [PATCH V2 1/2] f2fs: add a new function to support for merging contiguous read

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Kim,

> -----Original Message-----
> From: Jaegeuk Kim [mailto:jaegeuk.kim@xxxxxxxxxxx]
> Sent: Monday, November 18, 2013 8:29 AM
> To: Chao Yu
> Cc: linux-fsdevel@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx; 谭姝
> Subject: Re: [f2fs-dev] [PATCH V2 1/2] f2fs: add a new function to support for merging contiguous read
> 
> Hi Chao,
> 
> 2013-11-16 (토), 14:14 +0800, Chao Yu:
> > For better read performance, we add a new function to support for merging contiguous read as the one for write.
> 
> Please consider 80 columns for the description.
> I cannot fix this at every time though. :(

Got it, sorry about my carelessness in previous patch.

> 
> >
> > v1-->v2:
> >  o add declarations here as Gu Zheng suggested.
> >
> > Signed-off-by: Chao Yu <chao2.yu@xxxxxxxxxxx>
> > Acked-by: Gu Zheng <guz.fnst@xxxxxxxxxxxxxx>
> > ---
> >  fs/f2fs/data.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
> >  fs/f2fs/f2fs.h |    4 ++++
> >  2 files changed, 49 insertions(+)
> >
> > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> > index aa3438c..18107cb 100644
> > --- a/fs/f2fs/data.c
> > +++ b/fs/f2fs/data.c
> > @@ -404,6 +404,51 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page,
> >  	return 0;
> >  }
> >
> > +void f2fs_submit_read_bio(struct f2fs_sb_info *sbi, int rw)
> > +{
> > +	down_read(&sbi->bio_sem);
> 
> Is there any reason to use down_read()?

Isn't that we use bio_sem to let w/r or w/w submitting be mutex?

> It seems that we need to declare sbi->bio_read and sbi->bio_write
> instead of sbi->bio_sem.
> In addition to that, we need to use down_write(&sbi->bio_read) here.

If so, it looks similar between (struct rw_semaphore) sbi->bio_read 
and (struct bio *) sbi->read_bio.
How about using read_bio_sem/rbio_sem to differentiate 
from sbi->read_bio?

> 
> > +	if (sbi->read_bio) {
> > +		submit_bio(rw, sbi->read_bio);
> > +		sbi->read_bio = NULL;
> > +	}
> > +	up_read(&sbi->bio_sem);
> 
> up_write(&sbi->bio_read);
> 
> > +}
> > +
> > +void submit_read_page(struct f2fs_sb_info *sbi, struct page *page,
> > +					block_t blk_addr, int rw)
> > +{
> > +	struct block_device *bdev = sbi->sb->s_bdev;
> > +	int bio_blocks;
> > +
> > +	verify_block_addr(sbi, blk_addr);
> > +
> > +	down_read(&sbi->bio_sem);
> 
> down_write(&sbi->bio_read);
> 
> > +
> > +	if (sbi->read_bio && sbi->last_read_block != blk_addr - 1) {
> > +		submit_bio(rw, sbi->read_bio);
> > +		sbi->read_bio = NULL;
> > +	}
> > +
> > +alloc_new:
> > +	if (sbi->read_bio == NULL) {
> > +		bio_blocks = MAX_BIO_BLOCKS(max_hw_blocks(sbi));
> > +		sbi->read_bio = f2fs_bio_alloc(bdev, bio_blocks);
> > +		sbi->read_bio->bi_sector = SECTOR_FROM_BLOCK(sbi, blk_addr);
> > +		sbi->read_bio->bi_end_io = read_end_io;
> > +	}
> > +
> > +	if (bio_add_page(sbi->read_bio, page, PAGE_CACHE_SIZE, 0) <
> > +							PAGE_CACHE_SIZE) {
> > +		submit_bio(rw, sbi->read_bio);
> > +		sbi->read_bio = NULL;
> > +		goto alloc_new;
> > +	}
> > +
> > +	sbi->last_read_block = blk_addr;
> > +
> > +	up_read(&sbi->bio_sem);
> 
> up_write(&sbi->bio_read);
> 
> > +}
> > +
> >  /*
> >   * This function should be used by the data read flow only where it
> >   * does not check the "create" flag that indicates block allocation.
> > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > index 89dc750..bfe9d87 100644
> > --- a/fs/f2fs/f2fs.h
> > +++ b/fs/f2fs/f2fs.h
> > @@ -359,6 +359,8 @@ struct f2fs_sb_info {
> >
> >  	/* for segment-related operations */
> >  	struct f2fs_sm_info *sm_info;		/* segment manager */
> > +	struct bio *read_bio;			/* read bios to merge */
> > +	sector_t last_read_block;		/* last read block number */
> >  	struct bio *bio[NR_PAGE_TYPE];		/* bios to merge */
> >  	sector_t last_block_in_bio[NR_PAGE_TYPE];	/* last block number */
> >  	struct rw_semaphore bio_sem;		/* IO semaphore */
> > @@ -1111,6 +1113,8 @@ struct page *find_data_page(struct inode *, pgoff_t, bool);
> >  struct page *get_lock_data_page(struct inode *, pgoff_t);
> >  struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool);
> >  int f2fs_readpage(struct f2fs_sb_info *, struct page *, block_t, int);
> > +void f2fs_submit_read_bio(struct f2fs_sb_info *, int);
> > +void submit_read_page(struct f2fs_sb_info *, struct page *, block_t, int);
> >  int do_write_data_page(struct page *);
> >
> >  /*
> 
> --
> Jaegeuk Kim
> Samsung

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux