Commit e5c99983 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Pavel Emelyanov

criu: dump loginuid & oom_score_adj values

https://jira.sw.ru/browse/PSBM-41993Signed-off-by: 's avatarDmitry Safonov <dsafonov@odin.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 628179cb
...@@ -323,6 +323,34 @@ static int dump_task_rlimits(int pid, TaskRlimitsEntry *rls) ...@@ -323,6 +323,34 @@ static int dump_task_rlimits(int pid, TaskRlimitsEntry *rls)
return 0; return 0;
} }
static int dump_pid_misc(pid_t pid, TaskCoreEntry *tc)
{
int ret;
pr_info("dumping /proc/%d/{oom_score_adj,loginuid}\n", pid);
tc->has_loginuid = true;
tc->loginuid = parse_pid_loginuid(pid, &ret);
/*
* loginuid dumping is critical, as if not correctly
* restored, you may loss ability to login via SSH to CT
*/
if (ret < 0)
return ret;
tc->oom_score_adj = parse_pid_oom_score_adj(pid, &ret);
/*
* oom_score_adj dumping is not very critical, as it will affect
* on victim in OOM situation and one will find dumping error in log
*/
if (ret < 0)
tc->has_oom_score_adj = false;
else
tc->has_oom_score_adj = true;
return 0;
}
static int dump_filemap(pid_t pid, struct vma_area *vma_area, static int dump_filemap(pid_t pid, struct vma_area *vma_area,
const struct cr_imgset *imgset) const struct cr_imgset *imgset)
{ {
...@@ -702,6 +730,10 @@ static int dump_task_core_all(struct pstree_item *item, ...@@ -702,6 +730,10 @@ static int dump_task_core_all(struct pstree_item *item,
if (ret) if (ret)
goto err; goto err;
ret = dump_pid_misc(pid, core->tc);
if (ret)
goto err;
ret = dump_task_rlimits(pid, core->tc->rlimits); ret = dump_task_rlimits(pid, core->tc->rlimits);
if (ret) if (ret)
goto err; goto err;
......
...@@ -115,9 +115,13 @@ struct fstype { ...@@ -115,9 +115,13 @@ struct fstype {
struct vm_area_list; struct vm_area_list;
#define INVALID_UID ((uid_t)-1)
extern bool add_skip_mount(const char *mountpoint); extern bool add_skip_mount(const char *mountpoint);
extern struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump); extern struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump);
extern int parse_pid_stat(pid_t pid, struct proc_pid_stat *s); extern int parse_pid_stat(pid_t pid, struct proc_pid_stat *s);
extern unsigned int parse_pid_loginuid(pid_t pid, int *err);
extern int parse_pid_oom_score_adj(pid_t pid, int *err);
extern int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list); extern int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list);
extern int parse_self_maps_lite(struct vm_area_list *vms); extern int parse_self_maps_lite(struct vm_area_list *vms);
extern int parse_pid_status(pid_t pid, struct proc_status_creds *); extern int parse_pid_status(pid_t pid, struct proc_status_creds *);
......
...@@ -724,6 +724,56 @@ err: ...@@ -724,6 +724,56 @@ err:
return -1; return -1;
} }
unsigned int parse_pid_loginuid(pid_t pid, int *err)
{
int fd;
ssize_t num;
*err = 0;
fd = open_proc(pid, "loginuid");
if (fd < 0)
goto out;
num = read(fd, buf, 10);
close(fd);
if (num < 0) {
pr_perror("Unable to read /proc/%d/loginuid", pid);
goto out;
}
buf[num] = '\0';
return strtol(buf, NULL, 10);
out:
*err = -1;
return INVALID_UID; /* unset value */
}
int parse_pid_oom_score_adj(pid_t pid, int *err)
{
int fd;
ssize_t num;
*err = 0;
fd = open_proc(pid, "oom_score_adj");
if (fd < 0)
goto out;
num = read(fd, buf, 10);
close(fd);
if (num < 0) {
pr_perror("Unable to read /proc/%d/oom_score_adj", pid);
goto out;
}
buf[num] = '\0';
return strtol(buf, NULL, 10);
out:
*err = -1;
return 0;
}
static int ids_parse(char *str, unsigned int *arr) static int ids_parse(char *str, unsigned int *arr)
{ {
char *end; char *end;
......
...@@ -38,6 +38,10 @@ message task_core_entry { ...@@ -38,6 +38,10 @@ message task_core_entry {
optional seccomp_mode seccomp_mode = 11; optional seccomp_mode seccomp_mode = 11;
optional uint32 seccomp_filter = 12; optional uint32 seccomp_filter = 12;
optional uint32 loginuid = 13;
optional int32 oom_score_adj = 14;
} }
message task_kobj_ids_entry { message task_kobj_ids_entry {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment