ChangeSet 1.1413, 2005/03/31 22:36:33+01:00, iap10@xxxxxxxxxxxxxxxxxxxxx
Merge
dom0_ops.c | 168 ++++++++++++++++++++++++-------------------------------------
1 files changed, 68 insertions(+), 100 deletions(-)
diff -Nru a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c 2005-03-31 17:03:01 -05:00
+++ b/xen/common/dom0_ops.c 2005-03-31 17:03:01 -05:00
@@ -14,9 +14,9 @@
#include <xen/sched.h>
#include <xen/event.h>
#include <asm/domain_page.h>
-#include <asm/pdb.h>
#include <xen/trace.h>
#include <xen/console.h>
+#include <xen/physdev.h>
#include <asm/shadow.h>
#include <public/sched_ctl.h>
@@ -26,7 +26,7 @@
extern unsigned int alloc_new_dom_mem(struct domain *, unsigned int);
extern long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op);
extern void arch_getdomaininfo_ctxt(
- struct domain *, full_execution_context_t *);
+ struct exec_domain *, full_execution_context_t *);
static inline int is_free_domid(domid_t dom)
{
@@ -96,7 +96,7 @@
long ret = 0;
dom0_op_t curop, *op = &curop;
- if ( !IS_PRIV(current) )
+ if ( !IS_PRIV(current->domain) )
return -EPERM;
if ( copy_from_user(op, u_dom0_op, sizeof(*op)) )
@@ -112,13 +112,13 @@
switch ( op->cmd )
{
- case DOM0_BUILDDOMAIN:
+ case DOM0_SETDOMAININFO:
{
- struct domain *d = find_domain_by_id(op->u.builddomain.domain);
- ret = -EINVAL;
+ struct domain *d = find_domain_by_id(op->u.setdomaininfo.domain);
+ ret = -ESRCH;
if ( d != NULL )
{
- ret = final_setup_guestos(d, &op->u.builddomain);
+ ret = set_info_guest(d, &op->u.setdomaininfo);
put_domain(d);
}
}
@@ -131,7 +131,7 @@
if ( d != NULL )
{
ret = -EINVAL;
- if ( d != current )
+ if ( d != current->domain )
{
domain_pause_by_systemcontroller(d);
ret = 0;
@@ -148,7 +148,8 @@
if ( d != NULL )
{
ret = -EINVAL;
- if ( test_bit(DF_CONSTRUCTED, &d->flags) )
+ if ( (d != current->domain) &&
+ test_bit(DF_CONSTRUCTED, &d->d_flags) )
{
domain_unpause_by_systemcontroller(d);
ret = 0;
@@ -178,11 +179,14 @@
{
/* Do an initial placement. Pick the least-populated CPU. */
struct domain *d;
+ struct exec_domain *ed;
unsigned int i, ht, cnt[NR_CPUS] = { 0 };
read_lock(&domlist_lock);
- for_each_domain ( d )
- cnt[d->processor]++;
+ for_each_domain ( d ) {
+ for_each_exec_domain ( d, ed )
+ cnt[ed->processor]++;
+ }
read_unlock(&domlist_lock);
/* If we're on a HT system, we only use the first HT for dom0,
@@ -223,7 +227,7 @@
if ( d != NULL )
{
ret = -EINVAL;
- if ( d != current )
+ if ( d != current->domain )
{
domain_kill(d);
ret = 0;
@@ -237,6 +241,7 @@
{
domid_t dom = op->u.pincpudomain.domain;
struct domain *d = find_domain_by_id(dom);
+ struct exec_domain *ed;
int cpu = op->u.pincpudomain.cpu;
if ( d == NULL )
@@ -245,7 +250,15 @@
break;
}
- if ( d == current )
+ ed = d->exec_domain[op->u.pincpudomain.exec_domain];
+ if ( ed == NULL )
+ {
+ ret = -ESRCH;
+ put_domain(d);
+ break;
+ }
+
+ if ( ed == current )
{
ret = -EINVAL;
put_domain(d);
@@ -254,17 +267,16 @@
if ( cpu == -1 )
{
- clear_bit(DF_CPUPINNED, &d->flags);
+ clear_bit(EDF_CPUPINNED, &ed->ed_flags);
}
else
{
- domain_pause(d);
- synchronise_pagetables(~0UL);
- if ( d->processor != (cpu % smp_num_cpus) )
- set_bit(DF_MIGRATED, &d->flags);
- set_bit(DF_CPUPINNED, &d->flags);
- d->processor = cpu % smp_num_cpus;
- domain_unpause(d);
+ exec_domain_pause(ed);
+ if ( ed->processor != (cpu % smp_num_cpus) )
+ set_bit(EDF_MIGRATED, &ed->ed_flags);
+ set_bit(EDF_CPUPINNED, &ed->ed_flags);
+ ed->processor = cpu % smp_num_cpus;
+ exec_domain_unpause(ed);
}
put_domain(d);
@@ -285,48 +297,11 @@
}
break;
- case DOM0_GETMEMLIST:
- {
- int i;
- struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
- unsigned long max_pfns = op->u.getmemlist.max_pfns;
- unsigned long pfn;
- unsigned long *buffer = op->u.getmemlist.buffer;
- struct list_head *list_ent;
-
- ret = -EINVAL;
- if ( d != NULL )
- {
- ret = 0;
-
- spin_lock(&d->page_alloc_lock);
- list_ent = d->page_list.next;
- for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ )
- {
- pfn = list_entry(list_ent, struct pfn_info, list) -
- frame_table;
- if ( put_user(pfn, buffer) )
- {
- ret = -EFAULT;
- break;
- }
- buffer++;
- list_ent = frame_table[pfn].list.next;
- }
- spin_unlock(&d->page_alloc_lock);
-
- op->u.getmemlist.num_pfns = i;
- copy_to_user(u_dom0_op, op, sizeof(*op));
-
- put_domain(d);
- }
- }
- break;
-
case DOM0_GETDOMAININFO:
{
full_execution_context_t *c;
struct domain *d;
+ struct exec_domain *ed;
read_lock(&domlist_lock);
@@ -346,41 +321,50 @@
read_unlock(&domlist_lock);
op->u.getdomaininfo.domain = d->id;
+
+ if ( (op->u.getdomaininfo.exec_domain >= MAX_VIRT_CPUS) ||
+ !d->exec_domain[op->u.getdomaininfo.exec_domain] )
+ {
+ ret = -EINVAL;
+ break;
+ }
+ ed = d->exec_domain[op->u.getdomaininfo.exec_domain];
+
op->u.getdomaininfo.flags =
- (test_bit(DF_DYING, &d->flags) ? DOMFLAGS_DYING : 0) |
- (test_bit(DF_CRASHED, &d->flags) ? DOMFLAGS_CRASHED : 0) |
- (test_bit(DF_SHUTDOWN, &d->flags) ? DOMFLAGS_SHUTDOWN : 0) |
- (test_bit(DF_CTRLPAUSE, &d->flags) ? DOMFLAGS_PAUSED : 0) |
- (test_bit(DF_BLOCKED, &d->flags) ? DOMFLAGS_BLOCKED : 0) |
- (test_bit(DF_RUNNING, &d->flags) ? DOMFLAGS_RUNNING : 0);
+ (test_bit( DF_DYING, &d->d_flags) ? DOMFLAGS_DYING : 0) |
+ (test_bit( DF_CRASHED, &d->d_flags) ? DOMFLAGS_CRASHED : 0) |
+ (test_bit( DF_SHUTDOWN, &d->d_flags) ? DOMFLAGS_SHUTDOWN : 0) |
+ (test_bit(EDF_CTRLPAUSE, &ed->ed_flags) ? DOMFLAGS_PAUSED : 0) |
+ (test_bit(EDF_BLOCKED, &ed->ed_flags) ? DOMFLAGS_BLOCKED : 0) |
+ (test_bit(EDF_RUNNING, &ed->ed_flags) ? DOMFLAGS_RUNNING : 0);
- op->u.getdomaininfo.flags |= d->processor << DOMFLAGS_CPUSHIFT;
+ op->u.getdomaininfo.flags |= ed->processor << DOMFLAGS_CPUSHIFT;
op->u.getdomaininfo.flags |=
d->shutdown_code << DOMFLAGS_SHUTDOWNSHIFT;
op->u.getdomaininfo.tot_pages = d->tot_pages;
op->u.getdomaininfo.max_pages = d->max_pages;
- op->u.getdomaininfo.cpu_time = d->cpu_time;
+ op->u.getdomaininfo.cpu_time = ed->cpu_time;
op->u.getdomaininfo.shared_info_frame =
__pa(d->shared_info) >> PAGE_SHIFT;
if ( op->u.getdomaininfo.ctxt != NULL )
{
- if ( (c = xmalloc(sizeof(*c))) == NULL )
+ if ( (c = xmalloc(full_execution_context_t)) == NULL )
{
ret = -ENOMEM;
put_domain(d);
break;
}
- if ( d != current )
- domain_pause(d);
+ if ( ed != current )
+ exec_domain_pause(ed);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|