[PATCH v2 09/10] dax: convert to __pfn_t

2015-05-06 Thread Dan Williams
The primary source for non-page-backed page-frames to enter the system
is via the pmem driver's ->direct_access() method.  The pfns returned by
the top-level bdev_direct_access() may be passed to any other subsystem
in the kernel and those sub-systems either need to assume that the pfn
is page backed (CONFIG_PMEM_IO=n) or be prepared to handle non-page
backed case (CONFIG_PMEM_IO=y).  Currently the pfns returned by
->direct_access() are only ever used by vm_insert_mixed() which does not
care if the pfn is mapped.  As we go to add more usages of these pfns
add the type-safety of __pfn_t.

Cc: Matthew Wilcox 
Cc: Ross Zwisler 
Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Cc: Jens Axboe 
Cc: Martin Schwidefsky 
Cc: Heiko Carstens 
Cc: Boaz Harrosh 
Signed-off-by: Dan Williams 
---
 arch/powerpc/sysdev/axonram.c |4 ++--
 drivers/block/brd.c   |4 ++--
 drivers/block/pmem.c  |8 +---
 drivers/s390/block/dcssblk.c  |6 +++---
 fs/block_dev.c|2 +-
 fs/dax.c  |9 +
 include/asm-generic/pfn.h |7 +++
 include/linux/blkdev.h|4 ++--
 8 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c
index 9bb5da7f2c0c..069cb5285f18 100644
--- a/arch/powerpc/sysdev/axonram.c
+++ b/arch/powerpc/sysdev/axonram.c
@@ -141,13 +141,13 @@ axon_ram_make_request(struct request_queue *queue, struct 
bio *bio)
  */
 static long
 axon_ram_direct_access(struct block_device *device, sector_t sector,
-  void **kaddr, unsigned long *pfn, long size)
+  void **kaddr, __pfn_t *pfn, long size)
 {
struct axon_ram_bank *bank = device->bd_disk->private_data;
loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT;
 
*kaddr = (void *)(bank->ph_addr + offset);
-   *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
+   *pfn = phys_to_pfn_t(virt_to_phys(*kaddr));
 
return bank->size - offset;
 }
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index 115c6cf9cb43..57f4cd787ea2 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -371,7 +371,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t 
sector,
 
 #ifdef CONFIG_BLK_DEV_RAM_DAX
 static long brd_direct_access(struct block_device *bdev, sector_t sector,
-   void **kaddr, unsigned long *pfn, long size)
+   void **kaddr, __pfn_t *pfn, long size)
 {
struct brd_device *brd = bdev->bd_disk->private_data;
struct page *page;
@@ -382,7 +382,7 @@ static long brd_direct_access(struct block_device *bdev, 
sector_t sector,
if (!page)
return -ENOSPC;
*kaddr = page_address(page);
-   *pfn = page_to_pfn(page);
+   *pfn = page_to_pfn_t(page);
 
/*
 * TODO: If size > PAGE_SIZE, we could look to see if the next page in
diff --git a/drivers/block/pmem.c b/drivers/block/pmem.c
index 2a847651f8de..18edb48e405e 100644
--- a/drivers/block/pmem.c
+++ b/drivers/block/pmem.c
@@ -98,8 +98,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t 
sector,
return 0;
 }
 
-static long pmem_direct_access(struct block_device *bdev, sector_t sector,
- void **kaddr, unsigned long *pfn, long size)
+static long __maybe_unused pmem_direct_access(struct block_device *bdev,
+   sector_t sector, void **kaddr, __pfn_t *pfn, long size)
 {
struct pmem_device *pmem = bdev->bd_disk->private_data;
size_t offset = sector << 9;
@@ -108,7 +108,7 @@ static long pmem_direct_access(struct block_device *bdev, 
sector_t sector,
return -ENODEV;
 
*kaddr = pmem->virt_addr + offset;
-   *pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT;
+   *pfn = phys_to_pfn_t(pmem->phys_addr + offset);
 
return pmem->size - offset;
 }
@@ -116,7 +116,9 @@ static long pmem_direct_access(struct block_device *bdev, 
sector_t sector,
 static const struct block_device_operations pmem_fops = {
.owner =THIS_MODULE,
.rw_page =  pmem_rw_page,
+#if IS_ENABLED(CONFIG_PMEM_IO)
.direct_access =pmem_direct_access,
+#endif
 };
 
 static struct pmem_device *pmem_alloc(struct device *dev, struct resource *res)
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index 5da8515b8fb9..8616c1d33786 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -29,7 +29,7 @@ static int dcssblk_open(struct block_device *bdev, fmode_t 
mode);
 static void dcssblk_release(struct gendisk *disk, fmode_t mode);
 static void dcssblk_make_request(struct request_queue *q, struct bio *bio);
 static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
-void **kaddr, unsigned long *pfn, long size);
+void **kaddr, __pfn_t *pfn, long size);
 

[PATCH v2 09/10] dax: convert to __pfn_t

2015-05-06 Thread Dan Williams
The primary source for non-page-backed page-frames to enter the system
is via the pmem driver's -direct_access() method.  The pfns returned by
the top-level bdev_direct_access() may be passed to any other subsystem
in the kernel and those sub-systems either need to assume that the pfn
is page backed (CONFIG_PMEM_IO=n) or be prepared to handle non-page
backed case (CONFIG_PMEM_IO=y).  Currently the pfns returned by
-direct_access() are only ever used by vm_insert_mixed() which does not
care if the pfn is mapped.  As we go to add more usages of these pfns
add the type-safety of __pfn_t.

Cc: Matthew Wilcox wi...@linux.intel.com
Cc: Ross Zwisler ross.zwis...@linux.intel.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: Jens Axboe ax...@kernel.dk
Cc: Martin Schwidefsky schwidef...@de.ibm.com
Cc: Heiko Carstens heiko.carst...@de.ibm.com
Cc: Boaz Harrosh b...@plexistor.com
Signed-off-by: Dan Williams dan.j.willi...@intel.com
---
 arch/powerpc/sysdev/axonram.c |4 ++--
 drivers/block/brd.c   |4 ++--
 drivers/block/pmem.c  |8 +---
 drivers/s390/block/dcssblk.c  |6 +++---
 fs/block_dev.c|2 +-
 fs/dax.c  |9 +
 include/asm-generic/pfn.h |7 +++
 include/linux/blkdev.h|4 ++--
 8 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c
index 9bb5da7f2c0c..069cb5285f18 100644
--- a/arch/powerpc/sysdev/axonram.c
+++ b/arch/powerpc/sysdev/axonram.c
@@ -141,13 +141,13 @@ axon_ram_make_request(struct request_queue *queue, struct 
bio *bio)
  */
 static long
 axon_ram_direct_access(struct block_device *device, sector_t sector,
-  void **kaddr, unsigned long *pfn, long size)
+  void **kaddr, __pfn_t *pfn, long size)
 {
struct axon_ram_bank *bank = device-bd_disk-private_data;
loff_t offset = (loff_t)sector  AXON_RAM_SECTOR_SHIFT;
 
*kaddr = (void *)(bank-ph_addr + offset);
-   *pfn = virt_to_phys(*kaddr)  PAGE_SHIFT;
+   *pfn = phys_to_pfn_t(virt_to_phys(*kaddr));
 
return bank-size - offset;
 }
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index 115c6cf9cb43..57f4cd787ea2 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -371,7 +371,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t 
sector,
 
 #ifdef CONFIG_BLK_DEV_RAM_DAX
 static long brd_direct_access(struct block_device *bdev, sector_t sector,
-   void **kaddr, unsigned long *pfn, long size)
+   void **kaddr, __pfn_t *pfn, long size)
 {
struct brd_device *brd = bdev-bd_disk-private_data;
struct page *page;
@@ -382,7 +382,7 @@ static long brd_direct_access(struct block_device *bdev, 
sector_t sector,
if (!page)
return -ENOSPC;
*kaddr = page_address(page);
-   *pfn = page_to_pfn(page);
+   *pfn = page_to_pfn_t(page);
 
/*
 * TODO: If size  PAGE_SIZE, we could look to see if the next page in
diff --git a/drivers/block/pmem.c b/drivers/block/pmem.c
index 2a847651f8de..18edb48e405e 100644
--- a/drivers/block/pmem.c
+++ b/drivers/block/pmem.c
@@ -98,8 +98,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t 
sector,
return 0;
 }
 
-static long pmem_direct_access(struct block_device *bdev, sector_t sector,
- void **kaddr, unsigned long *pfn, long size)
+static long __maybe_unused pmem_direct_access(struct block_device *bdev,
+   sector_t sector, void **kaddr, __pfn_t *pfn, long size)
 {
struct pmem_device *pmem = bdev-bd_disk-private_data;
size_t offset = sector  9;
@@ -108,7 +108,7 @@ static long pmem_direct_access(struct block_device *bdev, 
sector_t sector,
return -ENODEV;
 
*kaddr = pmem-virt_addr + offset;
-   *pfn = (pmem-phys_addr + offset)  PAGE_SHIFT;
+   *pfn = phys_to_pfn_t(pmem-phys_addr + offset);
 
return pmem-size - offset;
 }
@@ -116,7 +116,9 @@ static long pmem_direct_access(struct block_device *bdev, 
sector_t sector,
 static const struct block_device_operations pmem_fops = {
.owner =THIS_MODULE,
.rw_page =  pmem_rw_page,
+#if IS_ENABLED(CONFIG_PMEM_IO)
.direct_access =pmem_direct_access,
+#endif
 };
 
 static struct pmem_device *pmem_alloc(struct device *dev, struct resource *res)
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index 5da8515b8fb9..8616c1d33786 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -29,7 +29,7 @@ static int dcssblk_open(struct block_device *bdev, fmode_t 
mode);
 static void dcssblk_release(struct gendisk *disk, fmode_t mode);
 static void dcssblk_make_request(struct request_queue *q, struct bio *bio);
 static long dcssblk_direct_access(struct block_device *bdev,