summary refs log tree commit diff
Commit message (Collapse)AuthorAge
* crosvm: use vhost-user-net instead of virtio-net vhost-userAlyssa Ross2021-05-11
| | | | | | | | This is a hack that just assumes vhost-user-net is desired if a MAC address is given, but not a host IP or netmask. No sandbox is created for this device. It'll do for now.
* devices: vhost-user: Vring should be enabled after initializationAlyssa Ross2021-05-11
| | | | | | | | | | Based on cloud-hypervisor 97699a521fbdffd0166bc55be37c13bb6bc1949f. > vm-virtio: vhost-user: Vring should be enabled after initialization > > As mentioned in the vhost-user specification, each ring is initialized > in a stopped state. This means each ring should be enabled only after > it has been correctly initialized.
* 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>
* bin/fmt: ignore generated files in target dirDaniel Verkamp2019-10-25
| | | | | | | | | | | | | | | Don't check formatting for *.rs files generated by the protobuf code generator. BUG=None TEST=bin/fmt --check TEST=docker/wrapped_smoke_test.sh Change-Id: I74af762d2758e6106a855f27214646b51f640b11 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1876838 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* docker: update ADHD commit to fix kokoro buildDaniel Verkamp2019-10-25
| | | | | | | | | | | | | | | https://crrev.com/c/1856586 uses a new audio_streams interface but did not update the revision used in kokoro/docker builds to match. Update it to fix the crosvm kokoro builder. BUG=None TEST=docker/wrapped_smoke_test.sh Change-Id: I12fda23861aad4b5a12eda79298ac507382188a5 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1876831 Reviewed-by: Fletcher Woodruff <fletcherw@chromium.org> Reviewed-by: Stephen Barber <smbarber@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>
* fuzz: block_fuzzer: add msix_config to activateDaniel Verkamp2019-10-25
| | | | | | | | | | | | | | Fix fuzzer build after the VirtioDevice activate() API change requiring the msix_config parameter. BUG=chromium:1017954 TEST=`USE='asan fuzzer' emerge-nami crosvm` Change-Id: I1bd63369e7d112ee55265747a88d64e6545e572a Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1880137 Reviewed-by: Manoj Gupta <manojgupta@chromium.org> Commit-Queue: Manoj Gupta <manojgupta@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>
* fuzz: Add virtqueue fuzzerChirantan Ekbote2019-10-24
| | | | | | | | | | | | | BUG=none TEST=Run it with cros_fuzz Cq-Depend: chromium:1863177, chromium:1863178 Change-Id: I1a989d7b90116e210a8aae63205c5e8cf6b70faa Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863889 Reviewed-by: Chirantan Ekbote <chirantan@chromium.org> Tested-by: Chirantan Ekbote <chirantan@chromium.org> Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org> Commit-Queue: Manoj Gupta <manojgupta@chromium.org>
* gpu_renderer: fix fd leak on export failureDavid Stevens2019-10-24
| | | | | | | | | | | | BUG=None TEST=arcvm boots Change-Id: Id5d3bb422fcaa4906d1a6dfca2f98269d1bafc2c Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1847537 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: David Stevens <stevensd@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: David Stevens <stevensd@chromium.org>
* fuzz: remove misleading block fuzzer commentDaniel Verkamp2019-10-24
| | | | | | | | | | | | | | | This looks like it's copied from the qcow fuzzer, and it doesn't apply to the block fuzzer. The actual behavior of the block fuzzer is correctly described by the comment later in the file. BUG=None TEST=`USE='asan fuzzer' emerge-nami crosvm` Change-Id: I9ccd6deba44af8b8df471ee0078ace385696151f Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1853698 Reviewed-by: Dylan Reid <dgreid@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* plugin: only pause on EINTRMatt Delco2019-10-23
| | | | | | | | | | | | | | | | | | | | | | | | | In the case of 1) an IO exit & callout to plugin, then 2) a pause request by another thread, the vcpu thread will eagerly check for a pause request and might cause another callout to the plugin for the pause. We haven't yet run KVM again for it to emulate the completion of the IO. It's probably less risky to call back into KVM again and let it finish the emulation before we callout to the plugin to make other potential state changes to the VM. This change also reduces the overhead of the non-pause case by not checking for a pause request on each VM exit. The tradeoff is that a pause request might take longer, but these are (or should be) relatively rare so it's better to slow these down (and be more conserative/sane about the state of the VM when pause is reported) in favor of making the non-pause VM exits faster. BUG=None TEST=Local build and run of "build_test". Change-Id: I38609eccd9a2196835f99de5ea84a586928fab30 Signed-off-by: Matt Delco <delco@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863725 Reviewed-by: Zach Reizner <zachr@chromium.org>
* crosvm: add support for immediate exitMatt Delco2019-10-23
| | | | | | | | | | | | | Adds ability to set the immediate exit bit and ask kvm if it's supported. BUG=None TEST=local compile and test Change-Id: I5c58a5920ebda13267efeb079c0bb671f83464ee Signed-off-by: Matt Delco <delco@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1847857 Reviewed-by: Zach Reizner <zachr@chromium.org>
* plugin: rename signal callMatt Delco2019-10-23
| | | | | | | | | | | | | | There was a rename of the signal handler function for rt signals. This renames the plugin use to be consistent with the non-plugin case. BUG=None. TEST=Local compile. Change-Id: I5bf2e19754183022dbfe31fd1fdeceb83e07c18a Signed-off-by: Matt Delco <delco@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1846680 Reviewed-by: Zach Reizner <zachr@chromium.org>
* usb_util: use sys_util::vec_with_array_fieldDaniel Verkamp2019-10-23
| | | | | | | | | | | | | Drop the copy of vec_with_array_field now that it is available in a common location. BUG=None TEST=cargo build Change-Id: Ia272803737a4cb3e4e84213c48aa8e28c17bab2c Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1865680 Reviewed-by: Stephen Barber <smbarber@chromium.org>
* gpu_buffer: remove dead codeDavid Stevens2019-10-23
| | | | | | | | | | | | | | This code was left behind when BackedBuffer was removed. BUG=none TEST=compile Change-Id: I450a98af8a2cbea1f86e4fd825f054f7853f7a18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1847538 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: David Stevens <stevensd@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: David Stevens <stevensd@chromium.org>
* arch: Remove unused CrateMmioDevice ErrorDylan Reid2019-10-23
| | | | | | | | Change-Id: I138d709dcea8b7902f3469ae203fd453c13506dd Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1873688 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* crosvm: defer IPC on set callsMatt Delco2019-10-23
| | | | | | | | | | | | | | If a plugin makes a set call on vcpu registers then we can improve performance by deferring the IPC and instead conbining the request with the next resume call. BUG=None TEST=build and run. Change-Id: I4eb54a3f6eb30c98971aa2f099e3ea5899767eed Signed-off-by: Matt Delco <delco@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1825262 Reviewed-by: Zach Reizner <zachr@chromium.org>
* crosvm: delete resume response from protobufMatt Delco2019-10-23
| | | | | | | | | | | | | | | The resume response was deleted in a earlier change. This change removes the message type from the proto file and adjusts crosvm so it can still build after this removal. BUG=None TEST=build and run. Change-Id: I27d36a51b1e7eb59258d23da38199b86d7cb3659 Signed-off-by: Matt Delco <delco@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1825260 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Dylan Reid <dgreid@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>
* Cargo.lock: update rust-protobuf to 2.8.1Daniel Verkamp2019-10-22
| | | | | | | | | | | | | | | | | | | | | | This is the latest version of rust-protobuf at the moment, and it includes fixes so that the generated code no longer triggers rustc warnings about missing `dyn` specifiers on trait objects. Note that Cargo.lock is unused in normal Chrome OS builds; this only affects other environments like running `cargo build` directly. This change was generated using: cargo update -p protobuf -p protoc-rust --precise 2.8.1 BUG=chromium:1015571 TEST=cargo check --features=plugin Change-Id: Id1ea387be70ef81ae62b6d39f99d85d48c938d58 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1869552 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* plugin: add missing #include <string.h> in testDaniel Verkamp2019-10-22
| | | | | | | | | | | | | | | | | | | Fixes warnings during test build: <stdin>: In function 'main': <stdin>:52:17: warning: implicit declaration of function 'strerror' [-Wimplicit-function-declaration] <stdin>:70:9: warning: implicit declaration of function 'memcmp' [-Wimplicit-function-declaration] BUG=None TEST=docker/wrapped_smoke_test.sh Change-Id: Ibec87db4ca289bec9b1a2c7080fdefebb6e86158 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863822 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* docker: add DRM to upgrade_checkout_commits.shDaniel Verkamp2019-10-22
| | | | | | | | | | | | | | | The DRM repository was added to checkout_commits.env without a corresponding addition in upgrade_checkout_commits.sh. Add it and upgrade all repositories. BUG=None TEST=docker/build_crosvm_base.sh && docker/wrapped_smoke_test.sh Change-Id: Iee7ae7005284cb3b7d0e8e8c983d4ef381781f8e Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863821 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* bin/fmt: remove use of `cargo fmt`Daniel Verkamp2019-10-21
| | | | | | | | | | | | | | | | | This simplifies our formatting script so that it does not need any of the Cargo metadata to run; the new version just finds all Rust files (*.rs) and runs `rustfmt` on them individually. BUG=None TEST=bin/fmt TEST=bin/fmt --check Change-Id: I45aaee497d4f1dfcc03b3e2c5c2f27feb974dc80 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1865371 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@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>
* fuzz: add USB descriptor parsing fuzzerDaniel Verkamp2019-10-17
| | | | | | | | | | | | | | | The new USB descriptor parsing code is a nice candidate for a fuzzer, since it takes an arbitrary stream of bytes as input and parses it. BUG=chromium:987833 TEST=`USE='asan fuzzer' emerge-nami crosvm` Cq-Depend: chromium:1863465 Change-Id: I3bbdbf081e9a9dd590c781467f8bd44fa1dcab64 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1862117 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* 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>
* rust-toolchain: Change to stableChirantan Ekbote2019-10-16
| | | | | | | | | | | | | | | | | | | | | | We end up using newer features of the language pretty much as soon as they hit stable so have a toolchain version that's older than the latest stable will quickly break. Also, cargo doesn't install any extra components for this named toolchain (rls, rust-analysis) and it's not immediately obvious why things stopped working. Instead, change the toolchain file to say stable to avoid these issues. BUG=none TEST=none Change-Id: I9c02b64a1bb0175a2c7fd70702328e4082819b91 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1863894 Tested-by: Chirantan Ekbote <chirantan@chromium.org> Auto-Submit: Chirantan Ekbote <chirantan@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Chirantan Ekbote <chirantan@chromium.org>
* 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>
* vm_control: Add VmIrqRequest SocketXiong Zhang2019-10-15
| | | | | | | | | | | | | | | | | | | | | | | | | When vfio device's msi/msi-x or virtio device's msi-x is enabled, its irq routing info should be notified to kvm. But this is a runtime vm service call, so vm_control is used to call vm service. VmIrqRequest->AllocateOneMsi() is used to allocate one gsi for a msi and a msi-x vector, and link gsi with irqfd through vm->register_irqfd. The orignal interrupt_evt and interrupt_resample_interrupt is used for INTX only. VmIrqRequest->AddMsiRoute is used to add msi routing info into kvm route table. BUG=chromium:992270 TEST=none Change-Id: I4f1beeb791943e09d957573dd2a58d55bf895d16 Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1846603 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>
* 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>
* kvm: Let device could modify its irq routingXiong Zhang2019-10-14
| | | | | | | | | | | | | | | | | | Current all devices use kvm default irq routing table, but when MSI or MSI-x are enabled, they have their own irq routing, here add_irq_route_entry() is added into vm's function, then device could add its irq routing into VM's irq routing table and replace the default kvm irq routing info. BUG=chromium:992270 TEST=none Change-Id: I111f9c3c09ef66b08c6f0432e936ec7e4fd6d270 Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1581145 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
* docker: fix a failure when building crosvmJianxun Zhang2019-10-10
| | | | | | | | | | | | | | | | | | What fixed by this change failed crosvm build with docker on non-Nvidia platforms. BUG=None TEST=./build_crosvm_base.sh ./build_crosvm.sh ./wrapped_smoke_test.sh Change-Id: Ib2cc70d5bd98bcad25410ba54c0492491a3ea799 Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1842519 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
* docker: fix minigbm failure when building base imageJianxun Zhang2019-10-10
| | | | | | | | | | | | | | | | | | | | | | | | | | | Running ./build_crosvm_base.sh failed with the below error: ... /scratch/minigbm/helpers.c: In function 'layout_from_format': /scratch/minigbm/helpers.c:156:7: error: \ 'DRM_FORMAT_ABGR16161616F' undeclared (first use in this function) case DRM_FORMAT_ABGR16161616F: ... The header file in the libdrm-dev package from debian distro hasn't included the missed macro. This change builds libdrm from the upstream source to fix the issue. BUG=None TEST=./build_crosvm_base.sh echo $? Change-Id: Ifaae4313781ea02ebac9658ab8be9d990a3d5d25 Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1841890 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>
* 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>