• Eric W. Biederman's avatar
    [PATCH] msi: Safer state caching. · 392ee1e6
    Eric W. Biederman authored
    There are two ways pci_save_state and pci_restore_state are used.  As
    helper functions during suspend/resume, and as helper functions around
    a hardware reset event.  When used as helper functions around a hardware
    reset event there is no reason to believe the calls will be paired, nor
    is there a good reason to believe that if we restore the msi state from
    before the reset that it will match the current msi state.  Since arch
    code may change the msi message without going through the driver, drivers
    currently do not have enough information to even know when to call
    pci_save_state to ensure they will have msi state in sync with the other
    kernel irq reception data structures.
    
    It turns out the solution is straight forward, cache the state in the
    existing msi data structures (not the magic pci saved things) and
    have the msi code update the cached state each time we write to the hardware.
    This means we never need to read the hardware to figure out what the hardware
    state should be.
    
    By modifying the caching in this manner we get to remove our save_state
    routines and only need to provide restore_state routines.
    
    The only fields that were at all tricky to regenerate were the msi and msi-x
    control registers and the way we regenerate them currently is a bit dependent
    upon assumptions on how we use the allow msi registers to be configured and used
    making the code a little bit brittle.  If we ever change what cases we allow
    or how we configure the msi bits we can address the fragility then.
    Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    Acked-by: default avatarAuke Kok <auke-jan.h.kok@intel.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    392ee1e6
msi.c 18.6 KB