aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-12-09 12:01:17 +0000
committerIan Campbell <ian.campbell@citrix.com>2011-12-09 12:01:17 +0000
commit0d819a81abd35d31a3377ec23c356e590d3d4c88 (patch)
tree2cfe72857cfce73754920b7e07c5b3958709f853 /extras
parente53a33568d4127852dc272873cdcda8da8c14239 (diff)
downloadxen-0d819a81abd35d31a3377ec23c356e590d3d4c88.tar.gz
xen-0d819a81abd35d31a3377ec23c356e590d3d4c88.tar.bz2
xen-0d819a81abd35d31a3377ec23c356e590d3d4c88.zip
mini-os: do not wait for pci backend in pcifront_scan
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>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/kernel.c1
-rw-r--r--extras/mini-os/pcifront.c15
2 files changed, 4 insertions, 12 deletions
diff --git a/extras/mini-os/kernel.c b/extras/mini-os/kernel.c
index 1feb87b198..2875bf138e 100644
--- a/extras/mini-os/kernel.c
+++ b/extras/mini-os/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;
diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c
index 889d701271..a5f554cbc7 100644
--- a/extras/mini-os/pcifront.c
+++ b/extras/mini-os/pcifront.c
@@ -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;