aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-05-29 09:22:50 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-05-29 09:22:50 +0100
commit0e4debb7fa5c4aa063cafded36991230ff5dd18f (patch)
tree062f4c7d8f97da704b43d592728f277aa98cdaef
parent903b93211f568cb10fa90b7dc46f5caffb10df7d (diff)
downloadxen-0e4debb7fa5c4aa063cafded36991230ff5dd18f.tar.gz
xen-0e4debb7fa5c4aa063cafded36991230ff5dd18f.tar.bz2
xen-0e4debb7fa5c4aa063cafded36991230ff5dd18f.zip
Revert 19661:326b24bfa9f9 "Free pirq_to_evtchn/pirq_mask..."
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r--xen/common/domain.c11
-rw-r--r--xen/common/event_channel.c24
2 files changed, 12 insertions, 23 deletions
diff --git a/xen/common/domain.c b/xen/common/domain.c
index f51b83af81..1d3b4d6b58 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -261,6 +261,13 @@ struct domain *domain_create(
if ( evtchn_init(d) != 0 )
goto fail;
init_status |= INIT_evtchn;
+ d->pirq_to_evtchn = xmalloc_array(u16, d->nr_pirqs);
+ d->pirq_mask = xmalloc_array(unsigned long,
+ BITS_TO_LONGS(d->nr_pirqs));
+ if ( !d->pirq_to_evtchn || !d->pirq_mask )
+ goto fail;
+ memset(d->pirq_to_evtchn, 0, d->nr_pirqs * sizeof(*d->pirq_to_evtchn));
+ bitmap_zero(d->pirq_mask, d->nr_pirqs);
if ( grant_table_create(d) != 0 )
goto fail;
@@ -303,7 +310,11 @@ struct domain *domain_create(
if ( init_status & INIT_gnttab )
grant_table_destroy(d);
if ( init_status & INIT_evtchn )
+ {
+ xfree(d->pirq_mask);
+ xfree(d->pirq_to_evtchn);
evtchn_destroy(d);
+ }
if ( init_status & INIT_rangeset )
rangeset_domain_destroy(d);
if ( init_status & INIT_xsm )
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index f4ea79f4b2..c51fd10031 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -1013,27 +1013,10 @@ void notify_via_xen_event_channel(int lport)
int evtchn_init(struct domain *d)
{
spin_lock_init(&d->event_lock);
-
- d->pirq_to_evtchn = xmalloc_array(u16, d->nr_pirqs);
- d->pirq_mask = xmalloc_array(
- unsigned long, BITS_TO_LONGS(d->nr_pirqs));
- if ( (d->pirq_to_evtchn == NULL) || (d->pirq_mask == NULL) )
- goto fail;
- memset(d->pirq_to_evtchn, 0, d->nr_pirqs * sizeof(*d->pirq_to_evtchn));
- bitmap_zero(d->pirq_mask, d->nr_pirqs);
-
if ( get_free_port(d) != 0 )
- goto fail;
+ return -EINVAL;
evtchn_from_port(d, 0)->state = ECS_RESERVED;
-
return 0;
-
- fail:
- xfree(d->pirq_to_evtchn);
- d->pirq_to_evtchn = NULL;
- xfree(d->pirq_mask);
- d->pirq_mask = NULL;
- return -ENOMEM;
}
@@ -1061,11 +1044,6 @@ void evtchn_destroy(struct domain *d)
d->evtchn[i] = NULL;
}
spin_unlock(&d->event_lock);
-
- xfree(d->pirq_to_evtchn);
- d->pirq_to_evtchn = NULL;
- xfree(d->pirq_mask);
- d->pirq_mask = NULL;
}
static void domain_dump_evtchn_info(struct domain *d)