From: Dan Williams <dan.j.williams@intel.com> To: linux-nvdimm@lists.01.org Cc: snitzer@redhat.com, mawilcox@microsoft.com, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de Subject: [RFC PATCH 10/17] block: introduce bdev_dax_direct_access() Date: Sat, 28 Jan 2017 00:36:58 -0800 [thread overview] Message-ID: <148559261791.11180.12085685820239925499.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <148559256378.11180.8957776806175202312.stgit@dwillia2-desk3.amr.corp.intel.com> Provide a replacement for bdev_direct_access() that uses dax_operations.direct_access() instead of block_device_operations.direct_access(). Once all consumers of the old api have been converted bdev_direct_access() will be deleted. Given that block device partitioning decisions can cause dax page alignment constraints to be violated we still need to validate the block_device before calling the dax ->direct_access method. Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- block/Kconfig | 1 + drivers/dax/super.c | 33 +++++++++++++++++++++++++++++++++ fs/block_dev.c | 28 ++++++++++++++++++++++++++++ include/linux/blkdev.h | 3 +++ include/linux/dax.h | 2 ++ 5 files changed, 67 insertions(+) diff --git a/block/Kconfig b/block/Kconfig index 8bf114a3858a..9be785173280 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -6,6 +6,7 @@ menuconfig BLOCK default y select SBITMAP select SRCU + select DAX help Provide block layer support for the kernel. diff --git a/drivers/dax/super.c b/drivers/dax/super.c index eb844ffea3cf..ab5b082df5dd 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -65,6 +65,39 @@ struct dax_inode { const struct dax_operations *ops; }; +long dax_direct_access(struct dax_inode *dax_inode, phys_addr_t dev_addr, + void **kaddr, pfn_t *pfn, long size) +{ + long avail; + + /* + * The device driver is allowed to sleep, in order to make the + * memory directly accessible. + */ + might_sleep(); + + if (!dax_inode) + return -EOPNOTSUPP; + + if (!dax_inode_alive(dax_inode)) + return -ENXIO; + + if (size < 0) + return size; + + if (dev_addr % PAGE_SIZE) + return -EINVAL; + + avail = dax_inode->ops->direct_access(dax_inode, dev_addr, kaddr, pfn, + size); + if (!avail) + return -ERANGE; + if (avail > 0 && avail & ~PAGE_MASK) + return -ENXIO; + return min(avail, size); +} +EXPORT_SYMBOL_GPL(dax_direct_access); + bool dax_inode_alive(struct dax_inode *dax_inode) { lockdep_assert_held(&dax_srcu); diff --git a/fs/block_dev.c b/fs/block_dev.c index edb1d2b16b8f..bf4b51a3a412 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -18,6 +18,7 @@ #include <linux/module.h> #include <linux/blkpg.h> #include <linux/magic.h> +#include <linux/dax.h> #include <linux/buffer_head.h> #include <linux/swap.h> #include <linux/pagevec.h> @@ -763,6 +764,33 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) EXPORT_SYMBOL_GPL(bdev_direct_access); /** + * bdev_dax_direct_access() - bdev-sector to pfn_t and kernel virtual address + * @bdev: host block device for @dax_inode + * @dax_inode: interface data and operations for a memory device + * @dax: control and output parameters for ->direct_access + * + * Return: negative errno if an error occurs, otherwise the number of bytes + * accessible at this address. + * + * Locking: must be called with dax_read_lock() held + */ +long bdev_dax_direct_access(struct block_device *bdev, + struct dax_inode *dax_inode, struct blk_dax_ctl *dax) +{ + sector_t sector = dax->sector; + + if (!blk_queue_dax(bdev->bd_queue)) + return -EOPNOTSUPP; + if ((sector + DIV_ROUND_UP(dax->size, 512)) + > part_nr_sects_read(bdev->bd_part)) + return -ERANGE; + sector += get_start_sect(bdev); + return dax_direct_access(dax_inode, sector * 512, &dax->addr, + &dax->pfn, dax->size); +} +EXPORT_SYMBOL_GPL(bdev_dax_direct_access); + +/** * bdev_dax_supported() - Check if the device supports dax for filesystem * @sb: The superblock of the device * @blocksize: The block size of the device diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5e7706f7d533..3b3c5ce376fd 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1903,6 +1903,9 @@ extern int bdev_read_page(struct block_device *, sector_t, struct page *); extern int bdev_write_page(struct block_device *, sector_t, struct page *, struct writeback_control *); extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); +struct dax_inode; +extern long bdev_dax_direct_access(struct block_device *bdev, + struct dax_inode *dax_inode, struct blk_dax_ctl *dax); extern int bdev_dax_supported(struct super_block *, int); #else /* CONFIG_BLOCK */ diff --git a/include/linux/dax.h b/include/linux/dax.h index 5aa620e8e5a2..2ef8e18e2587 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -22,6 +22,8 @@ void *dax_inode_get_private(struct dax_inode *dax_inode); void put_dax_inode(struct dax_inode *dax_inode); bool dax_inode_alive(struct dax_inode *dax_inode); void kill_dax_inode(struct dax_inode *dax_inode); +long dax_direct_access(struct dax_inode *dax_inode, phys_addr_t dev_addr, + void **kaddr, pfn_t *pfn, long size); /* * We use lowest available bit in exceptional entry for locking, one bit for _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
WARNING: multiple messages have this Message-ID (diff)
From: Dan Williams <dan.j.williams@intel.com> To: linux-nvdimm@lists.01.org Cc: snitzer@redhat.com, toshi.kani@hpe.com, mawilcox@microsoft.com, linux-block@vger.kernel.org, jmoyer@redhat.com, linux-fsdevel@vger.kernel.org, ross.zwisler@linux.intel.com, hch@lst.de Subject: [RFC PATCH 10/17] block: introduce bdev_dax_direct_access() Date: Sat, 28 Jan 2017 00:36:58 -0800 [thread overview] Message-ID: <148559261791.11180.12085685820239925499.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <148559256378.11180.8957776806175202312.stgit@dwillia2-desk3.amr.corp.intel.com> Provide a replacement for bdev_direct_access() that uses dax_operations.direct_access() instead of block_device_operations.direct_access(). Once all consumers of the old api have been converted bdev_direct_access() will be deleted. Given that block device partitioning decisions can cause dax page alignment constraints to be violated we still need to validate the block_device before calling the dax ->direct_access method. Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- block/Kconfig | 1 + drivers/dax/super.c | 33 +++++++++++++++++++++++++++++++++ fs/block_dev.c | 28 ++++++++++++++++++++++++++++ include/linux/blkdev.h | 3 +++ include/linux/dax.h | 2 ++ 5 files changed, 67 insertions(+) diff --git a/block/Kconfig b/block/Kconfig index 8bf114a3858a..9be785173280 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -6,6 +6,7 @@ menuconfig BLOCK default y select SBITMAP select SRCU + select DAX help Provide block layer support for the kernel. diff --git a/drivers/dax/super.c b/drivers/dax/super.c index eb844ffea3cf..ab5b082df5dd 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -65,6 +65,39 @@ struct dax_inode { const struct dax_operations *ops; }; +long dax_direct_access(struct dax_inode *dax_inode, phys_addr_t dev_addr, + void **kaddr, pfn_t *pfn, long size) +{ + long avail; + + /* + * The device driver is allowed to sleep, in order to make the + * memory directly accessible. + */ + might_sleep(); + + if (!dax_inode) + return -EOPNOTSUPP; + + if (!dax_inode_alive(dax_inode)) + return -ENXIO; + + if (size < 0) + return size; + + if (dev_addr % PAGE_SIZE) + return -EINVAL; + + avail = dax_inode->ops->direct_access(dax_inode, dev_addr, kaddr, pfn, + size); + if (!avail) + return -ERANGE; + if (avail > 0 && avail & ~PAGE_MASK) + return -ENXIO; + return min(avail, size); +} +EXPORT_SYMBOL_GPL(dax_direct_access); + bool dax_inode_alive(struct dax_inode *dax_inode) { lockdep_assert_held(&dax_srcu); diff --git a/fs/block_dev.c b/fs/block_dev.c index edb1d2b16b8f..bf4b51a3a412 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -18,6 +18,7 @@ #include <linux/module.h> #include <linux/blkpg.h> #include <linux/magic.h> +#include <linux/dax.h> #include <linux/buffer_head.h> #include <linux/swap.h> #include <linux/pagevec.h> @@ -763,6 +764,33 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax) EXPORT_SYMBOL_GPL(bdev_direct_access); /** + * bdev_dax_direct_access() - bdev-sector to pfn_t and kernel virtual address + * @bdev: host block device for @dax_inode + * @dax_inode: interface data and operations for a memory device + * @dax: control and output parameters for ->direct_access + * + * Return: negative errno if an error occurs, otherwise the number of bytes + * accessible at this address. + * + * Locking: must be called with dax_read_lock() held + */ +long bdev_dax_direct_access(struct block_device *bdev, + struct dax_inode *dax_inode, struct blk_dax_ctl *dax) +{ + sector_t sector = dax->sector; + + if (!blk_queue_dax(bdev->bd_queue)) + return -EOPNOTSUPP; + if ((sector + DIV_ROUND_UP(dax->size, 512)) + > part_nr_sects_read(bdev->bd_part)) + return -ERANGE; + sector += get_start_sect(bdev); + return dax_direct_access(dax_inode, sector * 512, &dax->addr, + &dax->pfn, dax->size); +} +EXPORT_SYMBOL_GPL(bdev_dax_direct_access); + +/** * bdev_dax_supported() - Check if the device supports dax for filesystem * @sb: The superblock of the device * @blocksize: The block size of the device diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 5e7706f7d533..3b3c5ce376fd 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1903,6 +1903,9 @@ extern int bdev_read_page(struct block_device *, sector_t, struct page *); extern int bdev_write_page(struct block_device *, sector_t, struct page *, struct writeback_control *); extern long bdev_direct_access(struct block_device *, struct blk_dax_ctl *); +struct dax_inode; +extern long bdev_dax_direct_access(struct block_device *bdev, + struct dax_inode *dax_inode, struct blk_dax_ctl *dax); extern int bdev_dax_supported(struct super_block *, int); #else /* CONFIG_BLOCK */ diff --git a/include/linux/dax.h b/include/linux/dax.h index 5aa620e8e5a2..2ef8e18e2587 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -22,6 +22,8 @@ void *dax_inode_get_private(struct dax_inode *dax_inode); void put_dax_inode(struct dax_inode *dax_inode); bool dax_inode_alive(struct dax_inode *dax_inode); void kill_dax_inode(struct dax_inode *dax_inode); +long dax_direct_access(struct dax_inode *dax_inode, phys_addr_t dev_addr, + void **kaddr, pfn_t *pfn, long size); /* * We use lowest available bit in exceptional entry for locking, one bit for
next prev parent reply other threads:[~2017-01-28 8:41 UTC|newest] Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-01-28 8:36 [RFC PATCH 00/17] introduce a dax_inode for dax_operations Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 01/17] dax: refactor dax-fs into a generic provider of dax inodes Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-30 12:28 ` Christoph Hellwig 2017-01-30 17:12 ` Dan Williams 2017-01-30 17:12 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 02/17] dax: convert dax_inode locking to srcu Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 03/17] dax: add a facility to lookup a dax inode by 'host' device name Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 04/17] dax: introduce dax_operations Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 05/17] pmem: add dax_operations support Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 06/17] axon_ram: " Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 07/17] brd: " Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 08/17] dcssblk: " Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` [RFC PATCH 09/17] block: kill bdev_dax_capable() Dan Williams 2017-01-28 8:36 ` Dan Williams 2017-01-28 8:36 ` Dan Williams [this message] 2017-01-28 8:36 ` [RFC PATCH 10/17] block: introduce bdev_dax_direct_access() Dan Williams 2017-01-30 12:32 ` Christoph Hellwig 2017-01-30 18:16 ` Dan Williams 2017-01-30 18:16 ` Dan Williams 2017-02-01 8:10 ` Christoph Hellwig 2017-02-01 8:10 ` Christoph Hellwig 2017-02-01 9:21 ` Dan Williams 2017-02-01 9:21 ` Dan Williams 2017-02-01 9:28 ` Christoph Hellwig 2017-02-01 9:28 ` Christoph Hellwig 2017-01-28 8:37 ` [RFC PATCH 11/17] dm: add dax_operations support (producer) Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 12/17] dm: add dax_operations support (consumer) Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 13/17] fs: update mount_bdev() to lookup dax infrastructure Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-30 12:26 ` Christoph Hellwig 2017-01-30 18:29 ` Dan Williams 2017-01-30 18:29 ` Dan Williams 2017-02-01 8:08 ` Christoph Hellwig 2017-02-01 8:08 ` Christoph Hellwig 2017-02-01 9:16 ` Dan Williams 2017-02-01 9:16 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 14/17] ext2, ext4, xfs: retrieve dax_inode through iomap operations Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 15/17] Revert "block: use DAX for partition table reads" Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 16/17] fs, dax: convert filesystem-dax to bdev_dax_direct_access Dan Williams 2017-01-28 8:37 ` Dan Williams 2017-01-28 8:37 ` [RFC PATCH 17/17] block: remove block_device_operations.direct_access and related infrastructure Dan Williams 2017-01-28 8:37 ` Dan Williams
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=148559261791.11180.12085685820239925499.stgit@dwillia2-desk3.amr.corp.intel.com \ --to=dan.j.williams@intel.com \ --cc=hch@lst.de \ --cc=linux-block@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-nvdimm@lists.01.org \ --cc=mawilcox@microsoft.com \ --cc=snitzer@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.