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/sysctl.h>
15 #include <linux/types.h>
16 #include <linux/vs_context.h>
17 #include <linux/vs_cvirt.h>
18 #include <linux/vserver/switch.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(void)
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, prev;
51 /* just set it to n */
52 if (unlikely(delta >= wsize))
57 prev = (wsize - delta);
65 void vx_update_load(struct vx_info *vxi)
67 uint32_t now, last, delta;
68 unsigned int nr_running, nr_uninterruptible;
71 spin_lock(&vxi->cvirt.load_lock);
74 last = vxi->cvirt.load_last;
80 nr_running = atomic_read(&vxi->cvirt.nr_running);
81 nr_uninterruptible = atomic_read(&vxi->cvirt.nr_uninterruptible);
82 total = nr_running + nr_uninterruptible;
84 vxi->cvirt.load[0] = __update_loadavg(vxi->cvirt.load[0],
86 vxi->cvirt.load[1] = __update_loadavg(vxi->cvirt.load[1],
87 5*60*HZ, delta, total);
88 vxi->cvirt.load[2] = __update_loadavg(vxi->cvirt.load[2],
89 15*60*HZ, delta, total);
91 vxi->cvirt.load_last = now;
93 atomic_inc(&vxi->cvirt.load_updates);
94 spin_unlock(&vxi->cvirt.load_lock);
98 int vx_uts_virt_handler(struct ctl_table *ctl, int write, xid_t xid,
99 void **datap, size_t *lenp)
101 switch (ctl->ctl_name) {
103 *datap = vx_new_uts(sysname);
106 *datap = vx_new_uts(release);
109 *datap = vx_new_uts(version);
112 *datap = vx_new_uts(nodename);
114 case KERN_DOMAINNAME:
115 *datap = vx_new_uts(domainname);
125 * Commands to do_syslog:
127 * 0 -- Close the log. Currently a NOP.
128 * 1 -- Open the log. Currently a NOP.
129 * 2 -- Read from the log.
130 * 3 -- Read all messages remaining in the ring buffer.
131 * 4 -- Read and clear all messages remaining in the ring buffer
132 * 5 -- Clear ring buffer.
133 * 6 -- Disable printk's to console
134 * 7 -- Enable printk's to console
135 * 8 -- Set level of messages printed to console
136 * 9 -- Return number of unread characters in the log buffer
137 * 10 -- Return size of the log buffer
139 int vx_do_syslog(int type, char __user *buf, int len)
143 struct vx_info *vxi = current->vx_info;
144 struct _vx_syslog *log;
148 log = &vxi->cvirt.syslog;
151 case 0: /* Close log */
152 case 1: /* Open log */
154 case 2: /* Read from log */
155 error = wait_event_interruptible(log->log_wait,
156 (log->log_start - log->log_end));
159 spin_lock_irq(&log->logbuf_lock);
160 spin_unlock_irq(&log->logbuf_lock);
162 case 4: /* Read/clear last kernel messages */
165 case 3: /* Read last kernel messages */
166 // if (count > log_buf_len)
167 // count = log_buf_len;
168 spin_lock_irq(&log->logbuf_lock);
169 // if (count > logged_chars)
170 // count = logged_chars;
173 spin_unlock_irq(&log->logbuf_lock);
178 case 5: /* Clear ring buffer */
182 case 6: /* Disable logging to console */
183 case 7: /* Enable logging to console */
184 case 8: /* Set level of messages printed to console */
187 case 9: /* Number of chars in the log buffer */
189 case 10: /* Size of the log buffer */