Skip to content

Commit

Permalink
perf(net): deregister tap from poll while handling events
Browse files Browse the repository at this point in the history
virtio-net benchmark data (io_ops/sec) with neper/tcp_rr

AMD
     | before    | after
 ----|-----------|----------
  TX | 48710.859 | 55276.65
  RX | 48285.602 | 55761.6

Intel
     | before    | after
 ----|-----------|-----------
  TX | 38647.308 | 46642.882
  RX | 39126.857 | 47304.954

Signed-off-by: Changyuan Lyu <changyuanl@google.com>
  • Loading branch information
Lencerf committed Sep 15, 2024
1 parent b306c1a commit f365429
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions alioth/src/virtio/dev/net/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,22 +359,23 @@ impl VirtioMio for Net {
event: &Event,
queues: &mut [Option<Q>],
irq_sender: &impl IrqSender,
_registry: &Registry,
registry: &Registry,
) -> Result<()>
where
Q: VirtQueue<'m>,
{
let token = event.token().0;
let Some(socket) = self.tap_sockets.get(token) else {
log::error!("{}: cannot find tap queue {token}", self.name);
return Ok(());
};
registry.deregister(&mut SourceFd(&socket.as_raw_fd()))?;
if event.is_readable() {
let rx_queue_index = token << 1;
let Some(Some(queue)) = queues.get_mut(rx_queue_index) else {
log::error!("{}: cannot find rx queue {rx_queue_index}", self.name);
return Ok(());
};
let Some(socket) = self.tap_sockets.get(token) else {
log::error!("{}: cannot find tap queue {token}", self.name);
return Ok(());
};
reader_to_queue(&self.name, socket, rx_queue_index as u16, queue, irq_sender)?;
}
if event.is_writable() {
Expand All @@ -383,12 +384,13 @@ impl VirtioMio for Net {
log::error!("{}: cannot find tx queue {tx_queue_index}", self.name);
return Ok(());
};
let Some(socket) = self.tap_sockets.get(token) else {
log::error!("{}: cannot find tap queue {token}", self.name);
return Ok(());
};
queue_to_writer(&self.name, socket, tx_queue_index as u16, queue, irq_sender)?;
}
registry.register(
&mut SourceFd(&socket.as_raw_fd()),
Token(token),
Interest::READABLE | Interest::WRITABLE,
)?;
Ok(())
}

Expand Down

0 comments on commit f365429

Please sign in to comment.