[4/6] criu: dump: get stack pointers of all threads early

Submitted by Mike Rapoport on Aug. 13, 2018, 1:29 p.m.

Details

Message ID 1534166953-15041-5-git-send-email-rppt@linux.vnet.ibm.com
State Accepted
Series "lazy-pages: always use pre-copy for stack"
Headers show

Commit Message

Mike Rapoport Aug. 13, 2018, 1:29 p.m.
The stack pointers will be later use by the memory dump to ensure that
current stack pages are not treated as lazy.

Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
---
 criu/include/pstree.h   |  1 +
 criu/parasite-syscall.c | 12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/pstree.h b/criu/include/pstree.h
index 4913aae..e6ad281 100644
--- a/criu/include/pstree.h
+++ b/criu/include/pstree.h
@@ -57,6 +57,7 @@  struct dmp_info {
 	struct page_pipe *mem_pp;
 	struct parasite_ctl *parasite_ctl;
 	struct parasite_thread_ctl **thread_ctls;
+	uint64_t *thread_sp;
 };
 
 static inline struct dmp_info *dmpi(const struct pstree_item *i)
diff --git a/criu/parasite-syscall.c b/criu/parasite-syscall.c
index 366c6c9..10504ed 100644
--- a/criu/parasite-syscall.c
+++ b/criu/parasite-syscall.c
@@ -468,24 +468,34 @@  static int parasite_prepare_threads(struct parasite_ctl *ctl,
 				    struct pstree_item *item)
 {
 	struct parasite_thread_ctl **thread_ctls;
+	uint64_t *thread_sp;
 	int i;
 
 	thread_ctls = xzalloc(sizeof(*thread_ctls) * item->nr_threads);
 	if (!thread_ctls)
 		return -1;
 
+	thread_sp = xzalloc(sizeof(*thread_sp) * item->nr_threads);
+	if (!thread_sp)
+		return -1;
+
 	for (i = 0; i < item->nr_threads; i++) {
 		struct pid *tid = &item->threads[i];
 
-		if (item->pid->real == tid->real)
+		if (item->pid->real == tid->real) {
+			thread_sp[i] = compel_get_leader_sp(ctl);
 			continue;
+		}
 
 		thread_ctls[i] = compel_prepare_thread(ctl, tid->real);
 		if (!thread_ctls[i])
 			return -1;
+
+		thread_sp[i] = compel_get_thread_sp(thread_ctls[i]);
 	}
 
 	dmpi(item)->thread_ctls = thread_ctls;
+	dmpi(item)->thread_sp = thread_sp;
 
 	return 0;
 }