mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
timers: save tid from a task pid namespace
Signed-off-by: Andrei Vagin <avagin@gmail.com>
This commit is contained in:
@@ -318,14 +318,13 @@ static int core_alloc_posix_timers(TaskTimersEntry *tte, int n,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void encode_posix_timer(struct posix_timer *v,
|
static int encode_posix_timer(struct pstree_item *item, struct posix_timer *v,
|
||||||
struct proc_posix_timer *vp, PosixTimerEntry *pte)
|
struct proc_posix_timer *vp, PosixTimerEntry *pte)
|
||||||
{
|
{
|
||||||
pte->it_id = vp->spt.it_id;
|
pte->it_id = vp->spt.it_id;
|
||||||
pte->clock_id = vp->spt.clock_id;
|
pte->clock_id = vp->spt.clock_id;
|
||||||
pte->si_signo = vp->spt.si_signo;
|
pte->si_signo = vp->spt.si_signo;
|
||||||
pte->it_sigev_notify = vp->spt.it_sigev_notify;
|
pte->it_sigev_notify = vp->spt.it_sigev_notify;
|
||||||
pte->notify_thread_id = vp->spt.notify_thread_id;
|
|
||||||
pte->sival_ptr = encode_pointer(vp->spt.sival_ptr);
|
pte->sival_ptr = encode_pointer(vp->spt.sival_ptr);
|
||||||
|
|
||||||
pte->overrun = v->overrun;
|
pte->overrun = v->overrun;
|
||||||
@@ -334,6 +333,27 @@ static void encode_posix_timer(struct posix_timer *v,
|
|||||||
pte->insec = v->val.it_interval.tv_nsec;
|
pte->insec = v->val.it_interval.tv_nsec;
|
||||||
pte->vsec = v->val.it_value.tv_sec;
|
pte->vsec = v->val.it_value.tv_sec;
|
||||||
pte->vnsec = v->val.it_value.tv_nsec;
|
pte->vnsec = v->val.it_value.tv_nsec;
|
||||||
|
if (vp->spt.notify_thread_id != 0) {
|
||||||
|
pid_t vtid = 0, rtid = vp->spt.notify_thread_id;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < item->nr_threads; i++) {
|
||||||
|
if (item->threads[i].real != rtid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
vtid = item->threads[i].ns[0].virt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtid == 0) {
|
||||||
|
pr_err("Unable to find the thread %d\n", rtid);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pte->notify_thread_id = vtid;
|
||||||
|
pte->has_notify_thread_id = true;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
|
int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
|
||||||
@@ -344,8 +364,8 @@ int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
|
|||||||
PosixTimerEntry *pte;
|
PosixTimerEntry *pte;
|
||||||
struct proc_posix_timer *temp;
|
struct proc_posix_timer *temp;
|
||||||
struct parasite_dump_posix_timers_args *args;
|
struct parasite_dump_posix_timers_args *args;
|
||||||
|
int ret, exit_code = -1;
|
||||||
int args_size;
|
int args_size;
|
||||||
int ret = 0;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (core_alloc_posix_timers(tte, proc_args->timer_n, &pte))
|
if (core_alloc_posix_timers(tte, proc_args->timer_n, &pte))
|
||||||
@@ -368,14 +388,16 @@ int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
|
|||||||
i = 0;
|
i = 0;
|
||||||
list_for_each_entry(temp, &proc_args->timers, list) {
|
list_for_each_entry(temp, &proc_args->timers, list) {
|
||||||
posix_timer_entry__init(&pte[i]);
|
posix_timer_entry__init(&pte[i]);
|
||||||
encode_posix_timer(&args->timer[i], temp, &pte[i]);
|
if (encode_posix_timer(item, &args->timer[i], temp, &pte[i]))
|
||||||
|
goto end_posix;
|
||||||
tte->posix[i] = &pte[i];
|
tte->posix[i] = &pte[i];
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit_code = 0;
|
||||||
end_posix:
|
end_posix:
|
||||||
free_posix_timers(proc_args);
|
free_posix_timers(proc_args);
|
||||||
return ret;
|
return exit_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc)
|
int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc)
|
||||||
|
Reference in New Issue
Block a user