From 1f2168f18297661995fa9d75acdd651fb16b308f Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 1 Jun 2006 16:42:40 +0100 Subject: [PATCH] Fix dummy domains (DOM_IO and DOM_XEN) creation so that list heads are initialised. Signed-off-by: Keir Fraser xen-unstable changeset: 10242:ab627e9da8fb7be385f4e713ac184c275aba7c7c xen-unstable date: Thu Jun 01 16:39:42 2006 +0100 --- xen/arch/x86/mm.c | 12 ++++-------- xen/common/domain.c | 19 +++++-------------- xen/common/schedule.c | 14 +++++++++++--- xen/include/xen/sched.h | 4 ++-- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index bf97f67eb..5f19d8f03 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -187,20 +187,16 @@ void arch_init_memory(void) * Any Xen-heap pages that we will allow to be mapped will have * their domain field set to dom_xen. */ - dom_xen = alloc_domain(); - spin_lock_init(&dom_xen->page_alloc_lock); - atomic_set(&dom_xen->refcnt, 1); - dom_xen->domain_id = DOMID_XEN; + dom_xen = alloc_domain(DOMID_XEN); + BUG_ON(dom_xen == NULL); /* * Initialise our DOMID_IO domain. * This domain owns I/O pages that are within the range of the page_info * array. Mappings occur at the priv of the caller. */ - dom_io = alloc_domain(); - spin_lock_init(&dom_io->page_alloc_lock); - atomic_set(&dom_io->refcnt, 1); - dom_io->domain_id = DOMID_IO; + dom_io = alloc_domain(DOMID_IO); + BUG_ON(dom_io == NULL); /* First 1MB of RAM is historically marked as I/O. */ for ( i = 0; i < 0x100; i++ ) diff --git a/xen/common/domain.c b/xen/common/domain.c index b58271954..5a7092688 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -32,23 +32,14 @@ struct domain *domain_list; struct domain *dom0; -struct domain *domain_create(domid_t dom_id, unsigned int cpu) +struct domain *domain_create(domid_t domid, unsigned int cpu) { struct domain *d, **pd; struct vcpu *v; - if ( (d = alloc_domain()) == NULL ) + if ( (d = alloc_domain(domid)) == NULL ) return NULL; - d->domain_id = dom_id; - - atomic_set(&d->refcnt, 1); - - spin_lock_init(&d->big_lock); - spin_lock_init(&d->page_alloc_lock); - INIT_LIST_HEAD(&d->page_list); - INIT_LIST_HEAD(&d->xenpage_list); - rangeset_domain_initialise(d); if ( !is_idle_domain(d) ) @@ -74,14 +65,14 @@ struct domain *domain_create(domid_t dom_id, unsigned int cpu) if ( !is_idle_domain(d) ) { write_lock(&domlist_lock); - pd = &domain_list; /* NB. domain_list maintained in order of dom_id. */ + pd = &domain_list; /* NB. domain_list maintained in order of domid. */ for ( pd = &domain_list; *pd != NULL; pd = &(*pd)->next_in_list ) if ( (*pd)->domain_id > d->domain_id ) break; d->next_in_list = *pd; *pd = d; - d->next_in_hashbucket = domain_hash[DOMAIN_HASH(dom_id)]; - domain_hash[DOMAIN_HASH(dom_id)] = d; + d->next_in_hashbucket = domain_hash[DOMAIN_HASH(domid)]; + domain_hash[DOMAIN_HASH(domid)] = d; write_unlock(&domlist_lock); } diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 87caf074c..f8180e003 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -97,12 +97,20 @@ void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info *runstate) } } -struct domain *alloc_domain(void) +struct domain *alloc_domain(domid_t domid) { struct domain *d; - if ( (d = xmalloc(struct domain)) != NULL ) - memset(d, 0, sizeof(*d)); + if ( (d = xmalloc(struct domain)) == NULL ) + return NULL; + + memset(d, 0, sizeof(*d)); + d->domain_id = domid; + atomic_set(&d->refcnt, 1); + spin_lock_init(&d->big_lock); + spin_lock_init(&d->page_alloc_lock); + INIT_LIST_HEAD(&d->page_list); + INIT_LIST_HEAD(&d->xenpage_list); return d; } diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index f785429f8..e3edd7ae4 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -184,7 +184,7 @@ extern struct vcpu *idle_vcpu[NR_CPUS]; struct vcpu *alloc_vcpu( struct domain *d, unsigned int vcpu_id, unsigned int cpu_id); -struct domain *alloc_domain(void); +struct domain *alloc_domain(domid_t domid); void free_domain(struct domain *d); #define DOMAIN_DESTROYED (1<<31) /* assumes atomic_t is >= 32 bits */ @@ -221,7 +221,7 @@ static inline void get_knownalive_domain(struct domain *d) } extern struct domain *domain_create( - domid_t dom_id, unsigned int cpu); + domid_t domid, unsigned int cpu); extern int construct_dom0( struct domain *d, unsigned long image_start, unsigned long image_len, -- 2.39.5