summary refs log tree commit diff
path: root/devices/src/virtio/block.rs
Commit message (Collapse)AuthorAge
...
* devices: block: add resize VmControl requestDaniel Verkamp2019-01-16
| | | | | | | | | | | | | | | | | | | | | | | | | This allows manual resizing of block devices at runtime via the command line ('crosvm disk resize <index> <size>'). The virtio config interrupt is asserted when the disk size changes so that the guest driver can update the block device to the updated size. Currently, there is no automatic policy for resizing disks - that will be implemented in another change. Additionally, this resize operation just changes the size of the block device; the filesystem will need to be resized by the guest (e.g. via the 'btrfs filesystem resize' command) as a separate step either before (shrinking) or after (expanding) the disk resize operation. BUG=chromium:858815 TEST=Start crosvm with a control socket (-s) and resize the disk with 'crosvm disk resize' from another shell. Change-Id: I01633a7af04bfbaffbd27b9227274406d2a2b9cb Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1394152 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: block: protect disk_size with a mutexDaniel Verkamp2019-01-05
| | | | | | | | | | | | | | | This will allow the disk size to be changed from the worker thread during resize operations. BUG=chromium:858815 TEST=build_test Change-Id: I0b2e1a057831856b44f19c2ba30b4dd1ffdeafc3 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1394151 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: build config space on demandDaniel Verkamp2019-01-05
| | | | | | | | | | | | | | | This will allow the config space to change when a disk resize takes place. BUG=chromium:858815 TEST=Boot Termina on kevin Change-Id: I115a7923097c3fd1f31535e9c48c87caa32f99d7 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1394150 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* toolchain: Update to Rust 1.31.0David Tolnay2018-12-13
| | | | | | | | | | | | | | | | | | We updated the production toolchain from 1.30 to 1.31 in CL:1366446. This CL does the same upgrade for the local developer toolchain and Kokoro. The relevant changes are in rust-toolchain and kokoro/Dockerfile. The rest are from rustfmt. TEST=cargo fmt --all -- --check TEST=as described in kokoro/README.md Change-Id: I3b4913f3e237baa36c664b4953be360c09efffd4 Reviewed-on: https://chromium-review.googlesource.com/1374376 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* lint: Resolve the easier clippy lintsDavid Tolnay2018-12-03
| | | | | | | | | | | | | | | | | | | | Hopefully the changes are self-explanatory and uncontroversial. This eliminates much of the noise from `cargo clippy` and, for my purposes, gives me a reasonable way to use it as a tool when writing and reviewing code. Here is the Clippy invocation I was using: cargo +nightly clippy -- -W clippy::correctness -A renamed_and_removed_lints -Aclippy::{blacklisted_name,borrowed_box,cast_lossless,cast_ptr_alignment,enum_variant_names,identity_op,if_same_then_else,mut_from_ref,needless_pass_by_value,new_without_default,new_without_default_derive,or_fun_call,ptr_arg,should_implement_trait,single_match,too_many_arguments,trivially_copy_pass_by_ref,unreadable_literal,unsafe_vector_initialization,useless_transmute} TEST=cargo check --features wl-dmabuf,gpu,usb-emulation TEST=boot linux Change-Id: I55eb1b4a72beb2f762480e3333a921909314a0a2 Reviewed-on: https://chromium-review.googlesource.com/1356911 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: make all virtio devices report version 1Daniel Verkamp2018-11-26
| | | | | | | | | | | | | | | | | Our virtio devices are all "modern" (no legacy/transitional support). Add VIRTIO_F_VERSION_1 to the features() handler for all virtio devices that didn't already have it. This lets us remove the hack that forced VIRTIO_F_VERSION_1 on for all devices. BUG=None TEST=build_test; boot crosvm on kevin Change-Id: I008926a9075679aae46069aa37a14504f10e8584 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1313013 Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: convert virtio features to a u64Daniel Verkamp2018-11-21
| | | | | | | | | | | | | | | | | | | | | The virtio specification only defines feature bits in the 0-63 range currently, so we can represent the features as a u64. The Linux kernel makes the same simplifying assumption, and very few features have been defined beyond the first 32 bits, so this is probably safe for a while. This allows the device models to be simplified, since they no longer need to deal with the features paging mechanism (it is handled by the generic virtio transport code). BUG=None TEST=build_test; boot termina on kevin Change-Id: I6fd86907b2bdf494466c205e85072ebfeb7f5b73 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1313012 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: pci: support level-triggered interruptsDaniel Verkamp2018-10-29
| | | | | | | | | | | | | | | | Register the irqfd with resample support so that we can correctly emulate level-triggered interrupts. This requires each PciDevice to listen for interrupt_resample events and re-assert the IRQ eventfd if it should still be active. BUG=None TEST=Boot crosvm on x86-64 and arm devices Change-Id: I5cf8d1d1705cf675b453962c00d2d606801fee91 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1298654 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* sys_util: add trait to fsync File and QcowFileDaniel Verkamp2018-10-26
| | | | | | | | | | | | | | | | | | | | | | | | | File exposes sync_all() and sync_data() functions, which map to fsync() and fdatasync(), but these functions are not in a trait (they are just implemented directly on File), so they can't be implemented and used in a generic way for QcowFile. Add a new trait, FileSync, that exposes a fsync() function that may be used in the virtio block model. Previously, we were translating a block flush request into a call to File's flush() function, but this just flushes internal Rust library buffers to the file descriptor; it didn't actually result in a fsync() call. Using the new trait, we can cause an actual fsync() to occur for raw files, as intended. QcowFile was already safe, since its flush() function actually calls sync_all() under the hood. BUG=None TEST=sync with raw disk and verify fsync() in strace output Change-Id: I9bee2c0d2df3747aac1e7d9ec7d9b46a7862dc48 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1297839 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: virtio: block: ignore Discard failuresDaniel Verkamp2018-10-19
| | | | | | | | | | | | | | | | | | | | | Our branch of the 3.18 kernel has FALLOC_FL_PUNCH_HOLE disabled for the ext4 filesystem, which means that systems running that kernel always take the fallback path of writing buffers full of zeroes. This is not necessary for the Discard command, since it is just a hint and is not required to actually zero the blocks. Split the WriteZeroes trait up into a new PunchHole trait, which corresponds to fallocate() with FALLOC_FL_PUNCH_HOLE, and use the new trait to implement the virtio block Discard command. BUG=chromium:896314 TEST=`mkfs.btrfs /dev/vdb` and verify the desired fallocate() is used and no write() calls are issued when inducing a failure Change-Id: I67fd9a132758d8d766531ccca8358c7fe67b0460 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1286224 Reviewed-by: Dylan Reid <dgreid@chromium.org>
* cargo fmt all source codeZach Reizner2018-10-09
| | | | | | | | | | | | | | Now that cargo fmt has landed, run it over everything at once to bring rust source to the standard formatting. TEST=cargo test BUG=None Change-Id: Ic95a48725e5a40dcbd33ba6d5aef2bd01e91865b Reviewed-on: https://chromium-review.googlesource.com/1259287 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: track flush timer armed stateDaniel Verkamp2018-09-27
| | | | | | | | | | | | | | Rather than querying the flush timerfd state repeatedly on every write, just track the state in a variable. This avoids an extra timerfd_gettime() syscall on every write. BUG=None TEST=Verify that the flush timer still fires via strace Change-Id: I5437d26570de466f05b496d3e0dce08a521c4fde Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1247443 Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: block: enforce read-only in execute()Daniel Verkamp2018-09-21
| | | | | | | | | | | | | | | | To fully meet the requirements laid out by the virtio specification, we need to fail write commands for devices that expose VIRTIO_BLK_F_RO with a specific error code of VIRTIO_BLK_S_IOERR. Pipe the read_only status down into the worker and the request execute function so that it can be checked and return the correct error code. BUG=chromium:872973 TEST=Attempt to write to read-only /dev/vda in termina Change-Id: I98c8ad17fde497e5a529d9e65096fb4ef022fd65 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1211062 Reviewed-by: Stephen Barber <smbarber@chromium.org>
* devices: block: clear flush timer once it firesDaniel Verkamp2018-09-19
| | | | | | | | | | | | | | | Otherwise, the flush timer case of the PollContext continues to fire repeatedly, since the timerfd remains readable. BUG=None TEST=Verify that crosvm virtio_blk thread no longer pins the CPU after writes are done Change-Id: I693346c078e07b97e30083f34d00be75fa93841d Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1232295 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: block: Flush a minute after a writeDylan Reid2018-09-17
| | | | | | | | | | | If the guest doesn't issue a flush command after a write, insert one. This will mainly help qcow backed files. However, it is a good idea for block devices as well, it narrows the window for data loss. Signed-off-by: Dylan Reid <dgreid@chromium.org> Change-Id: I1d6eaeda6fd5038ec994ed882e870ae025e3c151 Reviewed-on: https://chromium-review.googlesource.com/1211126 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
* devices: block: implement discard and write zeroesDaniel Verkamp2018-09-10
| | | | | | | | | | | | | | | | | Discard and Write Zeroes commands have been added to the virtio block specification: https://github.com/oasis-tcs/virtio-spec/commit/88c8553838346b26be4460485cc57c38850b36f7 Implement both commands using the WriteZeroes trait. BUG=chromium:850998 TEST=fstrim within termina on a writable qcow image Change-Id: I33e54e303202328c10f7f2d6e69ab19f419f3998 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1188680 Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: block: define config space as a structDaniel Verkamp2018-08-15
| | | | | | | | | | | | | | | | | | | | | | Define a struct to represent the virtio block configuration as defined in the current revision of the specification. Only the capacity field is set; all other fields are defaulted to 0, which should be safe, since they are all controlled by feature flags that our device does not advertise. This is prep work for adding discard/write zeroes support to the block device, since these commands require additional config fields that will be added at the end of the config struct. BUG=chromium:850998 TEST=cargo test -p devices; verify that container still boots and reports the correct size Change-Id: I8beb76195e446eb3dcbf1a99cc246ddd8cc8a7df Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1175235 Reviewed-by: Dylan Reid <dgreid@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: add support for read-only featureDaniel Verkamp2018-08-13
| | | | | | | | | | | | | | | The virtio block specification defines the VIRTIO_BLK_F_RO feature bit to indicate read-only block devices. Plumb the read-only status of block devices from the crosvm frontend into the virtio block device and populate the flag when appropriate. BUG=chromium:872973 TEST=Verify lsblk output in guest has the correct RO values Change-Id: I23af87cce8020641cd702adca6e8ff9fdd2b8220 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1170306 Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: store features as a u64Daniel Verkamp2018-08-13
| | | | | | | | | | | | | This matches other virtio device models (net, p9, vsock) and makes it easier to add flags conditionally at device creation time. BUG=chromium:872973 TEST=cargo test -p devices Change-Id: I65b3f37c220fae44a3f6b397acc6c0eec2b70bf2 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1170305 Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: define features as shift countsDaniel Verkamp2018-08-13
| | | | | | | | | | | | | | | Convert the definition of VIRTIO_BLK_F_FLUSH to a shift count instead of a bitmask. This matches the way the features are defined in the virtio spec and makes block consistent with other device models, such as p9. BUG=chromium:872973 TEST=cargo test -p devices Change-Id: Iece974c6f4d826b7bb76622973f08469a7936234 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1170303 Reviewed-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* device: block: Update status of the flush commandDylan Reid2018-07-17
| | | | | | | | | | ARM cares about the status so we need to parse the request correctly and fill in the status. Change-Id: I1ffabf556424184017eb64d3b9c68c72b75d0a26 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1139584 Reviewed-by: Stephen Barber <smbarber@chromium.org>
* devices: block: Support flush commandDylan Reid2018-07-13
| | | | | | | | | | The "supports flush" bit wasn't set in the device features, so the guest wasn't syncing. Handle the request, which is 0 length so needs special casing in the `parse` function. Change-Id: I079611df912cd077362b2ee9925cf730ba86d9e5 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1135940
* devices: block: add sector info to block errorsSonny Rao2018-05-04
| | | | | | | | | | | | | | This would have been useful in figuring out recent bugs in the block sub system. BUG=chromium:837453 TEST=manual test on kevin with qcow device Change-Id: I3e3360bb0226e3cd7052e0431ce555cfef5e091b Reviewed-on: https://chromium-review.googlesource.com/1034013 Commit-Ready: Sonny Rao <sonnyrao@chromium.org> Tested-by: Sonny Rao <sonnyrao@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
* devices: block: use PollContext in block deviceZach Reizner2018-04-04
| | | | | | | | | | | | | | Switching to PollContext so that there is one less user of Poller, which will be removed. TEST=run any vm with a block device BUG=chromium:816692 Change-Id: I2e1301ea9d66012262f1fcb69eaeee9f7464f3b3 Reviewed-on: https://chromium-review.googlesource.com/983036 Commit-Ready: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
* fix some clippy errors that are default denyZach Reizner2018-03-07
| | | | | | | | | | | | | | | | | Clippy only has 6 lints that are defaulted to deny, which this CL fixes. The first step to running clippy and establishing our own set of default deny lints, is to ensure we aren't running afoul of the most common deny lints. BUG=None TEST=cargo clippy --all Change-Id: I225801357d76a8a9e246e3842bc9bf550fcd7207 Reviewed-on: https://chromium-review.googlesource.com/952045 Commit-Ready: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Dylan Reid <dgreid@chromium.org>
* block: Put more info in Read and Write errorsDylan Reid2018-02-12
| | | | | | | | | | Adding the size and offset of a read or write makes errors easier to reproduce. Change-Id: Ia1c07f831dc6fb6f08acb87a30459713d0f706c0 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/907420 Reviewed-by: Stephen Barber <smbarber@chromium.org>
* crosvm: change GuestAddress to always be a u64Sonny Rao2018-02-01
| | | | | | | | | | | | | | | We want to be able to run 64-bit ARM kernels using a 32-bit version of crosvm, to make it more consistent use a u64 to represent GuestAddress. BUG=chromium:797868 TEST=./build_test passes on all architectures TEST=crosvm runs on caroline Change-Id: I43bf993592caf46891e3e5e05258ab70b6bf3045 Signed-off-by: Sonny Rao <sonnyrao@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/896398 Reviewed-by: Dylan Reid <dgreid@chromium.org>
* devices: block: require traits not a fileDylan Reid2018-01-16
| | | | | | | | | | | Allow block to take anything that satisfies the traits it uses. This will allow for different backends to be used in addition to normal files. The first new backend will be qcow2 added in subsequent commits. Change-Id: I571ffc8ad4b5d56f286e134f47a60261d639b160 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/862627 Reviewed-by: Zach Reizner <zachr@chromium.org>
* crosvm/devices: set thread namesStephen Barber2017-10-30
| | | | | | | | | | | | | | | | crosvm spawns a lot of processes/threads, and having these all use the same name as the original process can be confusing. So at least in the instances where Rust threads are spawned (vs. minijail_fork()), use a thread::Builder to allow setting the thread name. BUG=none TEST=start crosvm, check thread names with top Change-Id: I6e55ff5fd60f258880bda8e656ab7f9da82c656e Reviewed-on: https://chromium-review.googlesource.com/742394 Commit-Ready: Stephen Barber <smbarber@chromium.org> Tested-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org>
* Move crosvm/hw to a new devices moduleDylan Reid2017-10-09
Moving the devices to their own module makes it easier to add tests that use them. Change-Id: I61bfef4037d16b20145b5fddce604835cdc4f67b Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/706559 Reviewed-by: Zach Reizner <zachr@chromium.org>