Skip to content

Commit 5b27dfb

Browse files
gerald-schaeferAlexander Gordeev
authored andcommitted
s390/dcssblk: Add DAX support
With ZONE_DEVICE now available for s390, struct pages can be allocated for proper DAX support in dcssblk driver via devm_memremap_pages(). Adding struct pages for a range requires that the range is aligned to SUBSECTION_SIZE, which is defined as 2 MB in common code. Therefore, only enable DAX support and allocate struct pages for DCSS ranges that are aligned to 2 MB. Signed-off-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com> Acked-by: Heiko Carstens <hca@linux.ibm.com> Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
1 parent 5450abb commit 5b27dfb

2 files changed

Lines changed: 31 additions & 16 deletions

File tree

drivers/s390/block/Kconfig

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,11 @@ comment "S/390 block device drivers"
55
config DCSSBLK
66
def_tristate m
77
prompt "DCSSBLK support"
8-
depends on S390 && BLOCK && (DAX || DAX=n)
8+
depends on S390 && BLOCK && ZONE_DEVICE
9+
select FS_DAX
910
help
1011
Support for dcss block device
1112

12-
config DCSSBLK_DAX
13-
def_bool y
14-
depends on DCSSBLK
15-
# requires S390 ZONE_DEVICE support
16-
depends on BROKEN
17-
prompt "DCSSBLK DAX support"
18-
help
19-
Enable DAX operation for the dcss block device
20-
2113
config DASD
2214
def_tristate y
2315
prompt "Support for DASD devices"

drivers/s390/block/dcssblk.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ struct dcssblk_dev_info {
7979
int num_of_segments;
8080
struct list_head seg_list;
8181
struct dax_device *dax_dev;
82+
struct dev_pagemap pgmap;
83+
void *pgmap_addr;
8284
};
8385

8486
struct segment_info {
@@ -415,6 +417,8 @@ dcssblk_shared_store(struct device *dev, struct device_attribute *attr, const ch
415417
dax_remove_host(dev_info->gd);
416418
kill_dax(dev_info->dax_dev);
417419
put_dax(dev_info->dax_dev);
420+
if (dev_info->pgmap_addr)
421+
devm_memunmap_pages(&dev_info->dev, &dev_info->pgmap);
418422
del_gendisk(dev_info->gd);
419423
put_disk(dev_info->gd);
420424

@@ -537,9 +541,6 @@ static int dcssblk_setup_dax(struct dcssblk_dev_info *dev_info)
537541
{
538542
struct dax_device *dax_dev;
539543

540-
if (!IS_ENABLED(CONFIG_DCSSBLK_DAX))
541-
return 0;
542-
543544
dax_dev = alloc_dax(dev_info, &dcssblk_dax_ops);
544545
if (IS_ERR(dax_dev))
545546
return PTR_ERR(dax_dev);
@@ -562,6 +563,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
562563
struct dcssblk_dev_info *dev_info;
563564
struct segment_info *seg_info, *temp;
564565
char *local_buf;
566+
void *addr;
565567
unsigned long seg_byte_size;
566568

567569
dev_info = NULL;
@@ -687,9 +689,26 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
687689
if (rc)
688690
goto put_dev;
689691

690-
rc = dcssblk_setup_dax(dev_info);
691-
if (rc)
692-
goto out_dax;
692+
if (!IS_ALIGNED(dev_info->start, SUBSECTION_SIZE) ||
693+
!IS_ALIGNED(dev_info->end + 1, SUBSECTION_SIZE)) {
694+
pr_info("DCSS %s is not aligned to %lu bytes, DAX support disabled\n",
695+
local_buf, SUBSECTION_SIZE);
696+
} else {
697+
dev_info->pgmap.type = MEMORY_DEVICE_FS_DAX;
698+
dev_info->pgmap.range.start = dev_info->start;
699+
dev_info->pgmap.range.end = dev_info->end;
700+
dev_info->pgmap.nr_range = 1;
701+
addr = devm_memremap_pages(&dev_info->dev, &dev_info->pgmap);
702+
if (IS_ERR(addr)) {
703+
rc = PTR_ERR(addr);
704+
goto put_dev;
705+
}
706+
dev_info->pgmap_addr = addr;
707+
rc = dcssblk_setup_dax(dev_info);
708+
if (rc)
709+
goto out_dax;
710+
pr_info("DAX support enabled for DCSS %s\n", local_buf);
711+
}
693712

694713
get_device(&dev_info->dev);
695714
rc = device_add_disk(&dev_info->dev, dev_info->gd, NULL);
@@ -716,6 +735,8 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
716735
out_dax:
717736
kill_dax(dev_info->dax_dev);
718737
put_dax(dev_info->dax_dev);
738+
if (dev_info->pgmap_addr)
739+
devm_memunmap_pages(&dev_info->dev, &dev_info->pgmap);
719740
put_dev:
720741
list_del(&dev_info->lh);
721742
put_disk(dev_info->gd);
@@ -801,6 +822,8 @@ dcssblk_remove_store(struct device *dev, struct device_attribute *attr, const ch
801822
dax_remove_host(dev_info->gd);
802823
kill_dax(dev_info->dax_dev);
803824
put_dax(dev_info->dax_dev);
825+
if (dev_info->pgmap_addr)
826+
devm_memunmap_pages(&dev_info->dev, &dev_info->pgmap);
804827
del_gendisk(dev_info->gd);
805828
put_disk(dev_info->gd);
806829

0 commit comments

Comments
 (0)