diff mbox

[RFC,XEN,v3,13/39] tools/xen-ndctl: add command 'list'

Message ID 20170911043820.14617-14-haozhong.zhang@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Haozhong Zhang Sept. 11, 2017, 4:37 a.m. UTC
Two options are supported by command 'list'. '--raw' indicates to list
all PMEM regions detected by Xen hypervisor, which can be later
configured for future usages. '--all' indicates all other
options (i.e. --raw and future options).

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
---
 tools/misc/xen-ndctl.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)
diff mbox

Patch

diff --git a/tools/misc/xen-ndctl.c b/tools/misc/xen-ndctl.c
index de40e29ff6..6277a1eda2 100644
--- a/tools/misc/xen-ndctl.c
+++ b/tools/misc/xen-ndctl.c
@@ -27,12 +27,14 @@ 
 
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <xenctrl.h>
 
 static xc_interface *xch;
 
 static int handle_help(int argc, char *argv[]);
+static int handle_list(int argc, char *argv[]);
 static int handle_list_cmds(int argc, char *argv[]);
 
 static const struct xen_ndctl_cmd
@@ -52,6 +54,15 @@  static const struct xen_ndctl_cmd
         .handler = handle_help,
     },
 
+    {
+        .name    = "list",
+        .syntax  = "[--all | --raw ]",
+        .help    = "--all: the default option, list all PMEM regions of following types.\n"
+                   "--raw: list all PMEM regions detected by Xen hypervisor.\n",
+        .handler = handle_list,
+        .need_xc = true,
+    },
+
     {
         .name    = "list-cmds",
         .syntax  = "",
@@ -109,6 +120,70 @@  static int handle_help(int argc, char *argv[])
     return 0;
 }
 
+static int handle_list_raw(void)
+{
+    int rc;
+    unsigned int nr = 0, i;
+    xen_sysctl_nvdimm_pmem_raw_region_t *raw_list;
+
+    rc = xc_nvdimm_pmem_get_regions_nr(xch, PMEM_REGION_TYPE_RAW, &nr);
+    if ( rc )
+    {
+        fprintf(stderr, "Cannot get the number of PMEM regions: %s.\n",
+                strerror(-rc));
+        return rc;
+    }
+
+    raw_list = malloc(nr * sizeof(*raw_list));
+    if ( !raw_list )
+        return -ENOMEM;
+
+    rc = xc_nvdimm_pmem_get_regions(xch, PMEM_REGION_TYPE_RAW, raw_list, &nr);
+    if ( rc )
+        goto out;
+
+    printf("Raw PMEM regions:\n");
+    for ( i = 0; i < nr; i++ )
+        printf(" %u: MFN 0x%lx - 0x%lx, PXM %u\n",
+               i, raw_list[i].smfn, raw_list[i].emfn, raw_list[i].pxm);
+
+ out:
+    free(raw_list);
+
+    return rc;
+}
+
+static const struct list_handlers {
+    const char *option;
+    int (*handler)(void);
+} list_hndrs[] =
+{
+    { "--raw", handle_list_raw },
+};
+
+static const unsigned int nr_list_hndrs =
+    sizeof(list_hndrs) / sizeof(list_hndrs[0]);
+
+static int handle_list(int argc, char *argv[])
+{
+    bool list_all = argc <= 1 || !strcmp(argv[1], "--all");
+    unsigned int i;
+    bool handled = false;
+    int rc = 0;
+
+    for ( i = 0; i < nr_list_hndrs && !rc; i++)
+        if ( list_all || !strcmp(argv[1], list_hndrs[i].option) )
+        {
+            rc = list_hndrs[i].handler();
+            handled = true;
+        }
+
+    if ( !handled )
+        return handle_unrecognized_argument(argv[0], argv[1]);
+
+    return rc;
+}
+
 static int handle_list_cmds(int argc, char *argv[])
 {
     unsigned int i;