vserver 1.9.3
[linux-2.6.git] / kernel / vserver / cvirt.c
1 /*
2  *  linux/kernel/vserver/cvirt.c
3  *
4  *  Virtual Server: Context Virtualization
5  *
6  *  Copyright (C) 2004  Herbert Pƶtzl
7  *
8  *  V0.01  broken out from limit.c
9  *
10  */
11
12 #include <linux/config.h>
13 #include <linux/vserver/cvirt.h>
14 #include <linux/vserver/context.h>
15 #include <linux/vserver/switch.h>
16 #include <linux/vs_base.h>
17 #include <linux/vs_context.h>
18 #include <linux/vs_cvirt.h>
19
20 #include <asm/errno.h>
21 #include <asm/uaccess.h>
22
23
24 void vx_vsi_uptime(struct timespec *uptime, struct timespec *idle)
25 {
26         struct vx_info *vxi = current->vx_info;
27
28         set_normalized_timespec(uptime,
29                 uptime->tv_sec - vxi->cvirt.bias_uptime.tv_sec,
30                 uptime->tv_nsec - vxi->cvirt.bias_uptime.tv_nsec);
31         if (!idle)
32                 return;
33         set_normalized_timespec(idle,
34                 idle->tv_sec - vxi->cvirt.bias_idle.tv_sec,
35                 idle->tv_nsec - vxi->cvirt.bias_idle.tv_nsec);
36         return;
37 }
38
39 uint64_t vx_idle_jiffies()
40 {
41         return init_task.utime + init_task.stime;
42 }
43
44
45
46 static inline uint32_t __update_loadavg(uint32_t load,
47         int wsize, int delta, int n)
48 {
49         unsigned long long calc;
50
51         /* just set it to n */
52         if (unlikely(delta >= wsize))
53                 return (n << FSHIFT);
54
55         calc = (delta * n) << FSHIFT;
56         calc += (wsize - delta) * load;
57         do_div(calc, wsize);
58         return calc;
59 }
60
61
62 void vx_update_load(struct vx_info *vxi)
63 {
64         uint32_t now, last, delta;
65
66         spin_lock(&vxi->cvirt.load_lock);
67
68         now = jiffies;
69         last = vxi->cvirt.load_last;
70         delta = now - last;
71
72         vxi->cvirt.load[0] = __update_loadavg(vxi->cvirt.load[0],
73                 60*HZ, delta, atomic_read(&vxi->cvirt.nr_running));
74         vxi->cvirt.load[1] = __update_loadavg(vxi->cvirt.load[1],
75                 5*60*HZ, delta, atomic_read(&vxi->cvirt.nr_running));
76         vxi->cvirt.load[2] = __update_loadavg(vxi->cvirt.load[2],
77                 15*60*HZ, delta, atomic_read(&vxi->cvirt.nr_running));
78
79         vxi->cvirt.load_last = now;
80         spin_unlock(&vxi->cvirt.load_lock);
81 }
82
83
84