@@ -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>
@@ -880,6 +882,41 @@ 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 (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;
@@ -67,4 +67,5 @@ global:
daxctl_memory_set_online;
daxctl_memory_set_offline;
daxctl_memory_is_online;
+ daxctl_dev_get_mode;
} LIBDAXCTL_5;
@@ -74,6 +74,7 @@ int daxctl_dev_disable(struct daxctl_dev *dev);
int daxctl_dev_enable_devdax(struct daxctl_dev *dev);
int daxctl_dev_enable_ram(struct daxctl_dev *dev);
int daxctl_dev_get_target_node(struct daxctl_dev *dev);
+enum daxctl_dev_mode daxctl_dev_get_mode(struct daxctl_dev *dev);
struct daxctl_memory;
struct daxctl_memory *daxctl_dev_get_memory(struct daxctl_dev *dev);
@@ -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,22 @@ struct json_object *util_daxctl_dev_to_json(struct daxctl_dev *dev,
json_object_object_add(jdev, "target_node", jobj);
}
+ mode = daxctl_dev_get_mode(dev);
+ if (mode >= 0) {
+ if (mode == DAXCTL_DEV_MODE_RAM)
+ jobj = json_object_new_string("system-ram");
+ else
+ jobj = json_object_new_string("devdax");
+ if (jobj)
+ json_object_object_add(jdev, "mode", jobj);
+ }
+
+ if (!daxctl_dev_is_enabled(dev)) {
+ jobj = json_object_new_string("disabled");
+ if (jobj)
+ json_object_object_add(jdev, "state", 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 in device listings via a 'daxctl-list' command or immediately after a mode change. Add a 'state' attribute to the json listings for devices, since a device could end up in a state where it is not bound to any driver, and hence, 'disabled'. The state attribute is only displayed for disabled devices. 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 | 37 +++++++++++++++++++++++++++++++++++++ daxctl/lib/libdaxctl.sym | 1 + daxctl/libdaxctl.h | 1 + util/json.c | 17 +++++++++++++++++ 4 files changed, 56 insertions(+)