[PATCH v2 09/10] dax: convert to __pfn_t
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
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,