2012-01-14 01:48:29 +04:00
|
|
|
#ifndef PROC_PARSE_H__
|
|
|
|
#define PROC_PARSE_H__
|
2012-01-13 20:54:08 +04:00
|
|
|
|
2012-04-05 15:43:00 +04:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include "types.h"
|
2012-07-11 09:22:38 +04:00
|
|
|
#include "image.h"
|
2012-04-05 15:43:00 +04:00
|
|
|
#include "list.h"
|
|
|
|
|
2012-07-17 07:24:54 +04:00
|
|
|
#include "../protobuf/eventfd.pb-c.h"
|
2012-07-17 07:25:40 +04:00
|
|
|
#include "../protobuf/eventpoll.pb-c.h"
|
2012-07-17 07:25:42 +04:00
|
|
|
#include "../protobuf/inotify.pb-c.h"
|
2012-07-17 07:24:54 +04:00
|
|
|
|
2012-01-15 20:24:13 +04:00
|
|
|
#define PROC_TASK_COMM_LEN 32
|
|
|
|
#define PROC_TASK_COMM_LEN_FMT "(%31s"
|
2012-01-13 20:54:08 +04:00
|
|
|
|
ctrools: Rewrite task/threads stopping engine is back
This commit brings the former "Rewrite task/threads stopping engine"
commit back. Handling it separately is too complex so better try
to handle it in-place.
Note some tests might fault, it's expected.
---
Stopping tasks with STOP and proceeding with SEIZE is actually excessive --
the SEIZE if enough. Moreover, just killing a task with STOP is also racy,
since task should be given some time to come to sleep before its proc
can be parsed.
Rewrite all this code to SEIZE task and all its threads from the very beginning.
With this we can distinguish stopped task state and migrate it properly (not
supported now, need to implement).
This thing however has one BIG problem -- after we SEIZE-d a task we should
seize
it's threads, but we should do it in a loop -- reading /proc/pid/task and
seizing
them again and again, until the contents of this dir stops changing (not done
now).
Besides, after we seized a task and all its threads we cannot scan it's children
list once -- task can get reparented to init and any task's child can call clone
with CLONE_PARENT flag thus repopulating the children list of the already seized
task (not done also)
This patch is ugly, yes, but splitting it doesn't help to review it much, sorry
:(
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
2012-02-01 19:45:31 +04:00
|
|
|
struct proc_pid_stat_small {
|
|
|
|
int pid;
|
|
|
|
char comm[PROC_TASK_COMM_LEN];
|
|
|
|
char state;
|
2012-03-01 19:04:31 +04:00
|
|
|
int ppid;
|
2012-04-11 22:09:12 +04:00
|
|
|
int pgid;
|
|
|
|
int sid;
|
ctrools: Rewrite task/threads stopping engine is back
This commit brings the former "Rewrite task/threads stopping engine"
commit back. Handling it separately is too complex so better try
to handle it in-place.
Note some tests might fault, it's expected.
---
Stopping tasks with STOP and proceeding with SEIZE is actually excessive --
the SEIZE if enough. Moreover, just killing a task with STOP is also racy,
since task should be given some time to come to sleep before its proc
can be parsed.
Rewrite all this code to SEIZE task and all its threads from the very beginning.
With this we can distinguish stopped task state and migrate it properly (not
supported now, need to implement).
This thing however has one BIG problem -- after we SEIZE-d a task we should
seize
it's threads, but we should do it in a loop -- reading /proc/pid/task and
seizing
them again and again, until the contents of this dir stops changing (not done
now).
Besides, after we seized a task and all its threads we cannot scan it's children
list once -- task can get reparented to init and any task's child can call clone
with CLONE_PARENT flag thus repopulating the children list of the already seized
task (not done also)
This patch is ugly, yes, but splitting it doesn't help to review it much, sorry
:(
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
2012-02-01 19:45:31 +04:00
|
|
|
};
|
|
|
|
|
2012-01-13 20:54:08 +04:00
|
|
|
struct proc_pid_stat {
|
2012-01-14 01:48:29 +04:00
|
|
|
int pid;
|
2012-01-15 20:24:13 +04:00
|
|
|
char comm[PROC_TASK_COMM_LEN];
|
2012-01-14 01:48:29 +04:00
|
|
|
char state;
|
|
|
|
int ppid;
|
|
|
|
int pgid;
|
|
|
|
int sid;
|
|
|
|
int tty_nr;
|
|
|
|
int tty_pgrp;
|
|
|
|
unsigned int flags;
|
|
|
|
unsigned long min_flt;
|
|
|
|
unsigned long cmin_flt;
|
|
|
|
unsigned long maj_flt;
|
|
|
|
unsigned long cmaj_flt;
|
|
|
|
unsigned long utime;
|
|
|
|
unsigned long stime;
|
|
|
|
long cutime;
|
|
|
|
long cstime;
|
|
|
|
long priority;
|
|
|
|
long nice;
|
|
|
|
int num_threads;
|
|
|
|
int zero0;
|
|
|
|
unsigned long long start_time;
|
|
|
|
unsigned long vsize;
|
|
|
|
long mm_rss;
|
|
|
|
unsigned long rsslim;
|
|
|
|
unsigned long start_code;
|
|
|
|
unsigned long end_code;
|
|
|
|
unsigned long start_stack;
|
|
|
|
unsigned long esp;
|
|
|
|
unsigned long eip;
|
|
|
|
unsigned long sig_pending;
|
|
|
|
unsigned long sig_blocked;
|
|
|
|
unsigned long sig_ignored;
|
|
|
|
unsigned long sig_handled;
|
|
|
|
unsigned long wchan;
|
|
|
|
unsigned long zero1;
|
|
|
|
unsigned long zero2;
|
|
|
|
int exit_signal;
|
|
|
|
int task_cpu;
|
|
|
|
unsigned int rt_priority;
|
|
|
|
unsigned int policy;
|
|
|
|
unsigned long long delayacct_blkio_ticks;
|
|
|
|
unsigned long gtime;
|
|
|
|
long cgtime;
|
|
|
|
unsigned long start_data;
|
|
|
|
unsigned long end_data;
|
|
|
|
unsigned long start_brk;
|
2012-01-23 15:18:31 +04:00
|
|
|
unsigned long arg_start;
|
|
|
|
unsigned long arg_end;
|
|
|
|
unsigned long env_start;
|
|
|
|
unsigned long env_end;
|
2012-01-22 20:22:40 +04:00
|
|
|
int exit_code;
|
2012-01-13 20:54:08 +04:00
|
|
|
};
|
|
|
|
|
2012-01-27 21:37:13 +04:00
|
|
|
#define PROC_CAP_SIZE 2
|
|
|
|
|
|
|
|
struct proc_status_creds {
|
|
|
|
unsigned int uids[4];
|
|
|
|
unsigned int gids[4];
|
|
|
|
|
2012-07-19 12:35:25 +04:00
|
|
|
uint32_t cap_inh[PROC_CAP_SIZE];
|
|
|
|
uint32_t cap_prm[PROC_CAP_SIZE];
|
|
|
|
uint32_t cap_eff[PROC_CAP_SIZE];
|
|
|
|
uint32_t cap_bnd[PROC_CAP_SIZE];
|
2012-01-27 21:37:13 +04:00
|
|
|
};
|
|
|
|
|
2012-06-27 20:57:30 +04:00
|
|
|
struct mount_info {
|
2012-05-04 13:38:00 +04:00
|
|
|
int mnt_id;
|
|
|
|
int parent_mnt_id;
|
|
|
|
unsigned int s_dev;
|
2012-06-27 20:57:29 +04:00
|
|
|
char *root;
|
|
|
|
char *mountpoint;
|
2012-05-13 08:30:06 +04:00
|
|
|
unsigned flags;
|
|
|
|
int master_id;
|
|
|
|
int shared_id;
|
2012-06-27 20:57:29 +04:00
|
|
|
char *fstype;
|
|
|
|
char *source;
|
|
|
|
char *options;
|
2012-06-27 20:57:30 +04:00
|
|
|
struct mount_info *next;
|
2012-06-27 20:57:34 +04:00
|
|
|
|
|
|
|
/* tree linkage */
|
|
|
|
struct mount_info *parent;
|
|
|
|
struct list_head children;
|
|
|
|
struct list_head siblings;
|
2012-05-04 13:38:00 +04:00
|
|
|
};
|
|
|
|
|
2012-06-27 20:57:34 +04:00
|
|
|
static inline void mnt_entry_init(struct mount_info *pm)
|
|
|
|
{
|
|
|
|
pm->parent = NULL;
|
|
|
|
INIT_LIST_HEAD(&pm->children);
|
|
|
|
}
|
|
|
|
|
2012-06-27 20:57:30 +04:00
|
|
|
extern struct mount_info *parse_mountinfo(pid_t pid);
|
2012-02-17 01:39:36 +04:00
|
|
|
extern int parse_pid_stat(pid_t pid, struct proc_pid_stat *s);
|
|
|
|
extern int parse_pid_stat_small(pid_t pid, struct proc_pid_stat_small *s);
|
2012-05-10 21:07:00 +04:00
|
|
|
extern int parse_smaps(pid_t pid, struct list_head *vma_area_list, bool use_map_files);
|
2012-02-17 01:39:36 +04:00
|
|
|
extern int parse_pid_status(pid_t pid, struct proc_status_creds *);
|
2012-01-14 01:48:29 +04:00
|
|
|
|
2012-07-11 09:22:38 +04:00
|
|
|
union fdinfo_entries {
|
2012-07-17 07:24:54 +04:00
|
|
|
EventfdFileEntry efd;
|
2012-07-17 07:25:40 +04:00
|
|
|
EventpollTfdEntry epl;
|
2012-07-17 07:25:42 +04:00
|
|
|
InotifyWdEntry ify;
|
2012-07-11 09:22:38 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
extern int parse_fdinfo(int fd, int type,
|
|
|
|
int (*cb)(union fdinfo_entries *e, void *arg), void *arg);
|
|
|
|
|
2012-01-14 01:48:29 +04:00
|
|
|
#endif /* PROC_PARSE_H__ */
|