+
+
+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);
+}
+
+
+