2 * linux/kernel/vserver/cvirt.c
4 * Virtual Server: Context Virtualization
6 * Copyright (C) 2004 Herbert Pƶtzl
8 * V0.01 broken out from limit.c
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>
20 #include <asm/errno.h>
21 #include <asm/uaccess.h>
24 void vx_vsi_uptime(struct timespec *uptime, struct timespec *idle)
26 struct vx_info *vxi = current->vx_info;
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);
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);
39 uint64_t vx_idle_jiffies()
41 return init_task.utime + init_task.stime;
46 static inline uint32_t __update_loadavg(uint32_t load,
47 int wsize, int delta, int n)
49 unsigned long long calc;
51 /* just set it to n */
52 if (unlikely(delta >= wsize))
55 calc = (delta * n) << FSHIFT;
56 calc += (wsize - delta) * load;
62 void vx_update_load(struct vx_info *vxi)
64 uint32_t now, last, delta;
66 spin_lock(&vxi->cvirt.load_lock);
69 last = vxi->cvirt.load_last;
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));
79 vxi->cvirt.load_last = now;
80 spin_unlock(&vxi->cvirt.load_lock);