• Soby Mathew's avatar
    Fix PSCI CPU ON race when setting state to ON_PENDING · 203cdfe2
    Soby Mathew authored
    When a CPU is powered down using PSCI CPU OFF API, it disables its caches
    and updates its `aff_info_state` to OFF. The corresponding cache line is
    invalidated by the CPU so that the update will be observed by other CPUs
    running with caches enabled. There is a possibility that another CPU
    which has been trying to turn ON this CPU via PSCI CPU ON API,
    has already seen the update to `aff_info_state` and proceeds to update
    the state to ON_PENDING prior to the cache invalidation. This may result
    in the update of the state to ON_PENDING being discarded.
    
    This patch fixes this issue by making sure that the update of `aff_info_state`
    to ON_PENDING sticks by reading back the value after the cache flush and
    retrying it if not updated. The patch also adds a dsbish() to
    `psci_do_cpu_off()` to ensure ordering of the update to `aff_info_state`
    prior to cache line invalidation.
    
    Fixes ARM-software/tf-issues#349
    
    Change-Id: I225de99957fe89871f8c57bcfc243956e805dcca
    203cdfe2
psci_off.c 5.48 KB