#
74af1456 |
| 17-Nov-2023 |
Eduardo Bart <edub4rt@gmail.com> |
virtio: Cancel and join threads when exiting devices devices
I'm experiencing a segmentation fault in lkvm where it may crash after powering off a guest machine that uses a virtio network device. Th
virtio: Cancel and join threads when exiting devices devices
I'm experiencing a segmentation fault in lkvm where it may crash after powering off a guest machine that uses a virtio network device. The crash is hard to reproduce, because looks like it only happens when the guest machine is powering off while extra virtio threads is doing some work, when it happens lkvm crashes in the function virtio_net_rx_thread while attempting to read invalid guest physical memory, because guest physical memory was unmapped.
I've isolated the problem and looks like when lkvm exits it unmaps the guest memory while virtio device extra threads may still be executing. I noticed most virtio devices are not executing pthread_cancel + pthread_join to synchronize extra threads when exiting, to make sure this happens I added explicit calls to the virtio device exit function to all virtio devices, which should cancel and join all threads before unmapping guest physical memory, fixing the crash for me.
Signed-off-by: Eduardo Bart <edub4rt@gmail.com> Link: https://lore.kernel.org/r/20231117170455.80578-2-edub4rt@gmail.com [will: Added commit message from https://lore.kernel.org/all/CABqCASLWAZ5aq27GuQftWsXSf7yLFCKwrJxWMUF-fiV7Bc4LUA@mail.gmail.com/] Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
46aaf3b8 |
| 06-Jun-2023 |
Jean-Philippe Brucker <jean-philippe@linaro.org> |
virtio/vhost: Support line interrupt signaling
To signal a virtqueue, a kernel vhost worker writes an eventfd registered by kvmtool with VHOST_SET_VRING_CALL. When MSIs are supported, this eventfd i
virtio/vhost: Support line interrupt signaling
To signal a virtqueue, a kernel vhost worker writes an eventfd registered by kvmtool with VHOST_SET_VRING_CALL. When MSIs are supported, this eventfd is connected directly to KVM IRQFD to inject the interrupt into the guest. However direct injection does not work when MSIs are not supported. The virtio-mmio transport does not support MSIs at all, and even with virtio-pci, the guest may use INTx if the irqchip does not support MSIs (e.g. irqchip=gicv3 on arm64).
In this case, injecting the interrupt requires writing an ISR register in virtio to signal that it is a virtqueue notification rather than a config change. Add a thread that polls the vhost eventfd for interrupts, and notifies the guest. When the guest configures MSIs, disable polling on the eventfd and enable direct injection.
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Link: https://lore.kernel.org/r/20230606130426.978945-17-jean-philippe@linaro.org Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
b17552ee |
| 25-May-2023 |
Andre Przywara <andre.przywara@arm.com> |
virtio: sanitise virtio endian wrappers
In virtio/scsi.c we had a small hack to avoid compiler warnings when not using cross-endian support: we were assigning a variable to itself. This upsets clang
virtio: sanitise virtio endian wrappers
In virtio/scsi.c we had a small hack to avoid compiler warnings when not using cross-endian support: we were assigning a variable to itself. This upsets clang: virtio/scsi.c:63:7: error: explicitly assigning value of variable of type 'struct virtio_device *' to itself [-Werror,-Wself-assign] This hack was needed because we use *macros* to do the endianess conversion, and for architectures like x86 the "dev" argument was removed from the code.
Provide the endianess conversion functions as inline functions, which do not suffer from the unused problem. This requires to isolate the "endian" parameter, because there were *two* different structures used as the first argument(virtio_device and virt_queue), *both* with an identically defined "endian" member.
Signed-off-by: Andre Przywara <andre.przywara@arm.com> Link: https://lore.kernel.org/r/20230525144827.679651-3-andre.przywara@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
9b46ebc5 |
| 20-Mar-2023 |
Rajnesh Kanwal <rkanwal@rivosinc.com> |
Add virtio-transport option and deprecate force-pci and virtio-legacy.
This is a follow-up patch for [0] which proposed the --force-pci option for riscv. As per the discussion it was concluded to ad
Add virtio-transport option and deprecate force-pci and virtio-legacy.
This is a follow-up patch for [0] which proposed the --force-pci option for riscv. As per the discussion it was concluded to add virtio-tranport option taking in four options (pci, pci-legacy, mmio, mmio-legacy).
With this change force-pci and virtio-legacy are both deprecated and arm's default transport changes from MMIO to PCI as agreed in [0]. This is also true for riscv.
Nothing changes for other architectures.
[0]: https://lore.kernel.org/all/20230118172007.408667-1-rkanwal@rivosinc.com/
Signed-off-by: Rajnesh Kanwal <rkanwal@rivosinc.com> Link: https://lore.kernel.org/r/20230320143344.404307-1-rkanwal@rivosinc.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
717a3ab0 |
| 29-Sep-2022 |
Tu Dinh Ngoc <dinhngoc.tu@irit.fr> |
virtio-net: Fix vq->use_event_idx flag check
VIRTIO_RING_F_EVENT_IDX is a bit position value, but virtio_init_device_vq populates vq->use_event_idx by ANDing this value directly to vdev->features.
virtio-net: Fix vq->use_event_idx flag check
VIRTIO_RING_F_EVENT_IDX is a bit position value, but virtio_init_device_vq populates vq->use_event_idx by ANDing this value directly to vdev->features.
Fix the check for this flag in virtio_init_device_vq.
Reviewed-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Tu Dinh Ngoc <dinhngoc.tu@irit.fr> Link: https://lore.kernel.org/r/20220929121858.156-1-dinhngoc.tu@irit.fr Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
5fe5eb04 |
| 01-Jul-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Add support for modern virtio-mmio
Add modern MMIO transport to virtio, make it the default. Legacy transport can be enabled with --virtio-legacy. The main change for MMIO is the queue addre
virtio: Add support for modern virtio-mmio
Add modern MMIO transport to virtio, make it the default. Legacy transport can be enabled with --virtio-legacy. The main change for MMIO is the queue addresses. They are now 64-bit addresses instead of 32-bit PFNs. Apart from that all changes for supporting modern devices are already implemented.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220701142434.75170-11-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
b0d56e3c |
| 01-Jul-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Add support for modern virtio-pci
Add support for modern virtio-pci implementation (based on the 1.0 virtio spec). We add a new transport, alongside MMIO and PCI-legacy. This is now the defa
virtio: Add support for modern virtio-pci
Add support for modern virtio-pci implementation (based on the 1.0 virtio spec). We add a new transport, alongside MMIO and PCI-legacy. This is now the default when selecting PCI, but users can still select the legacy transport for all virtio devices by passing "--virtio-legacy" on the command-line.
The main change in modern PCI is the way we address virtqueues, using 64-bit values instead of PFNs. To keep the queue configuration atomic the device also gets a "queue enable" register. Configuration is also made extensible by more feature bits and PCI capabilities. Scalability is improved as well, as devices can have notification registers for each virtqueue on separate pages. However this implementation keeps a single notification register.
Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220701142434.75170-9-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
3c8f82b8 |
| 01-Jul-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Prepare for more feature bits
Modern virtio uses more than 32 bits of features. Bump the feature bitfield size to 64 bits.
virtio_set_guest_features() changes in behavior because it will no
virtio: Prepare for more feature bits
Modern virtio uses more than 32 bits of features. Bump the feature bitfield size to 64 bits.
virtio_set_guest_features() changes in behavior because it will now be called multiple times, each time the guest writes to a 32-bit slice of the features.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220701142434.75170-7-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
b231683c |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio/net: Prepare for modern virtio
The virtio_net header contains a 'num_buffers' field, used when the VIRTIO_NET_F_MRG_RXBUF feature is negotiated. The legacy driver does not present this field
virtio/net: Prepare for modern virtio
The virtio_net header contains a 'num_buffers' field, used when the VIRTIO_NET_F_MRG_RXBUF feature is negotiated. The legacy driver does not present this field when the feature is not negotiated. In that case the header is 2 bytes smaller.
When using the modern virtio transport, the header always contains the field and in addition the device MUST set it to 1 when the VIRTIO_NET_F_MRG_RXBUF is not negotiated. Prepare for modern virtio support by enabling this case once the 'legacy' flag is switched off.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-13-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
902a8ecb |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Remove set_guest_features() device op
Now that devices have a status callback, they don't use set_guest_features() anymore. The negotiated feature set is available in struct virtio_device. R
virtio: Remove set_guest_features() device op
Now that devices have a status callback, they don't use set_guest_features() anymore. The negotiated feature set is available in struct virtio_device. Remove the callback from all devices.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-10-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
867b15cc |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Fix device-specific config endianness
Some legacy virtio drivers expect to read the device-specific config in guest endianness (2.5.3 "Legacy Interface: A Note on Device Configuration Space
virtio: Fix device-specific config endianness
Some legacy virtio drivers expect to read the device-specific config in guest endianness (2.5.3 "Legacy Interface: A Note on Device Configuration Space endian-ness").
Kvmtool doesn't know the guest endianness until it can probe a VCPU. So the config fields start in host endianness, and are swapped once the guest is running. Currently this is done in set_guest_features(), but that is too late because the driver is allowed to read config fields before setting feature bits (2.5.2 "Device Requirements: Device Configuration Space"). In addition some devices don't swap the fields, and those that do swap the fields do it every time the guest writes the feature register, which can't work if a device gets reset more than once.
Initialize the config on device reset. Do it on every reset because in theory multiple guests could run with different endianness during the lifetime of the device.
Notes:
* the balloon device uses little-endian (5.5.4.0.0.1 "Legacy Interface: Device configuration layout").
* the vsock device was introduced after virtio 0.9.5, hence doesn't describe a legacy interface, but the Linux driver allows to use the legacy transport, and always reads the 64-bit guest_cid field as little-endian.
* the specification does not describe the 9p device, but the Linux driver uses guest-endian helpers.
* the specification does not explicitly forbid a driver from reading the configuration at any time, but a driver must follow the sequence from 3.1.1 "Driver Requirements: Device Initialization", where the driver is allowed to read the config after setting the DRIVER status bit. It should therefore be safe to keep dealing with guest endianness only on device reset, and not on the first config access.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-8-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
15e6c4e7 |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Add config access helpers
At the moment device-specific config access is tailored for a Linux guest, that performs any access in 8 bits. But config access can have any size, and modern virti
virtio: Add config access helpers
At the moment device-specific config access is tailored for a Linux guest, that performs any access in 8 bits. But config access can have any size, and modern virtio drivers must use the size of the accessed field. Add helpers that generalize config accesses.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-7-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
609ee906 |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Support modern virtqueue addresses
Modern virtio devices can use separate buffer for descriptors, available and used rings. They can also use 64-bit addresses instead of 44-bit. Rework the v
virtio: Support modern virtqueue addresses
Modern virtio devices can use separate buffer for descriptors, available and used rings. They can also use 64-bit addresses instead of 44-bit. Rework the virtqueue initialization function to support modern virtio.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-6-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
fd41cde0 |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Factor virtqueue initialization
All virtio devices perform the same set of operations when initializing their virtqueues. Move it to virtio core.
Signed-off-by: Jean-Philippe Brucker <jean-
virtio: Factor virtqueue initialization
All virtio devices perform the same set of operations when initializing their virtqueues. Move it to virtio core.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-5-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
3a1e36e4 |
| 07-Jun-2022 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Remove redundant test
Don't test for VIRTIO__STATUS_STOP right after setting it.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/2022060
virtio: Remove redundant test
Don't test for VIRTIO__STATUS_STOP right after setting it.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Link: https://lore.kernel.org/r/20220607170239.120084-3-jean-philippe.brucker@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
d7d79bd5 |
| 04-Aug-2020 |
Alexandru Elisei <alexandru.elisei@arm.com> |
virtio: Fix ordering of virtio_queue__should_signal()
The guest programs used_event in the avail ring to let the host know when it wants a notification from the device. The host notifies the guest w
virtio: Fix ordering of virtio_queue__should_signal()
The guest programs used_event in the avail ring to let the host know when it wants a notification from the device. The host notifies the guest when the used ring index passes used_event. It is possible for the guest to submit a buffer, and then go into uninterruptible sleep waiting for this notification.
The virtio-blk guest driver, in the notification callback virtblk_done(), increments the last known used ring index, then sets used_event to this value, which means it will get a notification after the next buffer is consumed by the host. virtblk_done() exits after the value of the used ring idx has been propagated from the host thread.
On the host side, the virtio-blk device increments the used ring index, then compares it to used_event to decide if a notification should be sent.
This is a common communication pattern between two threads, called store buffer. Memory barriers are needed in order for the pattern to work correctly, otherwise it is possible for the host to miss sending a required notification.
Initial state: vring.used.idx = 2, vring.used_event = 1 (idx passes used_event, which means kvmtool notifies the guest).
GUEST (in virtblk_done()) | KVMTOOL (in virtio_blk_complete()) | (increment vq->last_used_idx = 2) | // virtqueue_enable_cb_prepare_split(): | // virt_queue__used_idx_advance(): write vring.used_event = 2 | write vring.used.idx = 3 // virtqueue_poll(): | mb() | wmb() // virtqueue_poll_split(): | // virt_queue__should_signal(): read vring.used.idx = 2 | read vring.used_event = 1 // virtblk_done() exits. | // No notification.
The write memory barrier on the host side is not enough to prevent reordering of the read in the kvmtool thread, which can lead to the guest thread waiting forever for IO to complete. Replace it with a full memory barrier to get the correct store buffer pattern described in the Linux litmus test SB+fencembonceonces.litmus, which forbids both threads reading the initial values.
Also move the barrier in virtio_queue__should_signal(), because the barrier is needed for notifications to work correctly, and it makes more sense to have it in the function that determines if the host should notify the guest.
Reported-by: Anvay Virkar <anvay.virkar@arm.com> Suggested-by: Anvay Virkar <anvay.virkar@arm.com> Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Link: https://lore.kernel.org/r/20200804145317.51633-1-alexandru.elisei@arm.com Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
db927775 |
| 14-Apr-2020 |
Alexandru Elisei <alexandru.elisei@arm.com> |
virtio: Don't ignore initialization failures
Don't ignore an error in the bus specific initialization function in virtio_init; don't ignore the result of virtio_init; and don't return 0 in virtio_bl
virtio: Don't ignore initialization failures
Don't ignore an error in the bus specific initialization function in virtio_init; don't ignore the result of virtio_init; and don't return 0 in virtio_blk__init and virtio_scsi__init when we encounter an error. Hopefully this will save some developer's time debugging faulty virtio devices in a guest.
To take advantage of the cleanup function virtio_blk__exit, move appending the new device to the list before the call to virtio_init. Change virtio_net__exit to free all allocated net_dev devices on exit, and matching what virtio_blk__exit does.
To safeguard against this in the future, virtio_init has been annoted with the compiler attribute warn_unused_result.
Reviewed-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
show more ...
|
#
eb34a8c2 |
| 10-Jan-2019 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Add reset() callback
When the guest writes a status of 0, the device should be reset. Add a reset() callback for the transport layer to reset all queues and their ioeventfd.
Signed-off-by:
virtio: Add reset() callback
When the guest writes a status of 0, the device should be reset. Add a reset() callback for the transport layer to reset all queues and their ioeventfd.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Julien Thierry <julien.thierry@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
ad346c2e |
| 10-Jan-2019 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Add exit_vq() callback
Virtio allows to reset individual virtqueues. For legacy devices, it's done by writing an address of 0 into the PFN register. Modern devices have an "enable" register.
virtio: Add exit_vq() callback
Virtio allows to reset individual virtqueues. For legacy devices, it's done by writing an address of 0 into the PFN register. Modern devices have an "enable" register. Add an exit_vq() callback to all devices. A lot more work is required by each device to clean up their virtqueue state, and by the core to reset things like MSI routes and ioeventfds.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Julien Thierry <julien.thierry@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
95242e44 |
| 10-Jan-2019 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Implement notify_status
Modern virtio require proper status handling and reset. A "notify_status" callback is already present in the virtio ops, but isn't implemented by any device. Instead
virtio: Implement notify_status
Modern virtio require proper status handling and reset. A "notify_status" callback is already present in the virtio ops, but isn't implemented by any device. Instead they currently use "set_guest_feature" to reset the device and deal with endianess. This isn't sufficient for proper device reset, so add the notify_status callback to all devices that need it.
To add useful hints like "start" and "stop", extend the status variable to 32-bits.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> [Julien T: Remove VIRTIO_CONFIG_S_NEEDS_RESET from config mask, as it is virtio v1+ macro and kvmtool only implements v0.9, this macro should not be referenced for now] Signed-off-by: Julien Thierry <julien.thierry@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
bbea6c7a |
| 13-Mar-2018 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Clean up next_desc
The wmb() in next_desc seems out of place and the comments are inaccurate. Remove the unnecessary barrier and clean up next_desc().
next_desc() is called by virt_queue__g
virtio: Clean up next_desc
The wmb() in next_desc seems out of place and the comments are inaccurate. Remove the unnecessary barrier and clean up next_desc().
next_desc() is called by virt_queue__get_head_iov() when filling the iov with desciptor addresses. It reads the descriptor's flag and next index. The virt_queue__get_head_iov() only reads the direct and indirect descriptors, and doesn't write any shared memory except from iov and cursors that will be read by the caller.
As far as I can see, vhost (the kernel implementation of virtio device) does well without any barrier here, so I think it might be safe to remove.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
b7af514c |
| 17-Nov-2017 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Support drivers that don't negotiate VIRTIO_RING_F_EVENT_IDX
Bad things happen when the VIRTIO_RING_F_EVENT_IDX feature isn't negotiated and we try to write the avail_event anyway. SeaBIOS,
virtio: Support drivers that don't negotiate VIRTIO_RING_F_EVENT_IDX
Bad things happen when the VIRTIO_RING_F_EVENT_IDX feature isn't negotiated and we try to write the avail_event anyway. SeaBIOS, for example, stores internal data where avail_event should be [1].
Technically the Virtio specification doesn't forbid the device from writing the avail_event, and it's up to the driver to reserve space for it ("the transitional driver [...] MUST allocate the total number of bytes for the virtqueue according to [formula containing the avail event]").
But it doesn't hurt us to avoid writing avail_event, and kvmtool needs changes for interrupt suppression anyway, in order to comply with the spec. Indeed Virtio 1.0 cs04 says, in 2.4.7.2 Device Requirements: Virtqueue Interrupt Suppression: """ If the VIRTIO_F_EVENT_IDX feature bit is not negotiated: * The device MUST ignore the used_event value. * After the device writes a descriptor index into the used ring: - If flags is 1, the device SHOULD NOT send an interrupt. """
So let's do that.
[1] https://patchwork.kernel.org/patch/10038931/
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
56a16c90 |
| 17-Nov-2017 |
Jean-Philippe Brucker <jean-philippe.brucker@arm.com> |
virtio: Save negotiated features
We're going to need the features bits negotiated between host and guest in the core code. Save them in the virtio_device structure.
Signed-off-by: Jean-Philippe Bru
virtio: Save negotiated features
We're going to need the features bits negotiated between host and guest in the core code. Save them in the virtio_device structure.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
3fea89a9 |
| 17-Apr-2015 |
Will Deacon <will.deacon@arm.com> |
kvmtool: virtio-net: fix VIRTIO_NET_F_MRG_RXBUF usage in rx thread
When merging virtio-net buffers using the VIRTIO_NET_F_MRG_RXBUF feature, the first buffer added to the used ring should indicate t
kvmtool: virtio-net: fix VIRTIO_NET_F_MRG_RXBUF usage in rx thread
When merging virtio-net buffers using the VIRTIO_NET_F_MRG_RXBUF feature, the first buffer added to the used ring should indicate the total number of buffers used to hold the packet. Unfortunately, kvmtool has a number of issues when constructing these merged buffers:
- Commit 5131332e3f1a ("kvmtool: convert net backend to support bi-endianness") introduced a strange loop counter, which resulted in hdr->num_buffers being set redundantly the first time round
- When adding the buffers to the ring, we actually add them one-by-one, allowing the guest to see the header before we've inserted the rest of the data buffers...
- ... which is made worse because we non-atomically increment the num_buffers count in the header each time we insert a new data buffer
Consequently, the guest quickly becomes confused in its net rx code and the whole thing grinds to a halt. This is easily exemplified by trying to boot a root filesystem over NFS, which seldom succeeds.
This patch resolves the issues by allowing us to insert items into the used ring without updating the index. Once the full payload has been added and num_buffers corresponds to the total size, we *then* publish the buffers to the guest.
Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|
#
dc7a55d6 |
| 16-Dec-2014 |
Suzuki K. Poulose <suzuki.poulose@arm.com> |
Use the arch default transport method for network
lkvm by default sets up a virtio-pci transport for network, if none is specified. This can be a problem on archs (e.g ARM64), where virtio-pci is no
Use the arch default transport method for network
lkvm by default sets up a virtio-pci transport for network, if none is specified. This can be a problem on archs (e.g ARM64), where virtio-pci is not supported yet and cause the following warning at exit.
# KVM compatibility warning. virtio-net device was not detected.
This patch changes it to make use of the default transport method for the architecture when none is specified. This will ensure that on every arch we get the network up by default in the VM.
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
show more ...
|