qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] block: init bs->io_base correctly to avoid lock


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH] block: init bs->io_base correctly to avoid locking
Date: Thu, 10 Jan 2013 12:52:48 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)

Paolo Bonzini <address@hidden> writes:

> Il 10/01/2013 11:45, Markus Armbruster ha scritto:
>> 
>>> > If io_limits are specified during runtime that exceed the number
>>> > of operations in flight
>>> > bs->io_base is not initialized in the else statement in
>>> > bdrv_exceed_io_limits().
>> I'm confused.
>> 
>>     if ((bs->slice_start < now)
>>         && (bs->slice_end > now)) {
>>         bs->slice_end = now + bs->slice_time;
>>     } else {
>>         bs->slice_time  =  5 * BLOCK_IO_SLICE_TIME;
>>         bs->slice_start = now;
>>         bs->slice_end   = now + bs->slice_time;
>> 
>>         bs->io_base.bytes[is_write]  = bs->nr_bytes[is_write];
>>         bs->io_base.bytes[!is_write] = bs->nr_bytes[!is_write];
>> 
>>         bs->io_base.ios[is_write]    = bs->nr_ops[is_write];
>>         bs->io_base.ios[!is_write]   = bs->nr_ops[!is_write];
>>     }
>
> bdrv_io_limits_enable correctly starts a new slice (the first three
> lines of the else), but does not set io_base correctly for that slice.
> Here is how io_base is used:
>
>     bytes_base  = bs->nr_bytes[is_write] - bs->io_base.bytes[is_write];
>     bytes_res   = (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
>
>     if (bytes_base + bytes_res <= bytes_limit) {
>         /* no wait */
>     } else {
>         /* operation needs to be throttled */
>     }
>
> As a result, any I/O operations that are triggered between now and
> bs->slice_end are incorrectly limited.  If 10 MB of data has been
> written since the VM was started, QEMU thinks that 10 MB of data has
> been written in this slice.

Work that into the commit message, and I'm happy :)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]