• D
    pseries: Implement HPT resizing · 0b0b8310
    David Gibson 提交于
    This patch implements hypercalls allowing a PAPR guest to resize its own
    hash page table.  This will eventually allow for more flexible memory
    hotplug.
    
    The implementation is partially asynchronous, handled in a special thread
    running the hpt_prepare_thread() function.  The state of a pending resize
    is stored in SPAPR_MACHINE->pending_hpt.
    
    The H_RESIZE_HPT_PREPARE hypercall will kick off creation of a new HPT, or,
    if one is already in progress, monitor it for completion.  If there is an
    existing HPT resize in progress that doesn't match the size specified in
    the call, it will cancel it, replacing it with a new one matching the
    given size.
    
    The H_RESIZE_HPT_COMMIT completes transition to a resized HPT, and can only
    be called successfully once H_RESIZE_HPT_PREPARE has successfully
    completed initialization of a new HPT.  The guest must ensure that there
    are no concurrent accesses to the existing HPT while this is called (this
    effectively means stop_machine() for Linux guests).
    
    For now H_RESIZE_HPT_COMMIT goes through the whole old HPT, rehashing each
    HPTE into the new HPT.  This can have quite high latency, but it seems to
    be of the order of typical migration downtime latencies for HPTs of size
    up to ~2GiB (which would be used in a 256GiB guest).
    
    In future we probably want to move more of the rehashing to the "prepare"
    phase, by having H_ENTER and other hcalls update both current and
    pending HPTs.  That's a project for another day, but should be possible
    without any changes to the guest interface.
    Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
    0b0b8310
spapr.h 27.0 KB