Thanks for raising this.
I noticed that mirror_run() does not throttle the first loop where it
populates the dirty bitmap using bdrv_is_allocated_above().
This is on purpose. Does it causes a noticeable stall in the guest?
The main
copy loop does take the speed limit into account but perhaps that's
broken too.
Yeah, it looks broken. Each iteration of the loop can write much more
than sectors_per_chunk sectors, but here:
if (s->common.speed) {
delay_ns = ratelimit_calculate_delay(&s->limit,
sectors_per_chunk);
} else {
delay_ns = 0;
}
the second argument is fixed. :/
Paolo