Skip to content

Commit f1fb78e

Browse files
justxueweistudychao
authored andcommitted
dbs-virtio-devices: Clear resources when removing virtio devices
This PR implements functionaility of clearing resources for virtio-net and virtio-vsock devices. For virtio-net devices, the removed resource is its event hanlder. For virtio-vsock devices, the removed resources are its event handler and a socket on the host. Fixes: openanolis#273 Signed-off-by: Zizheng Bian <[email protected]> Signed-off-by: Xuewei Niu <[email protected]>
1 parent 804bd6e commit f1fb78e

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

crates/dbs-virtio-devices/src/net.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use dbs_utils::metric::{IncMetric, SharedIncMetric};
2222
use dbs_utils::net::{net_gen, MacAddr, Tap, MAC_ADDR_LEN};
2323
use dbs_utils::rate_limiter::{BucketUpdate, RateLimiter, TokenType};
2424
use libc;
25-
use log::{debug, error, info, trace};
25+
use log::{debug, error, info, trace, warn};
2626
use serde::Serialize;
2727
use virtio_bindings::bindings::virtio_net::*;
2828
use virtio_queue::{QueueOwnedT, QueueSync, QueueT};
@@ -861,6 +861,18 @@ where
861861
fn as_any_mut(&mut self) -> &mut dyn Any {
862862
self
863863
}
864+
865+
fn remove(&mut self) {
866+
let subscriber_id = self.subscriber_id.take();
867+
if let Some(subscriber_id) = subscriber_id {
868+
match self.device_info.remove_event_handler(subscriber_id) {
869+
Ok(_) => debug!("virtio-net: removed subscriber_id {:?}", subscriber_id),
870+
Err(err) => warn!("virtio-net: failed to remove event handler: {:?}", err),
871+
};
872+
} else {
873+
self.tap.take();
874+
}
875+
}
864876
}
865877

866878
#[cfg(test)]

crates/dbs-virtio-devices/src/vsock/backend/unix_stream.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ impl VsockBackend for VsockUnixStreamBackend {
9191
}
9292
}
9393

94+
impl Drop for VsockUnixStreamBackend {
95+
fn drop(&mut self) {
96+
std::fs::remove_file(&self.host_sock_path).ok();
97+
}
98+
}
99+
94100
#[cfg(test)]
95101
mod tests {
96102
use std::fs;

crates/dbs-virtio-devices/src/vsock/device.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ use std::sync::Arc;
1212

1313
use dbs_device::resources::ResourceConstraint;
1414
use dbs_utils::epoll_manager::{EpollManager, SubscriberId};
15+
use log::debug;
1516
use log::trace;
17+
use log::warn;
1618
use virtio_queue::QueueT;
1719
use vm_memory::GuestAddressSpace;
1820
use vm_memory::GuestMemoryRegion;
@@ -187,6 +189,18 @@ where
187189
fn as_any_mut(&mut self) -> &mut dyn Any {
188190
self
189191
}
192+
193+
fn remove(&mut self) {
194+
let subscriber_id = self.subscriber_id.take();
195+
if let Some(subscriber_id) = subscriber_id {
196+
match self.device_info.remove_event_handler(subscriber_id) {
197+
Ok(_) => debug!("virtio-vsock: removed subscriber_id {:?}", subscriber_id),
198+
Err(err) => warn!("virtio-vsock: failed to remove event handler: {:?}", err),
199+
};
200+
} else {
201+
self.muxer.take();
202+
}
203+
}
190204
}
191205

192206
#[cfg(test)]

0 commit comments

Comments
 (0)