mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-30 22:05:36 +00:00
Revert "memory: don't use parent memdump if detected possible pid reuse"
This reverts commit ffd415a5b5
.
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
committed by
Andrei Vagin
parent
08e5fe2560
commit
c8346275a8
@@ -1229,7 +1229,7 @@ static int assign_parasite_pids(struct pstree_item *item, struct parasite_dump_m
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pre_dump_one_task(struct pstree_item *item, StatsEntry *parent_se)
|
||||
static int pre_dump_one_task(struct pstree_item *item)
|
||||
{
|
||||
pid_t pid = item->pid->real;
|
||||
struct vm_area_list vmas;
|
||||
@@ -1289,8 +1289,6 @@ static int pre_dump_one_task(struct pstree_item *item, StatsEntry *parent_se)
|
||||
|
||||
mdc.pre_dump = true;
|
||||
mdc.lazy = false;
|
||||
mdc.stat = NULL;
|
||||
mdc.parent_se = parent_se;
|
||||
|
||||
ret = parasite_dump_pages_seized(item, &vmas, &mdc, parasite_ctl);
|
||||
if (ret)
|
||||
@@ -1309,7 +1307,7 @@ err_cure:
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
static int dump_one_task(struct pstree_item *item, StatsEntry *parent_se)
|
||||
static int dump_one_task(struct pstree_item *item)
|
||||
{
|
||||
pid_t pid = item->pid->real;
|
||||
struct vm_area_list vmas;
|
||||
@@ -1450,8 +1448,6 @@ static int dump_one_task(struct pstree_item *item, StatsEntry *parent_se)
|
||||
|
||||
mdc.pre_dump = false;
|
||||
mdc.lazy = opts.lazy_pages;
|
||||
mdc.stat = &pps_buf;
|
||||
mdc.parent_se = parent_se;
|
||||
|
||||
ret = parasite_dump_pages_seized(item, &vmas, &mdc, parasite_ctl);
|
||||
if (ret)
|
||||
@@ -1638,7 +1634,6 @@ err:
|
||||
|
||||
int cr_pre_dump_tasks(pid_t pid)
|
||||
{
|
||||
StatsEntry *parent_se = NULL;
|
||||
struct pstree_item *item;
|
||||
int ret = -1;
|
||||
|
||||
@@ -1703,18 +1698,10 @@ int cr_pre_dump_tasks(pid_t pid)
|
||||
if (collect_namespaces(false) < 0)
|
||||
goto err;
|
||||
|
||||
/* Errors handled later in detect_pid_reuse */
|
||||
parent_se = get_parent_stats();
|
||||
|
||||
for_each_pstree_item(item)
|
||||
if (pre_dump_one_task(item, parent_se))
|
||||
if (pre_dump_one_task(item))
|
||||
goto err;
|
||||
|
||||
if (parent_se) {
|
||||
stats_entry__free_unpacked(parent_se, NULL);
|
||||
parent_se = NULL;
|
||||
}
|
||||
|
||||
ret = cr_dump_shmem();
|
||||
if (ret)
|
||||
goto err;
|
||||
@@ -1724,9 +1711,6 @@ int cr_pre_dump_tasks(pid_t pid)
|
||||
|
||||
ret = 0;
|
||||
err:
|
||||
if (parent_se)
|
||||
stats_entry__free_unpacked(parent_se, NULL);
|
||||
|
||||
return cr_pre_dump_finish(ret);
|
||||
}
|
||||
|
||||
@@ -1847,7 +1831,6 @@ static int cr_dump_finish(int ret)
|
||||
int cr_dump_tasks(pid_t pid)
|
||||
{
|
||||
InventoryEntry he = INVENTORY_ENTRY__INIT;
|
||||
StatsEntry *parent_se = NULL;
|
||||
struct pstree_item *item;
|
||||
int pre_dump_ret = 0;
|
||||
int ret = -1;
|
||||
@@ -1942,19 +1925,11 @@ int cr_dump_tasks(pid_t pid)
|
||||
if (collect_seccomp_filters() < 0)
|
||||
goto err;
|
||||
|
||||
/* Errors handled later in detect_pid_reuse */
|
||||
parent_se = get_parent_stats();
|
||||
|
||||
for_each_pstree_item(item) {
|
||||
if (dump_one_task(item, parent_se))
|
||||
if (dump_one_task(item))
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (parent_se) {
|
||||
stats_entry__free_unpacked(parent_se, NULL);
|
||||
parent_se = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* It may happen that a process has completed but its files in
|
||||
* /proc/PID/ are still open by another process. If the PID has been
|
||||
@@ -2010,8 +1985,5 @@ int cr_dump_tasks(pid_t pid)
|
||||
if (ret)
|
||||
goto err;
|
||||
err:
|
||||
if (parent_se)
|
||||
stats_entry__free_unpacked(parent_se, NULL);
|
||||
|
||||
return cr_dump_finish(ret);
|
||||
}
|
||||
|
@@ -4,9 +4,6 @@
|
||||
#include <stdbool.h>
|
||||
#include "int.h"
|
||||
#include "vma.pb-c.h"
|
||||
#include "pid.h"
|
||||
#include "proc_parse.h"
|
||||
#include "stats.pb-c.h"
|
||||
|
||||
struct parasite_ctl;
|
||||
struct vm_area_list;
|
||||
@@ -15,10 +12,8 @@ struct pstree_item;
|
||||
struct vma_area;
|
||||
|
||||
struct mem_dump_ctl {
|
||||
bool pre_dump;
|
||||
bool lazy;
|
||||
struct proc_pid_stat *stat;
|
||||
StatsEntry *parent_se;
|
||||
bool pre_dump;
|
||||
bool lazy;
|
||||
};
|
||||
|
||||
extern bool vma_has_guard_gap_hidden(struct vma_area *vma);
|
||||
|
58
criu/mem.c
58
criu/mem.c
@@ -30,11 +30,9 @@
|
||||
#include "fault-injection.h"
|
||||
#include "prctl.h"
|
||||
#include <compel/compel.h>
|
||||
#include "proc_parse.h"
|
||||
|
||||
#include "protobuf.h"
|
||||
#include "images/pagemap.pb-c.h"
|
||||
#include "images/stats.pb-c.h"
|
||||
|
||||
static int task_reset_dirty_track(int pid)
|
||||
{
|
||||
@@ -292,51 +290,6 @@ static int xfer_pages(struct page_pipe *pp, struct page_xfer *xfer)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int detect_pid_reuse(struct pstree_item *item,
|
||||
struct proc_pid_stat* pps,
|
||||
StatsEntry *parent_se)
|
||||
{
|
||||
struct proc_pid_stat pps_buf;
|
||||
unsigned long long tps; /* ticks per second */
|
||||
int ret;
|
||||
|
||||
tps = sysconf(_SC_CLK_TCK);
|
||||
if (tps == -1) {
|
||||
pr_perror("Failed to get clock ticks via sysconf");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!pps) {
|
||||
pps = &pps_buf;
|
||||
ret = parse_pid_stat(item->pid->real, pps);
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!parent_se) {
|
||||
pr_perror("No parent stats, for real error, please, " \
|
||||
"check warnings in get_parent_stats");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (parent_se->dump->has_dump_uptime) {
|
||||
unsigned long long dump_ticks;
|
||||
|
||||
dump_ticks = parent_se->dump->dump_uptime/(USEC_PER_SEC/tps);
|
||||
|
||||
if (pps->start_time >= dump_ticks) {
|
||||
/* Print "*" if unsure */
|
||||
pr_warn("Pid reuse%s detected for pid %d\n",
|
||||
pps_buf.start_time == dump_ticks ? "*" : "",
|
||||
item->pid->real);
|
||||
return 1;
|
||||
}
|
||||
} else
|
||||
pr_warn_once("Parent image has no dump timestamp, " \
|
||||
"pid reuse detection is OFF!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __parasite_dump_pages_seized(struct pstree_item *item,
|
||||
struct parasite_dump_pages_args *args,
|
||||
struct vm_area_list *vma_area_list,
|
||||
@@ -350,7 +303,6 @@ static int __parasite_dump_pages_seized(struct pstree_item *item,
|
||||
int ret = -1;
|
||||
unsigned cpp_flags = 0;
|
||||
unsigned long pmc_size;
|
||||
int possible_pid_reuse = 0;
|
||||
|
||||
if (opts.check_only)
|
||||
return 0;
|
||||
@@ -408,14 +360,6 @@ static int __parasite_dump_pages_seized(struct pstree_item *item,
|
||||
xfer.parent = NULL + 1;
|
||||
}
|
||||
|
||||
if (xfer.parent) {
|
||||
possible_pid_reuse = detect_pid_reuse(item, mdc->stat,
|
||||
mdc->parent_se);
|
||||
if (possible_pid_reuse == -1)
|
||||
goto out_xfer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Step 1 -- generate the pagemap
|
||||
*/
|
||||
@@ -442,7 +386,7 @@ static int __parasite_dump_pages_seized(struct pstree_item *item,
|
||||
else {
|
||||
again:
|
||||
ret = generate_iovs(vma_area, pp, map, &off,
|
||||
has_parent && !possible_pid_reuse);
|
||||
has_parent);
|
||||
if (ret == -EAGAIN) {
|
||||
BUG_ON(!(pp->flags & PP_CHUNK_MODE));
|
||||
|
||||
|
@@ -213,7 +213,7 @@ void write_stats(int what)
|
||||
display_stats(what, &stats);
|
||||
}
|
||||
|
||||
StatsEntry *get_parent_stats(void)
|
||||
__maybe_unused StatsEntry *get_parent_stats(void)
|
||||
{
|
||||
struct cr_img *img;
|
||||
StatsEntry *se;
|
||||
|
Reference in New Issue
Block a user