On Wed, Aug 23, 2023 at 12:19:09PM +0530, Viresh Kumar wrote:
This adds support to issue the set irqfd ioctl via the privcmd file.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org
V3:
- Based on changes merged in kernel.
 V2:
- Fixed comment
 crates/xen-ioctls/src/private.rs | 14 +++++- crates/xen-ioctls/src/xdm/types.rs | 14 ++++++ crates/xen-ioctls/src/xdm/xdm.rs | 68 ++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-)
Applied.
Thanks, Mathieu
diff --git a/crates/xen-ioctls/src/private.rs b/crates/xen-ioctls/src/private.rs index 2d3379213e03..59a75f67f18d 100644 --- a/crates/xen-ioctls/src/private.rs +++ b/crates/xen-ioctls/src/private.rs @@ -14,8 +14,8 @@ use std::io::Error; use std::os::unix::io::AsRawFd; use vmm_sys_util::ioctl::_IOC_NONE; +use crate::xdm::types::{PrivcmdDeviceModelIrqFd, PrivcmdDeviceModelOp}; use crate::xfm::types::{PrivCmdMmapBatchV2, PrivCmdMmapResource}; -use crate::xdm::types::PrivcmdDeviceModelOp; pub const PAGE_SHIFT: u32 = 12; pub const PAGE_SIZE: u32 = 1 << PAGE_SHIFT; @@ -73,6 +73,18 @@ ioctl_ioc_nr!( std::mem::size_of::<PrivCmdMmapResource>() as u32 ); +/*
- #define IOCTL_PRIVCMD_IRQFD \
 
_IOC(_IOC_NONE, 'P', 8, sizeof(privcmd_irqfd_t))- */
 +ioctl_ioc_nr!(
- IOCTL_PRIVCMD_IRQFD,
 - _IOC_NONE,
 - XEN_PRIVCMD_TYPE,
 - 8 as u32,
 - std::mem::size_of::<PrivcmdDeviceModelIrqFd>() as u32
 +);
pub const HYPERCALL_EVTCHN: &str = "/dev/xen/evtchn"; pub const HYPERCALL_PRIVCMD: &str = "/dev/xen/privcmd"; pub const HYPERCALL_BUFFER_FILE: &str = "/dev/xen/hypercall"; diff --git a/crates/xen-ioctls/src/xdm/types.rs b/crates/xen-ioctls/src/xdm/types.rs index ea429558b852..b000a68f0cf1 100644 --- a/crates/xen-ioctls/src/xdm/types.rs +++ b/crates/xen-ioctls/src/xdm/types.rs @@ -143,3 +143,17 @@ impl PrivcmdDeviceModelOp { PrivcmdDeviceModelOp { domid, num, ubufs } } }
+pub const PRIVCMD_IRQFD_FLAG_DEASSIGN: u32 = 1;
+#[repr(C)] +#[derive(Debug, Copy, Clone)] +// tools/include/xen-sys/Linux/privcmd.h::privcmd_irqfd +pub struct PrivcmdDeviceModelIrqFd {
- pub dm_op: *mut c_void,
 - pub size: u32,
 - pub fd: u32,
 - pub flags: u32,
 - pub domid: u16,
 - pub pad: [u8; 2],
 +} diff --git a/crates/xen-ioctls/src/xdm/xdm.rs b/crates/xen-ioctls/src/xdm/xdm.rs index 115724284b7e..3aa5289794fe 100644 --- a/crates/xen-ioctls/src/xdm/xdm.rs +++ b/crates/xen-ioctls/src/xdm/xdm.rs @@ -15,6 +15,8 @@ use std::fs::{File, OpenOptions}; use std::io::Error; use std::os::unix::io::AsRawFd; +use vmm_sys_util::eventfd::EventFd;
#[cfg(target_arch = "aarch64")] use crate::aarch64::types::*; #[cfg(target_arch = "x86_64")] @@ -239,4 +241,70 @@ impl XenDeviceModelHandle { do_dm_op(&self.fd, domid, &mut privcmd_dm_op_buffers) }
- pub fn config_irqfd(
 &self,fd: EventFd,domid: u16,irq: u32,level: u8,flags: u32,- ) -> Result<(), std::io::Error> {
 let mut dm_op = XenDeviceModelOp {op: XEN_DMOP_set_irq_level,pad: 0,u: XenDeviceModelOpPayload {xen_set_irq_level: XenDeviceModelSetIrqLevel {irq,level,..Default::default()},},};let mut irqfd = PrivcmdDeviceModelIrqFd {dm_op: &mut dm_op as *mut _ as *mut c_void,size: std::mem::size_of::<XenDeviceModelOp>() as u32,fd: fd.as_raw_fd() as u32,flags,domid,pad: [0; 2],};let ret = unsafe {// The expression "&mut irqfd as *mut _" creates a reference to irqfd before casting it// to a *mut c_void.ioctl(self.fd.as_raw_fd(),IOCTL_PRIVCMD_IRQFD(),&mut irqfd as *mut _ as *mut c_void,)};if ret < 0 {return Err(Error::last_os_error());}Ok(())- }
 - pub fn set_irqfd(
 &self,fd: EventFd,domid: u16,irq: u32,level: u8,- ) -> Result<(), std::io::Error> {
 self.config_irqfd(fd, domid, irq, level, 0)- }
 - pub fn clear_irqfd(
 &self,fd: EventFd,domid: u16,irq: u32,level: u8,- ) -> Result<(), std::io::Error> {
 self.config_irqfd(fd, domid, irq, level, PRIVCMD_IRQFD_FLAG_DEASSIGN)- }
 }
2.31.1.272.g89b43f80a514