Skip to content

Commit 68bfb7e

Browse files
joannekoongMiklos Szeredi
authored andcommitted
fuse: remove pages for requests and exclusively use folios
All fuse requests use folios instead of pages for transferring data. Remove pages from the requests and exclusively use folios. No functional changes. [SzM: rename back folio_descs -> descs, etc.] Signed-off-by: Joanne Koong <[email protected]> Reviewed-by: Josef Bacik <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 3b97c36 commit 68bfb7e

File tree

8 files changed

+90
-154
lines changed

8 files changed

+90
-154
lines changed

fs/fuse/cuse.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,9 @@ static int cuse_send_init(struct cuse_conn *cc)
460460
ap->args.out_args[1].size = CUSE_INIT_INFO_MAX;
461461
ap->args.out_argvar = true;
462462
ap->args.out_pages = true;
463-
ap->uses_folios = true;
464463
ap->num_folios = 1;
465464
ap->folios = &ia->folio;
466-
ap->folio_descs = &ia->desc;
465+
ap->descs = &ia->desc;
467466
ia->folio = folio;
468467
ia->desc.length = ap->args.out_args[1].size;
469468
ap->args.end = cuse_process_init_reply;

fs/fuse/dev.c

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,41 +1028,27 @@ static int fuse_copy_pages(struct fuse_copy_state *cs, unsigned nbytes,
10281028
struct fuse_req *req = cs->req;
10291029
struct fuse_args_pages *ap = container_of(req->args, typeof(*ap), args);
10301030

1031-
if (ap->uses_folios) {
1032-
for (i = 0; i < ap->num_folios && (nbytes || zeroing); i++) {
1033-
int err;
1034-
unsigned int offset = ap->folio_descs[i].offset;
1035-
unsigned int count = min(nbytes, ap->folio_descs[i].length);
1036-
struct page *orig, *pagep;
1031+
for (i = 0; i < ap->num_folios && (nbytes || zeroing); i++) {
1032+
int err;
1033+
unsigned int offset = ap->descs[i].offset;
1034+
unsigned int count = min(nbytes, ap->descs[i].length);
1035+
struct page *orig, *pagep;
10371036

1038-
orig = pagep = &ap->folios[i]->page;
1037+
orig = pagep = &ap->folios[i]->page;
10391038

1040-
err = fuse_copy_page(cs, &pagep, offset, count, zeroing);
1041-
if (err)
1042-
return err;
1043-
1044-
nbytes -= count;
1045-
1046-
/*
1047-
* fuse_copy_page may have moved a page from a pipe
1048-
* instead of copying into our given page, so update
1049-
* the folios if it was replaced.
1050-
*/
1051-
if (pagep != orig)
1052-
ap->folios[i] = page_folio(pagep);
1053-
}
1054-
} else {
1055-
for (i = 0; i < ap->num_pages && (nbytes || zeroing); i++) {
1056-
int err;
1057-
unsigned int offset = ap->descs[i].offset;
1058-
unsigned int count = min(nbytes, ap->descs[i].length);
1039+
err = fuse_copy_page(cs, &pagep, offset, count, zeroing);
1040+
if (err)
1041+
return err;
10591042

1060-
err = fuse_copy_page(cs, &ap->pages[i], offset, count, zeroing);
1061-
if (err)
1062-
return err;
1043+
nbytes -= count;
10631044

1064-
nbytes -= count;
1065-
}
1045+
/*
1046+
* fuse_copy_page may have moved a page from a pipe instead of
1047+
* copying into our given page, so update the folios if it was
1048+
* replaced.
1049+
*/
1050+
if (pagep != orig)
1051+
ap->folios[i] = page_folio(pagep);
10661052
}
10671053
return 0;
10681054
}
@@ -1761,16 +1747,15 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
17611747
num_pages = (num + offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
17621748
num_pages = min(num_pages, fc->max_pages);
17631749

1764-
args_size += num_pages * (sizeof(ap->folios[0]) + sizeof(ap->folio_descs[0]));
1750+
args_size += num_pages * (sizeof(ap->folios[0]) + sizeof(ap->descs[0]));
17651751

17661752
ra = kzalloc(args_size, GFP_KERNEL);
17671753
if (!ra)
17681754
return -ENOMEM;
17691755

17701756
ap = &ra->ap;
17711757
ap->folios = (void *) (ra + 1);
1772-
ap->folio_descs = (void *) (ap->folios + num_pages);
1773-
ap->uses_folios = true;
1758+
ap->descs = (void *) (ap->folios + num_pages);
17741759

17751760
args = &ap->args;
17761761
args->nodeid = outarg->nodeid;
@@ -1791,8 +1776,8 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
17911776

17921777
this_num = min_t(unsigned, num, PAGE_SIZE - offset);
17931778
ap->folios[ap->num_folios] = folio;
1794-
ap->folio_descs[ap->num_folios].offset = offset;
1795-
ap->folio_descs[ap->num_folios].length = this_num;
1779+
ap->descs[ap->num_folios].offset = offset;
1780+
ap->descs[ap->num_folios].length = this_num;
17961781
ap->num_folios++;
17971782
cur_pages++;
17981783

fs/fuse/dir.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,10 +1590,9 @@ static int fuse_readlink_page(struct inode *inode, struct folio *folio)
15901590
struct fuse_mount *fm = get_fuse_mount(inode);
15911591
struct fuse_folio_desc desc = { .length = PAGE_SIZE - 1 };
15921592
struct fuse_args_pages ap = {
1593-
.uses_folios = true,
15941593
.num_folios = 1,
15951594
.folios = &folio,
1596-
.folio_descs = &desc,
1595+
.descs = &desc,
15971596
};
15981597
char *link;
15991598
ssize_t res;

fs/fuse/file.c

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -742,17 +742,16 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
742742
kref_put(&io->refcnt, fuse_io_release);
743743
}
744744

745-
static struct fuse_io_args *fuse_io_folios_alloc(struct fuse_io_priv *io,
745+
static struct fuse_io_args *fuse_io_alloc(struct fuse_io_priv *io,
746746
unsigned int nfolios)
747747
{
748748
struct fuse_io_args *ia;
749749

750750
ia = kzalloc(sizeof(*ia), GFP_KERNEL);
751751
if (ia) {
752752
ia->io = io;
753-
ia->ap.uses_folios = true;
754753
ia->ap.folios = fuse_folios_alloc(nfolios, GFP_KERNEL,
755-
&ia->ap.folio_descs);
754+
&ia->ap.descs);
756755
if (!ia->ap.folios) {
757756
kfree(ia);
758757
ia = NULL;
@@ -761,7 +760,7 @@ static struct fuse_io_args *fuse_io_folios_alloc(struct fuse_io_priv *io,
761760
return ia;
762761
}
763762

764-
static void fuse_io_folios_free(struct fuse_io_args *ia)
763+
static void fuse_io_free(struct fuse_io_args *ia)
765764
{
766765
kfree(ia->ap.folios);
767766
kfree(ia);
@@ -797,7 +796,7 @@ static void fuse_aio_complete_req(struct fuse_mount *fm, struct fuse_args *args,
797796
fuse_release_user_pages(&ia->ap, err ?: nres, io->should_dirty);
798797

799798
fuse_aio_complete(io, err, pos);
800-
fuse_io_folios_free(ia);
799+
fuse_io_free(ia);
801800
}
802801

803802
static ssize_t fuse_async_req_send(struct fuse_mount *fm,
@@ -880,10 +879,9 @@ static int fuse_do_readfolio(struct file *file, struct folio *folio)
880879
struct fuse_io_args ia = {
881880
.ap.args.page_zeroing = true,
882881
.ap.args.out_pages = true,
883-
.ap.uses_folios = true,
884882
.ap.num_folios = 1,
885883
.ap.folios = &folio,
886-
.ap.folio_descs = &desc,
884+
.ap.descs = &desc,
887885
};
888886
ssize_t res;
889887
u64 attr_ver;
@@ -962,7 +960,7 @@ static void fuse_readpages_end(struct fuse_mount *fm, struct fuse_args *args,
962960
if (ia->ff)
963961
fuse_file_put(ia->ff, false);
964962

965-
fuse_io_folios_free(ia);
963+
fuse_io_free(ia);
966964
}
967965

968966
static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
@@ -983,7 +981,7 @@ static void fuse_send_readpages(struct fuse_io_args *ia, struct file *file)
983981
/* Don't overflow end offset */
984982
if (pos + (count - 1) == LLONG_MAX) {
985983
count--;
986-
ap->folio_descs[ap->num_folios - 1].length--;
984+
ap->descs[ap->num_folios - 1].length--;
987985
}
988986
WARN_ON((loff_t) (pos + count) < 0);
989987

@@ -1044,15 +1042,15 @@ static void fuse_readahead(struct readahead_control *rac)
10441042
*/
10451043
break;
10461044

1047-
ia = fuse_io_folios_alloc(NULL, cur_pages);
1045+
ia = fuse_io_alloc(NULL, cur_pages);
10481046
if (!ia)
10491047
return;
10501048
ap = &ia->ap;
10511049

10521050
while (ap->num_folios < cur_pages) {
10531051
folio = readahead_folio(rac);
10541052
ap->folios[ap->num_folios] = folio;
1055-
ap->folio_descs[ap->num_folios].length = folio_size(folio);
1053+
ap->descs[ap->num_folios].length = folio_size(folio);
10561054
ap->num_folios++;
10571055
}
10581056
fuse_send_readpages(ia, rac->file);
@@ -1186,7 +1184,7 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
11861184
err = -EIO;
11871185

11881186
short_write = ia->write.out.size < count;
1189-
offset = ap->folio_descs[0].offset;
1187+
offset = ap->descs[0].offset;
11901188
count = ia->write.out.size;
11911189
for (i = 0; i < ap->num_folios; i++) {
11921190
struct folio *folio = ap->folios[i];
@@ -1224,7 +1222,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
12241222
int err;
12251223

12261224
ap->args.in_pages = true;
1227-
ap->folio_descs[0].offset = offset;
1225+
ap->descs[0].offset = offset;
12281226

12291227
do {
12301228
size_t tmp;
@@ -1261,7 +1259,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
12611259

12621260
err = 0;
12631261
ap->folios[ap->num_folios] = folio;
1264-
ap->folio_descs[ap->num_folios].length = tmp;
1262+
ap->descs[ap->num_folios].length = tmp;
12651263
ap->num_folios++;
12661264
nr_pages++;
12671265

@@ -1318,8 +1316,7 @@ static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii)
13181316
unsigned int nr_pages = fuse_wr_pages(pos, iov_iter_count(ii),
13191317
fc->max_pages);
13201318

1321-
ap->uses_folios = true;
1322-
ap->folios = fuse_folios_alloc(nr_pages, GFP_KERNEL, &ap->folio_descs);
1319+
ap->folios = fuse_folios_alloc(nr_pages, GFP_KERNEL, &ap->descs);
13231320
if (!ap->folios) {
13241321
err = -ENOMEM;
13251322
break;
@@ -1564,13 +1561,13 @@ static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii,
15641561
/* Currently, all folios in FUSE are one page */
15651562
nfolios = DIV_ROUND_UP(ret, PAGE_SIZE);
15661563

1567-
ap->folio_descs[ap->num_folios].offset = start;
1568-
fuse_folio_descs_length_init(ap->folio_descs, ap->num_folios, nfolios);
1564+
ap->descs[ap->num_folios].offset = start;
1565+
fuse_folio_descs_length_init(ap->descs, ap->num_folios, nfolios);
15691566
for (i = 0; i < nfolios; i++)
15701567
ap->folios[i + ap->num_folios] = page_folio(pages[i]);
15711568

15721569
ap->num_folios += nfolios;
1573-
ap->folio_descs[ap->num_folios - 1].length -=
1570+
ap->descs[ap->num_folios - 1].length -=
15741571
(PAGE_SIZE - ret) & (PAGE_SIZE - 1);
15751572
nr_pages += nfolios;
15761573
}
@@ -1614,14 +1611,14 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16141611
bool fopen_direct_io = ff->open_flags & FOPEN_DIRECT_IO;
16151612

16161613
max_pages = iov_iter_npages(iter, fc->max_pages);
1617-
ia = fuse_io_folios_alloc(io, max_pages);
1614+
ia = fuse_io_alloc(io, max_pages);
16181615
if (!ia)
16191616
return -ENOMEM;
16201617

16211618
if (fopen_direct_io && fc->direct_io_allow_mmap) {
16221619
res = filemap_write_and_wait_range(mapping, pos, pos + count - 1);
16231620
if (res) {
1624-
fuse_io_folios_free(ia);
1621+
fuse_io_free(ia);
16251622
return res;
16261623
}
16271624
}
@@ -1636,7 +1633,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16361633
if (fopen_direct_io && write) {
16371634
res = invalidate_inode_pages2_range(mapping, idx_from, idx_to);
16381635
if (res) {
1639-
fuse_io_folios_free(ia);
1636+
fuse_io_free(ia);
16401637
return res;
16411638
}
16421639
}
@@ -1663,7 +1660,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16631660

16641661
if (!io->async || nres < 0) {
16651662
fuse_release_user_pages(&ia->ap, nres, io->should_dirty);
1666-
fuse_io_folios_free(ia);
1663+
fuse_io_free(ia);
16671664
}
16681665
ia = NULL;
16691666
if (nres < 0) {
@@ -1682,13 +1679,13 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
16821679
}
16831680
if (count) {
16841681
max_pages = iov_iter_npages(iter, fc->max_pages);
1685-
ia = fuse_io_folios_alloc(io, max_pages);
1682+
ia = fuse_io_alloc(io, max_pages);
16861683
if (!ia)
16871684
break;
16881685
}
16891686
}
16901687
if (ia)
1691-
fuse_io_folios_free(ia);
1688+
fuse_io_free(ia);
16921689
if (res > 0)
16931690
*ppos = pos;
16941691

@@ -2093,8 +2090,7 @@ static struct fuse_writepage_args *fuse_writepage_args_alloc(void)
20932090
if (wpa) {
20942091
ap = &wpa->ia.ap;
20952092
ap->num_folios = 0;
2096-
ap->uses_folios = true;
2097-
ap->folios = fuse_folios_alloc(1, GFP_NOFS, &ap->folio_descs);
2093+
ap->folios = fuse_folios_alloc(1, GFP_NOFS, &ap->descs);
20982094
if (!ap->folios) {
20992095
kfree(wpa);
21002096
wpa = NULL;
@@ -2127,8 +2123,8 @@ static void fuse_writepage_args_page_fill(struct fuse_writepage_args *wpa, struc
21272123
folio_copy(tmp_folio, folio);
21282124

21292125
ap->folios[folio_index] = tmp_folio;
2130-
ap->folio_descs[folio_index].offset = 0;
2131-
ap->folio_descs[folio_index].length = PAGE_SIZE;
2126+
ap->descs[folio_index].offset = 0;
2127+
ap->descs[folio_index].length = PAGE_SIZE;
21322128

21332129
inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
21342130
node_stat_add_folio(tmp_folio, NR_WRITEBACK_TEMP);
@@ -2234,10 +2230,10 @@ static bool fuse_pages_realloc(struct fuse_fill_wb_data *data)
22342230
return false;
22352231

22362232
memcpy(folios, ap->folios, sizeof(struct folio *) * ap->num_folios);
2237-
memcpy(descs, ap->folio_descs, sizeof(struct fuse_folio_desc) * ap->num_folios);
2233+
memcpy(descs, ap->descs, sizeof(struct fuse_folio_desc) * ap->num_folios);
22382234
kfree(ap->folios);
22392235
ap->folios = folios;
2240-
ap->folio_descs = descs;
2236+
ap->descs = descs;
22412237
data->max_folios = nfolios;
22422238

22432239
return true;

fs/fuse/fuse_i.h

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,6 @@ struct fuse_arg {
285285
void *value;
286286
};
287287

288-
/** FUSE page descriptor */
289-
struct fuse_page_desc {
290-
unsigned int length;
291-
unsigned int offset;
292-
};
293-
294288
/** FUSE folio descriptor */
295289
struct fuse_folio_desc {
296290
unsigned int length;
@@ -325,19 +319,9 @@ struct fuse_args {
325319

326320
struct fuse_args_pages {
327321
struct fuse_args args;
328-
union {
329-
struct {
330-
struct page **pages;
331-
struct fuse_page_desc *descs;
332-
unsigned int num_pages;
333-
};
334-
struct {
335-
struct folio **folios;
336-
struct fuse_folio_desc *folio_descs;
337-
unsigned int num_folios;
338-
};
339-
};
340-
bool uses_folios;
322+
struct folio **folios;
323+
struct fuse_folio_desc *descs;
324+
unsigned int num_folios;
341325
};
342326

343327
struct fuse_release_args {

fs/fuse/ioctl.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,12 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
251251
BUILD_BUG_ON(sizeof(struct fuse_ioctl_iovec) * FUSE_IOCTL_MAX_IOV > PAGE_SIZE);
252252

253253
err = -ENOMEM;
254-
ap.folios = fuse_folios_alloc(fm->fc->max_pages, GFP_KERNEL, &ap.folio_descs);
254+
ap.folios = fuse_folios_alloc(fm->fc->max_pages, GFP_KERNEL, &ap.descs);
255255
iov_page = (struct iovec *) __get_free_page(GFP_KERNEL);
256256
if (!ap.folios || !iov_page)
257257
goto out;
258258

259-
fuse_folio_descs_length_init(ap.folio_descs, 0, fm->fc->max_pages);
259+
fuse_folio_descs_length_init(ap.descs, 0, fm->fc->max_pages);
260260

261261
/*
262262
* If restricted, initialize IO parameters as encoded in @cmd.
@@ -306,7 +306,6 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
306306
err = -ENOMEM;
307307
if (max_pages > fm->fc->max_pages)
308308
goto out;
309-
ap.uses_folios = true;
310309
while (ap.num_folios < max_pages) {
311310
ap.folios[ap.num_folios] = folio_alloc(GFP_KERNEL | __GFP_HIGHMEM, 0);
312311
if (!ap.folios[ap.num_folios])

0 commit comments

Comments
 (0)