Add support for changing devices alignment. On kernels that do not support per-device align sysfs property we set it to 0.
Signed-off-by: Joao Martins <[email protected]> --- daxctl/lib/libdaxctl-private.h | 1 + daxctl/lib/libdaxctl.c | 36 ++++++++++++++++++++++++++++++++++++ daxctl/lib/libdaxctl.sym | 2 ++ daxctl/libdaxctl.h | 2 ++ 4 files changed, 41 insertions(+) diff --git a/daxctl/lib/libdaxctl-private.h b/daxctl/lib/libdaxctl-private.h index 9f9c70d6024f..b307a8bc9438 100644 --- a/daxctl/lib/libdaxctl-private.h +++ b/daxctl/lib/libdaxctl-private.h @@ -99,6 +99,7 @@ struct daxctl_dev { struct list_node list; unsigned long long resource; unsigned long long size; + unsigned long align; struct kmod_module *module; struct daxctl_region *region; struct daxctl_memory *mem; diff --git a/daxctl/lib/libdaxctl.c b/daxctl/lib/libdaxctl.c index 9b43b68facfe..39871427c799 100644 --- a/daxctl/lib/libdaxctl.c +++ b/daxctl/lib/libdaxctl.c @@ -498,6 +498,13 @@ static void *add_dax_dev(void *parent, int id, const char *daxdev_base) goto err_read; dev->size = strtoull(buf, NULL, 0); + /* Device align attribute is only available in v5.10 or up */ + sprintf(path, "%s/align", daxdev_base); + if (!sysfs_read_attr(ctx, path, buf)) + dev->align = strtoull(buf, NULL, 0); + else + dev->align = 0; + dev->dev_path = strdup(daxdev_base); if (!dev->dev_path) goto err_read; @@ -1086,6 +1093,35 @@ DAXCTL_EXPORT int daxctl_dev_set_size(struct daxctl_dev *dev, unsigned long long return 0; } +DAXCTL_EXPORT unsigned long daxctl_dev_get_align(struct daxctl_dev *dev) +{ + return dev->align; +} + +DAXCTL_EXPORT int daxctl_dev_set_align(struct daxctl_dev *dev, unsigned long align) +{ + struct daxctl_ctx *ctx = daxctl_dev_get_ctx(dev); + char buf[SYSFS_ATTR_SIZE]; + char *path = dev->dev_buf; + int len = dev->buf_len; + + if (snprintf(path, len, "%s/align", dev->dev_path) >= len) { + err(ctx, "%s: buffer too small!\n", + daxctl_dev_get_devname(dev)); + return -ENXIO; + } + + sprintf(buf, "%#lx\n", align); + if (sysfs_write_attr(ctx, path, buf) < 0) { + err(ctx, "%s: failed to set align\n", + daxctl_dev_get_devname(dev)); + return -ENXIO; + } + + dev->align = align; + return 0; +} + DAXCTL_EXPORT int daxctl_dev_get_target_node(struct daxctl_dev *dev) { return dev->target_node; diff --git a/daxctl/lib/libdaxctl.sym b/daxctl/lib/libdaxctl.sym index 33c926411037..c3d08179c9fd 100644 --- a/daxctl/lib/libdaxctl.sym +++ b/daxctl/lib/libdaxctl.sym @@ -81,4 +81,6 @@ global: daxctl_dev_set_size; daxctl_region_create_dev; daxctl_region_destroy_dev; + daxctl_dev_get_align; + daxctl_dev_set_align; } LIBDAXCTL_7; diff --git a/daxctl/libdaxctl.h b/daxctl/libdaxctl.h index 2b14faad1895..b0bb5d78d357 100644 --- a/daxctl/libdaxctl.h +++ b/daxctl/libdaxctl.h @@ -71,6 +71,8 @@ int daxctl_dev_get_minor(struct daxctl_dev *dev); unsigned long long daxctl_dev_get_resource(struct daxctl_dev *dev); unsigned long long daxctl_dev_get_size(struct daxctl_dev *dev); int daxctl_dev_set_size(struct daxctl_dev *dev, unsigned long long size); +unsigned long daxctl_dev_get_align(struct daxctl_dev *dev); +int daxctl_dev_set_align(struct daxctl_dev *dev, unsigned long align); struct daxctl_ctx *daxctl_dev_get_ctx(struct daxctl_dev *dev); int daxctl_dev_is_enabled(struct daxctl_dev *dev); int daxctl_dev_disable(struct daxctl_dev *dev); -- 1.8.3.1 _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
