From 4f0849043c9ef8d683f257f34e590a6842d7355c Mon Sep 17 00:00:00 2001 From: Colby Townsend Date: Fri, 26 Jun 2026 04:01:00 -0700 Subject: [PATCH] vhost_user: add crosvm SHMEM_MAP compatibility SPDX-License-Identifier: Apache-2.0 crosvm's vhost-user GPU backend advertises the shared-memory mapping protocol bit as SHMEM_MAP at 0x0010_0000. rust-vmm/vhost 0.16 uses SHMEM at 0x0020_0000 for the same GET_SHMEM_CONFIG and SHMEM_MAP/ SHMEM_UNMAP flow. Accept either bit when checking local state, and expose the crosvm bit name so frontends can negotiate with crosvm without sending an unsupported protocol feature. Signed-off-by: Colby Townsend --- vhost-user-backend/src/handler.rs | 4 +++- vhost/src/vhost_user/backend_req_handler.rs | 4 +++- vhost/src/vhost_user/frontend.rs | 4 +++- vhost/src/vhost_user/message.rs | 2 ++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/vhost-user-backend/src/handler.rs b/vhost-user-backend/src/handler.rs index ea1fd6942..465dc2757 100644 --- a/vhost-user-backend/src/handler.rs +++ b/vhost-user-backend/src/handler.rs @@ -571,7 +571,9 @@ where if self.acked_protocol_features & VhostUserProtocolFeatures::SHARED_OBJECT.bits() != 0 { backend.set_shared_object_flag(true); } - if self.acked_protocol_features & VhostUserProtocolFeatures::SHMEM.bits() != 0 { + let shmem_features = VhostUserProtocolFeatures::SHMEM + | VhostUserProtocolFeatures::SHMEM_MAP; + if self.acked_protocol_features & shmem_features.bits() != 0 { backend.set_shmem_flag(true); } self.backend.set_backend_req_fd(backend); diff --git a/vhost/src/vhost_user/backend_req_handler.rs b/vhost/src/vhost_user/backend_req_handler.rs index d74b04558..fbe750c15 100644 --- a/vhost/src/vhost_user/backend_req_handler.rs +++ b/vhost/src/vhost_user/backend_req_handler.rs @@ -686,7 +686,9 @@ impl BackendReqHandler { self.send_reply_message(&hdr, &msg)?; } Ok(FrontendReq::GET_SHMEM_CONFIG) => { - self.check_proto_feature(VhostUserProtocolFeatures::SHMEM)?; + self.check_proto_feature( + VhostUserProtocolFeatures::SHMEM | VhostUserProtocolFeatures::SHMEM_MAP, + )?; let msg = self.backend.get_shmem_config()?; self.send_reply_message(&hdr, &msg)?; } diff --git a/vhost/src/vhost_user/frontend.rs b/vhost/src/vhost_user/frontend.rs index 195a6af1e..037f1b7f3 100644 --- a/vhost/src/vhost_user/frontend.rs +++ b/vhost/src/vhost_user/frontend.rs @@ -590,3 +590,5 @@ impl VhostUserFrontend for Frontend { let mut node = self.node(); - node.check_proto_feature(VhostUserProtocolFeatures::SHMEM)?; + node.check_proto_feature( + VhostUserProtocolFeatures::SHMEM | VhostUserProtocolFeatures::SHMEM_MAP, + )?; diff --git a/vhost/src/vhost_user/message.rs b/vhost/src/vhost_user/message.rs index 5826d19a6..006f2e0fe 100644 --- a/vhost/src/vhost_user/message.rs +++ b/vhost/src/vhost_user/message.rs @@ -441,6 +441,8 @@ bitflags! { const DEVICE_STATE = 0x0008_0000; /// Support suspend in-flight I/O requests and record them const GET_VRING_BASE_INFLIGHT = 0x0010_0000; + /// crosvm name for the shared-memory mapping protocol bit. + const SHMEM_MAP = 0x0010_0000; /// Allow the backend to request file descriptors be mapped into virtio shared memory /// regions. const SHMEM = 0x0020_0000; -- 2.50.0