scheduler: Add a global parameter adjustment to the switchable scheduler interface
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 21:43:30 +0000 (22:43 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 21:43:30 +0000 (22:43 +0100)
...along with a new sysctl to call it directly.  This is in order to
support DornerWorks' new ARINC653 scheduler.

Based on code from Josh Holtrop and Kathy Hadley at DornerWorks, Ltd

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Signed-off-by: Keir Fraser <keir.fraser@eu.citrix.com>
xen/common/schedule.c
xen/common/sysctl.c
xen/include/public/sysctl.h
xen/include/xen/sched.h

index 52ca2b894426c21082bf76350ca1c7dbedc5c2d5..ebc9703dbce1cfb43dfe337d2d3e8424a41cbe10 100644 (file)
@@ -882,6 +882,21 @@ long sched_adjust(struct domain *d, struct xen_domctl_scheduler_op *op)
     return ret;
 }
 
+long sched_adjust_global(struct xen_sysctl_scheduler_op *op)
+{
+    const struct scheduler *sched;
+
+    sched = scheduler_get_by_id(op->sched_id);
+    if ( sched == NULL )
+        return -ESRCH;
+
+    if ( (op->cmd != XEN_DOMCTL_SCHEDOP_putinfo) &&
+         (op->cmd != XEN_DOMCTL_SCHEDOP_getinfo) )
+        return -EINVAL;
+
+    return SCHED_OP(sched, adjust_global, op);
+}
+
 static void vcpu_periodic_timer_work(struct vcpu *v)
 {
     s_time_t now = NOW();
index 51b0a8e41482a2059cbba2809876b55e8ab590e1..5365c20f297029caf05f1f672b38cdb7d91a0620 100644 (file)
@@ -326,6 +326,14 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl)
     }
     break;
 
+    case XEN_SYSCTL_scheduler_op:
+    {
+        ret = sched_adjust_global(&op->u.scheduler_op);
+        if ( (ret == 0) && copy_to_guest(u_sysctl, op, 1) )
+            ret = -EFAULT;
+    }
+    break;
+
     default:
         ret = arch_do_sysctl(op, u_sysctl);
         break;
index 7d8d9294b836e9be00b395f234b28c24b4e1f20b..1241fd71d9cf7486eb1ef44d89b81d6a7892ff55 100644 (file)
@@ -536,6 +536,19 @@ struct xen_sysctl_cpupool_op {
 typedef struct xen_sysctl_cpupool_op xen_sysctl_cpupool_op_t;
 DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpupool_op_t);
 
+#define XEN_SYSCTL_scheduler_op      19
+/* Set or get info? */
+#define XEN_SYSCTL_SCHEDOP_putinfo 0
+#define XEN_SYSCTL_SCHEDOP_getinfo 1
+struct xen_sysctl_scheduler_op {
+    uint32_t sched_id;  /* XEN_SCHEDULER_* (domctl.h) */
+    uint32_t cmd;       /* XEN_SYSCTL_SCHEDOP_* */
+    union {
+    } u;
+};
+typedef struct xen_sysctl_scheduler_op xen_sysctl_scheduler_op_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_scheduler_op_t);
+
 struct xen_sysctl {
     uint32_t cmd;
     uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
@@ -557,6 +570,7 @@ struct xen_sysctl {
         struct xen_sysctl_page_offline_op   page_offline;
         struct xen_sysctl_lockprof_op       lockprof_op;
         struct xen_sysctl_cpupool_op        cpupool_op;
+        struct xen_sysctl_scheduler_op      scheduler_op;
         uint8_t                             pad[128];
     } u;
 };
index 71ead96c8e26f1177d817d8a1bf597b546c4b1f8..6da6b2d0f91a6bc24ef12b585fa35761bf906b29 100644 (file)
@@ -469,6 +469,7 @@ int  sched_init_domain(struct domain *d);
 void sched_destroy_domain(struct domain *d);
 int sched_move_domain(struct domain *d, struct cpupool *c);
 long sched_adjust(struct domain *, struct xen_domctl_scheduler_op *);
+long sched_adjust_global(struct xen_sysctl_scheduler_op *);
 int  sched_id(void);
 void sched_tick_suspend(void);
 void sched_tick_resume(void);