Skip to content

Commit bb0bc49

Browse files
committed
Merge tag 'libnvdimm-for-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull dax updates from Ira Weiny: "The series adds DAX support required for the upcoming fuse/famfs file system.[1] The support here is required because famfs is backed by devdax rather than pmem. This all lays the groundwork for using shared memory as a file system" Link: https://lore.kernel.org/all/0100019d43e5f632-f5862a3e-361c-4b54-a9a6-96c242a8f17a-000000@email.amazonses.com/ [1] * tag 'libnvdimm-for-7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: dax/fsdev: fix uninitialized kaddr in fsdev_dax_zero_page_range() dax: export dax_dev_get() dax: Add fs_dax_get() func to prepare dax for fs-dax usage dax: Add dax_set_ops() for setting dax_operations at bind time dax: Add dax_operations for use by fs-dax on fsdev dax dax: Save the kva from memremap dax: add fsdev.c driver for fs-dax on character dax dax: Factor out dax_folio_reset_order() helper dax: move dax_pgoff_to_phys from [drivers/dax/] device.c to bus.c
2 parents c94faa7 + 45df911 commit bb0bc49

11 files changed

Lines changed: 566 additions & 50 deletions

File tree

MAINTAINERS

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7303,6 +7303,14 @@ L: linux-cxl@vger.kernel.org
73037303
S: Supported
73047304
F: drivers/dax/
73057305

7306+
DEVICE DIRECT ACCESS (DAX) [fsdev_dax]
7307+
M: John Groves <jgroves@micron.com>
7308+
M: John Groves <John@Groves.net>
7309+
L: nvdimm@lists.linux.dev
7310+
L: linux-cxl@vger.kernel.org
7311+
S: Supported
7312+
F: drivers/dax/fsdev.c
7313+
73067314
DEVICE FREQUENCY (DEVFREQ)
73077315
M: MyungJoo Ham <myungjoo.ham@samsung.com>
73087316
M: Kyungmin Park <kyungmin.park@samsung.com>

drivers/dax/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ config DEV_DAX_HMEM_DEVICES
6565
depends on DEV_DAX_HMEM && DAX
6666
def_bool y
6767

68+
config DEV_DAX_FSDEV
69+
tristate
70+
depends on DEV_DAX && FS_DAX
71+
default DEV_DAX
72+
6873
config DEV_DAX_KMEM
6974
tristate "KMEM DAX: map dax-devices as System-RAM"
7075
default DEV_DAX

drivers/dax/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ obj-$(CONFIG_DEV_DAX) += device_dax.o
55
obj-$(CONFIG_DEV_DAX_KMEM) += kmem.o
66
obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o
77
obj-$(CONFIG_DEV_DAX_CXL) += dax_cxl.o
8+
obj-$(CONFIG_DEV_DAX_FSDEV) += fsdev_dax.o
89

910
dax-y := super.o
1011
dax-y += bus.o
1112
device_dax-y := device.o
1213
dax_pmem-y := pmem.o
1314
dax_cxl-y := cxl.o
15+
fsdev_dax-y := fsdev.o

drivers/dax/bus.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ static int dax_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)
4040
return add_uevent_var(env, "MODALIAS=" DAX_DEVICE_MODALIAS_FMT, 0);
4141
}
4242

43-
#define to_dax_drv(__drv) container_of_const(__drv, struct dax_device_driver, drv)
44-
4543
static struct dax_id *__dax_match_id(const struct dax_device_driver *dax_drv,
4644
const char *dev_name)
4745
{
@@ -1431,6 +1429,26 @@ static const struct device_type dev_dax_type = {
14311429
.groups = dax_attribute_groups,
14321430
};
14331431

1432+
/* see "strong" declaration in tools/testing/nvdimm/dax-dev.c */
1433+
__weak phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
1434+
unsigned long size)
1435+
{
1436+
for (int i = 0; i < dev_dax->nr_range; i++) {
1437+
struct dev_dax_range *dax_range = &dev_dax->ranges[i];
1438+
struct range *range = &dax_range->range;
1439+
phys_addr_t phys;
1440+
1441+
if (!in_range(pgoff, dax_range->pgoff, PHYS_PFN(range_len(range))))
1442+
continue;
1443+
phys = PFN_PHYS(pgoff - dax_range->pgoff) + range->start;
1444+
if (phys + size - 1 <= range->end)
1445+
return phys;
1446+
break;
1447+
}
1448+
return -1;
1449+
}
1450+
EXPORT_SYMBOL_GPL(dax_pgoff_to_phys);
1451+
14341452
static struct dev_dax *__devm_create_dev_dax(struct dev_dax_data *data)
14351453
{
14361454
struct dax_region *dax_region = data->dax_region;

drivers/dax/bus.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct dev_dax *devm_create_dev_dax(struct dev_dax_data *data);
3333
enum dax_driver_type {
3434
DAXDRV_KMEM_TYPE,
3535
DAXDRV_DEVICE_TYPE,
36+
DAXDRV_FSDEV_TYPE,
3637
};
3738

3839
struct dax_device_driver {
@@ -43,6 +44,8 @@ struct dax_device_driver {
4344
void (*remove)(struct dev_dax *dev);
4445
};
4546

47+
#define to_dax_drv(__drv) container_of_const(__drv, struct dax_device_driver, drv)
48+
4649
int __dax_driver_register(struct dax_device_driver *dax_drv,
4750
struct module *module, const char *mod_name);
4851
#define dax_driver_register(driver) \

drivers/dax/dax-private.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ struct dev_dax_range {
6969
* data while the device is activated in the driver.
7070
* @region: parent region
7171
* @dax_dev: core dax functionality
72+
* @virt_addr: kva from memremap; used by fsdev_dax
73+
* @cached_size: size of daxdev cached by fsdev_dax
7274
* @align: alignment of this instance
7375
* @target_node: effective numa node if dev_dax memory range is onlined
7476
* @dyn_id: is this a dynamic or statically created instance
@@ -83,6 +85,8 @@ struct dev_dax_range {
8385
struct dev_dax {
8486
struct dax_region *region;
8587
struct dax_device *dax_dev;
88+
void *virt_addr;
89+
u64 cached_size;
8690
unsigned int align;
8791
int target_node;
8892
bool dyn_id;

drivers/dax/device.c

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,6 @@ static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma,
5757
vma->vm_file, func);
5858
}
5959

60-
/* see "strong" declaration in tools/testing/nvdimm/dax-dev.c */
61-
__weak phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
62-
unsigned long size)
63-
{
64-
int i;
65-
66-
for (i = 0; i < dev_dax->nr_range; i++) {
67-
struct dev_dax_range *dax_range = &dev_dax->ranges[i];
68-
struct range *range = &dax_range->range;
69-
unsigned long long pgoff_end;
70-
phys_addr_t phys;
71-
72-
pgoff_end = dax_range->pgoff + PHYS_PFN(range_len(range)) - 1;
73-
if (pgoff < dax_range->pgoff || pgoff > pgoff_end)
74-
continue;
75-
phys = PFN_PHYS(pgoff - dax_range->pgoff) + range->start;
76-
if (phys + size - 1 <= range->end)
77-
return phys;
78-
break;
79-
}
80-
return -1;
81-
}
82-
8360
static void dax_set_mapping(struct vm_fault *vmf, unsigned long pfn,
8461
unsigned long fault_size)
8562
{

0 commit comments

Comments
 (0)