]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
mini-os: do not wait for pci backend in pcifront_scan
authorIan Campbell <ian.campbell@citrix.com>
Fri, 9 Dec 2011 12:01:17 +0000 (12:01 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Fri, 9 Dec 2011 12:01:17 +0000 (12:01 +0000)
This blocks the main thread indefinitely if there is no PCI backend present in
xenstore.

Even in the case where there are passthrough devices configured libxl creates
the stubdom and waits for it to startup _before_ adding the backend. Since the
stub domains main thread is blocked before it can write the "running" state to
xenstore the toolstack eventually times out and kills everything.

There is already a separate pcifront thread which waits for the backend to
appear and calls init_pcifront at the appropriate time should a backend ever
appear.

Unfortunately I don't have any free test boxes with VT-d so I haven't been able
to test the cases where PCI deivces are passed through but I obviously have
tested that I can now start an HVM domain with stub qemu without PCI devices
passed through which I couldn't do before so this is an improvement. This stuff
is a bit like pushing the lump around the carpet :-/

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson.citrix.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
kernel.c
pcifront.c

index 1feb87b1980f027e9c2ae33d91c07f194bf7ce35..2875bf138ed818413dfb572434a2dd077601fb37 100644 (file)
--- a/kernel.c
+++ b/kernel.c
@@ -448,6 +448,7 @@ static void print_pcidev(unsigned int domain, unsigned int bus, unsigned int slo
 
 static void pcifront_thread(void *p)
 {
+    pcifront_watches(NULL);
     pci_dev = init_pcifront(NULL);
     if (!pci_dev)
         return;
index 889d7012710a89e7212c77638d3464c9ffb41071..a5f554cbc7fc631bbdf61e0e66f79c6c690f56e7 100644 (file)
@@ -280,23 +280,14 @@ void pcifront_scan(struct pcifront_dev *dev, void (*func)(unsigned int domain, u
 {
     char *path;
     int i, n, len;
-    char *s, *msg = NULL, *err = NULL;
+    char *s, *msg = NULL;
     unsigned int domain, bus, slot, fun;
 
     if (!dev)
         dev = pcidev;
     if (!dev) {
-        xenbus_event_queue events = NULL;
-        char *fe_state = "device/pci/0/state";
-        xenbus_watch_path_token(XBT_NIL, fe_state, fe_state, &events);
-        while ((err = xenbus_read(XBT_NIL, fe_state, &msg)) != NULL || msg[0] != '4') {
-            free(msg);
-            free(err);
-            printk("pcifront_scan: waiting for pcifront to become ready\n");
-            xenbus_wait_for_watch(&events);
-        }
-        xenbus_unwatch_path_token(XBT_NIL, fe_state, fe_state);
-        dev = pcidev;
+       printk("pcifront_scan: device or bus\n");
+       return;
     }
 
     len = strlen(dev->backend) + 1 + 5 + 10 + 1;