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

[Xen-devel] [PATCH v2 4/4] libxl/xl: allow to get and set cap on Credit2.



Note that a cap is considered valid only if
it is within the [1, nr_vcpus]% interval.

Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/libxl/libxl_sched.c |   21 +++++++++++++++++++++
 tools/xl/xl_cmdtable.c    |    1 +
 tools/xl/xl_sched.c       |   25 +++++++++++++++++--------
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/tools/libxl/libxl_sched.c b/tools/libxl/libxl_sched.c
index faa604e..7d144d0 100644
--- a/tools/libxl/libxl_sched.c
+++ b/tools/libxl/libxl_sched.c
@@ -405,6 +405,7 @@ static int sched_credit2_domain_get(libxl__gc *gc, uint32_t 
domid,
     libxl_domain_sched_params_init(scinfo);
     scinfo->sched = LIBXL_SCHEDULER_CREDIT2;
     scinfo->weight = sdom.weight;
+    scinfo->cap = sdom.cap;
 
     return 0;
 }
@@ -413,8 +414,17 @@ static int sched_credit2_domain_set(libxl__gc *gc, 
uint32_t domid,
                                     const libxl_domain_sched_params *scinfo)
 {
     struct xen_domctl_sched_credit2 sdom;
+    xc_domaininfo_t info;
     int rc;
 
+    rc = xc_domain_getinfolist(CTX->xch, domid, 1, &info);
+    if (rc < 0) {
+        LOGED(ERROR, domid, "Getting domain info");
+        return ERROR_FAIL;
+    }
+    if (rc != 1 || info.domain != domid)
+        return ERROR_INVAL;
+
     rc = xc_sched_credit2_domain_get(CTX->xch, domid, &sdom);
     if (rc != 0) {
         LOGED(ERROR, domid, "Getting domain sched credit2");
@@ -430,6 +440,17 @@ static int sched_credit2_domain_set(libxl__gc *gc, 
uint32_t domid,
         sdom.weight = scinfo->weight;
     }
 
+    if (scinfo->cap != LIBXL_DOMAIN_SCHED_PARAM_CAP_DEFAULT) {
+        if (scinfo->cap < 0
+            || scinfo->cap > (info.max_vcpu_id + 1) * 100) {
+            LOGD(ERROR, domid, "Cpu cap out of range, "
+                 "valid range is from 0 to %d for specified number of vcpus",
+                 ((info.max_vcpu_id + 1) * 100));
+            return ERROR_INVAL;
+        }
+        sdom.cap = scinfo->cap;
+    }
+
     rc = xc_sched_credit2_domain_set(CTX->xch, domid, &sdom);
     if ( rc < 0 ) {
         LOGED(ERROR, domid, "Setting domain sched credit2");
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 2c71a9f..bfe6eb0 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -265,6 +265,7 @@ struct cmd_spec cmd_table[] = {
       "[-d <Domain> [-w[=WEIGHT]]] [-p CPUPOOL]",
       "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
       "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
+      "-c CAP,    --cap=CAP           Cap (int)\n"
       "-s         --schedparam        Query / modify scheduler parameters\n"
       "-r RLIMIT, --ratelimit_us=RLIMIT Set the scheduling rate limit, in 
microseconds\n"
       "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
diff --git a/tools/xl/xl_sched.c b/tools/xl/xl_sched.c
index 85722fe..7fabce3 100644
--- a/tools/xl/xl_sched.c
+++ b/tools/xl/xl_sched.c
@@ -209,7 +209,7 @@ static int sched_credit2_domain_output(int domid)
     libxl_domain_sched_params scinfo;
 
     if (domid < 0) {
-        printf("%-33s %4s %6s\n", "Name", "ID", "Weight");
+        printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap");
         return 0;
     }
 
@@ -219,10 +219,11 @@ static int sched_credit2_domain_output(int domid)
         return 1;
     }
     domname = libxl_domid_to_name(ctx, domid);
-    printf("%-33s %4d %6d\n",
+    printf("%-33s %4d %6d %4d\n",
         domname,
         domid,
-        scinfo.weight);
+        scinfo.weight,
+        scinfo.cap);
     free(domname);
     libxl_domain_sched_params_dispose(&scinfo);
     return 0;
@@ -589,21 +590,23 @@ int main_sched_credit2(int argc, char **argv)
     const char *dom = NULL;
     const char *cpupool = NULL;
     int ratelimit = 0;
-    int weight = 256;
+    int weight = 256, cap = 0;
     bool opt_s = false;
     bool opt_r = false;
     bool opt_w = false;
+    bool opt_c = false;
     int opt, rc;
     static struct option opts[] = {
         {"domain", 1, 0, 'd'},
         {"weight", 1, 0, 'w'},
+        {"cap", 1, 0, 'c'},
         {"schedparam", 0, 0, 's'},
         {"ratelimit_us", 1, 0, 'r'},
         {"cpupool", 1, 0, 'p'},
         COMMON_LONG_OPTS
     };
 
-    SWITCH_FOREACH_OPT(opt, "d:w:p:r:s", opts, "sched-credit2", 0) {
+    SWITCH_FOREACH_OPT(opt, "d:w:c:p:r:s", opts, "sched-credit2", 0) {
     case 'd':
         dom = optarg;
         break;
@@ -611,6 +614,10 @@ int main_sched_credit2(int argc, char **argv)
         weight = strtol(optarg, NULL, 10);
         opt_w = true;
         break;
+    case 'c':
+        cap = strtol(optarg, NULL, 10);
+        opt_c = true;
+        break;
     case 's':
         opt_s = true;
         break;
@@ -623,12 +630,12 @@ int main_sched_credit2(int argc, char **argv)
         break;
     }
 
-    if (cpupool && (dom || opt_w)) {
+    if (cpupool && (dom || opt_w || opt_c)) {
         fprintf(stderr, "Specifying a cpupool is not allowed with other "
                 "options.\n");
         return EXIT_FAILURE;
     }
-    if (!dom && opt_w) {
+    if (!dom && (opt_w || opt_c)) {
         fprintf(stderr, "Must specify a domain.\n");
         return EXIT_FAILURE;
     }
@@ -663,7 +670,7 @@ int main_sched_credit2(int argc, char **argv)
     } else {
         uint32_t domid = find_domain(dom);
 
-        if (!opt_w) { /* output credit2 scheduler info */
+        if (!opt_w && !opt_c) { /* output credit2 scheduler info */
             sched_credit2_domain_output(-1);
             if (sched_credit2_domain_output(domid))
                 return EXIT_FAILURE;
@@ -673,6 +680,8 @@ int main_sched_credit2(int argc, char **argv)
             scinfo.sched = LIBXL_SCHEDULER_CREDIT2;
             if (opt_w)
                 scinfo.weight = weight;
+            if (opt_c)
+                scinfo.cap = cap;
             rc = sched_domain_set(domid, &scinfo);
             libxl_domain_sched_params_dispose(&scinfo);
             if (rc)


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

 


Rackspace

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