From: Petr Mladek <pmladek@suse.com>
To: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>, Jan Kara <jack@suse.cz>,
Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <peterz@infradead.org>,
"Rafael J . Wysocki" <rjw@rjwysocki.net>,
Eric Biederman <ebiederm@xmission.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.com>, Pavel Machek <pavel@ucw.cz>,
Len Brown <len.brown@intel.com>,
linux-kernel@vger.kernel.org,
Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Subject: Re: [RFC][PATCHv2 1/8] printk: move printk_pending out of per-cpu
Date: Fri, 31 Mar 2017 15:09:50 +0200 [thread overview]
Message-ID: <20170331130950.GA3452@pathway.suse.cz> (raw)
In-Reply-To: <20170329092511.3958-2-sergey.senozhatsky@gmail.com>
On Wed 2017-03-29 18:25:04, Sergey Senozhatsky wrote:
> Do not keep `printk_pending' in per-CPU area. We set the following bits
> of printk_pending:
> a) PRINTK_PENDING_WAKEUP
> when we need to wakeup klogd
> b) PRINTK_PENDING_OUTPUT
> when there is a pending output from deferred printk and we need
> to call console_unlock().
>
> So none of the bits control/represent a state of a particular CPU and,
> basically, they should be global instead.
>
> Besides we will use `printk_pending' to control printk kthread, so this
> patch is also a preparation work.
>
> Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
> Suggested-by: Petr Mladek <pmladek@suse.com>
> ---
> kernel/printk/printk.c | 26 ++++++++++++--------------
> 1 file changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index 2984fb0f0257..2d07678e9ff9 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -401,6 +401,14 @@ DEFINE_RAW_SPINLOCK(logbuf_lock);
> printk_safe_exit_irqrestore(flags); \
> } while (0)
>
> +/*
> + * Delayed printk version, for scheduler-internal messages:
> + */
> +#define PRINTK_PENDING_WAKEUP 0x01
> +#define PRINTK_PENDING_OUTPUT 0x02
> +
> +static unsigned long printk_pending;
> +
> #ifdef CONFIG_PRINTK
> DECLARE_WAIT_QUEUE_HEAD(log_wait);
> /* the next printk record to read by syslog(READ) or /proc/kmsg */
> @@ -2654,25 +2662,15 @@ static int __init printk_late_init(void)
> late_initcall(printk_late_init);
>
> #if defined CONFIG_PRINTK
> -/*
> - * Delayed printk version, for scheduler-internal messages:
> - */
> -#define PRINTK_PENDING_WAKEUP 0x01
> -#define PRINTK_PENDING_OUTPUT 0x02
> -
> -static DEFINE_PER_CPU(int, printk_pending);
> -
> static void wake_up_klogd_work_func(struct irq_work *irq_work)
> {
> - int pending = __this_cpu_xchg(printk_pending, 0);
> -
> - if (pending & PRINTK_PENDING_OUTPUT) {
> + if (test_and_clear_bit(PRINTK_PENDING_OUTPUT, &printk_pending)) {
> /* If trylock fails, someone else is doing the printing */
> if (console_trylock())
> console_unlock();
> }
>
> - if (pending & PRINTK_PENDING_WAKEUP)
> + if (test_and_clear_bit(PRINTK_PENDING_WAKEUP, &printk_pending))
> wake_up_interruptible(&log_wait);
> }
>
> @@ -2685,7 +2683,7 @@ void wake_up_klogd(void)
> {
> preempt_disable();
> if (waitqueue_active(&log_wait)) {
> - this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
> + set_bit(PRINTK_PENDING_WAKEUP, &printk_pending);
We should add here a write barrier:
/*
* irq_work_queue() uses cmpxchg() and implies the memory
* barrier only when the work is queued. An explicit barrier
* is needed here to make sure that wake_up_klogd_work_func()
* sees printk_pending set even when the work was already queued
* because of an other pending event.
*/
smp_wmb();
> irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
> }
> preempt_enable();
> @@ -2701,7 +2699,7 @@ int printk_deferred(const char *fmt, ...)
> r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args);
> va_end(args);
>
> - __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
> + set_bit(PRINTK_PENDING_OUTPUT, &printk_pending);
Same here.
We are going to use printk_pending even more in the other patches.
I still have to check the final state. It might be useful
to define a helper if the barrier is needed on more locations.
Otherwise the change looks fine to me. It should reduce redundant
wakeups.
Best Regards,
Petr
next prev parent reply other threads:[~2017-03-31 13:11 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-29 9:25 [RFC][PATCHv2 0/8] printk: introduce printing kernel thread Sergey Senozhatsky
2017-03-29 9:25 ` [RFC][PATCHv2 1/8] printk: move printk_pending out of per-cpu Sergey Senozhatsky
2017-03-31 13:09 ` Petr Mladek [this message]
2017-03-31 13:33 ` Peter Zijlstra
2017-04-03 11:23 ` Sergey Senozhatsky
2017-04-03 12:43 ` Petr Mladek
2017-03-29 9:25 ` [RFC][PATCHv2 2/8] printk: introduce printing kernel thread Sergey Senozhatsky
2017-04-04 9:01 ` Petr Mladek
2017-04-04 9:36 ` Sergey Senozhatsky
2017-04-06 17:14 ` Pavel Machek
2017-04-07 5:12 ` Sergey Senozhatsky
2017-04-07 7:21 ` Pavel Machek
2017-04-07 8:15 ` Sergey Senozhatsky
2017-04-07 12:06 ` Pavel Machek
2017-03-29 9:25 ` [RFC][PATCHv2 3/8] printk: offload printing from wake_up_klogd_work_func() Sergey Senozhatsky
2017-03-31 14:56 ` Petr Mladek
2017-04-04 16:15 ` Sergey Senozhatsky
2017-03-29 9:25 ` [RFC][PATCHv2 4/8] pm: switch to printk.emergency mode in unsafe places Sergey Senozhatsky
2017-03-31 15:06 ` Petr Mladek
2017-04-06 17:20 ` Pavel Machek
2017-04-09 10:59 ` Andreas Mohr
2017-04-10 12:20 ` Petr Mladek
2017-04-10 14:38 ` Sergey Senozhatsky
2017-03-29 9:25 ` [RFC][PATCHv2 5/8] sysrq: " Sergey Senozhatsky
2017-03-31 15:37 ` Petr Mladek
2017-04-01 0:04 ` Sergey Senozhatsky
2017-03-29 9:25 ` [RFC][PATCHv2 6/8] kexec: " Sergey Senozhatsky
2017-03-31 15:39 ` Petr Mladek
2017-03-29 9:25 ` [RFC][PATCHv2 7/8] printk: add printk emergency_mode parameter Sergey Senozhatsky
2017-04-03 15:29 ` Petr Mladek
2017-04-04 8:29 ` Sergey Senozhatsky
2017-03-29 9:25 ` [RFC][PATCHv2 8/8] printk: enable printk offloading Sergey Senozhatsky
2017-03-30 21:38 ` [printk] fbc14616f4: BUG:kernel_reboot-without-warning_in_test_stage kernel test robot
2017-03-30 21:38 ` kernel test robot
2017-03-31 2:35 ` Sergey Senozhatsky
2017-03-31 2:35 ` Sergey Senozhatsky
2017-03-31 4:04 ` Sergey Senozhatsky
2017-03-31 4:04 ` Sergey Senozhatsky
2017-03-31 6:39 ` Ye Xiaolong
2017-03-31 6:39 ` Ye Xiaolong
2017-03-31 14:47 ` Sergey Senozhatsky
2017-03-31 14:47 ` Sergey Senozhatsky
2017-03-31 15:28 ` Eric W. Biederman
2017-03-31 15:28 ` Eric W. Biederman
2017-04-03 9:31 ` Jan Kara
2017-04-03 9:31 ` Jan Kara
2017-04-03 10:06 ` Petr Mladek
2017-04-03 10:06 ` Petr Mladek
2017-04-06 17:33 ` Pavel Machek
2017-04-06 17:33 ` Pavel Machek
2017-04-07 4:44 ` Sergey Senozhatsky
2017-04-07 4:44 ` Sergey Senozhatsky
2017-04-07 7:15 ` Pavel Machek
2017-04-07 7:15 ` Pavel Machek
2017-04-07 7:46 ` Sergey Senozhatsky
2017-04-07 7:46 ` Sergey Senozhatsky
2017-04-07 8:14 ` Pavel Machek
2017-04-07 8:14 ` Pavel Machek
2017-04-07 12:10 ` Sergey Senozhatsky
2017-04-07 12:10 ` Sergey Senozhatsky
2017-04-07 12:44 ` Pavel Machek
2017-04-07 12:44 ` Pavel Machek
2017-04-07 14:40 ` Steven Rostedt
2017-04-07 14:40 ` Steven Rostedt
2017-05-08 6:37 ` Sergey Senozhatsky
2017-05-08 6:37 ` Sergey Senozhatsky
2017-05-17 13:13 ` Petr Mladek
2017-05-17 13:13 ` Petr Mladek
2017-04-07 15:13 ` Sergey Senozhatsky
2017-04-07 15:13 ` Sergey Senozhatsky
2017-04-07 15:23 ` Peter Zijlstra
2017-04-07 15:23 ` Peter Zijlstra
2017-04-07 15:40 ` Sergey Senozhatsky
2017-04-07 15:40 ` Sergey Senozhatsky
2017-04-09 18:21 ` Eric W. Biederman
2017-04-09 18:21 ` Eric W. Biederman
2017-04-10 4:46 ` Sergey Senozhatsky
2017-04-10 4:46 ` Sergey Senozhatsky
2017-04-09 10:12 ` Pavel Machek
2017-04-09 10:12 ` Pavel Machek
2017-04-10 4:53 ` Sergey Senozhatsky
2017-04-10 4:53 ` Sergey Senozhatsky
2017-04-10 11:54 ` Petr Mladek
2017-04-10 11:54 ` Petr Mladek
2017-04-10 15:08 ` Sergey Senozhatsky
2017-04-10 15:08 ` Sergey Senozhatsky
2017-04-10 18:48 ` Pavel Machek
2017-04-10 18:48 ` Pavel Machek
2017-04-11 1:46 ` Sergey Senozhatsky
2017-04-11 1:46 ` Sergey Senozhatsky
2017-04-11 16:19 ` Sergey Senozhatsky
2017-04-12 18:43 ` Pavel Machek
2017-04-13 4:34 ` Sergey Senozhatsky
2017-04-13 5:50 ` Sergey Senozhatsky
2017-04-13 8:19 ` Sergey Senozhatsky
2017-04-13 14:03 ` Petr Mladek
2017-04-14 4:42 ` Sergey Senozhatsky
2017-04-07 14:29 ` Steven Rostedt
2017-04-07 14:29 ` Steven Rostedt
2017-04-09 9:57 ` Pavel Machek
2017-04-09 9:57 ` Pavel Machek
2017-04-03 10:51 ` Sergey Senozhatsky
2017-04-03 10:51 ` Sergey Senozhatsky
2017-04-05 7:29 ` Ye Xiaolong
2017-04-05 7:29 ` Ye Xiaolong
2017-04-05 8:40 ` Sergey Senozhatsky
2017-04-05 8:40 ` Sergey Senozhatsky
2017-04-03 15:42 ` [RFC][PATCHv2 8/8] printk: enable printk offloading Petr Mladek
2017-04-04 13:20 ` 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=20170331130950.GA3452@pathway.suse.cz \
--to=pmladek@suse.com \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=gregkh@linuxfoundation.org \
--cc=jack@suse.cz \
--cc=jslaby@suse.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=peterz@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=rostedt@goodmis.org \
--cc=sergey.senozhatsky.work@gmail.com \
--cc=sergey.senozhatsky@gmail.com \
--cc=torvalds@linux-foundation.org \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.