From c68302f7007225fa47f22a1085a8c59dcdae2ad4 Mon Sep 17 00:00:00 2001 From: Zhang Junyang Date: Fri, 6 Sep 2024 20:05:01 +0800 Subject: [PATCH] Don't hold any locks while waiting in `EpollFile` --- kernel/src/syscall/epoll.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kernel/src/syscall/epoll.rs b/kernel/src/syscall/epoll.rs index a32afefb5..9b7bdff1f 100644 --- a/kernel/src/syscall/epoll.rs +++ b/kernel/src/syscall/epoll.rs @@ -106,9 +106,11 @@ fn do_epoll_wait( None }; - let file_table = ctx.process.file_table().lock(); - let epoll_file = file_table - .get_file(epfd)? + let epoll_file_arc = { + let file_table = ctx.process.file_table().lock(); + file_table.get_file(epfd)?.clone() + }; + let epoll_file = epoll_file_arc .downcast_ref::() .ok_or(Error::with_message(Errno::EINVAL, "not epoll file"))?; let result = epoll_file.wait(max_events, timeout.as_ref());