WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Merge

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

<Prev in Thread] Current Thread [Next in Thread>