fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / vserver / context.h
1 #ifndef _VX_CONTEXT_H
2 #define _VX_CONTEXT_H
3
4 #include <linux/types.h>
5 #include <linux/capability.h>
6
7
8 #define VX_DYNAMIC_ID   ((uint32_t)-1)          /* id for dynamic context */
9
10 /* context flags */
11
12 #define VXF_INFO_SCHED          0x00000002
13 #define VXF_INFO_NPROC          0x00000004
14 #define VXF_INFO_PRIVATE        0x00000008
15
16 #define VXF_INFO_INIT           0x00000010
17 #define VXF_INFO_HIDE           0x00000020
18 #define VXF_INFO_ULIMIT         0x00000040
19 #define VXF_INFO_NSPACE         0x00000080
20
21 #define VXF_SCHED_HARD          0x00000100
22 #define VXF_SCHED_PRIO          0x00000200
23 #define VXF_SCHED_PAUSE         0x00000400
24
25 #define VXF_VIRT_MEM            0x00010000
26 #define VXF_VIRT_UPTIME         0x00020000
27 #define VXF_VIRT_CPU            0x00040000
28 #define VXF_VIRT_LOAD           0x00080000
29 #define VXF_VIRT_TIME           0x00100000
30
31 #define VXF_HIDE_MOUNT          0x01000000
32 #define VXF_HIDE_NETIF          0x02000000
33 #define VXF_HIDE_VINFO          0x04000000
34
35 #define VXF_STATE_SETUP         (1ULL<<32)
36 #define VXF_STATE_INIT          (1ULL<<33)
37 #define VXF_STATE_ADMIN         (1ULL<<34)
38
39 #define VXF_SC_HELPER           (1ULL<<36)
40 #define VXF_REBOOT_KILL         (1ULL<<37)
41 #define VXF_PERSISTENT          (1ULL<<38)
42
43 #define VXF_FORK_RSS            (1ULL<<48)
44 #define VXF_PROLIFIC            (1ULL<<49)
45
46 #define VXF_IGNEG_NICE          (1ULL<<52)
47
48 #define VXF_ONE_TIME            (0x0007ULL<<32)
49
50 #define VXF_INIT_SET            (VXF_STATE_SETUP|VXF_STATE_INIT|VXF_STATE_ADMIN)
51
52
53 /* context migration */
54
55 #define VXM_SET_INIT            0x00000001
56 #define VXM_SET_REAPER          0x00000002
57
58 /* context caps */
59
60 #define VXC_CAP_MASK            0x00000000
61
62 #define VXC_SET_UTSNAME         0x00000001
63 #define VXC_SET_RLIMIT          0x00000002
64
65 #define VXC_RAW_ICMP            0x00000100
66 #define VXC_SYSLOG              0x00001000
67
68 #define VXC_SECURE_MOUNT        0x00010000
69 #define VXC_SECURE_REMOUNT      0x00020000
70 #define VXC_BINARY_MOUNT        0x00040000
71
72 #define VXC_QUOTA_CTL           0x00100000
73 #define VXC_ADMIN_MAPPER        0x00200000
74 #define VXC_ADMIN_CLOOP         0x00400000
75
76
77 #ifdef  __KERNEL__
78
79 #include <linux/list.h>
80 #include <linux/spinlock.h>
81 #include <linux/rcupdate.h>
82
83 #include "limit_def.h"
84 #include "sched_def.h"
85 #include "cvirt_def.h"
86 #include "cacct_def.h"
87
88 struct _vx_info_pc {
89         struct _vx_sched_pc sched_pc;
90         struct _vx_cvirt_pc cvirt_pc;
91 };
92
93 struct vx_info {
94         struct hlist_node vx_hlist;             /* linked list of contexts */
95         xid_t vx_id;                            /* context id */
96         atomic_t vx_usecnt;                     /* usage count */
97         atomic_t vx_tasks;                      /* tasks count */
98         struct vx_info *vx_parent;              /* parent context */
99         int vx_state;                           /* context state */
100
101         unsigned long vx_nsmask;                /* assignment mask */
102         struct nsproxy *vx_nsproxy;             /* private namespace */
103         struct fs_struct *vx_fs;                /* private namespace fs */
104
105         uint64_t vx_flags;                      /* context flags */
106         uint64_t vx_bcaps;                      /* bounding caps (system) */
107         uint64_t vx_ccaps;                      /* context caps (vserver) */
108         kernel_cap_t vx_cap_bset;               /* the guest's bset */
109
110         struct task_struct *vx_reaper;          /* guest reaper process */
111         pid_t vx_initpid;                       /* PID of guest init */
112
113         struct _vx_limit limit;                 /* vserver limits */
114         struct _vx_sched sched;                 /* vserver scheduler */
115         struct _vx_cvirt cvirt;                 /* virtual/bias stuff */
116         struct _vx_cacct cacct;                 /* context accounting */
117
118 #ifndef CONFIG_SMP
119         struct _vx_info_pc info_pc;             /* per cpu data */
120 #else
121         struct _vx_info_pc *ptr_pc;             /* per cpu array */
122 #endif
123
124         wait_queue_head_t vx_wait;              /* context exit waitqueue */
125         int reboot_cmd;                         /* last sys_reboot() cmd */
126         int exit_code;                          /* last process exit code */
127
128         char vx_name[65];                       /* vserver name */
129 };
130
131 #ifndef CONFIG_SMP
132 #define vx_ptr_pc(vxi)          (&(vxi)->info_pc)
133 #define vx_per_cpu(vxi, v, id)  vx_ptr_pc(vxi)->v
134 #else
135 #define vx_ptr_pc(vxi)          ((vxi)->ptr_pc)
136 #define vx_per_cpu(vxi, v, id)  per_cpu_ptr(vx_ptr_pc(vxi), id)->v
137 #endif
138
139 #define vx_cpu(vxi, v)          vx_per_cpu(vxi, v, smp_processor_id())
140
141
142 struct vx_info_save {
143         struct vx_info *vxi;
144         xid_t xid;
145 };
146
147
148 /* status flags */
149
150 #define VXS_HASHED      0x0001
151 #define VXS_PAUSED      0x0010
152 #define VXS_SHUTDOWN    0x0100
153 #define VXS_HELPER      0x1000
154 #define VXS_RELEASED    0x8000
155
156
157 extern void claim_vx_info(struct vx_info *, struct task_struct *);
158 extern void release_vx_info(struct vx_info *, struct task_struct *);
159
160 extern struct vx_info *lookup_vx_info(int);
161 extern struct vx_info *lookup_or_create_vx_info(int);
162
163 extern int get_xid_list(int, unsigned int *, int);
164 extern int xid_is_hashed(xid_t);
165
166 extern int vx_migrate_task(struct task_struct *, struct vx_info *, int);
167
168 extern long vs_state_change(struct vx_info *, unsigned int);
169
170
171 #endif  /* __KERNEL__ */
172 #endif  /* _VX_CONTEXT_H */