mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-12-22 13:45:20 +00:00
pci: vfio_user: Batch IRQ enabling into batches of 16
The sendmsg() syscall is limited in the number of fds it can handle.
This number matches that used by the vfio-user library and is
conservative (since we've seen it work with 64 fds.)
Fixes: #3401
Signed-off-by: Rob Bradford <robert.bradford@intel.com>
(cherry picked from commit 7444c3a0c5
)
Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
43c4b6f546
commit
3e9eff1a9a
@ -326,17 +326,33 @@ impl Vfio for VfioUserClientWrapper {
|
||||
);
|
||||
let fds: Vec<i32> = event_fds.iter().map(|e| e.as_raw_fd()).collect();
|
||||
|
||||
self.client
|
||||
.lock()
|
||||
.unwrap()
|
||||
.set_irqs(
|
||||
irq_index,
|
||||
VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER,
|
||||
0,
|
||||
event_fds.len() as u32,
|
||||
&fds,
|
||||
)
|
||||
.map_err(VfioError::VfioUser)
|
||||
// Batch into blocks of 16 fds as sendmsg() has a size limit
|
||||
let mut sent_fds = 0;
|
||||
let num_fds = event_fds.len() as u32;
|
||||
while sent_fds < num_fds {
|
||||
let remaining_fds = num_fds - sent_fds;
|
||||
let count = if remaining_fds > 16 {
|
||||
16
|
||||
} else {
|
||||
remaining_fds
|
||||
};
|
||||
|
||||
self.client
|
||||
.lock()
|
||||
.unwrap()
|
||||
.set_irqs(
|
||||
irq_index,
|
||||
VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER,
|
||||
sent_fds,
|
||||
count,
|
||||
&fds[sent_fds as usize..(sent_fds + count) as usize],
|
||||
)
|
||||
.map_err(VfioError::VfioUser)?;
|
||||
|
||||
sent_fds += count;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn disable_irq(&self, irq_index: u32) -> Result<(), VfioError> {
|
||||
|
Loading…
Reference in New Issue
Block a user