|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC XEN PATCH v4 10/41] xen/pmem: add XEN_SYSCTL_nvdimm_pmem_get_rgions_nr
XEN_SYSCTL_nvdimm_pmem_get_rgions_nr, which is a command of hypercall
XEN_SYSCTL_nvdimm_op, is to get the number of PMEM regions of the
specified type (see PMEM_REGION_TYPE_*).
Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
---
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Cc: Tim Deegan <tim@xxxxxxx>
---
tools/libxc/include/xenctrl.h | 15 +++++++++++++++
tools/libxc/xc_misc.c | 23 +++++++++++++++++++++++
tools/libxl/libxl_nvdimm.c | 0
xen/common/pmem.c | 29 ++++++++++++++++++++++++++++-
xen/include/public/sysctl.h | 14 +++++++++++++-
5 files changed, 79 insertions(+), 2 deletions(-)
create mode 100644 tools/libxl/libxl_nvdimm.c
diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 666db0b919..195ff69846 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -2607,6 +2607,21 @@ int xc_livepatch_replace(xc_interface *xch, char *name,
uint32_t timeout);
int xc_domain_cacheflush(xc_interface *xch, uint32_t domid,
xen_pfn_t start_pfn, xen_pfn_t nr_pfns);
+/*
+ * Get the number of PMEM regions of the specified type.
+ *
+ * Parameters:
+ * xch: xc interface handle
+ * type: the type of PMEM regions, must be one of PMEM_REGION_TYPE_*
+ * nr: the number of PMEM regions is returned via this parameter
+ *
+ * Return:
+ * On success, return 0 and the number of PMEM regions is returned via @nr.
+ * Otherwise, return a non-zero error code.
+ */
+int xc_nvdimm_pmem_get_regions_nr(xc_interface *xch,
+ uint8_t type, uint32_t *nr);
+
/* Compat shims */
#include "xenctrl_compat.h"
diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index 5e6714ae2b..a3c6cfe2f6 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -888,6 +888,29 @@ int xc_livepatch_replace(xc_interface *xch, char *name,
uint32_t timeout)
return _xc_livepatch_action(xch, name, LIVEPATCH_ACTION_REPLACE, timeout);
}
+int xc_nvdimm_pmem_get_regions_nr(xc_interface *xch, uint8_t type, uint32_t
*nr)
+{
+ DECLARE_SYSCTL;
+ struct xen_sysctl_nvdimm_op *nvdimm = &sysctl.u.nvdimm;
+ int rc;
+
+ if ( !nr || type != PMEM_REGION_TYPE_RAW )
+ return -EINVAL;
+
+ sysctl.cmd = XEN_SYSCTL_nvdimm_op;
+ nvdimm->cmd = XEN_SYSCTL_nvdimm_pmem_get_regions_nr;
+ nvdimm->err = 0;
+ nvdimm->u.pmem_regions_nr.type = type;
+
+ rc = do_sysctl(xch, &sysctl);
+ if ( !rc )
+ *nr = nvdimm->u.pmem_regions_nr.num_regions;
+ else if ( nvdimm->err )
+ rc = nvdimm->err;
+
+ return rc;
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/libxl/libxl_nvdimm.c b/tools/libxl/libxl_nvdimm.c
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/xen/common/pmem.c b/xen/common/pmem.c
index c3b26dd02d..b196b256bb 100644
--- a/xen/common/pmem.c
+++ b/xen/common/pmem.c
@@ -97,6 +97,23 @@ static int pmem_list_add(struct list_head *list,
return 0;
}
+static int pmem_get_regions_nr(xen_sysctl_nvdimm_pmem_regions_nr_t *regions_nr)
+{
+ int rc = 0;
+
+ switch ( regions_nr->type )
+ {
+ case PMEM_REGION_TYPE_RAW:
+ regions_nr->num_regions = nr_raw_regions;
+ break;
+
+ default:
+ rc = -EINVAL;
+ }
+
+ return rc;
+}
+
/**
* Register a pmem region to Xen.
*
@@ -134,7 +151,17 @@ int pmem_register(unsigned long smfn, unsigned long emfn,
unsigned int pxm)
*/
int pmem_do_sysctl(struct xen_sysctl_nvdimm_op *nvdimm)
{
- int rc = -ENOSYS;
+ int rc;
+
+ switch ( nvdimm->cmd )
+ {
+ case XEN_SYSCTL_nvdimm_pmem_get_regions_nr:
+ rc = pmem_get_regions_nr(&nvdimm->u.pmem_regions_nr);
+ break;
+
+ default:
+ rc = -ENOSYS;
+ }
nvdimm->err = -rc;
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index 7f0e56f73a..c3c992225a 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -1049,11 +1049,23 @@ struct xen_sysctl_set_parameter {
* Interface for NVDIMM management.
*/
+/* Types of PMEM regions */
+#define PMEM_REGION_TYPE_RAW 0 /* PMEM regions detected by Xen */
+
+/* XEN_SYSCTL_nvdimm_pmem_get_regions_nr */
+struct xen_sysctl_nvdimm_pmem_regions_nr {
+ uint8_t type; /* IN: one of PMEM_REGION_TYPE_* */
+ uint32_t num_regions; /* OUT: the number of PMEM regions of type @type */
+};
+typedef struct xen_sysctl_nvdimm_pmem_regions_nr
xen_sysctl_nvdimm_pmem_regions_nr_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_nvdimm_pmem_regions_nr_t);
+
struct xen_sysctl_nvdimm_op {
uint32_t cmd; /* IN: XEN_SYSCTL_nvdimm_*; none is implemented yet. */
+#define XEN_SYSCTL_nvdimm_pmem_get_regions_nr 0
uint32_t err; /* OUT: error code */
union {
- /* Parameters of XEN_SYSCTL_nvdimm_* will be added here. */
+ xen_sysctl_nvdimm_pmem_regions_nr_t pmem_regions_nr;
} u;
};
--
2.15.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |