2
0
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:
Pavel Tikhomirov
2018-04-06 10:31:23 +03:00
committed by Andrei Vagin
parent 08e5fe2560
commit c8346275a8
4 changed files with 8 additions and 97 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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));

View File

@@ -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;