Skip to content

Commit f8c2a7f

Browse files
committed
Update worker thread sender on x86
On x86, use the same sender as we would for macOS. Additionally, rather than using an EventFd to determine when the thread work is done, use a response sender/receiver like macOS. Signed-off-by: Jake Correnti <[email protected]>
1 parent 585fe4a commit f8c2a7f

File tree

4 files changed

+42
-31
lines changed

4 files changed

+42
-31
lines changed

src/devices/src/legacy/ioapic.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crossbeam_channel::unbounded;
12
use kvm_bindings::{
23
kvm_enable_cap, kvm_irq_routing, kvm_irq_routing_entry, kvm_irq_routing_entry__bindgen_ty_1,
34
kvm_irq_routing_msi, KVM_CAP_SPLIT_IRQCHIP, KVM_IRQ_ROUTING_MSI,
@@ -96,14 +97,13 @@ pub struct IoApic {
9697
version: u8,
9798
irq_eoi: [i32; IOAPIC_NUM_PINS],
9899
irq_routes: Vec<kvm_irq_routing_entry>,
99-
irq_sender: crossbeam_channel::Sender<(WorkerMessage, EventFd)>,
100-
event_fd: EventFd,
100+
irq_sender: crossbeam_channel::Sender<WorkerMessage>,
101101
}
102102

103103
impl IoApic {
104104
pub fn new(
105105
vm: &VmFd,
106-
_irq_sender: crossbeam_channel::Sender<(WorkerMessage, EventFd)>,
106+
_irq_sender: crossbeam_channel::Sender<WorkerMessage>,
107107
) -> Result<Self, Error> {
108108
let mut cap = kvm_enable_cap {
109109
cap: KVM_CAP_SPLIT_IRQCHIP,
@@ -121,7 +121,6 @@ impl IoApic {
121121
irq_eoi: [0; IOAPIC_NUM_PINS],
122122
irq_routes: Vec::with_capacity(IOAPIC_NUM_PINS),
123123
irq_sender: _irq_sender,
124-
event_fd: EventFd::new(libc::EFD_SEMAPHORE).unwrap(),
125124
};
126125

127126
(0..IOAPIC_NUM_PINS).for_each(|i| ioapic.add_msi_route(i));
@@ -176,11 +175,7 @@ impl IoApic {
176175
}
177176

178177
fn send_irq_worker_message(&self, msg: WorkerMessage) {
179-
self.irq_sender
180-
.send((msg, self.event_fd.try_clone().unwrap()))
181-
.unwrap();
182-
183-
self.event_fd.read().unwrap();
178+
self.irq_sender.send(msg).unwrap();
184179
}
185180

186181
fn parse_entry(&self, entry: &RedirectionTableEntry) -> IoApicEntryInfo {
@@ -249,7 +244,12 @@ impl IoApic {
249244
}
250245
}
251246

252-
self.send_irq_worker_message(WorkerMessage::GsiRoute(self.irq_routes.clone()));
247+
let (response_sender, response_receiver) = unbounded();
248+
self.send_irq_worker_message(WorkerMessage::GsiRoute(
249+
response_sender.clone(),
250+
self.irq_routes.clone(),
251+
));
252+
response_receiver.recv().unwrap();
253253
}
254254

255255
fn service(&mut self) {
@@ -273,11 +273,27 @@ impl IoApic {
273273
continue;
274274
}
275275

276+
let (response_sender, response_receiver) = unbounded();
276277
if info.trig_mode as u64 == IOAPIC_TRIGGER_EDGE {
277-
self.send_irq_worker_message(WorkerMessage::IrqLine(i as u32, true));
278-
self.send_irq_worker_message(WorkerMessage::IrqLine(i as u32, false));
278+
self.send_irq_worker_message(WorkerMessage::IrqLine(
279+
response_sender.clone(),
280+
i as u32,
281+
true,
282+
));
283+
let _ = response_receiver.recv().unwrap();
284+
self.send_irq_worker_message(WorkerMessage::IrqLine(
285+
response_sender.clone(),
286+
i as u32,
287+
false,
288+
));
289+
let _ = response_receiver.recv().unwrap();
279290
} else {
280-
self.send_irq_worker_message(WorkerMessage::IrqLine(i as u32, true));
291+
self.send_irq_worker_message(WorkerMessage::IrqLine(
292+
response_sender.clone(),
293+
i as u32,
294+
true,
295+
));
296+
let _ = response_receiver.recv().unwrap();
281297
}
282298
}
283299
}

src/utils/src/worker_message.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
#[derive(Debug)]
22
pub enum WorkerMessage {
33
#[cfg(target_arch = "x86_64")]
4-
GsiRoute(Vec<kvm_bindings::kvm_irq_routing_entry>),
4+
GsiRoute(
5+
crossbeam_channel::Sender<bool>,
6+
Vec<kvm_bindings::kvm_irq_routing_entry>,
7+
),
58
#[cfg(target_arch = "x86_64")]
6-
IrqLine(u32, bool),
9+
IrqLine(crossbeam_channel::Sender<bool>, u32, bool),
710
#[cfg(target_os = "macos")]
811
GpuAddMapping(crossbeam_channel::Sender<bool>, u64, u64, u64),
912
#[cfg(target_os = "macos")]

src/vmm/src/builder.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,8 +511,7 @@ pub fn build_microvm(
511511
event_manager: &mut EventManager,
512512
_shutdown_efd: Option<EventFd>,
513513
#[cfg(feature = "tee")] pm_sender: (Sender<MemoryProperties>, EventFd),
514-
#[cfg(target_os = "macos")] _sender: Sender<WorkerMessage>,
515-
#[cfg(target_arch = "x86_64")] _sender: Sender<(WorkerMessage, EventFd)>,
514+
_sender: Sender<WorkerMessage>,
516515
) -> std::result::Result<Arc<Mutex<Vmm>>, StartMicrovmError> {
517516
let payload = choose_payload(vm_resources)?;
518517

src/vmm/src/lib.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ impl Vmm {
384384
pub fn start_worker_thread(
385385
vmm: Arc<Mutex<Vmm>>,
386386
#[cfg(target_os = "macos")] receiver: Receiver<WorkerMessage>,
387-
#[cfg(not(target_os = "macos"))] receiver: Receiver<(WorkerMessage, EventFd)>,
387+
#[cfg(not(target_os = "macos"))] receiver: Receiver<WorkerMessage>,
388388
) -> io::Result<()> {
389389
std::thread::Builder::new()
390390
.name("vmm worker".into())
@@ -394,26 +394,20 @@ impl Vmm {
394394
#[cfg(target_os = "macos")]
395395
Ok(message) => vmm.lock().unwrap().match_worker_message(message),
396396
#[cfg(target_os = "linux")]
397-
Ok((message, evt_fd)) => {
398-
vmm.lock().unwrap().match_worker_message(message, evt_fd)
399-
}
397+
Ok(message) => vmm.lock().unwrap().match_worker_message(message),
400398
}
401399
})?;
402400
Ok(())
403401
}
404402

405-
fn match_worker_message(
406-
&self,
407-
msg: WorkerMessage,
408-
#[cfg(target_os = "linux")] evt_fd: EventFd,
409-
) {
403+
fn match_worker_message(&self, msg: WorkerMessage) {
410404
match msg {
411405
#[cfg(target_os = "macos")]
412406
WorkerMessage::GpuAddMapping(s, h, g, l) => self.add_mapping(s, h, g, l),
413407
#[cfg(target_os = "macos")]
414408
WorkerMessage::GpuRemoveMapping(s, g, l) => self.remove_mapping(s, g, l),
415409
#[cfg(target_arch = "x86_64")]
416-
WorkerMessage::GsiRoute(entries) => {
410+
WorkerMessage::GsiRoute(sender, entries) => {
417411
let mut irq_routing = utils::sized_vec::vec_with_array_field::<
418412
kvm_bindings::kvm_irq_routing,
419413
kvm_bindings::kvm_irq_routing_entry,
@@ -428,13 +422,12 @@ impl Vmm {
428422
}
429423

430424
self.vm.fd().set_gsi_routing(&irq_routing[0]).unwrap();
431-
432-
evt_fd.write(1).unwrap();
425+
sender.send(true).unwrap();
433426
}
434427
#[cfg(target_arch = "x86_64")]
435-
WorkerMessage::IrqLine(irq, active) => {
428+
WorkerMessage::IrqLine(sender, irq, active) => {
436429
self.vm.fd().set_irq_line(irq, active).unwrap();
437-
evt_fd.write(1).unwrap();
430+
sender.send(true).unwrap();
438431
}
439432
}
440433
}

0 commit comments

Comments
 (0)