Message ID | 163250391274.2330363.16176856646027970865.stgit@warthog.procyon.org.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm: Use DIO for swap and fix NFS swapfiles | expand |
On Fri, Sep 24, 2021 at 06:18:32PM +0100, David Howells wrote: > Introduce an IOCB_SWAP flag for the kiocb struct such that the REQ_SWAP > will get set on lower level operation structures in generic code. > > Signed-off-by: David Howells <dhowells@redhat.com> > cc: Matthew Wilcox <willy@infradead.org> > cc: Christoph Hellwig <hch@lst.de> > cc: Darrick J. Wong <djwong@kernel.org> > cc: linux-xfs@vger.kernel.org > cc: linux-block@vger.kernel.org > cc: linux-fsdevel@vger.kernel.org > cc: linux-mm@kvack.org > --- > > fs/direct-io.c | 2 ++ > include/linux/bio.h | 2 ++ > include/linux/fs.h | 1 + > 3 files changed, 5 insertions(+) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index b2e86e739d7a..76eec0a68fa4 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -1216,6 +1216,8 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, > } > if (iocb->ki_flags & IOCB_HIPRI) > dio->op_flags |= REQ_HIPRI; > + if (iocb->ki_flags & IOCB_SWAP) > + dio->op_flags |= REQ_SWAP; > > /* > * For AIO O_(D)SYNC writes we need to defer completions to a workqueue > diff --git a/include/linux/bio.h b/include/linux/bio.h > index 00952e92eae1..b01133727494 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -787,6 +787,8 @@ static inline void bio_set_polled(struct bio *bio, struct kiocb *kiocb) > bio->bi_opf |= REQ_HIPRI; > if (!is_sync_kiocb(kiocb)) > bio->bi_opf |= REQ_NOWAIT; > + if (kiocb->ki_flags & IOCB_SWAP) > + bio->bi_opf |= REQ_SWAP; > } > > struct bio *blk_next_bio(struct bio *bio, unsigned int nr_pages, gfp_t gfp); > diff --git a/include/linux/fs.h b/include/linux/fs.h > index c909ca6c0eb6..c20f4423e2f1 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -321,6 +321,7 @@ enum rw_hint { > #define IOCB_NOIO (1 << 20) > /* can use bio alloc cache */ > #define IOCB_ALLOC_CACHE (1 << 21) > +#define IOCB_SWAP (1 << 22) /* Operation on a swapfile */ > > struct kiocb { > struct file *ki_filp; This doesn't set REQ_SWAP for the iomap based DIO path. bio_set_polled() is only called from iomap for IOCB_HIPRI IO. Cheers, Dave.
diff --git a/fs/direct-io.c b/fs/direct-io.c index b2e86e739d7a..76eec0a68fa4 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -1216,6 +1216,8 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, } if (iocb->ki_flags & IOCB_HIPRI) dio->op_flags |= REQ_HIPRI; + if (iocb->ki_flags & IOCB_SWAP) + dio->op_flags |= REQ_SWAP; /* * For AIO O_(D)SYNC writes we need to defer completions to a workqueue diff --git a/include/linux/bio.h b/include/linux/bio.h index 00952e92eae1..b01133727494 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -787,6 +787,8 @@ static inline void bio_set_polled(struct bio *bio, struct kiocb *kiocb) bio->bi_opf |= REQ_HIPRI; if (!is_sync_kiocb(kiocb)) bio->bi_opf |= REQ_NOWAIT; + if (kiocb->ki_flags & IOCB_SWAP) + bio->bi_opf |= REQ_SWAP; } struct bio *blk_next_bio(struct bio *bio, unsigned int nr_pages, gfp_t gfp); diff --git a/include/linux/fs.h b/include/linux/fs.h index c909ca6c0eb6..c20f4423e2f1 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -321,6 +321,7 @@ enum rw_hint { #define IOCB_NOIO (1 << 20) /* can use bio alloc cache */ #define IOCB_ALLOC_CACHE (1 << 21) +#define IOCB_SWAP (1 << 22) /* Operation on a swapfile */ struct kiocb { struct file *ki_filp;
Introduce an IOCB_SWAP flag for the kiocb struct such that the REQ_SWAP will get set on lower level operation structures in generic code. Signed-off-by: David Howells <dhowells@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: Christoph Hellwig <hch@lst.de> cc: Darrick J. Wong <djwong@kernel.org> cc: linux-xfs@vger.kernel.org cc: linux-block@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/direct-io.c | 2 ++ include/linux/bio.h | 2 ++ include/linux/fs.h | 1 + 3 files changed, 5 insertions(+)