Messages in this thread Patch in this message | | | From | David Howells <> | Subject | Re: [PATCH v8 07/10] block: Switch to pinning pages. | Date | Tue, 24 Jan 2023 15:03:53 +0000 |
| |
Christoph Hellwig <hch@infradead.org> wrote:
> It can't. Per your latest branch:
Yes it can. Patch 6:
--- a/block/blk-map.c +++ b/block/blk-map.c @@ -282,6 +282,7 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, if (blk_queue_pci_p2pdma(rq->q)) extract_flags |= ITER_ALLOW_P2PDMA; + bio_set_flag(bio, BIO_PAGE_REFFED); while (iov_iter_count(iter)) { struct page **pages, *stack_pages[UIO_FASTIOV]; ssize_t bytes; Patch 7:
+static inline unsigned int bio_to_gup_flags(struct bio *bio) +{ + return (bio_flagged(bio, BIO_PAGE_REFFED) ? FOLL_GET : 0) | + (bio_flagged(bio, BIO_PAGE_PINNED) ? FOLL_PIN : 0); +} + +/* + * Clean up a page appropriately, where the page may be pinned, may have a + * ref taken on it or neither. + */ +static inline void bio_release_page(struct bio *bio, struct page *page) +{ + page_put_unpin(page, bio_to_gup_flags(bio)); +} At patch 8, you can get either FOLL_GET, FOLL_PIN or 0, depending on the path you go through.
David
| |