Fire timer only when required. Brings down wakeups by a big number.

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJVqQYUAAoJEB6aO1+FQIO2i5oP/22IEve0upRIprVvDKmBCh91
 ablALBirktxvfriSmKOY+d+v5Zgo9R96rp4atVeSDerzV9O9Ms41NWR0olIGU98t
 9ZMY8P4MTbGn3nBFn4mSIEFbVv3QFoaJwiah01caTJpEvK9wvlj30nuXEERHgcps
 2g+ncZWH8lWf/f7J3myS6rhsYfgH4UB6HxwOaAdiZhpFn+5ygViOQnaL5KJYcTcE
 QKpT8XA9jfQOQlegmHNqowmFqoTrx8DxiCklR/ntRFe51GfKDgZpBVJV3E9Z2+oa
 RfnIfrKZftjdzk0rVanhtnis5lCP5xb3gXELhDWoE4G8IQoXBQjrVc+mV2OWfGR0
 s6xdtL+w9d77kAO7/M+jeA6hR2tKJyiJ9auDW6EalMDKpsjBJMvPErAGmB7WIfib
 9fxG8xGUdObrxhnph4GUSErHOB6juFFITtAEeSVqo/JrhBO2+TVnYWnUE5JzRcfj
 u0u2KmT9OJTLHORkBoPlWHVPPSfSRgp8LFheyNMGXjRASocJfDZQZNgAhNpoar5N
 4HlSEgYvF9Ub3SRGPnE08JNdKSMO6plBNYhzIyivFuGKAGx5tMGzgrkPbsJ8ww/w
 9GgFAxmVZsiwpOhPw7HTtGt0hWHFJzqW+iK8fzXIscP/TXsSnrkTV0Jd3UKpIqem
 CvSiMklKIBCoKlHZhS33
 =zkW+
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/amit-virtio-rng/tags/vrng-2.4' into staging

Fire timer only when required.  Brings down wakeups by a big number.

# gpg: Signature made Fri Jul 17 14:41:40 2015 BST using RSA key ID 854083B6
# gpg: Good signature from "Amit Shah <amit@amitshah.net>"
# gpg:                 aka "Amit Shah <amit@kernel.org>"
# gpg:                 aka "Amit Shah <amitshah@gmx.net>"

* remotes/amit-virtio-rng/tags/vrng-2.4:
  virtio-rng: trigger timer only when guest requests for entropy

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
master
Peter Maydell 2015-07-17 15:22:45 +01:00
commit 71358470ee
2 changed files with 9 additions and 7 deletions

View File

@ -77,6 +77,12 @@ static void virtio_rng_process(VirtIORNG *vrng)
return;
}
if (vrng->activate_timer) {
timer_mod(vrng->rate_limit_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + vrng->conf.period_ms);
vrng->activate_timer = false;
}
if (vrng->quota_remaining < 0) {
quota = 0;
} else {
@ -138,8 +144,7 @@ static void check_rate_limit(void *opaque)
vrng->quota_remaining = vrng->conf.max_bytes;
virtio_rng_process(vrng);
timer_mod(vrng->rate_limit_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + vrng->conf.period_ms);
vrng->activate_timer = true;
}
static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
@ -195,13 +200,9 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
vrng->vq = virtio_add_queue(vdev, 8, handle_input);
vrng->quota_remaining = vrng->conf.max_bytes;
vrng->rate_limit_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL,
check_rate_limit, vrng);
timer_mod(vrng->rate_limit_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + vrng->conf.period_ms);
vrng->activate_timer = true;
register_savevm(dev, "virtio-rng", -1, 1, virtio_rng_save,
virtio_rng_load, vrng);
}

View File

@ -44,6 +44,7 @@ typedef struct VirtIORNG {
*/
QEMUTimer *rate_limit_timer;
int64_t quota_remaining;
bool activate_timer;
} VirtIORNG;
#endif