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 04/17] dax: introduce dax_operations Date: Sat, 28 Jan 2017 00:36:26 -0800 [thread overview] Message-ID: <148559258599.11180.15865082041593158216.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <148559256378.11180.8957776806175202312.stgit@dwillia2-desk3.amr.corp.intel.com> Track a set of dax_operations per dax_inode that can be set at alloc_dax_inode() time. These operations will be used to stop the abuse of block_device_operations for communicating dax capabilities to filesystems. It will also be used to replace the "pmem api" and move pmem-specific cache maintenance, and other dax-driver-specific filesystem-dax operations, to dax inode methods. In particular this allows us to stop abusing __copy_user_nocache(), via memcpy_to_pmem(), with a driver specific replacement. This is a standalone introduction of the operations. Follow on patches convert each dax-driver and teach fs/dax.c to use ->direct_access() from dax_operations instead of block_device_operations. Suggested-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/dax/dax.h | 4 +++- drivers/dax/device.c | 6 +++++- drivers/dax/super.c | 6 +++++- include/linux/dax.h | 5 +++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h index f33c16ed2ec6..aeb1d49aafb8 100644 --- a/drivers/dax/dax.h +++ b/drivers/dax/dax.h @@ -13,7 +13,9 @@ #ifndef __DAX_H__ #define __DAX_H__ struct dax_inode; -struct dax_inode *alloc_dax_inode(void *private, const char *host); +struct dax_operations; +struct dax_inode *alloc_dax_inode(void *private, const char *host, + const struct dax_operations *ops); 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); diff --git a/drivers/dax/device.c b/drivers/dax/device.c index 6d0a3241a608..c3d9405ec285 100644 --- a/drivers/dax/device.c +++ b/drivers/dax/device.c @@ -560,7 +560,11 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, goto err_id; } - dax_inode = alloc_dax_inode(dax_dev, NULL); + /* + * No 'host' or dax_operations since there is no access to this + * device outside of mmap of the resulting character device. + */ + dax_inode = alloc_dax_inode(dax_dev, NULL, NULL); if (!dax_inode) goto err_inode; diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 7ac048f94b2b..eb844ffea3cf 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -17,6 +17,7 @@ #include <linux/cdev.h> #include <linux/hash.h> #include <linux/slab.h> +#include <linux/dax.h> #include <linux/fs.h> static int nr_dax = CONFIG_NR_DEV_DAX; @@ -61,6 +62,7 @@ struct dax_inode { const char *host; void *private; bool alive; + const struct dax_operations *ops; }; bool dax_inode_alive(struct dax_inode *dax_inode) @@ -204,7 +206,8 @@ static void dax_add_host(struct dax_inode *dax_inode, const char *host) spin_unlock(&dax_host_lock); } -struct dax_inode *alloc_dax_inode(void *private, const char *__host) +struct dax_inode *alloc_dax_inode(void *private, const char *__host, + const struct dax_operations *ops) { struct dax_inode *dax_inode; const char *host; @@ -225,6 +228,7 @@ struct dax_inode *alloc_dax_inode(void *private, const char *__host) goto err_inode; dax_add_host(dax_inode, host); + dax_inode->ops = ops; dax_inode->private = private; return dax_inode; diff --git a/include/linux/dax.h b/include/linux/dax.h index 8fe19230e118..def9a9d118c9 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -7,6 +7,11 @@ #include <asm/pgtable.h> struct iomap_ops; +struct dax_inode; +struct dax_operations { + long (*direct_access)(struct dax_inode *, phys_addr_t, void **, + pfn_t *, long); +}; int dax_read_lock(void); void dax_read_unlock(int id); _______________________________________________ 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 04/17] dax: introduce dax_operations Date: Sat, 28 Jan 2017 00:36:26 -0800 [thread overview] Message-ID: <148559258599.11180.15865082041593158216.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <148559256378.11180.8957776806175202312.stgit@dwillia2-desk3.amr.corp.intel.com> Track a set of dax_operations per dax_inode that can be set at alloc_dax_inode() time. These operations will be used to stop the abuse of block_device_operations for communicating dax capabilities to filesystems. It will also be used to replace the "pmem api" and move pmem-specific cache maintenance, and other dax-driver-specific filesystem-dax operations, to dax inode methods. In particular this allows us to stop abusing __copy_user_nocache(), via memcpy_to_pmem(), with a driver specific replacement. This is a standalone introduction of the operations. Follow on patches convert each dax-driver and teach fs/dax.c to use ->direct_access() from dax_operations instead of block_device_operations. Suggested-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/dax/dax.h | 4 +++- drivers/dax/device.c | 6 +++++- drivers/dax/super.c | 6 +++++- include/linux/dax.h | 5 +++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h index f33c16ed2ec6..aeb1d49aafb8 100644 --- a/drivers/dax/dax.h +++ b/drivers/dax/dax.h @@ -13,7 +13,9 @@ #ifndef __DAX_H__ #define __DAX_H__ struct dax_inode; -struct dax_inode *alloc_dax_inode(void *private, const char *host); +struct dax_operations; +struct dax_inode *alloc_dax_inode(void *private, const char *host, + const struct dax_operations *ops); 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); diff --git a/drivers/dax/device.c b/drivers/dax/device.c index 6d0a3241a608..c3d9405ec285 100644 --- a/drivers/dax/device.c +++ b/drivers/dax/device.c @@ -560,7 +560,11 @@ struct dax_dev *devm_create_dax_dev(struct dax_region *dax_region, goto err_id; } - dax_inode = alloc_dax_inode(dax_dev, NULL); + /* + * No 'host' or dax_operations since there is no access to this + * device outside of mmap of the resulting character device. + */ + dax_inode = alloc_dax_inode(dax_dev, NULL, NULL); if (!dax_inode) goto err_inode; diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 7ac048f94b2b..eb844ffea3cf 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -17,6 +17,7 @@ #include <linux/cdev.h> #include <linux/hash.h> #include <linux/slab.h> +#include <linux/dax.h> #include <linux/fs.h> static int nr_dax = CONFIG_NR_DEV_DAX; @@ -61,6 +62,7 @@ struct dax_inode { const char *host; void *private; bool alive; + const struct dax_operations *ops; }; bool dax_inode_alive(struct dax_inode *dax_inode) @@ -204,7 +206,8 @@ static void dax_add_host(struct dax_inode *dax_inode, const char *host) spin_unlock(&dax_host_lock); } -struct dax_inode *alloc_dax_inode(void *private, const char *__host) +struct dax_inode *alloc_dax_inode(void *private, const char *__host, + const struct dax_operations *ops) { struct dax_inode *dax_inode; const char *host; @@ -225,6 +228,7 @@ struct dax_inode *alloc_dax_inode(void *private, const char *__host) goto err_inode; dax_add_host(dax_inode, host); + dax_inode->ops = ops; dax_inode->private = private; return dax_inode; diff --git a/include/linux/dax.h b/include/linux/dax.h index 8fe19230e118..def9a9d118c9 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -7,6 +7,11 @@ #include <asm/pgtable.h> struct iomap_ops; +struct dax_inode; +struct dax_operations { + long (*direct_access)(struct dax_inode *, phys_addr_t, void **, + pfn_t *, long); +}; int dax_read_lock(void); void dax_read_unlock(int id);
next prev parent reply other threads:[~2017-01-28 8:40 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 ` Dan Williams [this message] 2017-01-28 8:36 ` [RFC PATCH 04/17] dax: introduce dax_operations 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 ` [RFC PATCH 10/17] block: introduce bdev_dax_direct_access() Dan Williams 2017-01-28 8:36 ` 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=148559258599.11180.15865082041593158216.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.