LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> To: John Ogness <john.ogness@linutronix.de> Cc: Petr Mladek <pmladek@suse.com>, Sergey Senozhatsky <senozhatsky@chromium.org>, Steven Rostedt <rostedt@goodmis.org>, Thomas Gleixner <tglx@linutronix.de>, linux-kernel@vger.kernel.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Jiri Slaby <jirislaby@kernel.org>, Paul Cercueil <paul@crapouillou.net>, Matthias Brugger <matthias.bgg@gmail.com>, Andrew Jeffery <andrew@aj.id.au>, Christophe JAILLET <christophe.jaillet@wanadoo.fr>, kuldip dwivedi <kuldip.dwivedi@puresoftware.com>, Wang Qing <wangqing@vivo.com>, Andrij Abyzov <aabyzov@slb.com>, Johan Hovold <johan@kernel.org>, Eddie Huang <eddie.huang@mediatek.com>, Claire Chang <tientzu@chromium.org>, Hsin-Yi Wang <hsinyi@chromium.org>, Zhang Qilong <zhangqilong3@huawei.com>, "Maciej W. Rozycki" <macro@orcam.me.uk>, Guenter Roeck <linux@roeck-us.net>, Sergey Senozhatsky <sergey.senozhatsky@gmail.com>, Serge Semin <Sergey.Semin@baikalelectronics.ru>, "Gustavo A. R. Silva" <gustavoars@kernel.org>, Al Cooper <alcooperx@gmail.com>, linux-serial@vger.kernel.org, linux-mips@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH printk v1 10/10] serial: 8250: implement write_atomic Date: Tue, 3 Aug 2021 17:07:50 +0300 [thread overview] Message-ID: <YQlNtr7TNAWtB8XF@smile.fi.intel.com> (raw) In-Reply-To: <20210803131301.5588-11-john.ogness@linutronix.de> On Tue, Aug 03, 2021 at 03:19:01PM +0206, John Ogness wrote: > Implement an NMI-safe write_atomic() console function in order to > support synchronous console printing. > > Since interrupts need to be disabled during transmit, all usage of > the IER register is wrapped with access functions that use the > printk cpulock to synchronize register access while tracking the > state of the interrupts. This is necessary because write_atomic() > can be called from an NMI context that has preempted write_atomic(). ... > +static inline void serial8250_set_IER(struct uart_8250_port *up, > + unsigned char ier) > +{ > + struct uart_port *port = &up->port; > + unsigned long flags; > + bool is_console; > + is_console = uart_console(port); > + > + if (is_console) > + console_atomic_cpu_lock(flags); > + > + serial_out(up, UART_IER, ier); > + > + if (is_console) > + console_atomic_cpu_unlock(flags); I would rewrite it as if (uart_console()) { console_atomic_cpu_lock(flags); serial_out(up, UART_IER, ier); console_atomic_cpu_unlock(flags); } else { serial_out(up, UART_IER, ier); } No additional variable, easier to get the algorithm on the first glance, less error prone. > +} > +static inline unsigned char serial8250_clear_IER(struct uart_8250_port *up) > +{ > + struct uart_port *port = &up->port; > + unsigned int clearval = 0; > + unsigned long flags; > + unsigned int prior; > + bool is_console; > + > + is_console = uart_console(port); > + > + if (up->capabilities & UART_CAP_UUE) > + clearval = UART_IER_UUE; > + > + if (is_console) > + console_atomic_cpu_lock(flags); > + > + prior = serial_port_in(port, UART_IER); > + serial_port_out(port, UART_IER, clearval); > + > + if (is_console) > + console_atomic_cpu_unlock(flags); Ditto. > + return prior; > +} ... > + is_console = uart_console(port); > + > + if (is_console) > + console_atomic_cpu_lock(flags); > up->ier = port->serial_in(port, UART_IER); > + if (is_console) > + console_atomic_cpu_unlock(flags); > + I'm wondering why you can't call above function here? ... > + is_console = uart_console(p); > + if (is_console) > + console_atomic_cpu_lock(flags); > ier = p->serial_in(p, UART_IER); > + if (is_console) > + console_atomic_cpu_unlock(flags); Ditto. ... > + is_console = uart_console(port); > + > + if (is_console) > + console_atomic_cpu_lock(flags); > + > + ier = serial_in(up, UART_IER); > + serial_out(up, UART_IER, ier & (~mask)); > + > + if (is_console) > + console_atomic_cpu_unlock(flags); Ditto. ... > + if (uart_console(port)) > + console_atomic_cpu_lock(flags); > + > + ier = serial_in(up, UART_IER); > + serial_out(up, UART_IER, ier | mask); > + > + if (uart_console(port)) > + console_atomic_cpu_unlock(flags); Ditto. Looking into above note, that uart_console(port) can give different results here, AFAIR. -- With Best Regards, Andy Shevchenko
next prev parent reply other threads:[~2021-08-03 14:08 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-08-03 13:12 [PATCH printk v1 00/10] printk: introduce atomic consoles and sync mode John Ogness 2021-08-03 13:12 ` [PATCH printk v1 01/10] printk: relocate printk cpulock functions John Ogness 2021-08-04 9:24 ` Petr Mladek 2021-08-03 13:12 ` [PATCH printk v1 02/10] printk: rename printk cpulock API and always disable interrupts John Ogness 2021-08-04 9:52 ` Petr Mladek 2021-08-03 13:12 ` [PATCH printk v1 03/10] kgdb: delay roundup if holding printk cpulock John Ogness 2021-08-03 14:25 ` Daniel Thompson 2021-08-03 15:30 ` John Ogness 2021-08-04 11:31 ` Daniel Thompson 2021-08-04 12:12 ` Petr Mladek 2021-08-04 15:04 ` Daniel Thompson 2021-08-05 3:46 ` John Ogness 2021-08-06 12:06 ` Daniel Thompson 2021-08-04 12:31 ` Petr Mladek 2021-08-03 13:12 ` [PATCH printk v1 04/10] printk: relocate printk_delay() John Ogness 2021-08-04 13:07 ` Petr Mladek 2021-08-03 13:12 ` [PATCH printk v1 05/10] printk: call boot_delay_msec() in printk_delay() John Ogness 2021-08-04 13:09 ` Petr Mladek 2021-08-31 1:04 ` Sergey Senozhatsky 2021-08-03 13:12 ` [PATCH printk v1 06/10] printk: use seqcount_latch for console_seq John Ogness 2021-08-05 12:16 ` Petr Mladek 2021-08-05 15:26 ` John Ogness 2021-08-06 15:56 ` Petr Mladek 2021-08-31 3:05 ` Sergey Senozhatsky 2021-08-03 13:12 ` [PATCH printk v1 07/10] console: add write_atomic interface John Ogness 2021-08-03 14:02 ` Andy Shevchenko 2021-08-06 10:56 ` John Ogness 2021-08-06 11:18 ` Andy Shevchenko 2021-08-31 2:55 ` Sergey Senozhatsky 2021-08-03 13:12 ` [PATCH printk v1 08/10] printk: introduce kernel sync mode John Ogness 2021-08-05 17:11 ` Petr Mladek 2021-08-05 21:25 ` John Ogness 2021-08-03 13:13 ` [PATCH printk v1 09/10] kdb: if available, only use atomic consoles for output mirroring John Ogness 2021-08-03 13:13 ` [PATCH printk v1 10/10] serial: 8250: implement write_atomic John Ogness 2021-08-03 14:07 ` Andy Shevchenko [this message] 2021-08-05 7:47 ` Jiri Slaby 2021-08-05 8:26 ` John Ogness 2021-08-03 13:52 ` [PATCH printk v1 00/10] printk: introduce atomic consoles and sync mode Andy Shevchenko 2021-08-05 15:47 ` Petr Mladek 2021-08-31 0:33 ` Sergey Senozhatsky
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=YQlNtr7TNAWtB8XF@smile.fi.intel.com \ --to=andriy.shevchenko@linux.intel.com \ --cc=Sergey.Semin@baikalelectronics.ru \ --cc=aabyzov@slb.com \ --cc=alcooperx@gmail.com \ --cc=andrew@aj.id.au \ --cc=christophe.jaillet@wanadoo.fr \ --cc=eddie.huang@mediatek.com \ --cc=gregkh@linuxfoundation.org \ --cc=gustavoars@kernel.org \ --cc=hsinyi@chromium.org \ --cc=jirislaby@kernel.org \ --cc=johan@kernel.org \ --cc=john.ogness@linutronix.de \ --cc=kuldip.dwivedi@puresoftware.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mediatek@lists.infradead.org \ --cc=linux-mips@vger.kernel.org \ --cc=linux-serial@vger.kernel.org \ --cc=linux@roeck-us.net \ --cc=macro@orcam.me.uk \ --cc=matthias.bgg@gmail.com \ --cc=paul@crapouillou.net \ --cc=pmladek@suse.com \ --cc=rostedt@goodmis.org \ --cc=senozhatsky@chromium.org \ --cc=sergey.senozhatsky@gmail.com \ --cc=tglx@linutronix.de \ --cc=tientzu@chromium.org \ --cc=wangqing@vivo.com \ --cc=zhangqilong3@huawei.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).