Skip to content

Commit eb1d46f

Browse files
Kundan Kumaraxboe
authored andcommitted
block: unpin user pages belonging to a folio at once
Use newly added mm function unpin_user_folio() to put refs by npages count. Signed-off-by: Kundan Kumar <[email protected]> Tested-by: Luis Chamberlain <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent d3bfbfb commit eb1d46f

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

block/bio.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,20 +1190,16 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty)
11901190
struct folio_iter fi;
11911191

11921192
bio_for_each_folio_all(fi, bio) {
1193-
struct page *page;
11941193
size_t nr_pages;
11951194

11961195
if (mark_dirty) {
11971196
folio_lock(fi.folio);
11981197
folio_mark_dirty(fi.folio);
11991198
folio_unlock(fi.folio);
12001199
}
1201-
page = folio_page(fi.folio, fi.offset / PAGE_SIZE);
12021200
nr_pages = (fi.offset + fi.length - 1) / PAGE_SIZE -
12031201
fi.offset / PAGE_SIZE + 1;
1204-
do {
1205-
bio_release_page(bio, page++);
1206-
} while (--nr_pages != 0);
1202+
unpin_user_folio(fi.folio, nr_pages);
12071203
}
12081204
}
12091205
EXPORT_SYMBOL_GPL(__bio_release_pages);
@@ -1241,8 +1237,8 @@ static int bio_iov_add_folio(struct bio *bio, struct folio *folio, size_t len,
12411237
folio_page(folio, 0), len, offset,
12421238
&same_page)) {
12431239
bio->bi_iter.bi_size += len;
1244-
if (same_page)
1245-
bio_release_page(bio, folio_page(folio, 0));
1240+
if (same_page && bio_flagged(bio, BIO_PAGE_PINNED))
1241+
unpin_user_folio(folio, 1);
12461242
return 0;
12471243
}
12481244
bio_add_folio_nofail(bio, folio, len, offset);
@@ -1258,8 +1254,8 @@ static int bio_iov_add_zone_append_folio(struct bio *bio, struct folio *folio,
12581254
if (bio_add_hw_folio(q, bio, folio, len, offset,
12591255
queue_max_zone_append_sectors(q), &same_page) != len)
12601256
return -EINVAL;
1261-
if (same_page)
1262-
bio_release_page(bio, folio_page(folio, 0));
1257+
if (same_page && bio_flagged(bio, BIO_PAGE_PINNED))
1258+
unpin_user_folio(folio, 1);
12631259
return 0;
12641260
}
12651261

0 commit comments

Comments
 (0)