• Mark Brown's avatar
    spi: Pump transfers inside calling context for spi_sync() · 0461a414
    Mark Brown authored
    If we are using the standard SPI message pump (which all drivers should be
    transitioning over to) then special case the message enqueue and instead of
    starting the worker thread to push messages to the hardware do so in the
    context of the caller if the controller is idle. This avoids a context
    switch in the common case where the controller has a single user in a
    single thread, for short PIO transfers there may be no need to context
    switch away from the calling context to complete the transfer.
    
    The code is a bit more complex than is desirable in part due to the need
    to handle drivers not using the standard queue and in part due to handling
    the various combinations of bus locking and asynchronous submission in
    interrupt context.
    
    It is still suboptimal since it will still wake the message pump for each
    transfer in order to schedule idling of the hardware and if multiple
    contexts are using the controller simultaneously a caller may end up
    pumping a message for some random other thread rather than for itself,
    and if the thread ends up deferring due to another context idling the
    hardware then it will just busy wait.  It can, however, have the benefit
    of aggregating power up and down of the hardware when a caller performs
    a series of transfers back to back without any need for the use of
    spi_async().
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    0461a414
spi.c 62.4 KB