From: Steven Rostedt <rostedt@goodmis.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: linux-kernel@vger.kernel.org, pq@iki.fi, proski@gnu.org,
sandmann@redhat.com, a.p.zijlstra@chello.nl,
Steven Rostedt <srostedt@redhat.com>
Subject: [PATCH 1/5] ftrace: limit use of check pages
Date: Thu, 22 May 2008 00:22:16 -0400 [thread overview]
Message-ID: <20080522042301.622087604@goodmis.org> (raw)
In-Reply-To: 20080522042215.584408893@goodmis.org
[-- Attachment #1: ftrace-limit-checkpages.patch --]
[-- Type: text/plain, Size: 3359 bytes --]
The check_pages function is called often enough that it can cause problems
with trace outputs or even bringing the system to a halt.
This patch limits the check_pages to the places that are most likely to
have problems. The check is made at the flip between the global array and
the max save array, as well as when the size of the buffers changes and
the self tests.
This patch also removes the BUG_ON from check_pages and replaces it with
a WARN_ON and disabling of the tracer.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
kernel/trace/trace.c | 32 +++++++++++++++++++++++---------
kernel/trace/trace_selftest.c | 1 +
2 files changed, 24 insertions(+), 9 deletions(-)
Index: linux-tip.git/kernel/trace/trace.c
===================================================================
--- linux-tip.git.orig/kernel/trace/trace.c 2008-05-21 13:25:34.000000000 -0400
+++ linux-tip.git/kernel/trace/trace.c 2008-05-21 21:32:23.000000000 -0400
@@ -249,24 +249,32 @@ __update_max_tr(struct trace_array *tr,
tracing_record_cmdline(current);
}
+#define CHECK_COND(cond) \
+ if (unlikely(cond)) { \
+ tracing_disabled = 0; \
+ WARN_ON(1); \
+ return -1; \
+ }
+
/**
* check_pages - integrity check of trace buffers
*
* As a safty measure we check to make sure the data pages have not
- * been corrupted. TODO: configure to disable this because it adds
- * a bit of overhead.
+ * been corrupted.
*/
-void check_pages(struct trace_array_cpu *data)
+int check_pages(struct trace_array_cpu *data)
{
struct page *page, *tmp;
- BUG_ON(data->trace_pages.next->prev != &data->trace_pages);
- BUG_ON(data->trace_pages.prev->next != &data->trace_pages);
+ CHECK_COND(data->trace_pages.next->prev != &data->trace_pages);
+ CHECK_COND(data->trace_pages.prev->next != &data->trace_pages);
list_for_each_entry_safe(page, tmp, &data->trace_pages, lru) {
- BUG_ON(page->lru.next->prev != &page->lru);
- BUG_ON(page->lru.prev->next != &page->lru);
+ CHECK_COND(page->lru.next->prev != &page->lru);
+ CHECK_COND(page->lru.prev->next != &page->lru);
}
+
+ return 0;
}
/**
@@ -280,7 +288,6 @@ void *head_page(struct trace_array_cpu *
{
struct page *page;
- check_pages(data);
if (list_empty(&data->trace_pages))
return NULL;
@@ -2608,7 +2615,7 @@ tracing_entries_write(struct file *filp,
{
unsigned long val;
char buf[64];
- int ret;
+ int i, ret;
if (cnt >= sizeof(buf))
return -EINVAL;
@@ -2677,8 +2684,15 @@ tracing_entries_write(struct file *filp,
trace_free_page();
}
+ /* check integrity */
+ for_each_tracing_cpu(i)
+ check_pages(global_trace.data[i]);
+
filp->f_pos += cnt;
+ /* If check pages failed, return ENOMEM */
+ if (tracing_disabled)
+ cnt = -ENOMEM;
out:
max_tr.entries = global_trace.entries;
mutex_unlock(&trace_types_lock);
Index: linux-tip.git/kernel/trace/trace_selftest.c
===================================================================
--- linux-tip.git.orig/kernel/trace/trace_selftest.c 2008-05-21 19:06:11.000000000 -0400
+++ linux-tip.git/kernel/trace/trace_selftest.c 2008-05-21 20:25:05.000000000 -0400
@@ -28,6 +28,7 @@ trace_test_buffer_cpu(struct trace_array
page = list_entry(data->trace_pages.next, struct page, lru);
entries = page_address(page);
+ check_pages(data);
if (head_page(data) != entries)
goto failed;
--
next prev parent reply other threads:[~2008-05-22 4:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-22 4:22 [PATCH 0/5] ftrace clean ups Steven Rostedt
2008-05-22 4:22 ` Steven Rostedt [this message]
2008-05-22 17:38 ` [PATCH 1/5] ftrace: limit use of check pages Pekka Paalanen
2008-05-22 17:43 ` Steven Rostedt
2008-05-22 18:06 ` [PATCH] ftrace: fix check_pages disable set Steven Rostedt
2008-05-27 15:34 ` [PATCH 1/5] ftrace: limit use of check pages Thomas Gleixner
2008-05-22 4:22 ` [PATCH 2/5] ftrace: remove wakeup functions from sched_switch tracer Steven Rostedt
2008-05-22 9:46 ` Peter Zijlstra
2008-05-22 4:22 ` [PATCH 3/5] ftrace: move ftrace_special to trace.c Steven Rostedt
2008-05-22 4:22 ` [PATCH 4/5] ftrace: add function tracing to wake up tracing Steven Rostedt
2008-05-22 4:22 ` [PATCH 5/5] ftrace: remove printks from irqsoff trace Steven Rostedt
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=20080522042301.622087604@goodmis.org \
--to=rostedt@goodmis.org \
--cc=a.p.zijlstra@chello.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=pq@iki.fi \
--cc=proski@gnu.org \
--cc=sandmann@redhat.com \
--cc=srostedt@redhat.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: link
Be 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