Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

serial: Reduce spinlocked portion of uart_rs485_config() #173

Commits on Sep 21, 2023

  1. serial: Reduce spinlocked portion of uart_rs485_config()

    Commit 44b27ae ("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 7c7f9bc ("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: 7c7f9bc ("serial: Deassert Transmit Enable on probe in driver-specific way")
    Suggested-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Cc: stable@vger.kernel.org # v6.1+
    Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
    l1k authored and linosanfilippo-kunbus committed Sep 21, 2023
    Configuration menu
    Copy the full SHA
    444cbe8 View commit details
    Browse the repository at this point in the history