• J
    xen/blkfront: Handle non-indirect grant with 64KB pages · 6cc56833
    Julien Grall 提交于
    The minimal size of request in the block framework is always PAGE_SIZE.
    It means that when 64KB guest is support, the request will at least be
    64KB.
    
    Although, if the backend doesn't support indirect descriptor (such as QDISK
    in QEMU), a ring request is only able to accommodate 11 segments of 4KB
    (i.e 44KB).
    
    The current frontend is assuming that an I/O request will always fit in
    a ring request. This is not true any more when using 64KB page
    granularity and will therefore crash during boot.
    
    On ARM64, the ABI is completely neutral to the page granularity used by
    the domU. The guest has the choice between different page granularity
    supported by the processors (for instance on ARM64: 4KB, 16KB, 64KB).
    This can't be enforced by the hypervisor and therefore it's possible to
    run guests using different page granularity.
    
    So we can't mandate the block backend to support indirect descriptor
    when the frontend is using 64KB page granularity and have to fix it
    properly in the frontend.
    
    The solution exposed below is based on modifying directly the frontend
    guest rather than asking the block framework to support smaller size
    (i.e < PAGE_SIZE). This is because the change is the block framework are
    not trivial as everything seems to relying on a struct *page (see [1]).
    Although, it may be possible that someone succeed to do it in the future
    and we would therefore be able to use it.
    
    Given that a block request may not fit in a single ring request, a
    second request is introduced for the data that cannot fit in the first
    one. This means that the second ring request should never be used on
    Linux if the page size is smaller than 44KB.
    
    To achieve the support of the extra ring request, the block queue size
    is divided by two. Therefore, the ring will always contain enough space
    to accommodate 2 ring requests. While this will reduce the overall
    performance, it will make the implementation more contained. The way
    forward to get better performance is to implement in the backend either
    indirect descriptor or multiple grants ring.
    
    Note that the parameters blk_queue_max_* helpers haven't been updated.
    The block code will set the mimimum size supported and we may be able
    to support directly any change in the block framework that lower down
    the minimal size of a request.
    
    [1] http://lists.xen.org/archives/html/xen-devel/2015-08/msg02200.htmlSigned-off-by: NJulien Grall <julien.grall@citrix.com>
    Acked-by: NRoger Pau Monné <roger.pau@citrix.com>
    Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    6cc56833
xen-blkfront.c 71.4 KB