2 * linux/kernel/vserver/cvirt.c
4 * Virtual Server: Context Virtualization
6 * Copyright (C) 2004-2005 Herbert Pƶtzl
8 * V0.01 broken out from limit.c
12 #include <linux/config.h>
13 #include <linux/sched.h>
14 #include <linux/types.h>
15 #include <linux/vs_context.h>
16 #include <linux/vs_cvirt.h>
17 #include <linux/vserver/switch.h>
19 #include <asm/errno.h>
20 #include <asm/uaccess.h>
23 void vx_vsi_uptime(struct timespec *uptime, struct timespec *idle)
25 struct vx_info *vxi = current->vx_info;
27 set_normalized_timespec(uptime,
28 uptime->tv_sec - vxi->cvirt.bias_uptime.tv_sec,
29 uptime->tv_nsec - vxi->cvirt.bias_uptime.tv_nsec);
32 set_normalized_timespec(idle,
33 idle->tv_sec - vxi->cvirt.bias_idle.tv_sec,
34 idle->tv_nsec - vxi->cvirt.bias_idle.tv_nsec);
38 uint64_t vx_idle_jiffies(void)
40 return init_task.utime + init_task.stime;
45 static inline uint32_t __update_loadavg(uint32_t load,
46 int wsize, int delta, int n)
48 unsigned long long calc, prev;
50 /* just set it to n */
51 if (unlikely(delta >= wsize))
56 prev = (wsize - delta);
64 void vx_update_load(struct vx_info *vxi)
66 uint32_t now, last, delta;
67 unsigned int nr_running, nr_uninterruptible;
70 spin_lock(&vxi->cvirt.load_lock);
73 last = vxi->cvirt.load_last;
79 nr_running = atomic_read(&vxi->cvirt.nr_running);
80 nr_uninterruptible = atomic_read(&vxi->cvirt.nr_uninterruptible);
81 total = nr_running + nr_uninterruptible;
83 vxi->cvirt.load[0] = __update_loadavg(vxi->cvirt.load[0],
85 vxi->cvirt.load[1] = __update_loadavg(vxi->cvirt.load[1],
86 5*60*HZ, delta, total);
87 vxi->cvirt.load[2] = __update_loadavg(vxi->cvirt.load[2],
88 15*60*HZ, delta, total);
90 vxi->cvirt.load_last = now;
92 atomic_inc(&vxi->cvirt.load_updates);
93 spin_unlock(&vxi->cvirt.load_lock);
98 * Commands to do_syslog:
100 * 0 -- Close the log. Currently a NOP.
101 * 1 -- Open the log. Currently a NOP.
102 * 2 -- Read from the log.
103 * 3 -- Read all messages remaining in the ring buffer.
104 * 4 -- Read and clear all messages remaining in the ring buffer
105 * 5 -- Clear ring buffer.
106 * 6 -- Disable printk's to console
107 * 7 -- Enable printk's to console
108 * 8 -- Set level of messages printed to console
109 * 9 -- Return number of unread characters in the log buffer
110 * 10 -- Return size of the log buffer
112 int vx_do_syslog(int type, char __user *buf, int len)
116 struct vx_info *vxi = current->vx_info;
117 struct _vx_syslog *log;
121 log = &vxi->cvirt.syslog;
124 case 0: /* Close log */
125 case 1: /* Open log */
127 case 2: /* Read from log */
128 error = wait_event_interruptible(log->log_wait,
129 (log->log_start - log->log_end));
132 spin_lock_irq(&log->logbuf_lock);
133 spin_unlock_irq(&log->logbuf_lock);
135 case 4: /* Read/clear last kernel messages */
138 case 3: /* Read last kernel messages */
139 // if (count > log_buf_len)
140 // count = log_buf_len;
141 spin_lock_irq(&log->logbuf_lock);
142 // if (count > logged_chars)
143 // count = logged_chars;
146 spin_unlock_irq(&log->logbuf_lock);
151 case 5: /* Clear ring buffer */
155 case 6: /* Disable logging to console */
156 case 7: /* Enable logging to console */
157 case 8: /* Set level of messages printed to console */
160 case 9: /* Number of chars in the log buffer */
162 case 10: /* Size of the log buffer */