From dfb18ef14a9c99440e4538f190817fd7b6434b57 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Wed, 21 Aug 2019 08:54:12 -0700 Subject: [PATCH] net: Make TAP registration functions immutable By making the registration functions immutable, this patch prevents from self borrowing issues with the RwLock on self.mem. Signed-off-by: Sebastien Boeuf --- vm-virtio/src/net.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vm-virtio/src/net.rs b/vm-virtio/src/net.rs index 338bd97b2..630e21f19 100644 --- a/vm-virtio/src/net.rs +++ b/vm-virtio/src/net.rs @@ -144,6 +144,7 @@ impl NetEpollHandler { // Queue has no available descriptors if self.rx_tap_listening { self.unregister_tap_rx_listener().unwrap(); + self.rx_tap_listening = false; } return false; } @@ -302,25 +303,23 @@ impl NetEpollHandler { self.tap.read(&mut self.rx.frame_buf) } - fn register_tap_rx_listener(&mut self) -> std::result::Result<(), std::io::Error> { + fn register_tap_rx_listener(&self) -> std::result::Result<(), std::io::Error> { epoll::ctl( self.epoll_fd, epoll::ControlOptions::EPOLL_CTL_ADD, self.tap.as_raw_fd(), epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)), )?; - self.rx_tap_listening = true; Ok(()) } - fn unregister_tap_rx_listener(&mut self) -> std::result::Result<(), std::io::Error> { + fn unregister_tap_rx_listener(&self) -> std::result::Result<(), std::io::Error> { epoll::ctl( self.epoll_fd, epoll::ControlOptions::EPOLL_CTL_DEL, self.tap.as_raw_fd(), epoll::Event::new(epoll::Events::EPOLLIN, u64::from(RX_TAP_EVENT)), )?; - self.rx_tap_listening = false; Ok(()) } @@ -344,6 +343,7 @@ impl NetEpollHandler { .map_err(DeviceError::EpollCtl)?; self.register_tap_rx_listener() .map_err(DeviceError::EpollCtl)?; + self.rx_tap_listening = true; epoll::ctl( self.epoll_fd, epoll::ControlOptions::EPOLL_CTL_ADD, @@ -387,6 +387,7 @@ impl NetEpollHandler { self.resume_rx().unwrap(); if !self.rx_tap_listening { self.register_tap_rx_listener().unwrap(); + self.rx_tap_listening = true; } } TX_QUEUE_EVENT => {