• Nathan Lynch's avatar
    powerpc/rtas: handle extended delays safely in early boot · 09d1ea72
    Nathan Lynch authored
    Some code that runs early in boot calls RTAS functions that can return
    -2 or 990x statuses, which mean the caller should retry. An example is
    pSeries_cmo_feature_init(), which invokes ibm,get-system-parameter but
    treats these benign statuses as errors instead of retrying.
    
    pSeries_cmo_feature_init() and similar code should be made to retry
    until they succeed or receive a real error, using the usual pattern:
    
    	do {
    		rc = rtas_call(token, etc...);
    	} while (rtas_busy_delay(rc));
    
    But rtas_busy_delay() will perform a timed sleep on any 990x
    status. This isn't safe so early in boot, before the CPU scheduler and
    timer subsystem have initialized.
    
    The -2 RTAS status is much more likely to occur during single-threaded
    boot than 990x in practice, at least on PowerVM. This is because -2
    usually means that RTAS made progress but exhausted its self-imposed
    timeslice, while 990x is associated with concurrent requests from the
    OS causing internal contention. Regardless, according to the language
    in PAPR, the OS should be prepared to handle either type of status at
    any time.
    
    Add a fallback path to rtas_busy_delay() to handle this as safely as
    possible, performing a small delay on 990x. Include a counter to
    detect retry loops that aren't making progress and bail out. Add __ref
    to rtas_busy_delay() since it now conditionally calls an __init
    function.
    
    This was found by inspection and I'm not aware of any real
    failures. However, the implementation of rtas_busy_delay() before
    commit 38f7b706 ("powerpc/rtas: rtas_busy_delay() improvements")
    was not susceptible to this problem, so let's treat this as a
    regression.
    Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
    Fixes: 38f7b706 ("powerpc/rtas: rtas_busy_delay() improvements")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-1-26929c8cce78@linux.ibm.com
    09d1ea72
rtas.c 37.7 KB