On Fri, Nov 22, 2024 at 6:47 AM Josef Bacik <josef@xxxxxxxxxxxxxx> wrote: > > On Fri, Nov 08, 2024 at 04:12:55PM -0800, Joanne Koong wrote: > > Add support for folios larger than one page size for readahead. > > > > Signed-off-by: Joanne Koong <joannelkoong@xxxxxxxxx> > > --- > > fs/fuse/file.c | 28 +++++++++++++++++++--------- > > 1 file changed, 19 insertions(+), 9 deletions(-) > > > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > > index 44a65bdfe8fb..255c7f2f2ed4 100644 > > --- a/fs/fuse/file.c > > +++ b/fs/fuse/file.c > > @@ -885,14 +885,13 @@ static void fuse_readpages_end(struct fuse_mount *fm, struct fuse_args *args, > > fuse_io_free(ia); > > } > > > > -static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file) > > +static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file, > > + unsigned int count) > > { > > struct fuse_file *ff = file->private_data; > > struct fuse_mount *fm = ff->fm; > > struct fuse_args_pages *ap = &ia->ap; > > loff_t pos = folio_pos(ap->folios[0]); > > - /* Currently, all folios in FUSE are one page */ > > - size_t count = ap->num_folios << PAGE_SHIFT; > > ssize_t res; > > int err; > > > > @@ -929,6 +928,7 @@ static void fuse_readahead(struct readahead_control *rac) > > unsigned int max_pages, nr_pages; > > loff_t first = readahead_pos(rac); > > loff_t last = first + readahead_length(rac) - 1; > > + struct folio *folio = NULL; > > > > if (fuse_is_bad(inode)) > > return; > > @@ -952,8 +952,8 @@ static void fuse_readahead(struct readahead_control *rac) > > while (nr_pages) { > > struct fuse_io_args *ia; > > struct fuse_args_pages *ap; > > - struct folio *folio; > > unsigned cur_pages = min(max_pages, nr_pages); > > + unsigned int pages = 0; > > > > if (fc->num_background >= fc->congestion_threshold && > > rac->ra->async_size >= readahead_count(rac)) > > @@ -968,14 +968,24 @@ static void fuse_readahead(struct readahead_control *rac) > > return; > > ap = &ia->ap; > > > > - while (ap->num_folios < cur_pages) { > > - folio = readahead_folio(rac); > > + while (pages < cur_pages) { > > + unsigned int folio_pages; > > + > > + if (!folio) > > + folio = readahead_folio(rac); > > + > > + folio_pages = folio_nr_pages(folio); > > + if (folio_pages > cur_pages - pages) > > + break; > > + > > ap->folios[ap->num_folios] = folio; > > - ap->descs[ap->num_folios].length = folio_size(folio); > > + ap->descs[ap->num_folios].length = folio_pages << PAGE_SHIFT; > > Why change this? Aren't these equivalent? Thanks, Yes, these are equivalent. Don't know why I modified this, thanks for noting. I'll change this back to the original line for v2. Thanks, Joanne > > Josef