• E
    blockjob: hoist bandwidth scaling out of monitor code · 08cc14f7
    Eric Blake 提交于
    qemu treats blockjob bandwidth as a 64-bit number, in the units
    of bytes/second.  But we stupidly modeled block job bandwidth
    after migration bandwidth, which in turn was an 'unsigned long'
    and therefore subject to 32-bit vs. 64-bit interpretations, and
    with a scale of MiB/s.  Our code already has to convert between
    the two scales, and report overflow as appropriate; although
    this conversion currently lives in the monitor code.  In fact,
    our conversion code limited things to 63 bits, because we
    checked against LLONG_MAX and reject what would be negative
    bandwidth if treated as signed.
    
    On the bright side, our use of MiB/s means that even with a
    32-bit unsigned long, we still have no problem representing a
    bandwidth of 2GiB/s, which is starting to be more feasible as
    10-gigabit or even faster interfaces are used.  And once you
    get past the physical speeds of existing interfaces, any larger
    bandwidth number behaves the same - effectively unlimited.
    But on the low side, the granularity of 1MiB/s tuning is rather
    coarse.  So the new virDomainBlockJob API decided to go with
    a direct 64-bit bytes/sec number instead of the scaled number
    that prior blockjob APIs had used.  But there is no point in
    rounding this number to MiB/s just to scale it back to bytes/s
    for handing to qemu.
    
    In order to make future code sharing possible between the old
    virDomainBlockRebase and the new virDomainBlockCopy, this patch
    moves the scaling and overflow detection into the driver code.
    Several of the block job calls that can set speed are fed
    through a common interface, so it was easier to adjust all block
    jobs at once, for consistency.  This patch is just code motion;
    there should be no user-visible change in behavior.
    
    * src/qemu/qemu_monitor.h (qemuMonitorBlockJob)
    (qemuMonitorBlockCommit, qemuMonitorDriveMirror): Change
    parameter type and scale.
    * src/qemu/qemu_monitor.c (qemuMonitorBlockJob)
    (qemuMonitorBlockCommit, qemuMonitorDriveMirror): Move scaling
    and overflow detection...
    * src/qemu/qemu_driver.c (qemuDomainBlockJobImpl)
    (qemuDomainBlockRebase, qemuDomainBlockCommit): ...here.
    (qemuDomainBlockCopy): Use bytes/sec.
    Signed-off-by: NEric Blake <eblake@redhat.com>
    08cc14f7
qemu_driver.c 562.9 KB