[PATCH 00/18] serial: Use uart_prepare_sysrq_char().

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



A few driver do in their console_write() callback something like

|	local_irq_save(flags);
|	if (sysrq)
|		locked = 0;
|	else if (oops_in_progress)
|		locked = uart_port_trylock(port);
|	else
|		uart_port_lock(port);

which breaks on PREEMPT_RT because the uart_port lock becomes a sleeping
lock and it can not be acquired with disabled interrupts. The PREEMPT_RT
queue has workarounds for a few of them. I tackled ever UART driver with
that pattern. The changes are mostly the same:
- Replace direct sysrq handling with delayed by using
  uart_prepare_sysrq_char(). This removes the first 'if (sysrq)' check.

- Remove local_irq_save() und use the _irqsave suffix for both of the
  locking functions.

The drivers can be categorized as
- Did not handle sysrq at all but does now
  - lpc32xx_hs
  - owl
  - rda
  - sifive

- Dropped the uart_port while invoking the sysrq callback but
  console_write did not acquire uart_port-lock as it should.
  - amba-pl011
  - msm
  - rda

  Don't think this is a serious problem.

- The IRQ service routine is always invoked with disabled interrupts and
  the _irqsave() suffix was dropped while switching to
  uart_prepare_sysrq_char().
  - msm
  - owl

- Nothing special, just converted
  - ar933x
  - bcm63xx
  - meson
  - omap
  - pxa
  - sunplus

- Required love & cuddling to get on track
  - pch

The series has been compiles tested on x86-64, arm, arm64.

Sebastian




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux