On 02/07/2015 18:36, Jason J. Herne wrote:
+static void cpu_throttle_thread(void *opaque)
+{
+ double pct = (double)throttle_percentage/100;
+ double throttle_ratio = pct / (1 - pct);
+ long sleeptime_ms = (long)(throttle_ratio * CPU_THROTTLE_TIMESLICE);
+
+ if (!throttle_percentage) {
+ return;
+ }
+
+ qemu_mutex_unlock_iothread();
+ g_usleep(sleeptime_ms * 1000); /* Convert ms to us for usleep call */
+ qemu_mutex_lock_iothread();
+}
+
+static void cpu_throttle_timer_tick(void *opaque)
+{
+ CPUState *cpu;
+
+ /* Stop the timer if needed */
+ if (!throttle_percentage) {
+ return;
+ }
+ CPU_FOREACH(cpu) {
+ async_run_on_cpu(cpu, cpu_throttle_thread, NULL);
+ }
+
+ timer_mod(throttle_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) +
+ CPU_THROTTLE_TIMESLICE);
+}
This could cause callbacks to pile up I think. David, do you have any
idea how to fix it?
Paolo