[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC 4/8] libxl: cpuid: add guest topology support



Introduce internal cpuid routine for setting the topology
as seen by the guest. The topology is made based on
leaf 1 and leaf 4 for Intel, more specifically setting:

Number of logical processors:
        proccount  (CPUID.1:EBX[16:24])

Number of physical cores - 1:
        procpkg    (CPUID.(4,0):EBX[26:32])

cache core count - 1:
        proccountX (CPUID.(4,Y):EBX[14:26])

        given that X is l1d, l1i, l2 or l3
        and Y the correspondent subleave [0-3]

Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
---
CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
CC: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
CC: Ian Campbell <ian.campbell@xxxxxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/libxl/libxl_cpuid.c    | 38 ++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_internal.h |  2 ++
 2 files changed, 40 insertions(+)

diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c
index deb81d2..e220566 100644
--- a/tools/libxl/libxl_cpuid.c
+++ b/tools/libxl/libxl_cpuid.c
@@ -352,6 +352,44 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
                      (const char**)(cpuid[i].policy), cpuid_res);
 }
 
+static int libxl_cpuid_parse_list(libxl_cpuid_policy_list *topo,
+                                  char **keys, int *vals, size_t sz)
+{
+    int i, ret = -1;
+
+    for (i = 0; i < sz; i++) {
+        char *str = NULL;
+
+        asprintf(&str, "%s=%d", keys[i], vals[i]);
+
+        ret = libxl_cpuid_parse_config(topo, str);
+        free(str);
+
+        if (ret)
+            break;
+    }
+
+    return ret;
+}
+
+void libxl__cpuid_set_topology(libxl_ctx *ctx, uint32_t domid,
+                               uint32_t cores, uint32_t threads)
+{
+    libxl_cpuid_policy_list topo;
+    char *keys[] = {
+        "htt", "proccount", "procpkg",
+        "proccountl1d", "proccountl1i", "proccountl2", "proccountl3"
+    };
+    int vals[] = {
+        1, cores * threads, --cores,
+        --threads, threads, threads, cores
+    };
+
+    memset(&topo, 0, sizeof(topo));
+    if (!libxl_cpuid_parse_list(&topo, keys, vals, ARRAY_SIZE(keys)))
+        libxl_cpuid_set(ctx, domid, topo);
+}
+
 static const char *input_names[2] = { "leaf", "subleaf" };
 static const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
 /*
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 650a958..903ad7b 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3919,6 +3919,8 @@ static inline int 
libxl__key_value_list_is_empty(libxl_key_value_list *pkvl)
 }
 
 int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl);
+void libxl__cpuid_set_topology(libxl_ctx *ctx, uint32_t domid,
+                               uint32_t max_vcpus, uint32_t threads);
 
 /* Portability note: a proper flock(2) implementation is required */
 typedef struct {
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.