[CRIU] [PATCH 1/1] Fix O(n^2) restore in terms of the number of fds.
Kirill Tkhai
ktkhai at virtuozzo.com
Fri Aug 3 11:10:55 MSK 2018
Hi, Radoslaw,
On 02.08.2018 13:58, Radoslaw Burny wrote:
> Since the processes and fds are restored from images in the increasing
> order, and they are stored in sorted lists, CRIU always needed (at least
> in my experiments) to traverse the whole list before inserting them.
> With this change, lists are traversed in reverse, so the fds should be
> inserted immediately.
>
> Signed-off-by: Radoslaw Burny <rburny at google.com>
> ---
> criu/files.c | 12 ++++++------
> criu/include/pid.h | 5 +++++
> 2 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/criu/files.c b/criu/files.c
> index 4ed84305..ea41f59e 100644
> --- a/criu/files.c
> +++ b/criu/files.c
> @@ -140,12 +140,12 @@ static void collect_task_fd(struct fdinfo_list_entry *new_fle, struct rst_info *
> struct fdinfo_list_entry *fle;
>
> /* 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)
> + list_for_each_entry_reverse(fle, &ri->fds, ps_list) {
> + if (fle->fe->fd < new_fle->fe->fd)
> break;
> }
>
> - list_add_tail(&new_fle->ps_list, &fle->ps_list);
> + list_add(&new_fle->ps_list, &fle->ps_list);
Looks OK. Could you add a small comment, that reverse traverse is faster
since we keep fles ordered im images?
> }
>
> unsigned int find_unused_fd(struct pstree_item *task, int hint_fd)
> @@ -785,10 +785,10 @@ static void __collect_desc_fle(struct fdinfo_list_entry *new_le, struct file_des
> {
> struct fdinfo_list_entry *le;
>
> - list_for_each_entry(le, &fdesc->fd_info_head, desc_list)
> - if (pid_rst_prio(new_le->pid, le->pid))
> + list_for_each_entry_reverse(le, &fdesc->fd_info_head, desc_list)
> + if (pid_rst_prio_eq(le->pid, new_le->pid))
Two fle with equal pids are bug in this place, aren't they?
I'd added direct BUG() for that.
> break;
> - list_add_tail(&new_le->desc_list, &le->desc_list);
> + list_add(&new_le->desc_list, &le->desc_list);
> }
>
> static void collect_desc_fle(struct fdinfo_list_entry *new_le,
> diff --git a/criu/include/pid.h b/criu/include/pid.h
> index 81786ec4..c749176f 100644
> --- a/criu/include/pid.h
> +++ b/criu/include/pid.h
> @@ -54,4 +54,9 @@ static inline bool pid_rst_prio(unsigned pid_a, unsigned pid_b)
> return pid_a < pid_b;
> }
>
> +static inline bool pid_rst_prio_eq(unsigned pid_a, unsigned pid_b)
> +{
> + return pid_a <= pid_b;
> +}
> +
> #endif /* __CR_PID_H__ */
Thanks,
Kirill
More information about the CRIU
mailing list