Linux 6.9-rc1
[linux-2.6-microblaze.git] / fs / direct-io.c
index f669163..62c97ff 100644 (file)
@@ -42,8 +42,8 @@
 #include "internal.h"
 
 /*
- * How many user pages to map in one call to get_user_pages().  This determines
- * the size of a structure in the slab cache
+ * How many user pages to map in one call to iov_iter_extract_pages().  This
+ * determines the size of a structure in the slab cache
  */
 #define DIO_PAGES      64
 
@@ -86,7 +86,6 @@ struct dio_submit {
        sector_t final_block_in_request;/* doesn't change */
        int boundary;                   /* prev block is at a boundary */
        get_block_t *get_block;         /* block mapping function */
-       dio_submit_t *submit_io;        /* IO submition function */
 
        loff_t logical_offset_in_bio;   /* current first logical block in bio */
        sector_t final_block_in_bio;    /* current final block in bio + 1 */
@@ -122,12 +121,13 @@ struct dio {
        struct inode *inode;
        loff_t i_size;                  /* i_size when submitted */
        dio_iodone_t *end_io;           /* IO completion function */
+       bool is_pinned;                 /* T if we have pins on the pages */
 
        void *private;                  /* copy from map_bh.b_private */
 
        /* BIO completion state */
        spinlock_t bio_lock;            /* protects BIO fields below */
-       int page_errors;                /* errno from get_user_pages() */
+       int page_errors;                /* err from iov_iter_extract_pages() */
        int is_async;                   /* is IO async ? */
        bool defer_completion;          /* defer AIO completion to workqueue? */
        bool should_dirty;              /* if pages should be dirtied */
@@ -151,7 +151,7 @@ struct dio {
        };
 } ____cacheline_aligned_in_smp;
 
-static struct kmem_cache *dio_cache __read_mostly;
+static struct kmem_cache *dio_cache __ro_after_init;
 
 /*
  * How many pages are in the queue?
@@ -166,14 +166,14 @@ static inline unsigned dio_pages_present(struct dio_submit *sdio)
  */
 static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio)
 {
+       struct page **pages = dio->pages;
        const enum req_op dio_op = dio->opf & REQ_OP_MASK;
        ssize_t ret;
 
-       ret = iov_iter_get_pages2(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES,
-                               &sdio->from);
+       ret = iov_iter_extract_pages(sdio->iter, &pages, LONG_MAX,
+                                    DIO_PAGES, 0, &sdio->from);
 
        if (ret < 0 && sdio->blocks_available && dio_op == REQ_OP_WRITE) {
-               struct page *page = ZERO_PAGE(0);
                /*
                 * A memory fault, but the filesystem has some outstanding
                 * mapped blocks.  We need to use those blocks up to avoid
@@ -181,8 +181,7 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio)
                 */
                if (dio->page_errors == 0)
                        dio->page_errors = ret;
-               get_page(page);
-               dio->pages[0] = page;
+               dio->pages[0] = ZERO_PAGE(0);
                sdio->head = 0;
                sdio->tail = 1;
                sdio->from = 0;
@@ -202,9 +201,9 @@ static inline int dio_refill_pages(struct dio *dio, struct dio_submit *sdio)
 
 /*
  * Get another userspace page.  Returns an ERR_PTR on error.  Pages are
- * buffered inside the dio so that we can call get_user_pages() against a
- * decent number of pages, less frequently.  To provide nicer use of the
- * L1 cache.
+ * buffered inside the dio so that we can call iov_iter_extract_pages()
+ * against a decent number of pages, less frequently.  To provide nicer use of
+ * the L1 cache.
  */
 static inline struct page *dio_get_page(struct dio *dio,
                                        struct dio_submit *sdio)
@@ -220,6 +219,18 @@ static inline struct page *dio_get_page(struct dio *dio,
        return dio->pages[sdio->head];
 }
 
+static void dio_pin_page(struct dio *dio, struct page *page)
+{
+       if (dio->is_pinned)
+               folio_add_pin(page_folio(page));
+}
+
+static void dio_unpin_page(struct dio *dio, struct page *page)
+{
+       if (dio->is_pinned)
+               unpin_user_page(page);
+}
+
 /*
  * dio_complete() - called when all DIO BIO I/O has been completed
  *
@@ -286,14 +297,8 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, unsigned int flags)
         * zeros from unwritten extents.
         */
        if (flags & DIO_COMPLETE_INVALIDATE &&
-           ret > 0 && dio_op == REQ_OP_WRITE &&
-           dio->inode->i_mapping->nrpages) {
-               err = invalidate_inode_pages2_range(dio->inode->i_mapping,
-                                       offset >> PAGE_SHIFT,
-                                       (offset + ret - 1) >> PAGE_SHIFT);
-               if (err)
-                       dio_warn_stale_pagecache(dio->iocb->ki_filp);
-       }
+           ret > 0 && dio_op == REQ_OP_WRITE)
+               kiocb_invalidate_post_direct_write(dio->iocb, ret);
 
        inode_dio_end(dio->inode);
 
@@ -403,6 +408,10 @@ dio_bio_alloc(struct dio *dio, struct dio_submit *sdio,
                bio->bi_end_io = dio_bio_end_aio;
        else
                bio->bi_end_io = dio_bio_end_io;
+       if (dio->is_pinned)
+               bio_set_flag(bio, BIO_PAGE_PINNED);
+       bio->bi_write_hint = file_inode(dio->iocb->ki_filp)->i_write_hint;
+
        sdio->bio = bio;
        sdio->logical_offset_in_bio = sdio->cur_page_fs_offset;
 }
@@ -421,8 +430,6 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
        unsigned long flags;
 
        bio->bi_private = dio;
-       /* don't account direct I/O as memory stall */
-       bio_clear_flag(bio, BIO_WORKINGSET);
 
        spin_lock_irqsave(&dio->bio_lock, flags);
        dio->refcount++;
@@ -433,10 +440,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
 
        dio->bio_disk = bio->bi_bdev->bd_disk;
 
-       if (sdio->submit_io)
-               sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio);
-       else
-               submit_bio(bio);
+       submit_bio(bio);
 
        sdio->bio = NULL;
        sdio->boundary = 0;
@@ -448,8 +452,10 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
  */
 static inline void dio_cleanup(struct dio *dio, struct dio_submit *sdio)
 {
-       while (sdio->head < sdio->tail)
-               put_page(dio->pages[sdio->head++]);
+       if (dio->is_pinned)
+               unpin_user_pages(dio->pages + sdio->head,
+                                sdio->tail - sdio->head);
+       sdio->head = sdio->tail;
 }
 
 /*
@@ -560,30 +566,6 @@ static inline int dio_bio_reap(struct dio *dio, struct dio_submit *sdio)
        return ret;
 }
 
-/*
- * Create workqueue for deferred direct IO completions. We allocate the
- * workqueue when it's first needed. This avoids creating workqueue for
- * filesystems that don't need it and also allows us to create the workqueue
- * late enough so the we can include s_id in the name of the workqueue.
- */
-int sb_init_dio_done_wq(struct super_block *sb)
-{
-       struct workqueue_struct *old;
-       struct workqueue_struct *wq = alloc_workqueue("dio/%s",
-                                                     WQ_MEM_RECLAIM, 0,
-                                                     sb->s_id);
-       if (!wq)
-               return -ENOMEM;
-       /*
-        * This has to be atomic as more DIOs can race to create the workqueue
-        */
-       old = cmpxchg(&sb->s_dio_done_wq, NULL, wq);
-       /* Someone created workqueue before us? Free ours... */
-       if (old)
-               destroy_workqueue(wq);
-       return 0;
-}
-
 static int dio_set_defer_completion(struct dio *dio)
 {
        struct super_block *sb = dio->inode->i_sb;
@@ -704,7 +686,7 @@ out:
  *
  * Return zero on success.  Non-zero means the caller needs to start a new BIO.
  */
-static inline int dio_bio_add_page(struct dio_submit *sdio)
+static inline int dio_bio_add_page(struct dio *dio, struct dio_submit *sdio)
 {
        int ret;
 
@@ -716,7 +698,7 @@ static inline int dio_bio_add_page(struct dio_submit *sdio)
                 */
                if ((sdio->cur_page_len + sdio->cur_page_offset) == PAGE_SIZE)
                        sdio->pages_in_io--;
-               get_page(sdio->cur_page);
+               dio_pin_page(dio, sdio->cur_page);
                sdio->final_block_in_bio = sdio->cur_page_block +
                        (sdio->cur_page_len >> sdio->blkbits);
                ret = 0;
@@ -771,11 +753,11 @@ static inline int dio_send_cur_page(struct dio *dio, struct dio_submit *sdio,
                        goto out;
        }
 
-       if (dio_bio_add_page(sdio) != 0) {
+       if (dio_bio_add_page(dio, sdio) != 0) {
                dio_bio_submit(dio, sdio);
                ret = dio_new_bio(dio, sdio, sdio->cur_page_block, map_bh);
                if (ret == 0) {
-                       ret = dio_bio_add_page(sdio);
+                       ret = dio_bio_add_page(dio, sdio);
                        BUG_ON(ret != 0);
                }
        }
@@ -832,13 +814,13 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
         */
        if (sdio->cur_page) {
                ret = dio_send_cur_page(dio, sdio, map_bh);
-               put_page(sdio->cur_page);
+               dio_unpin_page(dio, sdio->cur_page);
                sdio->cur_page = NULL;
                if (ret)
                        return ret;
        }
 
-       get_page(page);         /* It is in dio */
+       dio_pin_page(dio, page);                /* It is in dio */
        sdio->cur_page = page;
        sdio->cur_page_offset = offset;
        sdio->cur_page_len = len;
@@ -853,7 +835,7 @@ out:
                ret = dio_send_cur_page(dio, sdio, map_bh);
                if (sdio->bio)
                        dio_bio_submit(dio, sdio);
-               put_page(sdio->cur_page);
+               dio_unpin_page(dio, sdio->cur_page);
                sdio->cur_page = NULL;
        }
        return ret;
@@ -954,7 +936,7 @@ static int do_direct_IO(struct dio *dio, struct dio_submit *sdio,
 
                                ret = get_more_blocks(dio, sdio, map_bh);
                                if (ret) {
-                                       put_page(page);
+                                       dio_unpin_page(dio, page);
                                        goto out;
                                }
                                if (!buffer_mapped(map_bh))
@@ -999,7 +981,7 @@ do_holes:
 
                                /* AKPM: eargh, -ENOTBLK is a hack */
                                if (dio_op == REQ_OP_WRITE) {
-                                       put_page(page);
+                                       dio_unpin_page(dio, page);
                                        return -ENOTBLK;
                                }
 
@@ -1012,7 +994,7 @@ do_holes:
                                if (sdio->block_in_file >=
                                                i_size_aligned >> blkbits) {
                                        /* We hit eof */
-                                       put_page(page);
+                                       dio_unpin_page(dio, page);
                                        goto out;
                                }
                                zero_user(page, from, 1 << blkbits);
@@ -1052,7 +1034,7 @@ do_holes:
                                                  sdio->next_block_for_io,
                                                  map_bh);
                        if (ret) {
-                               put_page(page);
+                               dio_unpin_page(dio, page);
                                goto out;
                        }
                        sdio->next_block_for_io += this_chunk_blocks;
@@ -1067,8 +1049,8 @@ next_block:
                                break;
                }
 
-               /* Drop the ref which was taken in get_user_pages() */
-               put_page(page);
+               /* Drop the pin which was taken in get_user_pages() */
+               dio_unpin_page(dio, page);
        }
 out:
        return ret;
@@ -1124,7 +1106,7 @@ static inline int drop_refcount(struct dio *dio)
 ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
                struct block_device *bdev, struct iov_iter *iter,
                get_block_t get_block, dio_iodone_t end_io,
-               dio_submit_t submit_io, int flags)
+               int flags)
 {
        unsigned i_blkbits = READ_ONCE(inode->i_blkbits);
        unsigned blkbits = i_blkbits;
@@ -1134,7 +1116,7 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
        loff_t offset = iocb->ki_pos;
        const loff_t end = offset + count;
        struct dio *dio;
-       struct dio_submit sdio = { 0, };
+       struct dio_submit sdio = { NULL, };
        struct buffer_head map_bh = { 0, };
        struct blk_plug plug;
        unsigned long align = offset | iov_iter_alignment(iter);
@@ -1163,6 +1145,7 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
                /* will be released by direct_io_worker */
                inode_lock(inode);
        }
+       dio->is_pinned = iov_iter_extract_will_pin(iter);
 
        /* Once we sampled i_size check for reads beyond EOF */
        dio->i_size = i_size_read(inode);
@@ -1241,7 +1224,6 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
 
        sdio.get_block = get_block;
        dio->end_io = end_io;
-       sdio.submit_io = submit_io;
        sdio.final_block_in_bio = -1;
        sdio.next_block_for_io = -1;
 
@@ -1288,7 +1270,7 @@ ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
                ret2 = dio_send_cur_page(dio, &sdio, &map_bh);
                if (retval == 0)
                        retval = ret2;
-               put_page(sdio.cur_page);
+               dio_unpin_page(dio, sdio.cur_page);
                sdio.cur_page = NULL;
        }
        if (sdio.bio)