buffered_rate_limit is called to prevent the RAM migration callback from putting too much data in the buffer. So it has to check against the amount of data currently in the buffer, not against the amount of data that has been transferred so far.
s->bytes_xfer is used to communicate between successive calls of buffered_put_buffer. Buffered_rate_tick resets it every now and then to prevent moving too much buffered data to the socket at once. However, its value does not matter for the producer of the data. Here is the result for migrating an idle guest with 3GB of memory and ~360MB of non-zero memory: migrate_set_speed Before After ------------------------------------------------------------ default (32MB/sec) ~3 sec ~13 sec infinite (10GB/sec) ~3 sec ~3 sec Note that before this patch, QEMU is transferring of 100 MB/sec despite the rate limiting. Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- buffered_file.c | 2 +- 1 file modificato, 1 inserzione(+). 1 rimozione(-) diff --git a/buffered_file.c b/buffered_file.c index bd0f61d..46cd591 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -193,7 +193,7 @@ static int buffered_rate_limit(void *opaque) if (s->freeze_output) return 1; - if (s->bytes_xfer > s->xfer_limit) + if (s->buffer_size > s->xfer_limit) return 1; return 0; -- 1.7.12.1