From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753421AbbKYQJU (ORCPT ); Wed, 25 Nov 2015 11:09:20 -0500 Received: from mail.kernel.org ([198.145.29.136]:49073 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752229AbbKYQJP (ORCPT ); Wed, 25 Nov 2015 11:09:15 -0500 Message-Id: <20151125160912.830251803@goodmis.org> User-Agent: quilt/0.61-1 Date: Wed, 25 Nov 2015 11:08:44 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Andrew Morton Subject: [for-next][PATCH 6/7] ring-buffer: Process commits whenever moving to a new page. References: <20151125160838.739491216@goodmis.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=0006-ring-buffer-Process-commits-whenever-moving-to-a-new.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Steven Rostedt (Red Hat)" When crossing over to a new page, commit the current work. This will allow readers to get data with less latency, and also simplifies the work to get timestamps working for interrupted events. Signed-off-by: Steven Rostedt --- kernel/module.c | 18 ++++++++++++++++-- kernel/trace/ring_buffer.c | 7 +++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index 8f051a106676..c0ae7c18c2fa 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -284,11 +284,25 @@ static void module_assert_mutex(void) static void module_assert_mutex_or_preempt(void) { #ifdef CONFIG_LOCKDEP + static int once; + if (unlikely(!debug_locks)) return; - WARN_ON(!rcu_read_lock_sched_held() && - !lockdep_is_held(&module_mutex)); + /* + * Would be nice to use WARN_ON_ONCE(), but the warning + * that causes a stack trace may call __module_address() + * which may call here, and we trigger the warning again, + * before the WARN_ON_ONCE() updates its flag. + * To prevent the recursion, we need to open code the + * once logic. + */ + if (!once && + unlikely(!rcu_read_lock_sched_held() && + !lockdep_is_held(&module_mutex))) { + once++; + WARN_ON(1); + } #endif } diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 631541a53baf..95181e36891a 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2129,6 +2129,8 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, local_sub(length, &tail_page->write); } +static inline void rb_end_commit(struct ring_buffer_per_cpu *cpu_buffer); + /* * This is the slow path, force gcc not to inline it. */ @@ -2220,6 +2222,11 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, rb_reset_tail(cpu_buffer, tail, info); + /* Commit what we have for now. */ + rb_end_commit(cpu_buffer); + /* rb_end_commit() decs committing */ + local_inc(&cpu_buffer->committing); + /* fail and let the caller try again */ return ERR_PTR(-EAGAIN); -- 2.6.1