aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c')
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c
new file mode 100644
index 0000000000..9c5fce7857
--- /dev/null
+++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c
@@ -0,0 +1,137 @@
+/* -*- Mode:C; c-basic-offset:4; tab-width:4 -*-
+ ****************************************************************************
+ * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge
+ ****************************************************************************
+ *
+ * File: sched_ops.c
+ * Author: Rolf Neugebauer (neugebar@dcs.gla.ac.uk)
+ * Changes:
+ *
+ * Date: Mar 2003
+ *
+ * Environment: XenoLinux
+ * Description: Dom0 Control interface to scheduler in Xen
+ *
+ * code based on Andy's vfr parsing code
+ *
+ * Commands understood by the interface:
+ *
+ * C <context swith allowance>
+ * S <did> <mcu advance> <warp> <warp limit> <unwarp limit>
+ *
+ ****************************************************************************
+ * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $
+ ****************************************************************************
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/ctype.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/proc_fs.h>
+
+#include "dom0_ops.h"
+
+#define SCHED_ENTRY "sched"
+extern struct proc_dir_entry *xeno_base;
+static struct proc_dir_entry *sched_pde;
+
+static unsigned char readbuf[1024];
+
+static int sched_read_proc(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ strcpy(page, readbuf);
+ *readbuf = '\0';
+ *eof = 1;
+ *start = page;
+ return strlen(page);
+}
+
+
+static int sched_write_proc(struct file *file, const char *buffer,
+ u_long count, void *data)
+{
+ dom0_op_t op;
+
+ int ret, len;
+ int ts, te, tl; /* token start, end, and length */
+
+ /* Only admin can adjust scheduling parameters */
+ if ( !capable(CAP_SYS_ADMIN) )
+ return -EPERM;
+
+ /* parse the commands */
+ len = count;
+ ts = te = 0;
+
+ while ( count && isspace(buffer[ts]) ) { ts++; count--; } /*skip spaces*/
+ te = ts;
+ while ( count && !isspace(buffer[te]) ) { te++; count--; } /*command end*/
+ if ( te <= ts ) goto bad;
+ tl = te - ts;
+
+ if ( strncmp(&buffer[ts], "C", tl) == 0 ) {
+ op.cmd = DOM0_BVTCTL;
+ } else if ( strncmp(&buffer[ts], "S", tl) == 0 ) {
+ op.cmd = DOM0_ADJUSTDOM;
+ } else
+ goto bad;
+
+ /* skip whitspaces and get first parameter */
+ ts = te; while ( count && isspace(buffer[ts]) ) { ts++; count--; }
+ te = ts; while ( count && !isspace(buffer[te]) ) { te++; count--; }
+ if ( te <= ts ) goto bad;
+ tl = te - ts;
+ if ( !isdigit(buffer[ts]) ) goto bad;
+
+ if (op.cmd == DOM0_BVTCTL) {
+ /* get context switch allowance */
+ sscanf(&buffer[ts], "%lu", &op.u.bvtctl.ctx_allow);
+ } else if (op.cmd == DOM0_ADJUSTDOM) {
+ sscanf(&buffer[ts], "%u %lu %lu %lu %lu",
+ &op.u.adjustdom.domain,
+ &op.u.adjustdom.mcu_adv,
+ &op.u.adjustdom.warp,
+ &op.u.adjustdom.warpl,
+ &op.u.adjustdom.warpu);
+ }
+ ret = HYPERVISOR_dom0_op(&op);
+ return sizeof(op);
+
+ bad:
+ return -EINVAL;
+
+}
+
+
+/*
+ * main scheduler interface driver driver initialization function.
+ */
+static int __init init_module(void)
+{
+ printk(KERN_ALERT "Starting Domain Scheduler Control Interface\n");
+
+ sched_pde = create_proc_entry(SCHED_ENTRY, 0600, xeno_base);
+ if ( sched_pde == NULL )
+ {
+ printk(KERN_ALERT "Unable to create dom scheduler proc entry!");
+ return -1;
+ }
+
+ sched_pde->read_proc = sched_read_proc;
+ sched_pde->write_proc = sched_write_proc;
+
+ return 0;
+}
+
+static void __exit cleanup_module(void)
+{
+}
+
+module_init(init_module);
+module_exit(cleanup_module);
+