Commit graph

562 commits

Author SHA1 Message Date
Stefano Garzarella
aceda54de8 vhost: fix clippy transmute used without annotations
The new clippy in rust-vmm-ci complain about this:

error: transmute used without annotations
   --> vhost/src/vhost_kern/mod.rs:405:29
    |
405 |             msg.perm = mem::transmute(self.__bindgen_anon_1.iotlb.perm);
    |                             ^^^^^^^^^ help: consider adding missing annotations: `transmute::<u8, backend::VhostAccess>`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#missing_transmute_annotations
    = note: `-D clippy::missing-transmute-annotations` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::missing_transmute_annotations)]`

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
2024-09-03 11:59:38 +02:00
Stefano Garzarella
5a115dc7d4 vhost: fix clippy doc list item missing indentation
The new clippy in rust-vmm-ci complain about this:

error: doc list item missing indentation
   --> vhost/src/vhost_user/connection.rs:305:9
    |
305 |     /// In other words, recvmsg() operations must not cross the packet boundary, other...
    |         ^
    |
    = help: if this is supposed to be its own paragraph, add a blank line
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_lazy_continuation
    = note: `-D clippy::doc-lazy-continuation` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::doc_lazy_continuation)]`

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
2024-09-03 11:59:38 +02:00
Stefano Garzarella
b5a117d581 vhost: fix clippy match can be simplified with .unwrap_or_default()``
The new clippy in rust-vmm-ci complain about this:

error: match can be simplified with `.unwrap_or_default()`
   --> vhost/src/vhost_user/connection.rs:138:20
    |
138 |           let rfds = match fds {
    |  ____________________^
139 | |             Some(rfds) => rfds,
140 | |             _ => &[],
141 | |         };
    | |_________^ help: replace it with: `fds.unwrap_or_default()`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_unwrap_or_default
    = note: `-D clippy::manual-unwrap-or-default` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::manual_unwrap_or_default)]`

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
2024-09-03 11:59:38 +02:00
Stefano Garzarella
9442110f98 vhost: fix clippy deprecating feature = "cargo-clippy"
The latest toolchain update in rust-vmm-ci caused the following
error:

  error: unexpected `cfg` condition value: `cargo-clippy`
     --> vhost/src/vhost_user/message.rs:758:16
      |
  758 |     #[cfg_attr(feature = "cargo-clippy", allow(clippy::useless_conversion))]
      |                ^^^^^^^^^^^^^^^^^^^^^^^^
      |

As suggested in [1], today is no longer needed to check the
`cargo-clippy` feature (which has been deprecated), but we can
just use `#[allow(clippy::lint_name)]`.

[1] https://blog.rust-lang.org/2024/02/28/Clippy-deprecating-feature-cargo-clippy.html

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
2024-09-03 11:59:38 +02:00
Matej Hrica
c1e1ba2bf9 Fix bug in test create_listener_from_raw_fd()
Call into_raw_fd() instead of as_raw_fd() to make sure the fd is not closed
by File destructor.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-08-30 16:06:24 +02:00
dependabot[bot]
e4d9e237f2 build(deps): bump rust-vmm-ci from cec97d9 to 5e818dc
Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `cec97d9` to `5e818dc`.
- [Commits](cec97d9e6c...5e818dc729)

---
updated-dependencies:
- dependency-name: rust-vmm-ci
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-26 12:14:37 +02:00
dependabot[bot]
5c6080275f build(deps): bump rust-vmm-ci from 9f641f2 to cec97d9
Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `9f641f2` to `cec97d9`.
- [Commits](9f641f269b...cec97d9e6c)

---
updated-dependencies:
- dependency-name: rust-vmm-ci
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-06 09:08:50 +02:00
dependabot[bot]
50e28018d2 build(deps): bump rust-vmm-ci from 0503867 to 9f641f2
Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `0503867` to `9f641f2`.
- [Commits](05038671bb...9f641f269b)

---
updated-dependencies:
- dependency-name: rust-vmm-ci
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-30 12:14:04 +02:00
Matej Hrica
a4d6c81c8d CI: Build and test with gpu-socket feature
Compile and test with `gpu-socket` feature enabled.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
4684f2e9fc Modify changelogs mentioning upcoming gpu-socket feature
Adds links to PR in CHANGELOG.md for both vhost and vhost-user-backend.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
9c941c2c90 vhost_user: Add GpuBackend::set_dmabuf_scanout2
Add a method and related struct to send the VHOST_USER_GPU_DMABUF_SCANOUT2
message.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Dorinda Bassey
219e982479 vhost_user: Add GpuBackend::cursor_* message methods
Add methods to send cursor related messages: VHOST_USER_GPU_CURSOR_POS,
VHOST_USER_GPU_CURSOR_POS_HIDE and VHOST_USER_GPU_CURSOR_UPDATE.

VhostUserGpuCursorUpdate's `data` field is passed as a separate argument
into cursor_update method. The type is also an u8 array instead of u32
array like in the spec. Having the type be u8 array makes it easier to work
with the data without unsafe code for the consumer of this crate. Having it
be a separate argument is useful, because the user of the method doesn't
have to copy the array into a struct.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
2024-07-23 14:50:25 +02:00
Dorinda Bassey
7b23ae4609 vhost_user: Add GpuBackend::get_ and set_protocol_features
Add get_protocol_features method to send
VHOST_USER_GPU_GET_PROTOCOL_FEATURES and receive the reply. Also add
a method to send SET_PROTOCOL_FEATURES.
Introduce VhostUserGpuProtocolFeatures bitmap that defines possible feature
flags.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
fb496c0eaa vhost_user: Add GpuBackend::set_ and update_dmabuf_scanout
Add methods and related structs to send the VHOST_USER_GPU_DMABUF_SCANOUT
and VHOST_USER_GPU_DMABUF_UPDATE update messages.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
e385837436 vhost_user: Add GpuBackend::update_scanout
Add a method and related struct to send VHOST_USER_GPU_UPDATE.

The data part of the message is not part of the struct like sugested by
the spec but a separate argument to update_scanout. This is necessary
because of limitations of having an unsized array inside of struct in Rust.
But this aproach seems preferable anyway, because it allows the consumer of
the crate to store the array in a diferent location than the struct.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Dorinda Bassey
d35c657c05 vhost_user: Add GpuBackend::set_scanout
Add a method set_scanout() that sends VHOST_USER_GPU_SCANOUT and doesn't
wait for a reply.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
2024-07-23 14:50:25 +02:00
Dorinda Bassey
a08c43c6ed vhost_user: Add GpuBackend::get_edid
Add a method and related structs to send VHOST_USER_GPU_GET_EDID and
receive the reply.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
2024-07-23 14:50:25 +02:00
Dorinda Bassey
113bd0e187 vhost_user: Add GpuBackend::get_display_info
Add a get_display_info() method and the related reply structs to send
VHOST_USER_GPU_GET_DISPLAY_INFO and receive the reply.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
ab0c088bb6 vhost_user: Support sending msg larger than MAX_MSG_SIZE
Introduce another constant MAX_MSG_SIZE that is part of the MsgHeader
trait. For now this is only used for sending messages.
Consider using the more specific trait constant everywhere.

The VHOST_USER_GPU_UPDATE and VHOST_USER_GPU_CURSOR_UPDATE contain image
data and are larger than the existing MAX_MSG_SIZE.

The existing MAX_MSG_SIZE wasn't really a limitation of the protocol,
just an implementation detail limitation in this crate.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
9b24090faf Forward VHOST_USER_GPU_SET_SOCKET to VhostUserBackend impls
The VHOST_USER_GPU_SET_SOCKET is only handled when the feature gpu-socket
is enabled. This also introduces a GpuBackend for handling comunication
over the socket.
Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
ca57fb165d vhost_user: Add gpu_message protocol bits
This commit adds the basic definitions of GPU commands on the socket
obtained from VHOST_USER_GPU_SET_SOCKET. This also introduces a new
feature flag `gpu-socket` in the vhost crate.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
c66e3a9e0f vhost_user: Move enum_value macro from message.rs to mod.rs
Move the enum_value macro into vhost_user module and make it public within
this module. This will be used in the next commit for defining gpu message
enum.

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Matej Hrica
051c923301 vhost_user: Make Endpoint generic over Header not just Req
The Endpoint was previusly generic only over the Request.
This commit allows Endpoint to be used with a protocol with a slightly
different header such as the QEMU GPU protocol on the socket from
VHOST_USER_GPU_SET_SOCKET.
https://www.qemu.org/docs/master/interop/vhost-user-gpu.html

Signed-off-by: Matej Hrica <mhrica@redhat.com>
2024-07-23 14:50:25 +02:00
Alyssa Ross
7554d06ff4 vhost_user: ignore unknown features from backend
virtiofsd 1.11.0 added support for VHOST_USER_PROTOCOL_F_DEVICE_STATE.
Upgrading virtiofsd meant that the latest released version of Cloud
Hypervisor (39.0) was no longer able to communicate with it, because
rather than just ignoring the unsupported feature, it got an
unrecoverable "invalid message" error.  This demonstrates that it's
better for frontends to just ignore offers of unsupported features.
If the backend requires some feature, it'll get a chance to know that
when we send VHOST_USER_SET_PROTOCOL_FEATURES anyway.

Signed-off-by: Alyssa Ross <hi@alyssa.is>
2024-07-01 14:13:03 +02:00
Albert Esteve
6755c6cd82 CHANGELOG.md: Remove support for FS_* requests
Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-27 21:47:54 +02:00
Albert Esteve
569ef077fa vhost_user: Remove support for FS_* requests
Since these non-standard backend request
message types are confirmed not to be used
anymore, let's just remove them.

```
pub enum BackendReq {
    ...
    /// Virtio-fs draft: map file content into the window.
    FS_MAP = 100,
    /// Virtio-fs draft: unmap file content from the window.
    FS_UNMAP = 1001,
    /// Virtio-fs draft: sync file content.
    FS_SYNC = 1002,
    /// Virtio-fs draft: perform a read/write from an fd directly to GPA.
    FS_IO = 1003,
    ...
}
```

Closes: #213
Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-27 21:47:54 +02:00
dependabot[bot]
48081ddad6 build(deps): update nix requirement from 0.28 to 0.29 in the vhost group
Updates the requirements on [nix](https://github.com/nix-rust/nix) to permit the latest version.

Updates `nix` to 0.29.0
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.28.0...v0.29.0)

---
updated-dependencies:
- dependency-name: nix
  dependency-type: direct:production
  dependency-group: vhost
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-27 09:59:25 +02:00
Albert Esteve
873a9b9bed CHANGELOG.md: Add shared object feature
Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-19 13:11:20 +02:00
Albert Esteve
94be3dfb7d vhost_user.backend_req: check shared_object flag
Check for VHOST_USER_PROTOCOL_F_SHARED_OBJECT flag
before allowing the backend to send SHARED_OBJECT_*
requests.

If it does have negotiated the protocol feature,
avoid sending the message and return error code
(i.e., !=0).

Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-19 13:11:20 +02:00
Albert Esteve
76c347c108 vhost_user: add shared object msg
Add SHARED_OBJECT_* vhost-user request
IDs to align with standard. Implement
backend functions to send these
requests.

Add SHARED_OBJECT protocol feature.

Add GET_SHARED_OBJECT to the frontend
requests (not implemented, this is just to
have the placeholder and align with current
standard).

Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-19 13:11:20 +02:00
Albert Esteve
9323902c59 vhost_user: join frontend handler thread on tests
Assertion fails on the frontend thread in tests
can go unnoticed.
To avoid that the main thread finishes before
and solve this issue, let's `join()` the thread
at the end of the test.

Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-19 13:11:20 +02:00
Albert Esteve
85e00973f4 vhost_user: separate non standard msgs
FS_* vhost-user backend request messages in
BackendReq enum did not make it into the
standard yet. Actually, currently there
are already SHARED_OBJECT_* messages that
use the message type IDs for FS_* types.

To fix this and avoid the issue for future
message IDs, let's move FS_* types further
away and prevent collision to occur.
This way we only need to change it once.

Signed-off-by: Albert Esteve <aesteve@redhat.com>
2024-06-19 13:11:20 +02:00
dependabot[bot]
1991b1d77e build(deps): bump rust-vmm-ci from 7606478 to 0503867
Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `7606478` to `0503867`.
- [Commits](7606478202...05038671bb)

---
updated-dependencies:
- dependency-name: rust-vmm-ci
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-11 08:48:08 +02:00
Eugenio Pérez
043d0d8fa2 vhost-user-backend: set event_idx boolean at set_features
A frontend can skip the call to set_vring_base, assuming the ring will
be initialized at 0.  If that frontend acknowledge EVENT_IDX vring and
VhostUserHandler backend will never know they need to use event idx.

Move the features configuration of the vring and the backend to set_features method.

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
2024-05-14 12:28:11 +02:00
Matias Ezequiel Vara Larsen
bd6bf1325b vhost-user-backend: Prepare v0.15.0 release
This release changes the dependency for virtio-queue to 0.12.0.

Signed-off-by: Matias Ezequiel Vara Larsen <mvaralar@redhat.com>
2024-04-15 14:51:00 +02:00
dependabot[bot]
2a89b283fa build(deps): bump the vhost group with 1 update
Updates the requirements on [virtio-queue](https://github.com/rust-vmm/vm-virtio) to permit the latest version.

Updates `virtio-queue` to 0.12.0
- [Release notes](https://github.com/rust-vmm/vm-virtio/releases)
- [Commits](https://github.com/rust-vmm/vm-virtio/compare/virtio-queue-v0.11.0...virtio-queue-v0.12.0)

---
updated-dependencies:
- dependency-name: virtio-queue
  dependency-type: direct:production
  dependency-group: vhost
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-26 09:16:48 +01:00
German Maglione
e3de13040b vhost-user-backend: Prepare v0.14.0 release
This release adds support for live migration, adding
dirty pages tracking and initial postcopy support.

Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-15 11:23:54 +01:00
German Maglione
0133c53d5d vhost: Prepare v0.11.0 release
This release adds support for live migration, adding
dirty pages tracking and initial postcopy support.

Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-15 11:23:54 +01:00
German Maglione
6ce9d36b1e Add SET_LOG_BASE message support
If the backend has the VHOST_USER_PROTOCOL_F_LOG_SHMFD protocol feature
it will receive the VHOST_USER_SET_LOG_BASE message with a file
descriptor of the dirty-pages log memory region. This log covers all
known guest addresses, and must be manipulated atomically.

For further info please see
https://qemu-project.gitlab.io/qemu/interop/vhost-user.html#migration

Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-11 17:21:15 +01:00
German Maglione
4443df57bb vhost-user-backend: Add vhost-user bitmap trait bounds
Any bitmap used in the vhost-user backend must implement the
BitmapReplace trait, which provides the functionality to replace the
internal bitmap in runtime.

This internal bitmap is required because in the vm-memory crate the
bitmap is expected to exist at the time of creating the memory regions,
and in the case of vhost-user the bitmap is added at runtime, also it
could be replaced at a later time. In addition, the vhost user protocol
does not specify whether the previous bitmap is still active after
replying to the VHOST_USER_SET_LOG_BASE message, so we must be sure
that the in-flight requests are using the new bitmap after the message
reply.

Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-11 17:21:15 +01:00
German Maglione
d05f1b5e12 Add replaceable-mmapped bitmap support
The vhost user protocol supports live migration, and during live
migration, the vhost-user frontend needs to track the modifications the
vhost-user backend makes to the memory mapped regions, marking the
dirty pages in a log (i.e., a bitmap).

If the backend has the VHOST_USER_PROTOCOL_F_LOG_SHMFD protocol feature
it will receive the VHOST_USER_SET_LOG_BASE message with a file
descriptor of the dirty-pages log memory region. This log covers all
known guest addresses, and must be manipulated atomically.

For further info please see
https://qemu-project.gitlab.io/qemu/interop/vhost-user.html#migration

This commit adds support for creating an atomic-memory-mapped bitmap,
and being able to replace it in runtime. The vhost user protocol does
not specify whether the previous bitmap is still active after replying
to the VHOST_USER_SET_LOG_BASE message, so we use an RwLock to be sure
that the in-flight requests are using the new bitmap after the message
reply.

Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-11 17:21:15 +01:00
German Maglione
89126226b5 Add myself as code owner
Signed-off-by: German Maglione <gmaglione@redhat.com>
2024-03-07 09:46:49 +01:00
dependabot[bot]
6241add2a7 build(deps): bump the vhost group with 1 update
Updates the requirements on [nix](https://github.com/nix-rust/nix) to permit the latest version.

Updates `nix` to 0.28.0
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.27.0...v0.28.0)

---
updated-dependencies:
- dependency-name: nix
  dependency-type: direct:production
  dependency-group: vhost
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-27 09:13:17 +01:00
dependabot[bot]
1bead8f760 build(deps): bump rust-vmm-ci from 72ebeb3 to 7606478
Bumps [rust-vmm-ci](https://github.com/rust-vmm/rust-vmm-ci) from `72ebeb3` to `7606478`.
- [Commits](72ebeb393c...7606478202)

---
updated-dependencies:
- dependency-name: rust-vmm-ci
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-26 09:55:21 +01:00
dependabot[bot]
39e56d340e build(deps): bump the vhost group with 1 update
---
updated-dependencies:
- dependency-name: userfaultfd
  dependency-type: direct:production
  dependency-group: vhost
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-30 09:17:58 +01:00
Egor Lazarchuk
3044602efd coverage: add vhost-user-backend/postcopy feature
Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk>
2024-01-24 16:25:52 +01:00
Egor Lazarchuk
032fe16bca ci: add postcopy feature to *-without-xen tests
Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk>
2024-01-24 16:25:52 +01:00
Egor Lazarchuk
ee2ffdf890 doc: add postcopy feature description
New sections in README files describe what `postcopy`
feature enables and the limitation of using it with
`xen` feature.

Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk>
2024-01-24 16:25:52 +01:00
Egor Lazarchuk
a051b5c3b2 test: postcopy messages
Additional tests that trigger postcopy messages handling
on both frontend and backend side. To run successfully
they need access to /dev/userfaultfd.

Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk>
2024-01-24 16:25:52 +01:00
Egor Lazarchuk
0a221ab824 vhost-user-backend: handler supports POSTCOPY messages
New feature `postcopy` is introduced. It acts as a gate for a
new functionality.
This feature is not compatible with `xen` feature because `xen`
can map memory regions on demand and this does not work with uffd.

Now backend handler supports processing of POSTCOPY messages.
This is only available when `xen` feature is not in use.

Signed-off-by: Egor Lazarchuk <yegorlz@amazon.co.uk>
2024-01-24 16:25:52 +01:00