@@ -12,6 +12,8 @@
*/
#include <stdio.h>
#include <errno.h>
+#include <limits.h>
+#include <libgen.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
@@ -840,6 +842,47 @@ DAXCTL_EXPORT int daxctl_dev_disable(struct daxctl_dev *dev)
return 0;
}
+DAXCTL_EXPORT enum daxctl_dev_mode daxctl_dev_get_mode(struct daxctl_dev *dev)
+{
+ const char *devname = daxctl_dev_get_devname(dev);
+ struct daxctl_ctx *ctx = daxctl_dev_get_ctx(dev);
+ int rc = DAXCTL_DEV_MODE_UNKNOWN;
+ char path[200];
+ const int len = sizeof(path);
+ char *mod_path, *mod_base;
+
+ if (!daxctl_dev_is_enabled(dev))
+ return rc;
+
+ if (ctx->subsys != DAX_BUS) {
+ err(ctx, "%s: invalid operation for dax subsystem\n", devname);
+ err(ctx, "%s: see daxctl-migrate-device-model(1)\n", devname);
+ return -ENXIO;
+ }
+
+ if (snprintf(path, len, "%s/driver/module", dev->dev_path) >= len) {
+ err(ctx, "%s: buffer too small!\n", devname);
+ return -ENXIO;
+ }
+
+ mod_path = realpath(path, NULL);
+ if (!mod_path) {
+ rc = -errno;
+ err(ctx, "%s: unable to determine module: %s\n", devname,
+ strerror(errno));
+ return rc;
+ }
+
+ mod_base = basename(mod_path);
+ if (strcmp(mod_base, dax_modules[DAXCTL_DEV_MODE_RAM]) == 0)
+ rc = DAXCTL_DEV_MODE_RAM;
+ else if (strcmp(mod_base, dax_modules[DAXCTL_DEV_MODE_DEVDAX]) == 0)
+ rc = DAXCTL_DEV_MODE_DEVDAX;
+
+ free(mod_path);
+ return rc;
+}
+
DAXCTL_EXPORT struct daxctl_ctx *daxctl_dev_get_ctx(struct daxctl_dev *dev)
{
return dev->region->ctx;
@@ -62,4 +62,5 @@ global:
daxctl_dev_online_node;
daxctl_dev_offline_node;
daxctl_dev_node_is_online;
+ daxctl_dev_get_mode;
} LIBDAXCTL_5;
@@ -76,6 +76,7 @@ int daxctl_dev_enable_ram(struct daxctl_dev *dev);
int daxctl_dev_online_node(struct daxctl_dev *dev);
int daxctl_dev_offline_node(struct daxctl_dev *dev);
int daxctl_dev_node_is_online(struct daxctl_dev *dev);
+enum daxctl_dev_mode daxctl_dev_get_mode(struct daxctl_dev *dev);
#define daxctl_dev_foreach(region, dev) \
for (dev = daxctl_dev_get_first(region); \
@@ -271,6 +271,7 @@ struct json_object *util_daxctl_dev_to_json(struct daxctl_dev *dev,
{
const char *devname = daxctl_dev_get_devname(dev);
struct json_object *jdev, *jobj;
+ enum daxctl_dev_mode mode;
int node;
jdev = json_object_new_object();
@@ -292,6 +293,19 @@ struct json_object *util_daxctl_dev_to_json(struct daxctl_dev *dev,
json_object_object_add(jdev, "numa_node", jobj);
}
+ mode = daxctl_dev_get_mode(dev);
+ if (mode > 0) {
+ jobj = NULL;
+ if (mode == DAXCTL_DEV_MODE_RAM)
+ jobj = json_object_new_string("system-ram");
+ else if (mode == DAXCTL_DEV_MODE_DEVDAX)
+ jobj = json_object_new_string("devdax");
+ else
+ jobj = json_object_new_string("unknown");
+ if (jobj)
+ json_object_object_add(jdev, "mode", jobj);
+ }
+
return jdev;
}
In preparation for a reconfigure-device command, add an interface to retrieve the 'mode' of a dax device. This will allow the reconfigure-device command (and via daxctl_dev_to_json()), also daxctl-list) to print the mode on device listings via a list command or immediately after a mode change. Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> --- daxctl/lib/libdaxctl.c | 43 ++++++++++++++++++++++++++++++++++++++++ daxctl/lib/libdaxctl.sym | 1 + daxctl/libdaxctl.h | 1 + util/json.c | 14 +++++++++++++ 4 files changed, 59 insertions(+)