diff --git a/src/util/rust/defines.rs b/src/util/rust/defines.rs index 207bc2bd1d2..ace3202d1ee 100644 --- a/src/util/rust/defines.rs +++ b/src/util/rust/defines.rs @@ -86,7 +86,7 @@ pub const WAIT_CONTEXT_MAX: usize = 16; pub enum DescriptorType { Unknown, - Memory(u32), + Memory(u32, u32), // (size, handle_type) WritePipe, } diff --git a/src/util/rust/sys/linux/descriptor.rs b/src/util/rust/sys/linux/descriptor.rs index 5c266bf17f0..8e50006ed56 100644 --- a/src/util/rust/sys/linux/descriptor.rs +++ b/src/util/rust/sys/linux/descriptor.rs @@ -1,6 +1,7 @@ // Copyright 2025 Google // SPDX-License-Identifier: MIT +use std::fs::read_link; use std::fs::File; use std::io::Error; use std::io::ErrorKind; @@ -22,6 +23,8 @@ use crate::descriptor::AsRawDescriptor; use crate::descriptor::FromRawDescriptor; use crate::descriptor::IntoRawDescriptor; use crate::DescriptorType; +use crate::MESA_HANDLE_TYPE_MEM_DMABUF; +use crate::MESA_HANDLE_TYPE_MEM_SHM; pub type RawDescriptor = RawFd; pub const DEFAULT_RAW_DESCRIPTOR: RawDescriptor = -1; @@ -43,7 +46,10 @@ impl OwnedDescriptor { let size: u32 = seek_size .try_into() .map_err(|_| Error::from(ErrorKind::Unsupported))?; - Ok(DescriptorType::Memory(size)) + + let handle_type = self.get_memory_handle_type()?; + + Ok(DescriptorType::Memory(size, handle_type)) } _ => { let flags = fcntl_getfl(&self.owned)?; @@ -54,6 +60,21 @@ impl OwnedDescriptor { } } } + + fn get_memory_handle_type(&self) -> Result { + let fd_path = read_link(format!("/proc/self/fd/{}", self.as_raw_descriptor())) + .map_err(|_| Error::from(ErrorKind::Unsupported))?; + + let path_str = fd_path.to_string_lossy(); + if path_str.starts_with("/dmabuf:") { + Ok(MESA_HANDLE_TYPE_MEM_DMABUF) + } else if path_str.starts_with("/memfd:") { + Ok(MESA_HANDLE_TYPE_MEM_SHM) + } else { + // Default to SHM for unknown types + Ok(MESA_HANDLE_TYPE_MEM_SHM) + } + } } impl AsRawDescriptor for OwnedDescriptor {