]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
xenconsoled: Fixes to domain management.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 20 Apr 2009 14:38:29 +0000 (15:38 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 20 Apr 2009 14:38:29 +0000 (15:38 +0100)
Event-channel setup: Re-bind if the connection becomes unbound (e.g.,
due to 'slow' domain suspend cancellation), even if the remote port
identifier has not changed.

Domain logging: Only open log file once (don't leak fds) and fix a
small memory leak.

Evtchn changes based on a patch by Jiri Denemark <jdenemar@redhat.com>

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
tools/console/daemon/io.c

index de712affe3ee8e990a7c04abbb48c6908672154c..2475963a5819931e2917d985811f38ee76b48174 100644 (file)
@@ -288,6 +288,7 @@ static int create_domain_log(struct domain *dom)
        namepath = s;
        strcat(namepath, "/name");
        data = xs_read(xs, XBT_NULL, namepath, &len);
+       free(namepath);
        if (!data)
                return -1;
        if (!len) {
@@ -548,9 +549,6 @@ static int domain_create_ring(struct domain *dom)
        }
        free(type);
 
-       if ((ring_ref == dom->ring_ref) && (remote_port == dom->remote_port))
-               goto out;
-
        if (ring_ref != dom->ring_ref) {
                if (dom->interface != NULL)
                        munmap(dom->interface, getpagesize());
@@ -565,6 +563,16 @@ static int domain_create_ring(struct domain *dom)
                dom->ring_ref = ring_ref;
        }
 
+       /* Go no further if port has not changed and we are still bound. */
+       if (remote_port == dom->remote_port) {
+               xc_evtchn_status_t status = {
+                       .dom = DOMID_SELF,
+                       .port = dom->local_port };
+               if ((xc_evtchn_status(xc, &status) == 0) &&
+                   (status.status == EVTCHNSTAT_interdomain))
+                       goto out;
+       }
+
        dom->local_port = -1;
        dom->remote_port = -1;
        if (dom->xce_handle != -1)
@@ -601,7 +609,7 @@ static int domain_create_ring(struct domain *dom)
                }
        }
 
-       if (log_guest)
+       if (log_guest && (dom->log_fd == -1))
                dom->log_fd = create_domain_log(dom);
 
  out: