From d4a60bb201cd647ae5d682dc92665f26dcc20187 Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Thu, 16 Feb 2017 19:20:44 +0300 Subject: [PATCH] restorer/fault: add fault-injection into restorer Acked-by: Cyrill Gorcunov Signed-off-by: Dmitry Safonov Signed-off-by: Andrei Vagin --- criu/cr-restore.c | 1 + criu/include/fault-injection.h | 19 +++++++++++++++---- criu/include/restorer.h | 3 +++ criu/pie/restorer.c | 7 +++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/criu/cr-restore.c b/criu/cr-restore.c index 92964d7ee..c87cc44b5 100644 --- a/criu/cr-restore.c +++ b/criu/cr-restore.c @@ -3035,6 +3035,7 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns } task_args->breakpoint = &rsti(current)->breakpoint; + task_args->fault_strategy = fi_strategy; sigemptyset(&blockmask); sigaddset(&blockmask, SIGCHLD); diff --git a/criu/include/fault-injection.h b/criu/include/fault-injection.h index 2b23f54bd..5b3313667 100644 --- a/criu/include/fault-injection.h +++ b/criu/include/fault-injection.h @@ -18,10 +18,7 @@ enum faults { FI_MAX, }; -extern enum faults fi_strategy; -extern int fault_injection_init(void); - -static inline bool fault_injected(enum faults f) +static inline bool __fault_injected(enum faults f, enum faults fi_strategy) { /* * Temporary workaround for Xen guests. Breakpoints degrade @@ -33,4 +30,18 @@ static inline bool fault_injected(enum faults f) return fi_strategy == f; } + +#ifndef CR_NOGLIBC + +extern enum faults fi_strategy; +#define fault_injected(f) __fault_injected(f, fi_strategy) + +extern int fault_injection_init(void); + +#else /* CR_NOGLIBC */ + +extern bool fault_injected(enum faults f); + +#endif + #endif diff --git a/criu/include/restorer.h b/criu/include/restorer.h index fb7d89e49..d0f786d94 100644 --- a/criu/include/restorer.h +++ b/criu/include/restorer.h @@ -18,6 +18,7 @@ #include "timerfd.h" #include "shmem.h" #include "parasite-vdso.h" +#include "fault-injection.h" #include @@ -182,6 +183,8 @@ struct task_restore_args { unsigned long vdso_rt_parked_at; /* safe place to keep vdso */ #endif void **breakpoint; + + enum faults fault_strategy; } __aligned(64); /* diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c index 929c478b7..0d6e3b9da 100644 --- a/criu/pie/restorer.c +++ b/criu/pie/restorer.c @@ -61,6 +61,11 @@ static pid_t *helpers; static int n_helpers; static pid_t *zombies; static int n_zombies; +static enum faults fi_strategy; +bool fault_injected(enum faults f) +{ + return __fault_injected(f, fi_strategy); +} /* * These are stubs for std compel plugin. @@ -1087,6 +1092,8 @@ long __export_restore_task(struct task_restore_args *args) vdso_rt_size = args->vdso_rt_size; #endif + fi_strategy = args->fault_strategy; + task_entries_local = args->task_entries; helpers = args->helpers; n_helpers = args->helpers_n;