[CRIU] [PATCH 4/4] files: Keep single sorted list of fds (v2)
Pavel Emelyanov
xemul at virtuozzo.com
Fri Feb 10 06:52:44 PST 2017
After fds restore set merge we no longer need two lists.
v2: Don't BUG in eventpoll when the tfd is not on the list.
This situation means that it's restored, so it's safe
to report OK from this place.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/eventpoll.c | 8 ++++++--
criu/files.c | 20 ++++++++------------
criu/include/files.h | 1 -
criu/include/rst_info.h | 1 -
4 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/criu/eventpoll.c b/criu/eventpoll.c
index e8831c1..c638f8f 100644
--- a/criu/eventpoll.c
+++ b/criu/eventpoll.c
@@ -153,7 +153,7 @@ static int epoll_not_ready_tfd(EventpollTfdEntry *tdefe)
{
struct fdinfo_list_entry *fle;
- list_for_each_entry(fle, &rsti(current)->used, used_list) {
+ list_for_each_entry(fle, &rsti(current)->fds, ps_list) {
if (tdefe->tfd != fle->fe->fd)
continue;
@@ -162,7 +162,11 @@ static int epoll_not_ready_tfd(EventpollTfdEntry *tdefe)
else
return (fle->stage != FLE_RESTORED);
}
- BUG();
+
+ /*
+ * If tgt fle is not on the fds list, it's already
+ * restored (see open_fdinfos), so we're ready.
+ */
return 0;
}
diff --git a/criu/files.c b/criu/files.c
index 6240062..f2ade30 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -103,8 +103,8 @@ struct fdinfo_list_entry *find_used_fd(struct pstree_item *task, int fd)
struct list_head *head;
struct fdinfo_list_entry *fle;
- head = &rsti(task)->used;
- list_for_each_entry_reverse(fle, head, used_list) {
+ head = &rsti(task)->fds;
+ list_for_each_entry_reverse(fle, head, ps_list) {
if (fle->fe->fd == fd)
return fle;
/* List is ordered, so let's stop */
@@ -118,16 +118,13 @@ void collect_task_fd(struct fdinfo_list_entry *new_fle, struct rst_info *ri)
{
struct fdinfo_list_entry *fle;
- /* fles in fds list are disordered */
- list_add_tail(&new_fle->ps_list, &ri->fds);
-
- /* fles in used list are ordered by fd */
- list_for_each_entry(fle, &ri->used, used_list) {
+ /* fles in fds list are ordered by fd */
+ list_for_each_entry(fle, &ri->fds, ps_list) {
if (new_fle->fe->fd < fle->fe->fd)
break;
}
- list_add_tail(&new_fle->used_list, &fle->used_list);
+ list_add_tail(&new_fle->ps_list, &fle->ps_list);
}
unsigned int find_unused_fd(struct pstree_item *task, int hint_fd)
@@ -142,9 +139,9 @@ unsigned int find_unused_fd(struct pstree_item *task, int hint_fd)
}
prev_fd = service_fd_min_fd() - 1;
- head = &rsti(task)->used;
+ head = &rsti(task)->fds;
- list_for_each_entry_reverse(fle, head, used_list) {
+ list_for_each_entry_reverse(fle, head, ps_list) {
fd = fle->fe->fd;
if (prev_fd > fd) {
fd++;
@@ -788,7 +785,6 @@ int prepare_fd_pid(struct pstree_item *item)
pid_t pid = item->pid->ns[0].virt;
struct rst_info *rst_info = rsti(item);
- INIT_LIST_HEAD(&rst_info->used);
INIT_LIST_HEAD(&rst_info->fds);
if (item->ids == NULL) /* zombie */
@@ -876,7 +872,7 @@ static bool task_fle(struct pstree_item *task, struct fdinfo_list_entry *fle)
{
struct fdinfo_list_entry *tmp;
- list_for_each_entry(tmp, &rsti(task)->used, used_list)
+ list_for_each_entry(tmp, &rsti(task)->fds, ps_list)
if (fle == tmp)
return true;
return false;
diff --git a/criu/include/files.h b/criu/include/files.h
index 036b9e6..2ec5a53 100644
--- a/criu/include/files.h
+++ b/criu/include/files.h
@@ -74,7 +74,6 @@ struct fdinfo_list_entry {
struct list_head desc_list; /* To chain on @fd_info_head */
struct file_desc *desc; /* Associated file descriptor */
struct list_head ps_list; /* To chain per-task files */
- struct list_head used_list; /* To chain per-task used fds */
int pid;
FdinfoEntry *fe;
u8 received:1;
diff --git a/criu/include/rst_info.h b/criu/include/rst_info.h
index 82fbd56..92dfc9d 100644
--- a/criu/include/rst_info.h
+++ b/criu/include/rst_info.h
@@ -26,7 +26,6 @@ struct fdt {
struct _MmEntry;
struct rst_info {
- struct list_head used;
struct list_head fds;
void *premmapped_addr;
--
2.5.0
More information about the CRIU
mailing list