summary refs log tree commit diff
path: root/devices
Commit message (Collapse)AuthorAge
* vhost_rs: vhost_user: Add missing protocol featuresAlyssa Ross2021-05-11
| | | | | | | | | | | Based on cloud-hypervisor/vhost c3a835b55dc56aa0de04a9c0695368a6403e8e93. > vhost_user: Add missing protocol features > > The spec recently introduced some new protocol features, which we need > to be listed if we don't want to run into any issue when getting the > list of supported features from the backend.
* devices: port vhost-user-net from cloud-hypervisorAlyssa Ross2021-05-11
| | | | | | | This is the cloud-hypervisor vhost-user-net code, modified just enough to compile as part of crosvm. There is currently no way to run crosvm with a vhost-user-net device, and even if there were, it wouldn't work without some further fixes.
* devices: implement dedicated Interrupt struct for virtio WorkerZide Chen2019-10-25
| | | | | | | | | | | | | | | | | | | | | | The code to inject interrupt to the guest can be generic to all virtio devices. This patch: - move those guest interrupt related fields out of Worker structure and put in a separate file, making the worker code cleaner. - remove redandant functions across virtio devices: signal_used_queue(), signal_config_changed(), etc. BUG=chromium:854765 TEST=sanity test on eve and Linux TEST=cargo test -p devices Change-Id: I8e9f760f2057f192fdc74d16a59fea2e6b08c194 Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1869553 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* devices: enable MSI-X for virtio-net and viotio-block devicesXiong Zhang2019-10-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - signal_used_queue(): trigger MSI-X interrupts to the guest if MSI-X is enabled, otherwise trigger INTx interrupts - enable MSI-X on vhost-net: allocate one vhost_interrupt for every MSI-X vector. Performance wise, fio random R/W test on eve pixelbook: INTx MSI-X delta fio write 8.13MiB/s 9.79MiB/s +1.66MiB/s (+20%) fio read 24.35MiB/s 29.3MiB/s +4.95MiB/s (+20%) For networking performance (TCP stream), test results on eve pixelbook: INTx MSI-X delta iperf3 5.93Gbits/s 6.57Gbits/s +0.64Gbits/s (+10.7%) iperf3 -R 5.68Gbits/s 7.37Gbits/s +1.30Gbits/s (+22.8%) iperf test results on VM launched from Ubuntu host (client sends only): INTx MSI-X delta virtio-net 9.53Gbits/s 11.4 Gbits/s +1.87Gbits/s (+19.5%) vhost 28.34Gbits/s 44.43Gbits/s +16.09Gbits/s (+56.7%) BUG=chromium:854765 TEST=cargo test -p devices TEST=tested virtio-net and block on Linux VM and eve pixelbook Change-Id: Ic4952a094327e6b977f446def8209ea2f796878c Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1828340 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* descriptor_utils: check for size overflow in new()Daniel Verkamp2019-10-25
| | | | | | | | | | | | | | | | | | | Move the check for length overflow that was in available_bytes() into Reader::new() and Writer::new(). This simplifies callers, since they can assume that once a valid Reader or Writer has been constructed, available_bytes() cannot fail. Since we are walking the descriptor chain during new() anyway, this extra check should be essentially free. BUG=None TEST=cargo test -p devices descriptor_utils Change-Id: Ibeb1defd3728e7b71356650094b0885f3419ed47 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1873142 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* devices: implement MSI control socketXiong Zhang2019-10-24
| | | | | | | | | | | | | | | | | Allocate per device VmMsi msg_socket for communication between virtio devices and main VM process, which owns the KVM fd and issues ioctl to KVM for KVM_IRQFD and KVM_SET_GSI_ROUTING. BUG=chromium:854765 TEST=None Change-Id: Ie1c81534912eaab7fbf05b5edef7dca343db301c Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1828339 Tested-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
* devices: finish the functions to enable MSI-XZide Chen2019-10-24
| | | | | | | | | | | | | | | | | | | | | | | - add a new field "vector" to struct Queue, which represents the entry number to the MSI-X Table. This can be used to find out the desired irqfd to inject MSI-X interrupts to the guest. - enable MSI-X when MSI-X Enable bit of the Message Control word is being set: allocate irqfd per MSI-X vector; register the irqfd to KVM; update GSI routing to KVM. - update GSI routing if the Message Data or Message Addr of individual MSI-X table Entry is being changed in run time. BUG=chromium:854765 TEST=cargo test -p devices Change-Id: I81533999ab6cd9ec5f111b256caf34077a4a7d1a Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com> Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1828338 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* devices: implement MsixConfig struct and generic MSI-X functionsZide Chen2019-10-24
| | | | | | | | | | | | | | | | | | | | The MsixConfig struct is responsible for all the operations of MSI-X Capability Structure and MSI-X Table. A msix_config object is created for each virtio device. BUG=chromium:854765 TEST=cargo test -p devices Change-Id: Ide7c34d335d49a201f20b0a4307bcda97d1d61b7 Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com> Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1828337 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* devices: implement msix capability structureZide Chen2019-10-24
| | | | | | | | | | | | | | | | | | | | | | | | | | | The MSI-X feature is ported from Cloud-hypervisor commit 69e27288a2e. (https://github.com/intel/cloud-hypervisor.git) In this commit: - add a new "msix" module to the pci crate. - implement the MSI-X Capability Structure. - implement per virtio device msix_vectors() function which represents the supported MSI-X vector for this device. BUG=chromium:854765 TEST=launch Crosvm on eve and Linux TEST=cargo test -p devices TEST=./bin/clippy TEST=./build_test.py --x86_64-sysroot /build/eve Change-Id: I5498b15a3bf115e34764e6610407b3ba204dae7f Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com> Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1873356 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* descriptor_utils: Consume all buffers when reading or writingChirantan Ekbote2019-10-23
| | | | | | | | | | | | | | | | | | | The consume function in both the read and write methods should consume all the VolatileSlices that are given to it rather than just the first one. The previous implementation was not wrong, just inefficient. This should fix that. Also add a test to make sure that this doesn't regress in the future. BUG=none TEST=unit tests Change-Id: I02ec22269cdd6cdc329dd62367b99352a4dc1245 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1865271 Tested-by: Chirantan Ekbote <chirantan@chromium.org> Commit-Queue: Chirantan Ekbote <chirantan@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* virtio-net: reduce number of virtual interrupts to the guestZide Chen2019-10-22
| | | | | | | | | | | | | | | | | | | | | It's quite costly to inject virtual interrupt to the guest, especially in INTx case. To reduce the number of interrupts, in process_rx(), we don't have to inject interrupt on every frame, but wait until process_rx() finishes processing all frames. On eve, iperf3 gets ~15% improvement, "iperf3 -R" gets ~30% improvement. BUG=chromium:854765 TEST=iperf3 on eve and Linux Change-Id: Ie0560d8f42235d2371addb6de34c5f93d11a405f Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1865021 Reviewed-by: Stephen Barber <smbarber@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org> Tested-by: Stephen Barber <smbarber@chromium.org>
* ac97: add sample format to create_*_streamFletcher Woodruff2019-10-22
| | | | | | | | | | | | | | | The audio_streams interface now supports specifying a sample format. Update call sites to indicate that the desired format is S16LE. BUG=chromium:1010667 TEST=aplay within vm Cq-Depend: chromium:1856646 Change-Id: Ib69ff9b39196905f0f429eaf771f6f92901bfc71 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1856586 Reviewed-by: Dylan Reid <dgreid@chromium.org> Tested-by: Fletcher Woodruff <fletcherw@chromium.org> Commit-Queue: Fletcher Woodruff <fletcherw@chromium.org>
* devices: vhost: simplify vhost importsDaniel Verkamp2019-10-21
| | | | | | | | | | | | | | | | | | | | Rather than using `use ::vhost::...` to disambiguate the imports, remove the conflicting `use virtio_sys::vhost` and add `virtio_sys::` to each location that used `vhost::...` previously. The `use ::vhost::...` syntax confuses rustfmt when run directly on these two files, causing it to rewrite the imports into something that doesn't actually compile. BUG=None TEST=rustfmt --check devices/src/virtio/vhost/net.rs TEST=rustfmt --check devices/src/virtio/vhost/vsock.rs Change-Id: I8483f5327a1e2b3ae4887f0b3cef20a917d7410e Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1865370 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* Reformat with rustfmt from Rust 1.38.0Daniel Verkamp2019-10-17
| | | | | | | | | | | | | | | | This just removes a few extraneous blank lines that the new rustfmt doesn't like. BUG=None TEST=bin/fmt --check Change-Id: I4482f873bdfe19f2f73f86cfdd99d6cce873593c Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863000 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* Add explicit `dyn` for trait objectsDaniel Verkamp2019-10-17
| | | | | | | | | | | | | | | Fix "trait objects without an explicit `dyn` are deprecated" warnings introduced in Rust 1.38. BUG=None TEST=emerge-nami crosvm Change-Id: I8ca6aa747475268ae898adddd5d091d401326ceb Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1862999 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* usb: replace libusb with Rust usb_util libraryDaniel Verkamp2019-10-17
| | | | | | | | | | | | | | | | | | | | | Drop the dependency on libusb and reimplement the host USB backend using usb_sys to wrap the Linux usbdevfs ioctls. This allows sandboxing to work without any dependency on libusb patches, and it gives us the flexibility to modify and update the USB backend without depending on an external third-party library. BUG=chromium:987833 TEST=`adb logcat` on nami with Nexus 5 attached TEST=deploy app to phone with Android Studio TEST=Run EdgeTPU USB accelerator demo (including DFU mode transition) Cq-Depend: chromium:1773695 Change-Id: I4321c2b6142caac15f48f197795a37d59d268831 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1783601 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* vfio: Add msi supportXiong Zhang2019-10-17
| | | | | | | | | | | | | | | | | | | | crosvm doesn't support MSI/MSI-x, but kvmgt vgpu support MSI only through cfg msi capability. This is a simple msi implementation, it detects msi capability and track msi control, data and address info, then call vfio kernel to enable / disable msi interrupt. Currently it supports one vetor per MSI. It could extend to multi vetors and MSI-x. BUG=chromium:992270 TEST=none Change-Id: I04fc95f23a07f9698237c014d9f909d011f447ef Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1581142 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* devices: vfio: fix clippy warningsDaniel Verkamp2019-10-17
| | | | | | | | | | | | | | | | | | | | | Fix boxed_local, const_static_lifetime, useless_format, and redundant_closure clippy warnings in the VFIO code. This fixes all clippy warnings except a single instance of let_and_return in VfioPciDevice::keep_fds(), since that code is modified in an upcoming patch. BUG=None TEST=./build_test.py TEST=bin/clippy Change-Id: I548adbc6b92448fc0db82ed72214d73b0eabaf5c Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1822697 Reviewed-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Tested-by: kokoro <noreply+kokoro@google.com>
* devices: fs: Add fuse constants and struct definitionsChirantan Ekbote2019-10-16
| | | | | | | | | | | | | | | | | Add the constants and struct definitions from the kernel fuse interface. These bindings are manually generated from `include/uapi/linux/fuse.h` in the kernel repo. BUG=b:136128319 TEST=none; these aren't used anywhere yet Change-Id: I03d11bc55eca6b8269f1e63a1187ef458ee16f28 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1705655 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Chirantan Ekbote <chirantan@chromium.org>
* devices: Refactor DescriptorChainConsumer, Reader, and WriterChirantan Ekbote2019-10-15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Refactor the Reader and Writer implementations for DescriptorChains. This has several changes: * Change the DescriptorChainConsumer to keep a VecDeque<VolatileSlice> instead of an iterator. This delegates the fiddly business of sub-slicing chunks of memory to the VolatileSlice implementation. * Read in the entire DescriptorChain once when the Reader or Writer is first constructed. This allows us to validate the DescriptorChain in the beginning rather than having to deal with an invalid DescriptorChain in the middle of the device operating on it. Combined with the check that enforces the ordering of read/write descriptors in a previous change we can be sure that the entire descriptor chain that we have copied in is valid. * Add a new `split_at` method so that we can split the Reader/Writer into multiple pieces, each responsible for reading/writing a separate part of the DescriptorChain. This is particularly useful for implementing zero-copy data transfer as we sometimes need to write the data first and then update an earlier part of the buffer with the number of bytes written. * Stop caching the available bytes in the DescriptorChain. The previous implementation iterated over the remaining descriptors in the chain and then only updated the cached value. If a mis-behaving guest then changed one of the later descriptors, the cached value would no longer be valid. * Check for integer overflow when calculating the number of bytes available in the chain. A guest could fill a chain with five 1GB descriptors and cause an integer overflow on a 32-bit machine. This would previously crash the device process since we compile with integer overflow checks enabled but it would be better to return an error instead. * Clean up the Read/Write impls. Having 2 different functions called `read`, with different behavior is just confusing. Consolidate on the Read/Write traits from `std::io`. * Change the `read_to` and `write_from` functions to be generic over types that implement `FileReadWriteVolatile` since we are not allowed to assume that it's safe to call read or write on something just because it implements `AsRawFd`. Also add `*at` variants that read or write to a particular offset rather than the kernel offset. * Change the callback passed to the `consume` function of `DescriptorChainConsumer` to take a `&[VolatileSlice]` instead. This way we can use the `*vectored` versions of some methods to reduce the number of I/O syscalls we need to make. * Change the `Result` types that are returned. Functions that perform I/O return an `io::Result`. Functions that only work on guest memory return a `guest_memory::Result`. This makes it easier to inter-operate with the functions from `std::io`. * Change some u64/u32 parameters to usize to avoid having to convert back and forth between the two in various places. BUG=b:136128319 TEST=unit tests Change-Id: I15102f7b4035d66b5ce0891df42b656411e8279f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1757240 Auto-Submit: Chirantan Ekbote <chirantan@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* devices: proxy: do not acknowledge write commandsDaniel Verkamp2019-10-14
| | | | | | | | | | | | | | | | | | | | | Write accessess cannot fail (in the CommandResult sense) and the result did not carry any data, so remove the response from the Write command. This should improve the speed of write requests for sandboxed devices. For example, with the sandboxed serial device, boot time with a release build of crosvm on my workstation goes from 1.7 seconds to 1.2 seconds, measured by timing a boot with a missing init so that the kernel panics and shuts down immediately. BUG=None TEST=time crosvm run -p init=bogus vm_kernel Change-Id: I125bb831235ca741ae1cc6c86a02a5d863d1a211 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1853970 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* devices: jail serial deviceZach Reizner2019-10-10
| | | | | | | | | | | | | | | | | | This change plumbs the jail throughout the arch specific device creation process. It also adds a custom callback support for the ProxyDevice so that the main process can interrupt the child serial process when it has incoming bytes. TEST=crosvm run BUG=None Change-Id: I6af7d2cb0acbba9bf42eaeeb294cee2bce4a1f36 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1752589 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Zach Reizner <zachr@chromium.org> Commit-Queue: Zach Reizner <zachr@chromium.org>
* device: ac97: Cleanup interrupt logicpaulhsia2019-10-08
| | | | | | | | | | | | | | | | | | - Send only one event while re-sampling. - Don't sent event if the new sr is identical to the old one This can reduce the rate to trigger the issue. BUG=chromium:937977 TEST=Build and run lots of aplay and arecord in guest vm Change-Id: Ibd21f363076c977ae256079e2615094b7ed2408b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1840752 Tested-by: Chih-Yang Hsia <paulhsia@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org> Commit-Queue: Chih-Yang Hsia <paulhsia@chromium.org>
* devices: virtio_net: handle errors in tapfd poll adding/removalStephen Barber2019-10-08
| | | | | | | | | | | | | | | | | | | Add error handling for adding/removing the tapfd to epoll. We only remove the tap fd from the poll context if the tap is readable, i.e. it would busy loop, so don't assume it's removed from the poll context when there's a deferred rx frame. BUG=chromium:1010742 TEST=arcvm network works Change-Id: I84aab2dbe7ea31d724f04d3b3fb0a6916f232300 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1842399 Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* devices: ac97: fix interrupt triggering logicDaniel Verkamp2019-10-08
| | | | | | | | | | | | | | | | | | Do not write to the irq_evt eventfd when interrupt_high is false; the value written to the eventfd is ignored, so despite the '0' in the call, this would re-trigger the interrupt even when it should not have been asserted. Since ac97 is a PCI device, its interrupt is level triggered, and re-asserting it on EOI is handled by the irq_resample_thread code. BUG=None TEST=`aplay /dev/urandom` from Crostini on nami Change-Id: I6ad8e40b818e0495ad58b6902d88dd61103aed9d Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1838762 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Chih-Yang Hsia <paulhsia@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* virtio: queue: Enforce DescriptorChain orderingChirantan Ekbote2019-10-06
| | | | | | | | | | | | | | | | | | | The virtio spec requires that all read-only descriptors appear in the chain before any write-only descriptors. Enforce this in the `checked_new` function by adding a new `required_flags` parameter. The `next_descriptor` function will set this to `VIRTQ_DESC_F_WRITE` if the current descriptor is write-only. This ensures that once we see a write-only descriptor, all following descriptors must be write-only. BUG=b:136127316 TEST=none Change-Id: Id8f942a4236a20f62f35439f3648dbec17e14c00 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1757239 Auto-Submit: Chirantan Ekbote <chirantan@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org> Commit-Queue: Chirantan Ekbote <chirantan@chromium.org>
* devices: virtio_net: avoid busylooping when no rx buffers availableStephen Barber2019-10-03
| | | | | | | | | | | | | | | | | | If the guest is unable to return rx queue buffers to the device, we should temporarily stop polling for reads on the tap fd. Otherwise, we'll spin and burn CPU needlessly. BUG=chromium:1010742 TEST=repro from b/141940546 Change-Id: Iac004e870779a8dd39004f44b44e17a2b45bcfa1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1836914 Tested-by: Stephen Barber <smbarber@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Stephen Barber <smbarber@chromium.org>
* devices: virtio: pmem: use descriptor reader/writerDaniel Verkamp2019-10-01
| | | | | | | | | | | | | | | Convert the virtio pmem device to use the descriptor_utils Reader/Writer helpers to simplify the code and allow support of arbitrary descriptor layouts. BUG=chromium:966258 TEST=./build_test.py Change-Id: I9ccbdf2833980e4c44e19975f9091f9aea56c94b Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1811713 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* devices: virtio: input: use descriptor reader/writerDaniel Verkamp2019-10-01
| | | | | | | | | | | | | | | Convert the virtio input device to use the descriptor_utils Reader/Writer helpers to simplify the code and allow support of arbitrary descriptor layouts. BUG=chromium:966258 TEST=./build_test.py Change-Id: Ia9272496dc59b29ea9cde9f6454099c881242d4c Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1811712 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* crosvm: Use Reader/Writer interfaces in various virtio devices.Jakub Staron2019-10-01
| | | | | | | | | | | | | | | | Switching the devices to the new interface reduces code duplication and will ease fuzzing the devices as they now have a common input and output interface for descriptors. BUG=chromium:966258 TEST=vm.CrostiniStartEverything Change-Id: I823c04dfc24e017433f8e8ab167bbd5dfafd338b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1647371 Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* virtio-gpu: handle VIRTIO_GPU_CMD_RESOURCE_CREATE_V2Gurchetan Singh2019-10-01
| | | | | | | | | | | | BUG=chromium:924405 TEST=compile Change-Id: I57379452f6805aaf429c268b95ddd3aecd07e90e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1591463 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
* virtio-gpu: handle VIRTIO_GPU_CMD_ALLOCATION_METADATAGurchetan Singh2019-10-01
| | | | | | | | | | | | | | Designed to return metadata to the guest. BUG=chromium:924405 TEST=compile Change-Id: Ic04a0bbb6b0a5bb6d08314371181f256eb7230df Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1591464 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
* vfio: Setup dma map for vfio deviceXiong Zhang2019-10-01
| | | | | | | | | | | | | | | | | For each guest memory region, setup the corresponding gpa to hva map in the kernel vfio iommu table. Then the kernel vfio driver could get the hpa through gpa. Device could use this gpa for dma also. BUG=chromium:992270 TEST=none Change-Id: I04008d68ab2ed182a789d6ee8c97a0ed9e1e4756 Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1581141 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* vfio: Integrate VFIO device into pci device modelXiong Zhang2019-10-01
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Create VFIO device and VFIO PCI device in create_devices() function, and intergrate it into PciRootBridge, so guest could see this vfio device. Add a vfio config parameter, this config point to passthrough or mdev device sysfs path. For passthrough case, first user unbind host device from its driver, then bind host device to vfio-pci. Like: echo 0000:00:02.0 > /sys/bus/pci/devices/0000:00:02.0/driver/unbind ech0 8086 1912 > /sys/bus/pci/drivers/vfio-pci/new_id Finally pass the sysfs to crosvm through --vfio=/sys/bus/pci/devices/0000:00:02.0 For mdev case, user create a mdev device through echo $UUID > mdev_type/create, then pass this mdev device to crosvm like --vfio=/sys/bus/pci/devices/0000:00:02.0/$UUID BUG=chromium:992270 TEST=none Change-Id: I0f59d6e93f62f9ab0727ad3a867d204f4ff6ad2d Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1581140 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* sys_util: add write_zeroes_all() functionDaniel Verkamp2019-09-25
| | | | | | | | | | | | | | | | | | In the same spirit as write_all() for the standard io::Write::write() function, add a write_zeroes_all() function with a default implementation that calls write_zeroes() in a loop until the requested length is met. This will allow write_zeroes implementations that don't necessarily fulfill the entire requested length. BUG=None TEST=cargo test -p sys_util write_zeroes Change-Id: I0fc3a4b3fe8904946e253ab8a2687555b12657be Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1811466 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Cody Schuffelen <schuffelen@google.com> Tested-by: kokoro <noreply+kokoro@google.com>
* devices: modify get_device_bars(..) interfaceGurchetan Singh2019-09-20
| | | | | | | | | | | | | | | Alloc::PciBar {..} is used as a key in the AddressAllocator's hashmap, so inform the device about the pci bus/dev numbers. BUG=chromium:924405 TEST=compile Change-Id: Ib9d94e516269c1dc9a375c2ceb9775cf5a421156 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1811585 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
* virtio-gpu: Use new + proposed virtio-gpu featuresGurchetan Singh2019-09-20
| | | | | | | | | | | | | BUG=chromium:924405 TEST=compile Change-Id: If7f2d35f66664a1a4e9a6e0883ea981b0ac3e87c Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1591462 Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: David Riley <davidriley@chromium.org>
* virtio-gpu: add new + proposed kernel protocolsGurchetan Singh2019-09-20
| | | | | | | | | | | | | BUG=chromium:924405 TEST=compile Change-Id: I550d5e60e8bde1378c226fc9da61eb60f1293811 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1591461 Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: David Riley <davidriley@chromium.org>
* vfio: Implement PciDevice Trait for vfio deviceXiong Zhang2019-09-18
| | | | | | | | | | | | | | | | | | | | | | | | | According to kernel Documents/vfio.txt and Documents/vfio-mediated-device.txt,user pass host assigned device or mdev to crosvm through --vfio parameter, vfio module open this device and get this device's information. Implement PciDevice trait on this device, then vfio_pci module could trap guest pci cfg r/w and mmio r/w, and transfer this operation into kernel vfio. Currently the relationship of vfio container:group:device are 1:1:1, in the future it could extend to 1:m:n. BUG=chromium:992270 TEST=none Change-Id: I8006ef65022d56197eaeb464811a59db2ce54b9a Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1580458 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* devices: gpu: Use descriptor_utils helpers for virtio processing.David Riley2019-09-17
| | | | | | | | | | | | | | | | | Switch to using Reader/Writer which allows buffers to be passed from the guest as scatter gathers instead of requiring a single contiguous buffer. BUG=chromium:993452 TEST=apitrace replay Change-Id: Ibe212cfa60eae16d70db248a2a619d272c13f540 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1775365 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: David Riley <davidriley@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: David Riley <davidriley@chromium.org>
* virtio: Make Reader interface cloneable.David Riley2019-09-17
| | | | | | | | | | | | | BUG=chromium:993452 TEST=apitrace replay Change-Id: If7dc8ef93d9e6b9783f2f8f124fcee5e016b3eb4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1775364 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: David Riley <davidriley@chromium.org> Commit-Queue: David Riley <davidriley@chromium.org>
* devices: join worker threads in drop()Daniel Verkamp2019-09-17
| | | | | | | | | | | | | | Make sure all devices join any threads they spawn before returning from the drop() handler after signaling the exit event. BUG=chromium:992494 TEST=crosvm exits without errors Change-Id: I6bc91c32a08f568b041765044caa9aff6f7cf4a9 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1802156 Reviewed-by: Stephen Barber <smbarber@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* use `SharedMemory::{named, anon}` to replace `::new`Zach Reizner2019-09-11
| | | | | | | | | | | | | | | | The new constructors are shorter and omit the bare `None` in the `anon` call sites which gave no clues to the reader what the effect of that `None` was. This should improve readability. TEST=./build_test BUG=None Change-Id: I2e34e7df9a4ccc5da50edf4e963a6a42e3d84b22 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1797188 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* usb: clarify transfer cancellation APIDaniel Verkamp2019-09-09
| | | | | | | | | | | | | | | Rather than having a get_canceller() function on UsbTransfer, make the submit function return the canceller. This makes it clear that the transfer can't be cancelled before it is submitted. BUG=None TEST=None Change-Id: Ice36c3096a1f8a5aafe93b5d5e27eb371183c19f Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1783599 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* Replace "AsRawFd" with "AsRawFds" for disks.Cody Schuffelen2019-08-30
| | | | | | | | | | | | This supports virtio disks that depend on multiple file descriptors. All of the file descriptors are passed to the jail when relevant. Bug: b/133432409 Change-Id: Idf2e24cd2984c0d12a47a523c13d24c1ba8d173e Signed-off-by: Cody Schuffelen <schuffelen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1691761 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* Extract disk creation logic out of qcow and src.Cody Schuffelen2019-08-28
| | | | | | | | | Bug: b/133432409 Change-Id: Iba25d5f6bb5f60619bb2f5a3d72ddfd3a81650b4 Signed-off-by: Cody Schuffelen <schuffelen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1691460 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* devices: pci: replace byteorder with from_le_bytes()Daniel Verkamp2019-08-26
| | | | | | | | | | | | | | Use the standardized from_le_bytes() functions rather than the byteorder crate. BUG=None TEST=./build_test Change-Id: I07a062bf63c5d3ae1e25f403713bf9a1677e8cba Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1761155 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: virtio: replace byteorder with {to,from}_le_bytes()Daniel Verkamp2019-08-26
| | | | | | | | | | | | | | | Use the stabilized standard to_le_bytes() and from_le_bytes() functions rather than the byteorder crate. BUG=None TEST=./build_test TEST=cargo test -p devices virtio_pci_common_config Change-Id: I4106a41484760b9e7e586de07135874238bcadb0 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1761154 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: vsock: replace byteorder with from_le_bytes()Daniel Verkamp2019-08-26
| | | | | | | | | | | BUG=None TEST=cargo test -p devices vsock Change-Id: I9da35f894898198413737f9caa29a7f772e4f720 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1761153 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
* usb: clean up clippy unit_arg warningDaniel Verkamp2019-08-26
| | | | | | | | | | | | | | | | | | | Fix the last instance of this clippy warning: warning: passing a unit value to a function ... and remove this warning from the "To be resolved" list in bin/clippy. BUG=None TEST=bin/clippy passes without warnings Change-Id: Ic1d558e935366d80eeadb96bf1ff951ce50edd5b Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1766623 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Tomasz Jeznach <tjeznach@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>