* [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices @ 2012-05-25 7:35 Alexey Kardashevskiy 2012-05-25 8:28 ` Benjamin Herrenschmidt ` (2 more replies) 0 siblings, 3 replies; 14+ messages in thread From: Alexey Kardashevskiy @ 2012-05-25 7:35 UTC (permalink / raw) To: Alex Williamson; +Cc: kvm, qemu-devel, Alex Graf, David Gibson Some adapters (like NEC PCI USB controller) do not flush their config on a sioftware reset and remember DMA config, etc. If we use such an adapter with QEMU, then crash QEMU (stop it with ctrl-A ctrl-X), and try to use it in QEMU again, it may start working immediately with previous config when pci_enable_device() is called on that PCI function. To eliminate such effect, some quirk should be called. The proposed pci_fixup_final does its job well for mentioned NEC PCI USB but not sure if it is 100% correct. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> --- drivers/vfio/pci/vfio_pci.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 1e5315c..6e7c12d 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev) { int bar; + pci_fixup_device(pci_fixup_final, vdev->pdev); + pci_disable_device(vdev->pdev); vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | -- 1.7.7.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-25 7:35 [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices Alexey Kardashevskiy @ 2012-05-25 8:28 ` Benjamin Herrenschmidt 2012-05-25 12:24 ` Alex Williamson 2012-05-28 12:44 ` Michael S. Tsirkin 2012-06-06 23:17 ` Alex Williamson 2 siblings, 1 reply; 14+ messages in thread From: Benjamin Herrenschmidt @ 2012-05-25 8:28 UTC (permalink / raw) To: Alexey Kardashevskiy Cc: qemu-devel, Alex Williamson, Alex Graf, kvm, David Gibson On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: > Some adapters (like NEC PCI USB controller) do not flush their config > on a sioftware reset and remember DMA config, etc. > > If we use such an adapter with QEMU, then crash QEMU (stop it with > ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > immediately with previous config when pci_enable_device() is called > on that PCI function. > > To eliminate such effect, some quirk should be called. The proposed > pci_fixup_final does its job well for mentioned NEC PCI USB but not > sure if it is 100% correct. I think we should create a new quirk category... call it pci_fixup_reset or something like that, which is responsible for blasting the thing into submission when ownership changes. We'll need these for more than just USB I suspect. Cheers, Ben. > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > drivers/vfio/pci/vfio_pci.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index 1e5315c..6e7c12d 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev) > { > int bar; > > + pci_fixup_device(pci_fixup_final, vdev->pdev); > + > pci_disable_device(vdev->pdev); > > vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-25 8:28 ` Benjamin Herrenschmidt @ 2012-05-25 12:24 ` Alex Williamson 2012-05-25 12:36 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 14+ messages in thread From: Alex Williamson @ 2012-05-25 12:24 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: Alexey Kardashevskiy, qemu-devel, Alex Graf, kvm, David Gibson On Fri, 2012-05-25 at 18:28 +1000, Benjamin Herrenschmidt wrote: > On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: > > Some adapters (like NEC PCI USB controller) do not flush their config > > on a sioftware reset and remember DMA config, etc. > > > > If we use such an adapter with QEMU, then crash QEMU (stop it with > > ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > > immediately with previous config when pci_enable_device() is called > > on that PCI function. > > > > To eliminate such effect, some quirk should be called. The proposed > > pci_fixup_final does its job well for mentioned NEC PCI USB but not > > sure if it is 100% correct. > > I think we should create a new quirk category... call it pci_fixup_reset > or something like that, which is responsible for blasting the thing into > submission when ownership changes. > > We'll need these for more than just USB I suspect. We already have pci_dev_specific_reset() called from pci_dev_reset(). Does this device support any of the standard reset mechanisms? It would be nice to know what within the final fixups keeps this device working. Thanks, Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-25 12:24 ` Alex Williamson @ 2012-05-25 12:36 ` Benjamin Herrenschmidt 0 siblings, 0 replies; 14+ messages in thread From: Benjamin Herrenschmidt @ 2012-05-25 12:36 UTC (permalink / raw) To: Alex Williamson Cc: Alexey Kardashevskiy, qemu-devel, Alex Graf, kvm, David Gibson On Fri, 2012-05-25 at 06:24 -0600, Alex Williamson wrote: > > > To eliminate such effect, some quirk should be called. The > proposed > > > pci_fixup_final does its job well for mentioned NEC PCI USB but > not > > > sure if it is 100% correct. > > > > I think we should create a new quirk category... call it > pci_fixup_reset > > or something like that, which is responsible for blasting the thing > into > > submission when ownership changes. > > > > We'll need these for more than just USB I suspect. > > We already have pci_dev_specific_reset() called from pci_dev_reset(). > Does this device support any of the standard reset mechanisms? It > would > be nice to know what within the final fixups keeps this device > working. > Thanks, Well, HW is HW ... it's going to be broken one way or another. Reset is no exception, and we already have a way to deal with that sort of breakage via the quirks. They are already divided in several categories (early, normal, final, ...), I suggest we just add one for reset. No point re-inventing a callback mechanism when we already have one. Cheers, Ben. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-25 7:35 [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices Alexey Kardashevskiy 2012-05-25 8:28 ` Benjamin Herrenschmidt @ 2012-05-28 12:44 ` Michael S. Tsirkin 2012-05-28 12:48 ` Jan Kiszka 2012-06-06 23:17 ` Alex Williamson 2 siblings, 1 reply; 14+ messages in thread From: Michael S. Tsirkin @ 2012-05-28 12:44 UTC (permalink / raw) To: Alexey Kardashevskiy Cc: Alex Williamson, David Gibson, qemu-devel, kvm, Alex Graf On Fri, May 25, 2012 at 05:35:03PM +1000, Alexey Kardashevskiy wrote: > Some adapters (like NEC PCI USB controller) do not flush their config > on a sioftware reset and remember DMA config, etc. > > If we use such an adapter with QEMU, then crash QEMU (stop it with > ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > immediately with previous config when pci_enable_device() is called > on that PCI function. > > To eliminate such effect, some quirk should be called. The proposed > pci_fixup_final does its job well for mentioned NEC PCI USB but not > sure if it is 100% correct. > > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Won't current kvm device assignment be affected by this? If yes need to address that not just vfio. > --- > drivers/vfio/pci/vfio_pci.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index 1e5315c..6e7c12d 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev) > { > int bar; > > + pci_fixup_device(pci_fixup_final, vdev->pdev); > + > pci_disable_device(vdev->pdev); > > vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > -- > 1.7.7.3 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-28 12:44 ` Michael S. Tsirkin @ 2012-05-28 12:48 ` Jan Kiszka 2012-05-28 13:15 ` Michael S. Tsirkin 0 siblings, 1 reply; 14+ messages in thread From: Jan Kiszka @ 2012-05-28 12:48 UTC (permalink / raw) To: Michael S. Tsirkin Cc: kvm, Alexey Kardashevskiy, qemu-devel, Alex Graf, Alex Williamson, David Gibson [-- Attachment #1: Type: text/plain, Size: 929 bytes --] On 2012-05-28 14:44, Michael S. Tsirkin wrote: > On Fri, May 25, 2012 at 05:35:03PM +1000, Alexey Kardashevskiy wrote: >> Some adapters (like NEC PCI USB controller) do not flush their config >> on a sioftware reset and remember DMA config, etc. >> >> If we use such an adapter with QEMU, then crash QEMU (stop it with >> ctrl-A ctrl-X), and try to use it in QEMU again, it may start working >> immediately with previous config when pci_enable_device() is called >> on that PCI function. >> >> To eliminate such effect, some quirk should be called. The proposed >> pci_fixup_final does its job well for mentioned NEC PCI USB but not >> sure if it is 100% correct. >> >> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > > Won't current kvm device assignment be affected by this? Would be surprising if not. > If yes need to address that not just vfio. A reason to solve this at PCI level? Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 262 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-28 12:48 ` Jan Kiszka @ 2012-05-28 13:15 ` Michael S. Tsirkin 0 siblings, 0 replies; 14+ messages in thread From: Michael S. Tsirkin @ 2012-05-28 13:15 UTC (permalink / raw) To: Jan Kiszka Cc: kvm, Alexey Kardashevskiy, qemu-devel, Alex Graf, Alex Williamson, David Gibson On Mon, May 28, 2012 at 02:48:10PM +0200, Jan Kiszka wrote: > On 2012-05-28 14:44, Michael S. Tsirkin wrote: > > On Fri, May 25, 2012 at 05:35:03PM +1000, Alexey Kardashevskiy wrote: > >> Some adapters (like NEC PCI USB controller) do not flush their config > >> on a sioftware reset and remember DMA config, etc. > >> > >> If we use such an adapter with QEMU, then crash QEMU (stop it with > >> ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > >> immediately with previous config when pci_enable_device() is called > >> on that PCI function. > >> > >> To eliminate such effect, some quirk should be called. The proposed > >> pci_fixup_final does its job well for mentioned NEC PCI USB but not > >> sure if it is 100% correct. > >> > >> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > > > > Won't current kvm device assignment be affected by this? > > Would be surprising if not. > > > If yes need to address that not just vfio. > > A reason to solve this at PCI level? > > Jan > Sure, and I think this is what Benjamin Herren was suggesting. I just wanted to add another reason. -- MST ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-05-25 7:35 [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices Alexey Kardashevskiy 2012-05-25 8:28 ` Benjamin Herrenschmidt 2012-05-28 12:44 ` Michael S. Tsirkin @ 2012-06-06 23:17 ` Alex Williamson 2012-06-07 2:52 ` Benjamin Herrenschmidt 2012-06-22 8:16 ` Alexey Kardashevskiy 2 siblings, 2 replies; 14+ messages in thread From: Alex Williamson @ 2012-06-06 23:17 UTC (permalink / raw) To: Alexey Kardashevskiy; +Cc: qemu-devel, Alex Graf, kvm, David Gibson On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: > Some adapters (like NEC PCI USB controller) do not flush their config > on a sioftware reset and remember DMA config, etc. > > If we use such an adapter with QEMU, then crash QEMU (stop it with > ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > immediately with previous config when pci_enable_device() is called > on that PCI function. > > To eliminate such effect, some quirk should be called. The proposed > pci_fixup_final does its job well for mentioned NEC PCI USB but not > sure if it is 100% correct. > > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > drivers/vfio/pci/vfio_pci.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index 1e5315c..6e7c12d 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev) > { > int bar; > > + pci_fixup_device(pci_fixup_final, vdev->pdev); > + > pci_disable_device(vdev->pdev); > > vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | Sorry, just taking a look at this again. Do you have any idea what fixup it is that makes it work? Calling a fixup at this point seems rather odd. I suspect the problem is that vfio is only calling pci_load_and_free_saved_state if pci_reset_function reports that it worked. kvm device assignment doesn't do that and I'm not sure why I did that. If you unconditionally call pci_load_and_free_saved_state a bit further down in this function, does it solve the problem? Thanks, Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-06-06 23:17 ` Alex Williamson @ 2012-06-07 2:52 ` Benjamin Herrenschmidt 2012-06-07 3:56 ` Alex Williamson 2012-06-22 8:16 ` Alexey Kardashevskiy 1 sibling, 1 reply; 14+ messages in thread From: Benjamin Herrenschmidt @ 2012-06-07 2:52 UTC (permalink / raw) To: Alex Williamson Cc: Alexey Kardashevskiy, qemu-devel, Alex Graf, kvm, David Gibson On Wed, 2012-06-06 at 17:17 -0600, Alex Williamson wrote: > > diff --git a/drivers/vfio/pci/vfio_pci.c > b/drivers/vfio/pci/vfio_pci.c > > index 1e5315c..6e7c12d 100644 > > --- a/drivers/vfio/pci/vfio_pci.c > > +++ b/drivers/vfio/pci/vfio_pci.c > > @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct > vfio_pci_device *vdev) > > { > > int bar; > > > > + pci_fixup_device(pci_fixup_final, vdev->pdev); > > + > > pci_disable_device(vdev->pdev); > > > > vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > > Sorry, just taking a look at this again. Do you have any idea what > fixup it is that makes it work? Calling a fixup at this point seems > rather odd. I suspect the problem is that vfio is only calling > pci_load_and_free_saved_state if pci_reset_function reports that it > worked. kvm device assignment doesn't do that and I'm not sure why I > did that. If you unconditionally call pci_load_and_free_saved_state a > bit further down in this function, does it solve the problem? No it won't do, you need device-specific "reset" fixup code for devices where the function reset doesn't do the right thing. My suggestion is to add a new quirk category (in addition to early,late,... add reset) and call that here. Then we can do one for the NEC OHCI that properly stops the controller, among others. I would be -very- surprised if that chip ends up being the only one causing that sort of trouble. Also, some chips will need some "tweaks" after the reset, for example if we do a full link reset, I know of at least one device that might randomly fail to properly train the PCIe link, such a quirk is a perfect spot to add the right fixup. Cheers, Ben. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-06-07 2:52 ` Benjamin Herrenschmidt @ 2012-06-07 3:56 ` Alex Williamson 2012-06-07 4:37 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 14+ messages in thread From: Alex Williamson @ 2012-06-07 3:56 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: Alexey Kardashevskiy, David Gibson, qemu-devel, kvm, Alex Graf On Thu, 2012-06-07 at 12:52 +1000, Benjamin Herrenschmidt wrote: > On Wed, 2012-06-06 at 17:17 -0600, Alex Williamson wrote: > > > diff --git a/drivers/vfio/pci/vfio_pci.c > > b/drivers/vfio/pci/vfio_pci.c > > > index 1e5315c..6e7c12d 100644 > > > --- a/drivers/vfio/pci/vfio_pci.c > > > +++ b/drivers/vfio/pci/vfio_pci.c > > > @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct > > vfio_pci_device *vdev) > > > { > > > int bar; > > > > > > + pci_fixup_device(pci_fixup_final, vdev->pdev); > > > + > > > pci_disable_device(vdev->pdev); > > > > > > vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > > > > Sorry, just taking a look at this again. Do you have any idea what > > fixup it is that makes it work? Calling a fixup at this point seems > > rather odd. I suspect the problem is that vfio is only calling > > pci_load_and_free_saved_state if pci_reset_function reports that it > > worked. kvm device assignment doesn't do that and I'm not sure why I > > did that. If you unconditionally call pci_load_and_free_saved_state a > > bit further down in this function, does it solve the problem? > > No it won't do, you need device-specific "reset" fixup code for devices > where the function reset doesn't do the right thing. > > My suggestion is to add a new quirk category (in addition to > early,late,... add reset) and call that here. > > Then we can do one for the NEC OHCI that properly stops the controller, > among others. I would be -very- surprised if that chip ends up being the > only one causing that sort of trouble. > > Also, some chips will need some "tweaks" after the reset, for example if > we do a full link reset, I know of at least one device that might > randomly fail to properly train the PCIe link, such a quirk is a perfect > spot to add the right fixup. In so far as vfio should only have to call pci_reset_function and device quirks take care of everything else, I agree with you, but that doesn't answer any of my questions. Sure, we may want pre- and post-reset fixup quirks and a pony, but what quirk is actually necessary for this device? Does it fit into the existing pci_dev_specific_reset quirking? Reloading config space isn't a good generic solution, but it might at least shed some light on whether the reset function is doing anything and if a simple config space change fixes it. VFIO needs to do this anyway. Thanks, Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-06-07 3:56 ` Alex Williamson @ 2012-06-07 4:37 ` Benjamin Herrenschmidt 0 siblings, 0 replies; 14+ messages in thread From: Benjamin Herrenschmidt @ 2012-06-07 4:37 UTC (permalink / raw) To: Alex Williamson Cc: Alexey Kardashevskiy, David Gibson, qemu-devel, kvm, Alex Graf On Wed, 2012-06-06 at 21:56 -0600, Alex Williamson wrote: > In so far as vfio should only have to call pci_reset_function and > device > quirks take care of everything else, I agree with you, but that > doesn't > answer any of my questions. Sure, we may want pre- and post-reset > fixup > quirks and a pony, but what quirk is actually necessary for this > device? > Does it fit into the existing pci_dev_specific_reset quirking? > Reloading config space isn't a good generic solution, but it might at > least shed some light on whether the reset function is doing anything > and if a simple config space change fixes it. VFIO needs to do this > anyway. Thanks, Knowing those NEC OHCI critters I suspect it just continues DMA'ing as usual and just ignores the reset... not sure what the actual setup is though, those are PCI 2.x devices behind a PCI-E to PCI-X bridge, so I'm not even sure they support a semi-decent reset. We might want to even tell the bridge to hard reset what's behind it in that case (everything is one isolation group behind that bridge anyway) but that has its own problems (CSR unreliability, need for extra delays, need to reconfigure the whole config space etc....) Cheers, Ben. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-06-06 23:17 ` Alex Williamson 2012-06-07 2:52 ` Benjamin Herrenschmidt @ 2012-06-22 8:16 ` Alexey Kardashevskiy 2012-08-17 14:28 ` Alexey Kardashevskiy 1 sibling, 1 reply; 14+ messages in thread From: Alexey Kardashevskiy @ 2012-06-22 8:16 UTC (permalink / raw) To: Alex Williamson; +Cc: qemu-devel, Alex Graf, kvm, David Gibson On 07/06/12 09:17, Alex Williamson wrote: > On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: >> Some adapters (like NEC PCI USB controller) do not flush their config >> on a sioftware reset and remember DMA config, etc. >> >> If we use such an adapter with QEMU, then crash QEMU (stop it with >> ctrl-A ctrl-X), and try to use it in QEMU again, it may start working >> immediately with previous config when pci_enable_device() is called >> on that PCI function. >> >> To eliminate such effect, some quirk should be called. The proposed >> pci_fixup_final does its job well for mentioned NEC PCI USB but not >> sure if it is 100% correct. >> >> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> >> --- >> drivers/vfio/pci/vfio_pci.c | 2 ++ >> 1 files changed, 2 insertions(+), 0 deletions(-) >> >> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c >> index 1e5315c..6e7c12d 100644 >> --- a/drivers/vfio/pci/vfio_pci.c >> +++ b/drivers/vfio/pci/vfio_pci.c >> @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev) >> { >> int bar; >> >> + pci_fixup_device(pci_fixup_final, vdev->pdev); >> + >> pci_disable_device(vdev->pdev); >> >> vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > > Sorry, just taking a look at this again. Do you have any idea what > fixup it is that makes it work? Calling a fixup at this point seems > rather odd. I suspect the problem is that vfio is only calling > pci_load_and_free_saved_state if pci_reset_function reports that it > worked. kvm device assignment doesn't do that and I'm not sure why I > did that. If you unconditionally call pci_load_and_free_saved_state a > bit further down in this function, does it solve the problem? Thanks, Checked again. Seems to be a false alarm, cannot reproduce the bad behavior anymore, looks like it was caused by another issue which Alex fixed. So although the problem may arise again, there is nothing urgent to do at the moment. -- Alexey ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-06-22 8:16 ` Alexey Kardashevskiy @ 2012-08-17 14:28 ` Alexey Kardashevskiy 2012-08-21 2:31 ` Alex Williamson 0 siblings, 1 reply; 14+ messages in thread From: Alexey Kardashevskiy @ 2012-08-17 14:28 UTC (permalink / raw) To: Alex Williamson; +Cc: kvm, aik, qemu-devel, Alex Graf, qemu-ppc, David Gibson [-- Attachment #1: Type: text/plain, Size: 3117 bytes --] On Fri, Jun 22, 2012 at 6:16 PM, Alexey Kardashevskiy <aik@ozlabs.ru> wrote: > On 07/06/12 09:17, Alex Williamson wrote: > > On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: > >> Some adapters (like NEC PCI USB controller) do not flush their config > >> on a sioftware reset and remember DMA config, etc. > >> > >> If we use such an adapter with QEMU, then crash QEMU (stop it with > >> ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > >> immediately with previous config when pci_enable_device() is called > >> on that PCI function. > >> > >> To eliminate such effect, some quirk should be called. The proposed > >> pci_fixup_final does its job well for mentioned NEC PCI USB but not > >> sure if it is 100% correct. > >> > >> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > >> --- > >> drivers/vfio/pci/vfio_pci.c | 2 ++ > >> 1 files changed, 2 insertions(+), 0 deletions(-) > >> > >> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > >> index 1e5315c..6e7c12d 100644 > >> --- a/drivers/vfio/pci/vfio_pci.c > >> +++ b/drivers/vfio/pci/vfio_pci.c > >> @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device > *vdev) > >> { > >> int bar; > >> > >> + pci_fixup_device(pci_fixup_final, vdev->pdev); > >> + > >> pci_disable_device(vdev->pdev); > >> > >> vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > > > > Sorry, just taking a look at this again. Do you have any idea what > > fixup it is that makes it work? Calling a fixup at this point seems > > rather odd. I suspect the problem is that vfio is only calling > > pci_load_and_free_saved_state if pci_reset_function reports that it > > worked. kvm device assignment doesn't do that and I'm not sure why I > > did that. If you unconditionally call pci_load_and_free_saved_state a > > bit further down in this function, does it solve the problem? Thanks, > > > Checked again. > > Seems to be a false alarm, cannot reproduce the bad behavior anymore, > looks like it was caused by > another issue which Alex fixed. > > So although the problem may arise again, there is nothing urgent to do at > the moment. > > While doing cleanups in my SPAPR IOMMU driver for VFIO, I found that I have not unmapped all the pages on module_exit. Heh. My bad. So I implemented that and got a lot of strange accidental crashes of the host kernel when I tried to debug "USB Controller: NEC Corporation USB (rev 43)". I applied the quoted patch and it has gone. You asked what fixup exactly does but honestly I do not know. >From the code, it enables a device, does some tricks in quirk_usb_handoff_ohci()/quirk_usb_disable_ehci() and disables the device back. The comments of these quirks say that they basically disable interrupts and do shutdown/reset via OHCI/EHCI specific registers as pci_disable_device() does not do the job like it does not reset the device's DMA config so when it gets enabled back, it continues DMA transfer to/from addresses which were actual at the moment of QEMU shutdown/group release. So do we add a new class of quirks? -- Alexey [-- Attachment #2: Type: text/html, Size: 3933 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices 2012-08-17 14:28 ` Alexey Kardashevskiy @ 2012-08-21 2:31 ` Alex Williamson 0 siblings, 0 replies; 14+ messages in thread From: Alex Williamson @ 2012-08-21 2:31 UTC (permalink / raw) To: Alexey Kardashevskiy; +Cc: kvm, qemu-devel, Alex Graf, qemu-ppc, David Gibson On Sat, 2012-08-18 at 00:28 +1000, Alexey Kardashevskiy wrote: > On Fri, Jun 22, 2012 at 6:16 PM, Alexey Kardashevskiy <aik@ozlabs.ru> wrote: > > > On 07/06/12 09:17, Alex Williamson wrote: > > > On Fri, 2012-05-25 at 17:35 +1000, Alexey Kardashevskiy wrote: > > >> Some adapters (like NEC PCI USB controller) do not flush their config > > >> on a sioftware reset and remember DMA config, etc. > > >> > > >> If we use such an adapter with QEMU, then crash QEMU (stop it with > > >> ctrl-A ctrl-X), and try to use it in QEMU again, it may start working > > >> immediately with previous config when pci_enable_device() is called > > >> on that PCI function. > > >> > > >> To eliminate such effect, some quirk should be called. The proposed > > >> pci_fixup_final does its job well for mentioned NEC PCI USB but not > > >> sure if it is 100% correct. > > >> > > >> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > > >> --- > > >> drivers/vfio/pci/vfio_pci.c | 2 ++ > > >> 1 files changed, 2 insertions(+), 0 deletions(-) > > >> > > >> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > > >> index 1e5315c..6e7c12d 100644 > > >> --- a/drivers/vfio/pci/vfio_pci.c > > >> +++ b/drivers/vfio/pci/vfio_pci.c > > >> @@ -88,6 +88,8 @@ static void vfio_pci_disable(struct vfio_pci_device > > *vdev) > > >> { > > >> int bar; > > >> > > >> + pci_fixup_device(pci_fixup_final, vdev->pdev); > > >> + > > >> pci_disable_device(vdev->pdev); > > >> > > >> vfio_pci_set_irqs_ioctl(vdev, VFIO_IRQ_SET_DATA_NONE | > > > > > > Sorry, just taking a look at this again. Do you have any idea what > > > fixup it is that makes it work? Calling a fixup at this point seems > > > rather odd. I suspect the problem is that vfio is only calling > > > pci_load_and_free_saved_state if pci_reset_function reports that it > > > worked. kvm device assignment doesn't do that and I'm not sure why I > > > did that. If you unconditionally call pci_load_and_free_saved_state a > > > bit further down in this function, does it solve the problem? Thanks, > > > > > > Checked again. > > > > Seems to be a false alarm, cannot reproduce the bad behavior anymore, > > looks like it was caused by > > another issue which Alex fixed. > > > > So although the problem may arise again, there is nothing urgent to do at > > the moment. > > > > > While doing cleanups in my SPAPR IOMMU driver for VFIO, > I found that I have not unmapped all the pages on module_exit. > Heh. My bad. So I implemented that and got a lot of strange accidental > crashes of the host kernel when I tried to debug > "USB Controller: NEC Corporation USB (rev 43)". > I applied the quoted patch and it has gone. > > You asked what fixup exactly does but honestly I do not know. > From the code, it enables a device, does some tricks in > quirk_usb_handoff_ohci()/quirk_usb_disable_ehci() and > disables the device back. The comments of these quirks > say that they basically disable interrupts and do shutdown/reset > via OHCI/EHCI specific registers as pci_disable_device() does > not do the job like it does not reset the device's DMA config so when > it gets enabled back, it continues DMA transfer to/from addresses > which were actual at the moment of QEMU shutdown/group release. > > So do we add a new class of quirks? Sounds like a device specific (or maybe class specific) reset to me. I don't think we have any business directly calling PCI quirks from VFIO code. Let's make pci_reset_function do what it takes to settle the device. Thanks, Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2012-08-21 2:31 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-05-25 7:35 [Qemu-devel] [RFC PATCH] vfio: add fixup for broken PCI devices Alexey Kardashevskiy 2012-05-25 8:28 ` Benjamin Herrenschmidt 2012-05-25 12:24 ` Alex Williamson 2012-05-25 12:36 ` Benjamin Herrenschmidt 2012-05-28 12:44 ` Michael S. Tsirkin 2012-05-28 12:48 ` Jan Kiszka 2012-05-28 13:15 ` Michael S. Tsirkin 2012-06-06 23:17 ` Alex Williamson 2012-06-07 2:52 ` Benjamin Herrenschmidt 2012-06-07 3:56 ` Alex Williamson 2012-06-07 4:37 ` Benjamin Herrenschmidt 2012-06-22 8:16 ` Alexey Kardashevskiy 2012-08-17 14:28 ` Alexey Kardashevskiy 2012-08-21 2:31 ` Alex Williamson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).