From d3499999676dd5397cc6ec6bcfb8cf217108e975 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Thu, 13 Sep 2018 02:41:13 +0300 Subject: [PATCH] criu: remove all magic of service-fd when it isn't required Service descriptors are a set of file descriptors which isn't intercepted with restored file descriptors. In all cases, when we don't need to restore file descriptors, we can skip all magic of service-fd and just save descriptor numbers in a static array. Reviewed-by: Kirill Tkhai Signed-off-by: Andrei Vagin --- criu/util.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/criu/util.c b/criu/util.c index 66a6d4aae..2bae71ea8 100644 --- a/criu/util.c +++ b/criu/util.c @@ -454,8 +454,6 @@ int init_service_fd(void) } service_fd_rlim_cur = (int)rlimit.rlim_cur; - service_fd_base = service_fd_rlim_cur; - BUG_ON(service_fd_base < SERVICE_FD_MAX); return 0; } @@ -476,6 +474,7 @@ int service_fd_min_fd(struct pstree_item *item) } static DECLARE_BITMAP(sfd_map, SERVICE_FD_MAX); +static int sfd_arr[SERVICE_FD_MAX]; /* * Variable for marking areas of code, where service fds modifications * are prohibited. It's used to safe them from reusing their numbers @@ -498,6 +497,12 @@ int install_service_fd(enum sfd_type type, int fd) if (sfds_protected && !test_bit(type, sfd_map)) sfds_protection_bug(type); + if (service_fd_base == 0) { + sfd_arr[type] = fd; + set_bit(type, sfd_map); + return fd; + } + if (dup3(fd, sfd, O_CLOEXEC) != sfd) { pr_perror("Dup %d -> %d failed", fd, sfd); close(fd); @@ -516,6 +521,9 @@ int get_service_fd(enum sfd_type type) if (!test_bit(type, sfd_map)) return -1; + if (service_fd_base == 0) + return sfd_arr[type]; + return __get_service_fd(type, service_fd_id); }