• Lukas Wunner's avatar
    serial: Reduce spinlocked portion of uart_rs485_config() · 8679328e
    Lukas Wunner authored
    Commit 44b27aec ("serial: core, 8250: set RS485 termination GPIO in
    serial core") enabled support for RS485 termination GPIOs behind i2c
    expanders by setting the GPIO outside of the critical section protected
    by the port spinlock.  Access to the i2c expander may sleep, which
    caused a splat with the port spinlock held.
    
    Commit 7c7f9bc9 ("serial: Deassert Transmit Enable on probe in
    driver-specific way") erroneously regressed that by spinlocking the
    GPIO manipulation again.
    
    Fix by moving uart_rs485_config() (the function manipulating the GPIO)
    outside of the spinlocked section and acquiring the spinlock inside of
    uart_rs485_config() for the invocation of ->rs485_config() only.
    
    This gets us one step closer to pushing the spinlock down into the
    ->rs485_config() callbacks which actually need it.  (Some callbacks
    do not want to be spinlocked because they perform sleepable register
    accesses, see e.g. sc16is7xx_config_rs485().)
    
    Stack trace for posterity:
    
     Voluntary context switch within RCU read-side critical section!
     WARNING: CPU: 0 PID: 56 at kernel/rcu/tree_plugin.h:318 rcu_note_context_switch
     Call trace:
     rcu_note_context_switch
     __schedule
     schedule
     schedule_timeout
     wait_for_completion_timeout
     bcm2835_i2c_xfer
     __i2c_transfer
     i2c_transfer
     i2c_transfer_buffer_flags
     regmap_i2c_write
     _regmap_raw_write_impl
     _regmap_bus_raw_write
     _regmap_write
     _regmap_update_bits
     regmap_update_bits_base
     pca953x_gpio_set_value
     gpiod_set_raw_value_commit
     gpiod_set_value_nocheck
     gpiod_set_value_cansleep
     uart_rs485_config
     uart_add_one_port
     pl011_register_port
     pl011_probe
    
    Fixes: 7c7f9bc9 ("serial: Deassert Transmit Enable on probe in driver-specific way")
    Suggested-by: default avatarLino Sanfilippo <LinoSanfilippo@gmx.de>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Cc: stable@vger.kernel.org # v6.1+
    Link: https://lore.kernel.org/r/f3a35967c28b32f3c6432d0aa5936e6a9908282d.1695307688.git.lukas@wunner.deSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8679328e
serial_core.c 91.4 KB