Message ID | 20160923142541.GB31510@mail-itl (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Marek Marczykowski-Górecki, on Fri 23 Sep 2016 16:25:41 +0200, wrote: > On Fri, Sep 23, 2016 at 03:27:07PM +0200, Samuel Thibault wrote: > > Marek Marczykowski-Górecki, on Fri 23 Sep 2016 10:48:14 +0200, wrote: > > > I'm still trying to get PCI passthrough working with stubdomain and > > > without qemu in dom0 (even for just vfb/vkbd backends). How is this > > > supposed to work? > > > > Just as I recall from my memory: > > > > > 1. Should xen-pcifront in the target domain be used (and consequently, > > > should xen-pciback be set for it)? > > > > I guess that could work. > > Could, or should? ;) I don't really remember, actually. I do remember doing some passthrough tests, but I don't remember the exact conditions. > In the meantime, I've found this in xen-pcifront driver: > > static int __init pcifront_init(void) > { > if (!xen_pv_domain() || xen_initial_domain()) > return -ENODEV; > > So, it looks like pcifront is not used in PV domain. ? I read it as disabling pcifront when used in an HVM or native domain, i.e. precisely used in PV domains. > > So the unfortunate thing is that when using stubdom, you'd have to set > > the pciback either on the guest (to run a PV driver in it), or on the > > stubdom (to run a plain driver in the guest, and let mini-os use PV to > > let qemu pass the board through) > > I've tried only on Linux HVM guest and as noted above xen-pcifront > doesn't look to be involved. Is it any different on other OSes? I don't know, perhaps it's different on windows. Or perhaps for windows we just rely on the qemu pass-through. > Toolstack during (stub)domain startup setup two things, mostly > asynchronously: > 1. pciback/pcifront (through standard xenstore entries) > 2. instruct qemu to attach device (by writing "pci-ins" to > device-model/xxx/command) Ah, since pcifront_watches runs in a separate thread, it may not have called init_pcifront before qemu calls libpci, i.e. pcifront_scan. I'd say that's where the fix should be: make pcifront_scan wait for init_pcifront to be done. It's however not so simple: we want to make pcifront_scan do nothing if no pciback is to be launched. My memory is rusty: is there something we are sure will show up in the xenstore when a pciback is to be launched? If so, pcifront_scan could do this: wait for pcifront_watches to have checked for the potential presence of pciback. If pciback is not to be started, just do nothing; if pciback is to be started, wait for init_pcifront to have been called by pcifront_watches. Then it will find the devices. Samuel
On Fri, Sep 23, 2016 at 04:25:41PM +0200, Marek Marczykowski-Górecki wrote: > On Fri, Sep 23, 2016 at 03:27:07PM +0200, Samuel Thibault wrote: > > Marek Marczykowski-Górecki, on Fri 23 Sep 2016 10:48:14 +0200, wrote: > > > I'm still trying to get PCI passthrough working with stubdomain and > > > without qemu in dom0 (even for just vfb/vkbd backends). How is this > > > supposed to work? > > > > Just as I recall from my memory: > > > > > 1. Should xen-pcifront in the target domain be used (and consequently, > > > should xen-pciback be set for it)? > > > > I guess that could work. > > Could, or should? ;) > > In the meantime, I've found this in xen-pcifront driver: > > static int __init pcifront_init(void) > { > if (!xen_pv_domain() || xen_initial_domain()) > return -ENODEV; > > So, it looks like pcifront is not used in PV domain. You mean in HVM domains.
On Fri, Sep 23, 2016 at 11:35:27AM -0400, Konrad Rzeszutek Wilk wrote: > On Fri, Sep 23, 2016 at 04:25:41PM +0200, Marek Marczykowski-Górecki wrote: > > On Fri, Sep 23, 2016 at 03:27:07PM +0200, Samuel Thibault wrote: > > > Marek Marczykowski-Górecki, on Fri 23 Sep 2016 10:48:14 +0200, wrote: > > > > I'm still trying to get PCI passthrough working with stubdomain and > > > > without qemu in dom0 (even for just vfb/vkbd backends). How is this > > > > supposed to work? > > > > > > Just as I recall from my memory: > > > > > > > 1. Should xen-pcifront in the target domain be used (and consequently, > > > > should xen-pciback be set for it)? > > > > > > I guess that could work. > > > > Could, or should? ;) > > > > In the meantime, I've found this in xen-pcifront driver: > > > > static int __init pcifront_init(void) > > { > > if (!xen_pv_domain() || xen_initial_domain()) > > return -ENODEV; > > > > So, it looks like pcifront is not used in PV domain. > > You mean in HVM domains. Of course.
On Fri, Sep 23, 2016 at 04:51:33PM +0200, Samuel Thibault wrote: > Marek Marczykowski-Górecki, on Fri 23 Sep 2016 16:25:41 +0200, wrote: > > Toolstack during (stub)domain startup setup two things, mostly > > asynchronously: > > 1. pciback/pcifront (through standard xenstore entries) > > 2. instruct qemu to attach device (by writing "pci-ins" to > > device-model/xxx/command) > > Ah, since pcifront_watches runs in a separate thread, it may not have > called init_pcifront before qemu calls libpci, i.e. pcifront_scan. Yes, exactly. > I'd say that's where the fix should be: make pcifront_scan wait for > init_pcifront to be done. It's however not so simple: we want to make > pcifront_scan do nothing if no pciback is to be launched. My memory is > rusty: is there something we are sure will show up in the xenstore when > a pciback is to be launched? If so, pcifront_scan could do this: wait > for pcifront_watches to have checked for the potential presence of > pciback. If pciback is not to be started, just do nothing; if pciback is > to be started, wait for init_pcifront to have been called by > pcifront_watches. Then it will find the devices. Ok. So, two questions: 1. How to do this? ;) I.e. what synchronization primitives are available in mini-os? Just pthread_mutex_lock/unlock? 2. Wouldn't the same problem be with other stubdomain implementations? Like Linux + qemu-xen or rumprun + qemu-xen? At least in Linux case pcifront driver will also needs some time for initialization...
Marek Marczykowski-Górecki, on Fri 23 Sep 2016 20:56:43 +0200, wrote: > 1. How to do this? ;) I.e. what synchronization primitives are available > in mini-os? Just pthread_mutex_lock/unlock? pthread_mutex_lock are nops :o) because we don't have pthread_create. But for mini-os itself there are synchronization primitives, yes: there are also semaphores (./include/semaphore.h) and waitqueues (include/wait.h). > 2. Wouldn't the same problem be with other stubdomain implementations? > Like Linux + qemu-xen or rumprun + qemu-xen? At least in Linux case > pcifront driver will also needs some time for initialization... Possibly, I don't know about them, they didn't exist at the time ;) Samuel
On Fri, Sep 23, 2016 at 11:00:42PM +0200, Samuel Thibault wrote: > Marek Marczykowski-Górecki, on Fri 23 Sep 2016 20:56:43 +0200, wrote: > > 1. How to do this? ;) I.e. what synchronization primitives are available > > in mini-os? Just pthread_mutex_lock/unlock? > > pthread_mutex_lock are nops :o) because we don't have pthread_create. > But for mini-os itself there are synchronization primitives, yes: > there are also semaphores (./include/semaphore.h) and waitqueues > (include/wait.h). Ok, will take a look at this. Thanks. > > 2. Wouldn't the same problem be with other stubdomain implementations? > > Like Linux + qemu-xen or rumprun + qemu-xen? At least in Linux case > > pcifront driver will also needs some time for initialization... > > Possibly, I don't know about them, they didn't exist at the time ;) Actually they don't exist even now ;) But hopefully will, in the near future...
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index c6862b8..5625ef2 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -1429,7 +1429,7 @@ static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev, } } - if (d_config->num_pcidevs > 0) { + if (d_config->num_pcidevs > 0 && d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV) { ret = libxl__create_pci_backend(gc, domid, d_config->pcidevs, d_config->num_pcidevs); if (ret < 0) { diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 19c597e..2942772 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -1001,7 +1001,7 @@ out: } } - if (!starting) + if (!starting && !hvm) rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); else rc = 0;