diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_cvirt.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_cvirt.h --- linux-2.6.9-vs1.9.3/include/linux/vs_cvirt.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_cvirt.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,9 +1,9 @@ #ifndef _VX_VS_CVIRT_H #define _VX_VS_CVIRT_H + #include "vserver/cvirt.h" #include "vserver/debug.h" -#include "vs_base.h" /* utsname virtualization */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_dlimit.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_dlimit.h --- linux-2.6.9-vs1.9.3/include/linux/vs_dlimit.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_dlimit.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,11 +1,7 @@ #ifndef _VX_VS_DLIMIT_H #define _VX_VS_DLIMIT_H -#include -#include -#include -#include "vserver/context.h" #include "vserver/dlimit.h" #include "vserver/debug.h" diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_limit.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_limit.h --- linux-2.6.9-vs1.9.3/include/linux/vs_limit.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_limit.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,11 +1,7 @@ #ifndef _VX_VS_LIMIT_H #define _VX_VS_LIMIT_H -#include -#include -#include -#include "vserver/context.h" #include "vserver/limit.h" #include "vserver/debug.h" diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_memory.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_memory.h --- linux-2.6.9-vs1.9.3/include/linux/vs_memory.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_memory.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,11 +1,7 @@ #ifndef _VX_VS_MEMORY_H #define _VX_VS_MEMORY_H -#include -#include -#include -#include "vserver/context.h" #include "vserver/limit.h" #include "vserver/debug.h" diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_network.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_network.h --- linux-2.6.9-vs1.9.3/include/linux/vs_network.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_network.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,9 +1,6 @@ #ifndef _NX_VS_NETWORK_H #define _NX_VS_NETWORK_H -#include -#include -#include #include "vserver/network.h" #include "vserver/debug.h" diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_sched.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_sched.h --- linux-2.6.9-vs1.9.3/include/linux/vs_sched.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_sched.h 2005-01-13 12:42:05.000000000 +0100 @@ -0,0 +1,73 @@ +#ifndef _VX_VS_SCHED_H +#define _VX_VS_SCHED_H + + +#include "vserver/sched.h" + + +#define VAVAVOOM_RATIO 50 + +#define MAX_PRIO_BIAS 20 +#define MIN_PRIO_BIAS -20 + + +static inline int vx_tokens_avail(struct vx_info *vxi) +{ + return atomic_read(&vxi->sched.tokens); +} + +static inline void vx_consume_token(struct vx_info *vxi) +{ + atomic_dec(&vxi->sched.tokens); +} + +static inline int vx_need_resched(struct task_struct *p) +{ +#ifdef CONFIG_VSERVER_HARDCPU + struct vx_info *vxi = p->vx_info; +#endif + int slice = --p->time_slice; + +#ifdef CONFIG_VSERVER_HARDCPU + if (vxi) { + int tokens; + + if ((tokens = vx_tokens_avail(vxi)) > 0) + vx_consume_token(vxi); + /* for tokens > 0, one token was consumed */ + if (tokens < 2) + return 1; + } +#endif + return (slice == 0); +} + + +static inline void vx_onhold_inc(struct vx_info *vxi) +{ + int onhold = atomic_read(&vxi->cvirt.nr_onhold); + + atomic_inc(&vxi->cvirt.nr_onhold); + if (!onhold) + vxi->cvirt.onhold_last = jiffies; +} + +static inline void __vx_onhold_update(struct vx_info *vxi) +{ + int cpu = smp_processor_id(); + uint32_t now = jiffies; + uint32_t delta = now - vxi->cvirt.onhold_last; + + vxi->cvirt.onhold_last = now; + vxi->sched.cpu[cpu].hold_ticks += delta; +} + +static inline void vx_onhold_dec(struct vx_info *vxi) +{ + if (atomic_dec_and_test(&vxi->cvirt.nr_onhold)) + __vx_onhold_update(vxi); +} + +#else +#warning duplicate inclusion +#endif diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vs_socket.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_socket.h --- linux-2.6.9-vs1.9.3/include/linux/vs_socket.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vs_socket.h 2005-01-13 12:41:55.000000000 +0100 @@ -2,14 +2,6 @@ #define _VX_VS_SOCKET_H -// #define VX_DEBUG - -#include -#include -#include - -#include "vserver/context.h" -#include "vserver/network.h" #include "vserver/debug.h" diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/context.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/context.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/context.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/context.h 2005-01-13 12:41:55.000000000 +0100 @@ -3,22 +3,69 @@ #include + #define MAX_S_CONTEXT 65535 /* Arbitrary limit */ #define MIN_D_CONTEXT 49152 /* dynamic contexts start here */ #define VX_DYNAMIC_ID ((uint32_t)-1) /* id for dynamic context */ +/* context flags */ + +#define VXF_INFO_LOCK 0x00000001 +#define VXF_INFO_SCHED 0x00000002 +#define VXF_INFO_NPROC 0x00000004 +#define VXF_INFO_PRIVATE 0x00000008 + +#define VXF_INFO_INIT 0x00000010 +#define VXF_INFO_HIDE 0x00000020 +#define VXF_INFO_ULIMIT 0x00000040 +#define VXF_INFO_NSPACE 0x00000080 + +#define VXF_SCHED_HARD 0x00000100 +#define VXF_SCHED_PRIO 0x00000200 +#define VXF_SCHED_PAUSE 0x00000400 + +#define VXF_VIRT_MEM 0x00010000 +#define VXF_VIRT_UPTIME 0x00020000 +#define VXF_VIRT_CPU 0x00040000 +#define VXF_VIRT_LOAD 0x00080000 + +#define VXF_HIDE_MOUNT 0x01000000 +#define VXF_HIDE_NETIF 0x02000000 + +#define VXF_STATE_SETUP (1ULL<<32) +#define VXF_STATE_INIT (1ULL<<33) + +#define VXF_FORK_RSS (1ULL<<48) +#define VXF_PROLIFIC (1ULL<<49) + +#define VXF_IGNEG_NICE (1ULL<<52) + +#define VXF_ONE_TIME (0x0003ULL<<32) + + +/* context caps */ + +#define VXC_CAP_MASK 0x00000000 + +#define VXC_SET_UTSNAME 0x00000001 +#define VXC_SET_RLIMIT 0x00000002 + +#define VXC_RAW_ICMP 0x00000100 + +#define VXC_SECURE_MOUNT 0x00010000 +#define VXC_SECURE_REMOUNT 0x00020000 + + #ifdef __KERNEL__ #include #include #include -#define _VX_INFO_DEF_ -#include "cvirt.h" -#include "limit.h" -#include "sched.h" -#undef _VX_INFO_DEF_ +#include "cvirt_def.h" +#include "limit_def.h" +#include "sched_def.h" struct vx_info { struct hlist_node vx_hlist; /* linked list of contexts */ @@ -48,6 +95,7 @@ struct vx_info { char vx_name[65]; /* vserver name */ }; + /* status flags */ #define VXS_HASHED 0x0001 @@ -89,111 +137,12 @@ extern int vx_info_is_hashed(xid_t); extern int vx_migrate_task(struct task_struct *, struct vx_info *); -#endif /* __KERNEL__ */ - -#include "switch.h" - -/* vinfo commands */ - -#define VCMD_task_xid VC_CMD(VINFO, 1, 0) -#define VCMD_task_nid VC_CMD(VINFO, 2, 0) - -#ifdef __KERNEL__ -extern int vc_task_xid(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_vx_info VC_CMD(VINFO, 5, 0) -#define VCMD_nx_info VC_CMD(VINFO, 6, 0) - -struct vcmd_vx_info_v0 { - uint32_t xid; - uint32_t initpid; - /* more to come */ -}; - -#ifdef __KERNEL__ -extern int vc_vx_info(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_ctx_create VC_CMD(VPROC, 1, 0) -#define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 0) - -#ifdef __KERNEL__ -extern int vc_ctx_create(uint32_t, void __user *); -extern int vc_ctx_migrate(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_get_cflags VC_CMD(FLAGS, 1, 0) -#define VCMD_set_cflags VC_CMD(FLAGS, 2, 0) - -struct vcmd_ctx_flags_v0 { - uint64_t flagword; - uint64_t mask; -}; - -#ifdef __KERNEL__ -extern int vc_get_cflags(uint32_t, void __user *); -extern int vc_set_cflags(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VXF_INFO_LOCK 0x00000001 -#define VXF_INFO_SCHED 0x00000002 -#define VXF_INFO_NPROC 0x00000004 -#define VXF_INFO_PRIVATE 0x00000008 - -#define VXF_INFO_INIT 0x00000010 -#define VXF_INFO_HIDE 0x00000020 -#define VXF_INFO_ULIMIT 0x00000040 -#define VXF_INFO_NSPACE 0x00000080 - -#define VXF_SCHED_HARD 0x00000100 -#define VXF_SCHED_PRIO 0x00000200 -#define VXF_SCHED_PAUSE 0x00000400 - -#define VXF_VIRT_MEM 0x00010000 -#define VXF_VIRT_UPTIME 0x00020000 -#define VXF_VIRT_CPU 0x00040000 -#define VXF_VIRT_LOAD 0x00080000 - -#define VXF_HIDE_MOUNT 0x01000000 -#define VXF_HIDE_NETIF 0x02000000 - -#define VXF_STATE_SETUP (1ULL<<32) -#define VXF_STATE_INIT (1ULL<<33) - -#define VXF_FORK_RSS (1ULL<<48) -#define VXF_PROLIFIC (1ULL<<49) - -#define VXF_IGNEG_NICE (1ULL<<52) - -#define VXF_ONE_TIME (0x0003ULL<<32) - -#define VCMD_get_ccaps VC_CMD(FLAGS, 3, 0) -#define VCMD_set_ccaps VC_CMD(FLAGS, 4, 0) +extern int proc_pid_vx_info(struct task_struct *, char *); -struct vcmd_ctx_caps_v0 { - uint64_t bcaps; - uint64_t ccaps; - uint64_t cmask; -}; +extern void free_vx_info(struct vx_info *); -#ifdef __KERNEL__ -extern int vc_get_ccaps(uint32_t, void __user *); -extern int vc_set_ccaps(uint32_t, void __user *); #endif /* __KERNEL__ */ - -#define VXC_SET_UTSNAME 0x00000001 -#define VXC_SET_RLIMIT 0x00000002 - -#define VXC_RAW_ICMP 0x00000100 - -#define VXC_SECURE_MOUNT 0x00010000 -#define VXC_SECURE_REMOUNT 0x00020000 - - +#else /* _VX_CONTEXT_H */ +#warning duplicate inclusion #endif /* _VX_CONTEXT_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/context_cmd.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/context_cmd.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/context_cmd.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/context_cmd.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,73 @@ +#ifndef _VX_CONTEXT_CMD_H +#define _VX_CONTEXT_CMD_H + + +/* vinfo commands */ + +#define VCMD_task_xid VC_CMD(VINFO, 1, 0) + +#ifdef __KERNEL__ +extern int vc_task_xid(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + +#define VCMD_vx_info VC_CMD(VINFO, 5, 0) + +struct vcmd_vx_info_v0 { + uint32_t xid; + uint32_t initpid; + /* more to come */ +}; + +#ifdef __KERNEL__ +extern int vc_vx_info(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + + +/* context commands */ + +#define VCMD_ctx_create VC_CMD(VPROC, 1, 0) +#define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 0) + +#ifdef __KERNEL__ +extern int vc_ctx_create(uint32_t, void __user *); +extern int vc_ctx_migrate(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + + +/* flag commands */ + +#define VCMD_get_cflags VC_CMD(FLAGS, 1, 0) +#define VCMD_set_cflags VC_CMD(FLAGS, 2, 0) + +struct vcmd_ctx_flags_v0 { + uint64_t flagword; + uint64_t mask; +}; + +#ifdef __KERNEL__ +extern int vc_get_cflags(uint32_t, void __user *); +extern int vc_set_cflags(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + + +/* context caps commands */ + +#define VCMD_get_ccaps VC_CMD(FLAGS, 3, 0) +#define VCMD_set_ccaps VC_CMD(FLAGS, 4, 0) + +struct vcmd_ctx_caps_v0 { + uint64_t bcaps; + uint64_t ccaps; + uint64_t cmask; +}; + +#ifdef __KERNEL__ +extern int vc_get_ccaps(uint32_t, void __user *); +extern int vc_set_ccaps(uint32_t, void __user *); + +#endif /* __KERNEL__ */ +#endif /* _VX_CONTEXT_CMD_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,205 +1,18 @@ -/* _VX_CVIRT_H defined below */ - -#if defined(__KERNEL__) && defined(_VX_INFO_DEF_) - -#include -#include -#include -#include -#include -#include -#include - -/* context sub struct */ - -struct _vx_cvirt { - int max_threads; /* maximum allowed threads */ - atomic_t nr_threads; /* number of current threads */ - atomic_t nr_running; /* number of running threads */ - - atomic_t nr_onhold; /* processes on hold */ - uint32_t onhold_last; /* jiffies when put on hold */ - - struct timespec bias_idle; - struct timespec bias_uptime; /* context creation point */ - - struct new_utsname utsname; - - spinlock_t load_lock; /* lock for the load averages */ - uint32_t load_last; /* last time load was cacled */ - uint32_t load[3]; /* load averages 1,5,15 */ - - struct cpu_usage_stat cpustat[NR_CPUS]; -}; - -struct sock_acc { - atomic_t count; - atomic_t total; -}; - -struct _vx_cacct { - unsigned long total_forks; - - struct sock_acc sock[5][3]; -}; - - -static inline long vx_sock_count(struct _vx_cacct *cacct, int type, int pos) -{ - return atomic_read(&cacct->sock[type][pos].count); -} - - -static inline long vx_sock_total(struct _vx_cacct *cacct, int type, int pos) -{ - return atomic_read(&cacct->sock[type][pos].total); -} - - -extern uint64_t vx_idle_jiffies(void); - -static inline void vx_info_init_cvirt(struct _vx_cvirt *cvirt) -{ - uint64_t idle_jiffies = vx_idle_jiffies(); - - do_posix_clock_monotonic_gettime(&cvirt->bias_uptime); - jiffies_to_timespec(idle_jiffies, &cvirt->bias_idle); - atomic_set(&cvirt->nr_threads, 0); - atomic_set(&cvirt->nr_running, 0); - atomic_set(&cvirt->nr_onhold, 0); - - down_read(&uts_sem); - cvirt->utsname = system_utsname; - up_read(&uts_sem); - - spin_lock_init(&cvirt->load_lock); - cvirt->load_last = jiffies; - cvirt->load[0] = 0; - cvirt->load[1] = 0; - cvirt->load[2] = 0; -} - -static inline void vx_info_exit_cvirt(struct _vx_cvirt *cvirt) -{ -#ifdef CONFIG_VSERVER_DEBUG - int value; - - if ((value = atomic_read(&cvirt->nr_threads))) - printk("!!! cvirt: %p[nr_threads] = %d on exit.\n", - cvirt, value); - if ((value = atomic_read(&cvirt->nr_running))) - printk("!!! cvirt: %p[nr_running] = %d on exit.\n", - cvirt, value); -#endif - return; -} - -static inline void vx_info_init_cacct(struct _vx_cacct *cacct) -{ - int i,j; - - for (i=0; i<5; i++) { - for (j=0; j<3; j++) { - atomic_set(&cacct->sock[i][j].count, 0); - atomic_set(&cacct->sock[i][j].total, 0); - } - } -} - -static inline void vx_info_exit_cacct(struct _vx_cacct *cacct) -{ - return; -} - -#define LOAD_INT(x) ((x) >> FSHIFT) -#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) - - -static inline int vx_info_proc_cvirt(struct _vx_cvirt *cvirt, char *buffer) -{ - int length = 0; - int a, b, c; - - length += sprintf(buffer + length, - "BiasUptime:\t%lu.%02lu\n", - (unsigned long)cvirt->bias_uptime.tv_sec, - (cvirt->bias_uptime.tv_nsec / (NSEC_PER_SEC / 100))); - length += sprintf(buffer + length, - "SysName:\t%.*s\n" - "NodeName:\t%.*s\n" - "Release:\t%.*s\n" - "Version:\t%.*s\n" - "Machine:\t%.*s\n" - "DomainName:\t%.*s\n" - ,__NEW_UTS_LEN, cvirt->utsname.sysname - ,__NEW_UTS_LEN, cvirt->utsname.nodename - ,__NEW_UTS_LEN, cvirt->utsname.release - ,__NEW_UTS_LEN, cvirt->utsname.version - ,__NEW_UTS_LEN, cvirt->utsname.machine - ,__NEW_UTS_LEN, cvirt->utsname.domainname - ); - - a = cvirt->load[0] + (FIXED_1/200); - b = cvirt->load[1] + (FIXED_1/200); - c = cvirt->load[2] + (FIXED_1/200); - length += sprintf(buffer + length, - "nr_threads:\t%d\n" - "nr_running:\t%d\n" - "nr_onhold:\t%d\n" - "loadavg:\t%d.%02d %d.%02d %d.%02d\n" - ,atomic_read(&cvirt->nr_threads) - ,atomic_read(&cvirt->nr_running) - ,atomic_read(&cvirt->nr_onhold) - ,LOAD_INT(a), LOAD_FRAC(a) - ,LOAD_INT(b), LOAD_FRAC(b) - ,LOAD_INT(c), LOAD_FRAC(c) - ); - return length; -} - -static inline int vx_info_proc_cacct(struct _vx_cacct *cacct, char *buffer) -{ - int i,j, length = 0; - static char *type[] = { "UNSPEC", "UNIX", "INET", "INET6", "OTHER" }; - - for (i=0; i<5; i++) { - length += sprintf(buffer + length, - "%s:", type[i]); - for (j=0; j<3; j++) { - length += sprintf(buffer + length, - "\t%12lu/%-12lu" - ,vx_sock_count(cacct, i, j) - ,vx_sock_total(cacct, i, j) - ); - } - buffer[length++] = '\n'; - } - length += sprintf(buffer + length, - "forks:\t%lu\n", cacct->total_forks); - return length; -} - -#else /* _VX_INFO_DEF_ */ #ifndef _VX_CVIRT_H #define _VX_CVIRT_H -#include "switch.h" - -/* cvirt vserver commands */ - - #ifdef __KERNEL__ struct timespec; void vx_vsi_uptime(struct timespec *, struct timespec *); + struct vx_info; void vx_update_load(struct vx_info *); - #endif /* __KERNEL__ */ - +#else /* _VX_CVIRT_H */ +#warning duplicate inclusion #endif /* _VX_CVIRT_H */ -#endif diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt_cmd.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt_cmd.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt_cmd.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt_cmd.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,7 @@ +#ifndef _VX_CVIRT_CMD_H +#define _VX_CVIRT_CMD_H + +/* cvirt vserver commands */ + + +#endif /* _VX_CVIRT_CMD_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt_def.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt_def.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/cvirt_def.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/cvirt_def.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,58 @@ +#ifndef _VX_CVIRT_DEF_H +#define _VX_CVIRT_DEF_H + +#include +#include +#include +#include +#include + + +struct _vx_usage_stat { + uint64_t user; + uint64_t nice; + uint64_t system; + uint64_t softirq; + uint64_t irq; + uint64_t idle; + uint64_t iowait; +}; + +/* context sub struct */ + +struct _vx_cvirt { + int max_threads; /* maximum allowed threads */ + atomic_t nr_threads; /* number of current threads */ + atomic_t nr_running; /* number of running threads */ + atomic_t nr_uninterruptible; /* number of uninterruptible threads */ + + atomic_t nr_onhold; /* processes on hold */ + uint32_t onhold_last; /* jiffies when put on hold */ + + struct timespec bias_idle; + struct timespec bias_uptime; /* context creation point */ + + struct new_utsname utsname; + + spinlock_t load_lock; /* lock for the load averages */ + atomic_t load_updates; /* nr of load updates done so far */ + uint32_t load_last; /* last time load was cacled */ + uint32_t load[3]; /* load averages 1,5,15 */ + + struct _vx_usage_stat cpustat[NR_CPUS]; +}; + +struct _vx_sock_acc { + atomic_t count; + atomic_t total; +}; + +/* context sub struct */ + +struct _vx_cacct { + unsigned long total_forks; + + struct _vx_sock_acc sock[5][3]; +}; + +#endif /* _VX_CVIRT_DEF_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/dlimit.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/dlimit.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/dlimit.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/dlimit.h 2005-01-13 12:41:55.000000000 +0100 @@ -79,7 +79,7 @@ extern int vc_get_dlimit(uint32_t, void typedef uint64_t dlsize_t; - #endif /* __KERNEL__ */ - +#else /* _VX_DLIMIT_H */ +#warning duplicate inclusion #endif /* _VX_DLIMIT_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/inode.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/inode.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/inode.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/inode.h 2005-01-13 12:41:55.000000000 +0100 @@ -64,4 +64,6 @@ extern int vc_set_iattr(uint32_t, void _ #define FIOC_GETXFLG _IOR('x', 5, long) #define FIOC_SETXFLG _IOW('x', 6, long) +#else /* _VX_INODE_H */ +#warning duplicate inclusion #endif /* _VX_INODE_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/legacy.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/legacy.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/legacy.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/legacy.h 2005-01-13 12:41:55.000000000 +0100 @@ -2,7 +2,6 @@ #define _VX_LEGACY_H #include "switch.h" -#include "network.h" /* compatibiliy vserver commands */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/limit.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/limit.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,144 +1,20 @@ -/* _VX_LIMIT_H defined below */ - -#if defined(__KERNEL__) && defined(_VX_INFO_DEF_) - -#include -#include - -/* context sub struct */ - -#define NUM_LIMITS 20 - -#define VLIMIT_NSOCK 16 - - -extern const char *vlimit_name[NUM_LIMITS]; - -struct _vx_limit { - atomic_t ticks; - - unsigned long rlim[NUM_LIMITS]; /* Context limit */ - unsigned long rmax[NUM_LIMITS]; /* Context maximum */ - atomic_t rcur[NUM_LIMITS]; /* Current value */ - atomic_t lhit[NUM_LIMITS]; /* Limit hits */ -}; - -static inline void vx_info_init_limit(struct _vx_limit *limit) -{ - int lim; - - for (lim=0; limrlim[lim] = RLIM_INFINITY; - limit->rmax[lim] = 0; - atomic_set(&limit->rcur[lim], 0); - atomic_set(&limit->lhit[lim], 0); - } -} - -static inline void vx_info_exit_limit(struct _vx_limit *limit) -{ -#ifdef CONFIG_VSERVER_DEBUG - unsigned long value; - unsigned int lim; - - for (lim=0; limrcur[lim]); - if (value) - printk("!!! limit: %p[%s,%d] = %ld on exit.\n", - limit, vlimit_name[lim], lim, value); - } -#endif -} - -static inline void vx_limit_fixup(struct _vx_limit *limit) -{ - unsigned long value; - unsigned int lim; - - for (lim=0; limrcur[lim]); - if (value > limit->rmax[lim]) - limit->rmax[lim] = value; - if (limit->rmax[lim] > limit->rlim[lim]) - limit->rmax[lim] = limit->rlim[lim]; - } -} - -#define VX_LIMIT_FMT ":\t%10d\t%10ld\t%10ld\t%6d\n" - -#define VX_LIMIT_ARG(r) \ - ,atomic_read(&limit->rcur[r]) \ - ,limit->rmax[r] \ - ,limit->rlim[r] \ - ,atomic_read(&limit->lhit[r]) - -static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer) -{ - vx_limit_fixup(limit); - return sprintf(buffer, - "PROC" VX_LIMIT_FMT - "VM" VX_LIMIT_FMT - "VML" VX_LIMIT_FMT - "RSS" VX_LIMIT_FMT - "FILES" VX_LIMIT_FMT - "SOCK" VX_LIMIT_FMT - VX_LIMIT_ARG(RLIMIT_NPROC) - VX_LIMIT_ARG(RLIMIT_AS) - VX_LIMIT_ARG(RLIMIT_MEMLOCK) - VX_LIMIT_ARG(RLIMIT_RSS) - VX_LIMIT_ARG(RLIMIT_NOFILE) - VX_LIMIT_ARG(VLIMIT_NSOCK) - ); -} - -#else /* _VX_INFO_DEF_ */ #ifndef _VX_LIMIT_H #define _VX_LIMIT_H -#include "switch.h" - -#define VXD_RLIMIT(r,l) (VXD_CBIT(limit, (l)) && ((r) == (l))) - -/* rlimit vserver commands */ - -#define VCMD_get_rlimit VC_CMD(RLIMIT, 1, 0) -#define VCMD_set_rlimit VC_CMD(RLIMIT, 2, 0) -#define VCMD_get_rlimit_mask VC_CMD(RLIMIT, 3, 0) - -struct vcmd_ctx_rlimit_v0 { - uint32_t id; - uint64_t minimum; - uint64_t softlimit; - uint64_t maximum; -}; - -struct vcmd_ctx_rlimit_mask_v0 { - uint32_t minimum; - uint32_t softlimit; - uint32_t maximum; -}; - -#define CRLIM_UNSET (0ULL) -#define CRLIM_INFINITY (~0ULL) -#define CRLIM_KEEP (~1ULL) - #ifdef __KERNEL__ -#include - -extern int vc_get_rlimit(uint32_t, void __user *); -extern int vc_set_rlimit(uint32_t, void __user *); -extern int vc_get_rlimit_mask(uint32_t, void __user *); - struct sysinfo; void vx_vsi_meminfo(struct sysinfo *); void vx_vsi_swapinfo(struct sysinfo *); +#define VXD_RLIMIT(r,l) (VXD_CBIT(limit, (l)) && ((r) == (l))) -#endif /* __KERNEL__ */ +#define NUM_LIMITS 20 -#endif /* _VX_LIMIT_H */ -#endif +#define VLIMIT_NSOCK 16 +extern const char *vlimit_name[NUM_LIMITS]; +#endif /* __KERNEL__ */ +#endif /* _VX_LIMIT_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/limit_cmd.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit_cmd.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/limit_cmd.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit_cmd.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,36 @@ +#ifndef _VX_LIMIT_CMD_H +#define _VX_LIMIT_CMD_H + +/* rlimit vserver commands */ + +#define VCMD_get_rlimit VC_CMD(RLIMIT, 1, 0) +#define VCMD_set_rlimit VC_CMD(RLIMIT, 2, 0) +#define VCMD_get_rlimit_mask VC_CMD(RLIMIT, 3, 0) + +struct vcmd_ctx_rlimit_v0 { + uint32_t id; + uint64_t minimum; + uint64_t softlimit; + uint64_t maximum; +}; + +struct vcmd_ctx_rlimit_mask_v0 { + uint32_t minimum; + uint32_t softlimit; + uint32_t maximum; +}; + +#define CRLIM_UNSET (0ULL) +#define CRLIM_INFINITY (~0ULL) +#define CRLIM_KEEP (~1ULL) + +#ifdef __KERNEL__ + +#include + +extern int vc_get_rlimit(uint32_t, void __user *); +extern int vc_set_rlimit(uint32_t, void __user *); +extern int vc_get_rlimit_mask(uint32_t, void __user *); + +#endif /* __KERNEL__ */ +#endif /* _VX_LIMIT_CMD_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/limit_def.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit_def.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/limit_def.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/limit_def.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,21 @@ +#ifndef _VX_LIMIT_DEF_H +#define _VX_LIMIT_DEF_H + +#include +#include + +#include "limit.h" + +/* context sub struct */ + +struct _vx_limit { + atomic_t ticks; + + unsigned long rlim[NUM_LIMITS]; /* Context limit */ + unsigned long rmax[NUM_LIMITS]; /* Context maximum */ + atomic_t rcur[NUM_LIMITS]; /* Current value */ + atomic_t lhit[NUM_LIMITS]; /* Limit hits */ +}; + + +#endif /* _VX_LIMIT_DEF_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/namespace.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/namespace.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/namespace.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/namespace.h 2005-01-13 12:41:55.000000000 +0100 @@ -55,4 +55,6 @@ extern int vc_cleanup_namespace(uint32_t extern int vc_set_namespace(uint32_t, void __user *); #endif /* __KERNEL__ */ +#else /* _VX_NAMESPACE_H */ +#warning duplicate inclusion #endif /* _VX_NAMESPACE_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/network.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/network.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/network.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/network.h 2005-01-13 12:41:55.000000000 +0100 @@ -64,89 +64,7 @@ struct sock; int nx_addr_conflict(struct nx_info *, uint32_t, struct sock *); - -#endif /* __KERNEL__ */ - -#include "switch.h" - -/* vinfo commands */ - -#define VCMD_task_nid VC_CMD(VINFO, 2, 0) - -#ifdef __KERNEL__ -extern int vc_task_nid(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_nx_info VC_CMD(VINFO, 6, 0) - -struct vcmd_nx_info_v0 { - uint32_t nid; - /* more to come */ -}; - -#ifdef __KERNEL__ -extern int vc_nx_info(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_net_create VC_CMD(VNET, 1, 0) -#define VCMD_net_migrate VC_CMD(NETMIG, 1, 0) - -#define VCMD_net_add VC_CMD(NETALT, 1, 0) -#define VCMD_net_remove VC_CMD(NETALT, 2, 0) - -struct vcmd_net_nx_v0 { - uint16_t type; - uint16_t count; - uint32_t ip[4]; - uint32_t mask[4]; - /* more to come */ -}; - -// IPN_TYPE_IPV4 - - -#ifdef __KERNEL__ -extern int vc_net_create(uint32_t, void __user *); -extern int vc_net_migrate(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define VCMD_get_nflags VC_CMD(FLAGS, 5, 0) -#define VCMD_set_nflags VC_CMD(FLAGS, 6, 0) - -struct vcmd_net_flags_v0 { - uint64_t flagword; - uint64_t mask; -}; - -#ifdef __KERNEL__ -extern int vc_get_nflags(uint32_t, void __user *); -extern int vc_set_nflags(uint32_t, void __user *); - #endif /* __KERNEL__ */ - -#define IPF_STATE_SETUP (1ULL<<32) - - -#define IPF_ONE_TIME (0x0001ULL<<32) - -#define VCMD_get_ncaps VC_CMD(FLAGS, 7, 0) -#define VCMD_set_ncaps VC_CMD(FLAGS, 8, 0) - -struct vcmd_net_caps_v0 { - uint64_t ncaps; - uint64_t cmask; -}; - -#ifdef __KERNEL__ -extern int vc_get_ncaps(uint32_t, void __user *); -extern int vc_set_ncaps(uint32_t, void __user *); - -#endif /* __KERNEL__ */ - -#define IPC_WOSSNAME 0x00000001 - - +#else /* _VX_NETWORK_H */ +#warning duplicate inclusion #endif /* _VX_NETWORK_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/network_cmd.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/network_cmd.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/network_cmd.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/network_cmd.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,81 @@ +#ifndef _VX_NETWORK_CMD_H +#define _VX_NETWORK_CMD_H + + +/* vinfo commands */ + +#define VCMD_task_nid VC_CMD(VINFO, 2, 0) + +#ifdef __KERNEL__ +extern int vc_task_nid(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + +#define VCMD_nx_info VC_CMD(VINFO, 6, 0) + +struct vcmd_nx_info_v0 { + uint32_t nid; + /* more to come */ +}; + +#ifdef __KERNEL__ +extern int vc_nx_info(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + +#define VCMD_net_create VC_CMD(VNET, 1, 0) +#define VCMD_net_migrate VC_CMD(NETMIG, 1, 0) + +#define VCMD_net_add VC_CMD(NETALT, 1, 0) +#define VCMD_net_remove VC_CMD(NETALT, 2, 0) + +struct vcmd_net_nx_v0 { + uint16_t type; + uint16_t count; + uint32_t ip[4]; + uint32_t mask[4]; + /* more to come */ +}; + +// IPN_TYPE_IPV4 + + +#ifdef __KERNEL__ +extern int vc_net_create(uint32_t, void __user *); +extern int vc_net_migrate(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + +#define VCMD_get_nflags VC_CMD(FLAGS, 5, 0) +#define VCMD_set_nflags VC_CMD(FLAGS, 6, 0) + +struct vcmd_net_flags_v0 { + uint64_t flagword; + uint64_t mask; +}; + +#ifdef __KERNEL__ +extern int vc_get_nflags(uint32_t, void __user *); +extern int vc_set_nflags(uint32_t, void __user *); + +#endif /* __KERNEL__ */ + +#define IPF_STATE_SETUP (1ULL<<32) + + +#define IPF_ONE_TIME (0x0001ULL<<32) + +#define VCMD_get_ncaps VC_CMD(FLAGS, 7, 0) +#define VCMD_set_ncaps VC_CMD(FLAGS, 8, 0) + +struct vcmd_net_caps_v0 { + uint64_t ncaps; + uint64_t cmask; +}; + +#ifdef __KERNEL__ +extern int vc_get_ncaps(uint32_t, void __user *); +extern int vc_set_ncaps(uint32_t, void __user *); + +#endif /* __KERNEL__ */ +#endif /* _VX_CONTEXT_CMD_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/sched.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/sched.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched.h 2005-01-13 12:41:55.000000000 +0100 @@ -1,221 +1,25 @@ -/* _VX_SCHED_H defined below */ - -#if defined(__KERNEL__) && defined(_VX_INFO_DEF_) - -#include -#include -#include -#include -#include - -struct _vx_ticks { - uint64_t user_ticks; /* token tick events */ - uint64_t sys_ticks; /* token tick events */ - uint64_t hold_ticks; /* token ticks paused */ - uint64_t unused[5]; /* cacheline ? */ -}; - -/* context sub struct */ - -struct _vx_sched { - atomic_t tokens; /* number of CPU tokens */ - spinlock_t tokens_lock; /* lock for token bucket */ - - int fill_rate; /* Fill rate: add X tokens... */ - int interval; /* Divisor: per Y jiffies */ - int tokens_min; /* Limit: minimum for unhold */ - int tokens_max; /* Limit: no more than N tokens */ - uint32_t jiffies; /* last time accounted */ - - int priority_bias; /* bias offset for priority */ - cpumask_t cpus_allowed; /* cpu mask for context */ - - struct _vx_ticks cpu[NR_CPUS]; -}; - -static inline void vx_info_init_sched(struct _vx_sched *sched) -{ - int i; - - /* scheduling; hard code starting values as constants */ - sched->fill_rate = 1; - sched->interval = 4; - sched->tokens_min = HZ >> 4; - sched->tokens_max = HZ >> 1; - sched->jiffies = jiffies; - sched->tokens_lock = SPIN_LOCK_UNLOCKED; - - atomic_set(&sched->tokens, HZ >> 2); - sched->cpus_allowed = CPU_MASK_ALL; - sched->priority_bias = 0; - - for_each_cpu(i) { - sched->cpu[i].user_ticks = 0; - sched->cpu[i].sys_ticks = 0; - sched->cpu[i].hold_ticks = 0; - } -} - -static inline void vx_info_exit_sched(struct _vx_sched *sched) -{ - return; -} - -static inline int vx_info_proc_sched(struct _vx_sched *sched, char *buffer) -{ - int length = 0; - int i; - - length += sprintf(buffer, - "Token:\t\t%8d\n" - "FillRate:\t%8d\n" - "Interval:\t%8d\n" - "TokensMin:\t%8d\n" - "TokensMax:\t%8d\n" - "PrioBias:\t%8d\n" - ,atomic_read(&sched->tokens) - ,sched->fill_rate - ,sched->interval - ,sched->tokens_min - ,sched->tokens_max - ,sched->priority_bias - ); - - for_each_online_cpu(i) { - length += sprintf(buffer + length, - "cpu %d: %lld %lld %lld\n" - ,i - ,(long long)sched->cpu[i].user_ticks - ,(long long)sched->cpu[i].sys_ticks - ,(long long)sched->cpu[i].hold_ticks - ); - } - - return length; -} - - -#else /* _VX_INFO_DEF_ */ #ifndef _VX_SCHED_H #define _VX_SCHED_H -#include "switch.h" - -/* sched vserver commands */ - -#define VCMD_set_sched_v2 VC_CMD(SCHED, 1, 2) -#define VCMD_set_sched VC_CMD(SCHED, 1, 3) - -struct vcmd_set_sched_v2 { - int32_t fill_rate; - int32_t interval; - int32_t tokens; - int32_t tokens_min; - int32_t tokens_max; - uint64_t cpu_mask; -}; - -struct vcmd_set_sched_v3 { - uint32_t set_mask; - int32_t fill_rate; - int32_t interval; - int32_t tokens; - int32_t tokens_min; - int32_t tokens_max; - int32_t priority_bias; -}; - - -#define VXSM_FILL_RATE 0x0001 -#define VXSM_INTERVAL 0x0002 -#define VXSM_TOKENS 0x0010 -#define VXSM_TOKENS_MIN 0x0020 -#define VXSM_TOKENS_MAX 0x0040 -#define VXSM_PRIO_BIAS 0x0100 - -#define SCHED_KEEP (-2) - #ifdef __KERNEL__ -extern int vc_set_sched_v1(uint32_t, void __user *); -extern int vc_set_sched_v2(uint32_t, void __user *); -extern int vc_set_sched(uint32_t, void __user *); +struct timespec; +void vx_vsi_uptime(struct timespec *, struct timespec *); -#define VAVAVOOM_RATIO 50 -#define MAX_PRIO_BIAS 20 -#define MIN_PRIO_BIAS -20 +struct vx_info; -#include "context.h" +void vx_update_load(struct vx_info *); -/* scheduling stuff */ +struct task_struct; int effective_vavavoom(struct task_struct *, int); int vx_tokens_recalc(struct vx_info *); -/* new stuff ;) */ - -static inline int vx_tokens_avail(struct vx_info *vxi) -{ - return atomic_read(&vxi->sched.tokens); -} - -static inline void vx_consume_token(struct vx_info *vxi) -{ - atomic_dec(&vxi->sched.tokens); -} - -static inline int vx_need_resched(struct task_struct *p) -{ -#ifdef CONFIG_VSERVER_HARDCPU - struct vx_info *vxi = p->vx_info; -#endif - int slice = --p->time_slice; - -#ifdef CONFIG_VSERVER_HARDCPU - if (vxi) { - int tokens; - - if ((tokens = vx_tokens_avail(vxi)) > 0) - vx_consume_token(vxi); - /* for tokens > 0, one token was consumed */ - if (tokens < 2) - return 1; - } -#endif - return (slice == 0); -} - - -static inline void vx_onhold_inc(struct vx_info *vxi) -{ - int onhold = atomic_read(&vxi->cvirt.nr_onhold); - - atomic_inc(&vxi->cvirt.nr_onhold); - if (!onhold) - vxi->cvirt.onhold_last = jiffies; -} - -static inline void __vx_onhold_update(struct vx_info *vxi) -{ - int cpu = smp_processor_id(); - uint32_t now = jiffies; - uint32_t delta = now - vxi->cvirt.onhold_last; - - vxi->cvirt.onhold_last = now; - vxi->sched.cpu[cpu].hold_ticks += delta; -} - -static inline void vx_onhold_dec(struct vx_info *vxi) -{ - if (atomic_dec_and_test(&vxi->cvirt.nr_onhold)) - __vx_onhold_update(vxi); -} - #endif /* __KERNEL__ */ - +#else /* _VX_SCHED_H */ +#warning duplicate inclusion #endif /* _VX_SCHED_H */ -#endif diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/sched_cmd.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched_cmd.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/sched_cmd.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched_cmd.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,47 @@ +#ifndef _VX_SCHED_CMD_H +#define _VX_SCHED_CMD_H + +/* sched vserver commands */ + +#define VCMD_set_sched_v2 VC_CMD(SCHED, 1, 2) +#define VCMD_set_sched VC_CMD(SCHED, 1, 3) + +struct vcmd_set_sched_v2 { + int32_t fill_rate; + int32_t interval; + int32_t tokens; + int32_t tokens_min; + int32_t tokens_max; + uint64_t cpu_mask; +}; + +struct vcmd_set_sched_v3 { + uint32_t set_mask; + int32_t fill_rate; + int32_t interval; + int32_t tokens; + int32_t tokens_min; + int32_t tokens_max; + int32_t priority_bias; +}; + + +#define VXSM_FILL_RATE 0x0001 +#define VXSM_INTERVAL 0x0002 +#define VXSM_TOKENS 0x0010 +#define VXSM_TOKENS_MIN 0x0020 +#define VXSM_TOKENS_MAX 0x0040 +#define VXSM_PRIO_BIAS 0x0100 + +#define SCHED_KEEP (-2) + +#ifdef __KERNEL__ + +#include + +extern int vc_set_sched_v1(uint32_t, void __user *); +extern int vc_set_sched_v2(uint32_t, void __user *); +extern int vc_set_sched(uint32_t, void __user *); + +#endif /* __KERNEL__ */ +#endif /* _VX_SCHED_CMD_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver/sched_def.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched_def.h --- linux-2.6.9-vs1.9.3/include/linux/vserver/sched_def.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver/sched_def.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,36 @@ +#ifndef _VX_SCHED_DEF_H +#define _VX_SCHED_DEF_H + +#include +#include +#include +#include +#include + + +struct _vx_ticks { + uint64_t user_ticks; /* token tick events */ + uint64_t sys_ticks; /* token tick events */ + uint64_t hold_ticks; /* token ticks paused */ + uint64_t unused[5]; /* cacheline ? */ +}; + +/* context sub struct */ + +struct _vx_sched { + atomic_t tokens; /* number of CPU tokens */ + spinlock_t tokens_lock; /* lock for token bucket */ + + int fill_rate; /* Fill rate: add X tokens... */ + int interval; /* Divisor: per Y jiffies */ + int tokens_min; /* Limit: minimum for unhold */ + int tokens_max; /* Limit: no more than N tokens */ + uint32_t jiffies; /* last time accounted */ + + int priority_bias; /* bias offset for priority */ + cpumask_t cpus_allowed; /* cpu mask for context */ + + struct _vx_ticks cpu[NR_CPUS]; +}; + +#endif /* _VX_SCHED_DEF_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/include/linux/vserver.h linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver.h --- linux-2.6.9-vs1.9.3/include/linux/vserver.h 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/include/linux/vserver.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -#ifndef _LINUX_VSERVER_H -#define _LINUX_VSERVER_H - -#include -#include - -extern long vs_reboot(unsigned int, void *); - -#endif diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/context.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/context.c --- linux-2.6.9-vs1.9.3/kernel/vserver/context.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/context.c 2005-01-13 12:41:55.000000000 +0100 @@ -16,15 +16,21 @@ * */ +#define _VX_INFO_INIT_ + #include #include -#include +#include +#include + +#include +#include #include -#include +#include +#include + #include -#include -#include -#include +#include #include diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/cvirt.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt.c --- linux-2.6.9-vs1.9.3/kernel/vserver/cvirt.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt.c 2005-01-13 12:41:55.000000000 +0100 @@ -10,12 +10,11 @@ */ #include -#include -#include -#include -#include +#include +#include #include #include +#include #include #include diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/cvirt_init.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt_init.h --- linux-2.6.9-vs1.9.3/kernel/vserver/cvirt_init.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt_init.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,57 @@ + +extern uint64_t vx_idle_jiffies(void); + +static inline void vx_info_init_cvirt(struct _vx_cvirt *cvirt) +{ + uint64_t idle_jiffies = vx_idle_jiffies(); + + do_posix_clock_monotonic_gettime(&cvirt->bias_uptime); + jiffies_to_timespec(idle_jiffies, &cvirt->bias_idle); + atomic_set(&cvirt->nr_threads, 0); + atomic_set(&cvirt->nr_running, 0); + atomic_set(&cvirt->nr_onhold, 0); + + down_read(&uts_sem); + cvirt->utsname = system_utsname; + up_read(&uts_sem); + + spin_lock_init(&cvirt->load_lock); + cvirt->load_last = jiffies; + atomic_set(&cvirt->load_updates, 0); + cvirt->load[0] = 0; + cvirt->load[1] = 0; + cvirt->load[2] = 0; +} + +static inline void vx_info_exit_cvirt(struct _vx_cvirt *cvirt) +{ +#ifdef CONFIG_VSERVER_DEBUG + int value; + + if ((value = atomic_read(&cvirt->nr_threads))) + printk("!!! cvirt: %p[nr_threads] = %d on exit.\n", + cvirt, value); + if ((value = atomic_read(&cvirt->nr_running))) + printk("!!! cvirt: %p[nr_running] = %d on exit.\n", + cvirt, value); +#endif + return; +} + +static inline void vx_info_init_cacct(struct _vx_cacct *cacct) +{ + int i,j; + + for (i=0; i<5; i++) { + for (j=0; j<3; j++) { + atomic_set(&cacct->sock[i][j].count, 0); + atomic_set(&cacct->sock[i][j].total, 0); + } + } +} + +static inline void vx_info_exit_cacct(struct _vx_cacct *cacct) +{ + return; +} + diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/cvirt_proc.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt_proc.h --- linux-2.6.9-vs1.9.3/kernel/vserver/cvirt_proc.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/cvirt_proc.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,74 @@ +#ifndef _VX_CVIRT_PROC_H +#define _VX_CVIRT_PROC_H + +#include + + +#define LOAD_INT(x) ((x) >> FSHIFT) +#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) + +static inline int vx_info_proc_cvirt(struct _vx_cvirt *cvirt, char *buffer) +{ + int length = 0; + int a, b, c; + + length += sprintf(buffer + length, + "BiasUptime:\t%lu.%02lu\n", + (unsigned long)cvirt->bias_uptime.tv_sec, + (cvirt->bias_uptime.tv_nsec / (NSEC_PER_SEC / 100))); + length += sprintf(buffer + length, + "SysName:\t%.*s\n" + "NodeName:\t%.*s\n" + "Release:\t%.*s\n" + "Version:\t%.*s\n" + "Machine:\t%.*s\n" + "DomainName:\t%.*s\n" + ,__NEW_UTS_LEN, cvirt->utsname.sysname + ,__NEW_UTS_LEN, cvirt->utsname.nodename + ,__NEW_UTS_LEN, cvirt->utsname.release + ,__NEW_UTS_LEN, cvirt->utsname.version + ,__NEW_UTS_LEN, cvirt->utsname.machine + ,__NEW_UTS_LEN, cvirt->utsname.domainname + ); + + a = cvirt->load[0] + (FIXED_1/200); + b = cvirt->load[1] + (FIXED_1/200); + c = cvirt->load[2] + (FIXED_1/200); + length += sprintf(buffer + length, + "nr_threads:\t%d\n" + "nr_running:\t%d\n" + "nr_onhold:\t%d\n" + "loadavg:\t%d.%02d %d.%02d %d.%02d\n" + ,atomic_read(&cvirt->nr_threads) + ,atomic_read(&cvirt->nr_running) + ,atomic_read(&cvirt->nr_onhold) + ,LOAD_INT(a), LOAD_FRAC(a) + ,LOAD_INT(b), LOAD_FRAC(b) + ,LOAD_INT(c), LOAD_FRAC(c) + ); + return length; +} + +static inline int vx_info_proc_cacct(struct _vx_cacct *cacct, char *buffer) +{ + int i,j, length = 0; + static char *type[] = { "UNSPEC", "UNIX", "INET", "INET6", "OTHER" }; + + for (i=0; i<5; i++) { + length += sprintf(buffer + length, + "%s:", type[i]); + for (j=0; j<3; j++) { + length += sprintf(buffer + length, + "\t%12lu/%-12lu" + ,vx_sock_count(cacct, i, j) + ,vx_sock_total(cacct, i, j) + ); + } + buffer[length++] = '\n'; + } + length += sprintf(buffer + length, + "forks:\t%lu\n", cacct->total_forks); + return length; +} + +#endif /* _VX_CVIRT_PROC_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/limit.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit.c --- linux-2.6.9-vs1.9.3/kernel/vserver/limit.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit.c 2005-01-13 12:41:55.000000000 +0100 @@ -11,12 +11,11 @@ #include #include -#include -#include -#include -#include #include #include +#include +#include +#include #include #include diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/limit_init.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit_init.h --- linux-2.6.9-vs1.9.3/kernel/vserver/limit_init.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit_init.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,28 @@ + +static inline void vx_info_init_limit(struct _vx_limit *limit) +{ + int lim; + + for (lim=0; limrlim[lim] = RLIM_INFINITY; + limit->rmax[lim] = 0; + atomic_set(&limit->rcur[lim], 0); + atomic_set(&limit->lhit[lim], 0); + } +} + +static inline void vx_info_exit_limit(struct _vx_limit *limit) +{ +#ifdef CONFIG_VSERVER_DEBUG + unsigned long value; + unsigned int lim; + + for (lim=0; limrcur[lim]); + if (value) + printk("!!! limit: %p[%s,%d] = %ld on exit.\n", + limit, vlimit_name[lim], lim, value); + } +#endif +} + diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/limit_proc.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit_proc.h --- linux-2.6.9-vs1.9.3/kernel/vserver/limit_proc.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/limit_proc.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,48 @@ +#ifndef _VX_LIMIT_PROC_H +#define _VX_LIMIT_PROC_H + + +static inline void vx_limit_fixup(struct _vx_limit *limit) +{ + unsigned long value; + unsigned int lim; + + for (lim=0; limrcur[lim]); + if (value > limit->rmax[lim]) + limit->rmax[lim] = value; + if (limit->rmax[lim] > limit->rlim[lim]) + limit->rmax[lim] = limit->rlim[lim]; + } +} + +#define VX_LIMIT_FMT ":\t%10d\t%10ld\t%10ld\t%6d\n" + +#define VX_LIMIT_ARG(r) \ + ,atomic_read(&limit->rcur[r]) \ + ,limit->rmax[r] \ + ,limit->rlim[r] \ + ,atomic_read(&limit->lhit[r]) + +static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer) +{ + vx_limit_fixup(limit); + return sprintf(buffer, + "PROC" VX_LIMIT_FMT + "VM" VX_LIMIT_FMT + "VML" VX_LIMIT_FMT + "RSS" VX_LIMIT_FMT + "FILES" VX_LIMIT_FMT + "SOCK" VX_LIMIT_FMT + VX_LIMIT_ARG(RLIMIT_NPROC) + VX_LIMIT_ARG(RLIMIT_AS) + VX_LIMIT_ARG(RLIMIT_MEMLOCK) + VX_LIMIT_ARG(RLIMIT_RSS) + VX_LIMIT_ARG(RLIMIT_NOFILE) + VX_LIMIT_ARG(VLIMIT_NSOCK) + ); +} + +#endif /* _VX_LIMIT_PROC_H */ + + diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/network.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/network.c --- linux-2.6.9-vs1.9.3/kernel/vserver/network.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/network.c 2005-01-13 12:41:55.000000000 +0100 @@ -14,8 +14,7 @@ #include #include -#include -#include +#include #include #include diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/proc.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/proc.c --- linux-2.6.9-vs1.9.3/kernel/vserver/proc.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/proc.c 2005-01-13 12:41:55.000000000 +0100 @@ -18,15 +18,19 @@ #include #include #include -#include -#include +#include #include #include #include +#include + #include #include +#include "cvirt_proc.h" +#include "limit_proc.h" +#include "sched_proc.h" static struct proc_dir_entry *proc_virtual; diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/sched.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched.c --- linux-2.6.9-vs1.9.3/kernel/vserver/sched.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched.c 2005-01-13 12:41:55.000000000 +0100 @@ -12,10 +12,10 @@ #include #include -#include +// #include #include -#include -#include +#include +#include #include #include diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/sched_init.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched_init.h --- linux-2.6.9-vs1.9.3/kernel/vserver/sched_init.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched_init.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,29 @@ + +static inline void vx_info_init_sched(struct _vx_sched *sched) +{ + int i; + + /* scheduling; hard code starting values as constants */ + sched->fill_rate = 1; + sched->interval = 4; + sched->tokens_min = HZ >> 4; + sched->tokens_max = HZ >> 1; + sched->jiffies = jiffies; + sched->tokens_lock = SPIN_LOCK_UNLOCKED; + + atomic_set(&sched->tokens, HZ >> 2); + sched->cpus_allowed = CPU_MASK_ALL; + sched->priority_bias = 0; + + for_each_cpu(i) { + sched->cpu[i].user_ticks = 0; + sched->cpu[i].sys_ticks = 0; + sched->cpu[i].hold_ticks = 0; + } +} + +static inline void vx_info_exit_sched(struct _vx_sched *sched) +{ + return; +} + diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/sched_proc.h linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched_proc.h --- linux-2.6.9-vs1.9.3/kernel/vserver/sched_proc.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/sched_proc.h 2005-01-13 12:41:55.000000000 +0100 @@ -0,0 +1,38 @@ +#ifndef _VX_SCHED_PROC_H +#define _VX_SCHED_PROC_H + + +static inline int vx_info_proc_sched(struct _vx_sched *sched, char *buffer) +{ + int length = 0; + int i; + + length += sprintf(buffer, + "Token:\t\t%8d\n" + "FillRate:\t%8d\n" + "Interval:\t%8d\n" + "TokensMin:\t%8d\n" + "TokensMax:\t%8d\n" + "PrioBias:\t%8d\n" + ,atomic_read(&sched->tokens) + ,sched->fill_rate + ,sched->interval + ,sched->tokens_min + ,sched->tokens_max + ,sched->priority_bias + ); + + for_each_online_cpu(i) { + length += sprintf(buffer + length, + "cpu %d: %lld %lld %lld\n" + ,i + ,(long long)sched->cpu[i].user_ticks + ,(long long)sched->cpu[i].sys_ticks + ,(long long)sched->cpu[i].hold_ticks + ); + } + + return length; +} + +#endif /* _VX_SCHED_PROC_H */ diff -NurpP --minimal linux-2.6.9-vs1.9.3/kernel/vserver/switch.c linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/switch.c --- linux-2.6.9-vs1.9.3/kernel/vserver/switch.c 2005-01-13 12:40:42.000000000 +0100 +++ linux-2.6.9-vs1.9.3-xrs-2/kernel/vserver/switch.c 2005-01-13 12:41:55.000000000 +0100 @@ -14,11 +14,12 @@ #include #include +#include #include -#include -#include +#include #include +#include static inline int @@ -27,13 +28,14 @@ vc_get_version(uint32_t id) return VCI_VERSION; } +#include +#include +#include +#include +#include #include -#include -#include #include -#include -#include #include #include #include