]> xenbits.xensource.com Git - xen.git/commitdiff
evtchn: Free pirq_to_evtchn/pirq_mask arrays on domain destruction.
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 27 May 2009 13:03:09 +0000 (14:03 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 27 May 2009 13:03:09 +0000 (14:03 +0100)
At the same time, move this into evtchn_init/destroy().

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/common/domain.c
xen/common/event_channel.c

index 1d3b4d6b5868b98bf24480ce44c3bcd1fae321bb..f51b83af817c17a0e07f8bee9a55f13a8d6d5115 100644 (file)
@@ -261,13 +261,6 @@ 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;
@@ -310,11 +303,7 @@ 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 )
index c51fd1003118b699d6dacf593385c54553c86f6e..f4ea79f4b23e130d38a65028f19871d06cd3b0c9 100644 (file)
@@ -1013,10 +1013,27 @@ 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 )
-        return -EINVAL;
+        goto fail;
     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;
 }
 
 
@@ -1044,6 +1061,11 @@ 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)