Discussion:
[Qemu-devel] [BUG] virtio-net linux driver fails to probe on MIPS Malta since 'hw/virtio-pci: fix virtio behaviour'
James Hogan
2017-03-17 21:57:25 UTC
Permalink
Hi,

I've bisected the following failure of the virtio_net linux v4.10 driver
to probe in QEMU v2.9.0-rc1 emulating a MIPS Malta machine:

virtio_net virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_net: probe of virtio0 failed with error -22

To QEMU commit 9a4c0e220d8a ("hw/virtio-pci: fix virtio behaviour").

It appears that adding ",disable-modern=on,disable-legacy=off" to the
virtio-net -device makes it work again.

I presume this should really just work out of the box. Any ideas why it
isn't?

Cheers
James
Marcel Apfelbaum
2017-03-20 15:21:22 UTC
Permalink
Post by James Hogan
Hi,
I've bisected the following failure of the virtio_net linux v4.10 driver
virtio_net virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_net: probe of virtio0 failed with error -22
To QEMU commit 9a4c0e220d8a ("hw/virtio-pci: fix virtio behaviour").
It appears that adding ",disable-modern=on,disable-legacy=off" to the
virtio-net -device makes it work again.
I presume this should really just work out of the box. Any ideas why it
isn't?
Hi,


This is strange. This commit changes virtio devices from legacy to virtio "transitional".
(your command line changes it to legacy)
Linux 4.10 supports virtio modern/transitional (as far as I know) and on QEMU side
there is nothing new.

Michael, do you have any idea?

Thanks,
Marcel
Post by James Hogan
Cheers
James
Michael S. Tsirkin
2017-03-20 15:43:00 UTC
Permalink
Post by Marcel Apfelbaum
Post by James Hogan
Hi,
I've bisected the following failure of the virtio_net linux v4.10 driver
virtio_net virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_net: probe of virtio0 failed with error -22
To QEMU commit 9a4c0e220d8a ("hw/virtio-pci: fix virtio behaviour").
It appears that adding ",disable-modern=on,disable-legacy=off" to the
virtio-net -device makes it work again.
I presume this should really just work out of the box. Any ideas why it
isn't?
Hi,
This is strange. This commit changes virtio devices from legacy to virtio "transitional".
(your command line changes it to legacy)
Linux 4.10 supports virtio modern/transitional (as far as I know) and on QEMU side
there is nothing new.
Michael, do you have any idea?
Thanks,
Marcel
My guess would be firmware mishandling 64 bit BARs - we saw such
a case on sparc previously. As a result you are probably reading
all zeroes from features register or something like that.
Marcel, could you send a patch making the bar 32 bit?
If that helps we know what the issue is.
Post by Marcel Apfelbaum
Post by James Hogan
Cheers
James
Marcel Apfelbaum
2017-03-20 16:02:26 UTC
Permalink
Post by Michael S. Tsirkin
Post by Marcel Apfelbaum
Post by James Hogan
Hi,
I've bisected the following failure of the virtio_net linux v4.10 driver
virtio_net virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_net: probe of virtio0 failed with error -22
To QEMU commit 9a4c0e220d8a ("hw/virtio-pci: fix virtio behaviour").
It appears that adding ",disable-modern=on,disable-legacy=off" to the
virtio-net -device makes it work again.
I presume this should really just work out of the box. Any ideas why it
isn't?
Hi,
This is strange. This commit changes virtio devices from legacy to virtio "transitional".
(your command line changes it to legacy)
Linux 4.10 supports virtio modern/transitional (as far as I know) and on QEMU side
there is nothing new.
Michael, do you have any idea?
Thanks,
Marcel
My guess would be firmware mishandling 64 bit BARs - we saw such
a case on sparc previously. As a result you are probably reading
all zeroes from features register or something like that.
Marcel, could you send a patch making the bar 32 bit?
If that helps we know what the issue is.
Sure,

Thanks,
Marcel
Post by Michael S. Tsirkin
Post by Marcel Apfelbaum
Post by James Hogan
Cheers
James
Marcel Apfelbaum
2017-03-21 14:16:58 UTC
Permalink
Post by Michael S. Tsirkin
Post by Marcel Apfelbaum
Post by James Hogan
Hi,
I've bisected the following failure of the virtio_net linux v4.10 driver
virtio_net virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_net: probe of virtio0 failed with error -22
To QEMU commit 9a4c0e220d8a ("hw/virtio-pci: fix virtio behaviour").
It appears that adding ",disable-modern=on,disable-legacy=off" to the
virtio-net -device makes it work again.
I presume this should really just work out of the box. Any ideas why it
isn't?
Hi,
This is strange. This commit changes virtio devices from legacy to virtio "transitional".
(your command line changes it to legacy)
Linux 4.10 supports virtio modern/transitional (as far as I know) and on QEMU side
there is nothing new.
Michael, do you have any idea?
Thanks,
Marcel
My guess would be firmware mishandling 64 bit BARs - we saw such
a case on sparc previously. As a result you are probably reading
all zeroes from features register or something like that.
Marcel, could you send a patch making the bar 32 bit?
If that helps we know what the issue is.
Hi James,

Can you please check if the below patch fixes the problem?
Please note it is not a solution.

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index f9b7244..5b4d429 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1671,9 +1671,7 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
}

pci_register_bar(&proxy->pci_dev, proxy->modern_mem_bar_idx,
- PCI_BASE_ADDRESS_SPACE_MEMORY |
- PCI_BASE_ADDRESS_MEM_PREFETCH |
- PCI_BASE_ADDRESS_MEM_TYPE_64,
+ PCI_BASE_ADDRESS_SPACE_MEMORY,
&proxy->modern_bar);

proxy->config_cap = virtio_pci_add_mem_cap(proxy, &cfg.cap);


Thanks,
Marcel
James Hogan
2017-03-27 18:45:28 UTC
Permalink
Hi Marcel,
Post by Marcel Apfelbaum
Can you please check if the below patch fixes the problem?
Please note it is not a solution.
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index f9b7244..5b4d429 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1671,9 +1671,7 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
}
pci_register_bar(&proxy->pci_dev, proxy->modern_mem_bar_idx,
- PCI_BASE_ADDRESS_SPACE_MEMORY |
- PCI_BASE_ADDRESS_MEM_PREFETCH |
- PCI_BASE_ADDRESS_MEM_TYPE_64,
+ PCI_BASE_ADDRESS_SPACE_MEMORY,
&proxy->modern_bar);
proxy->config_cap = virtio_pci_add_mem_cap(proxy, &cfg.cap);
Sorry for the delay trying this, I was away last week.

No, it doesn't seem to make any difference.

Thanks
James

Loading...