From 7e10b43b4f8fdc7d3dedeae49be86e7b6e46b2a5 Mon Sep 17 00:00:00 2001 From: Mike Rapoport Date: Wed, 9 May 2018 18:03:48 +0300 Subject: [PATCH] lazy-pages: factor out insertion to sorted IOV list Signed-off-by: Mike Rapoport Signed-off-by: Andrei Vagin --- criu/uffd.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/criu/uffd.c b/criu/uffd.c index 21db369cc..f019eee02 100644 --- a/criu/uffd.c +++ b/criu/uffd.c @@ -416,31 +416,37 @@ static int split_iov(struct lazy_iov *iov, unsigned long addr) return 0; } +static void iov_list_insert(struct lazy_iov *new, struct list_head *dst) +{ + struct lazy_iov *iov; + + if (list_empty(dst)) { + list_move(&new->l, dst); + return; + } + + list_for_each_entry(iov, dst, l) { + if (new->start < iov->start) { + list_move_tail(&new->l, &iov->l); + break; + } + if (list_is_last(&iov->l, dst) && + new->start > iov->start) { + list_move(&new->l, &iov->l); + break; + } + } +} + static void merge_iov_lists(struct list_head *src, struct list_head *dst) { - struct lazy_iov *iov, *p, *n; + struct lazy_iov *iov, *n; if (list_empty(src)) return; - if (list_empty(dst)) { - iov = list_first_entry(src, struct lazy_iov, l); - list_move(&iov->l, dst); - } - - list_for_each_entry_safe(iov, n, src, l) { - list_for_each_entry(p, dst, l) { - if (iov->start < p->start) { - list_move_tail(&iov->l, &p->l); - break; - } - if (list_is_last(&p->l, dst) && - iov->start > p->start) { - list_move(&iov->l, &p->l); - break; - } - } - } + list_for_each_entry_safe(iov, n, src, l) + iov_list_insert(iov, dst); } static int __copy_iov_list(struct list_head *src, struct list_head *dst)