X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Fcvirt.c;h=6b5f100825ad9373fd340f9c280aafa7dd2b5f7c;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=a5192211f6be1ddef0c052de8edc408e6db08370;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/kernel/vserver/cvirt.c b/kernel/vserver/cvirt.c index a5192211f..6b5f10082 100644 --- a/kernel/vserver/cvirt.c +++ b/kernel/vserver/cvirt.c @@ -24,13 +24,10 @@ void vx_vsi_uptime(struct timespec *uptime, struct timespec *idle) { struct vx_info *vxi = current->vx_info; - struct timeval bias; - - jiffies_to_timeval(vxi->cvirt.bias_jiffies - INITIAL_JIFFIES, &bias); set_normalized_timespec(uptime, - uptime->tv_sec - bias.tv_sec, - uptime->tv_nsec - bias.tv_usec*1000); + uptime->tv_sec - vxi->cvirt.bias_uptime.tv_sec, + uptime->tv_nsec - vxi->cvirt.bias_uptime.tv_nsec); if (!idle) return; set_normalized_timespec(idle, @@ -44,3 +41,44 @@ uint64_t vx_idle_jiffies() return init_task.utime + init_task.stime; } + + +static inline uint32_t __update_loadavg(uint32_t load, + int wsize, int delta, int n) +{ + unsigned long long calc; + + /* just set it to n */ + if (unlikely(delta >= wsize)) + return (n << FSHIFT); + + calc = (delta * n) << FSHIFT; + calc += (wsize - delta) * load; + do_div(calc, wsize); + return calc; +} + + +void vx_update_load(struct vx_info *vxi) +{ + uint32_t now, last, delta; + + spin_lock(&vxi->cvirt.load_lock); + + now = jiffies; + last = vxi->cvirt.load_last; + delta = now - last; + + vxi->cvirt.load[0] = __update_loadavg(vxi->cvirt.load[0], + 60*HZ, delta, atomic_read(&vxi->cvirt.nr_running)); + vxi->cvirt.load[1] = __update_loadavg(vxi->cvirt.load[1], + 5*60*HZ, delta, atomic_read(&vxi->cvirt.nr_running)); + vxi->cvirt.load[2] = __update_loadavg(vxi->cvirt.load[2], + 15*60*HZ, delta, atomic_read(&vxi->cvirt.nr_running)); + + vxi->cvirt.load_last = now; + spin_unlock(&vxi->cvirt.load_lock); +} + + +