aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ftrace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2008-11-15 16:31:41 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-16 01:37:17 -0500
commit982c350b9ec4b3564d67f3627a274ae61bbc7e95 (patch)
treec7ccd83698552997bcfe58ab7f61b8761d37957e /kernel/trace/ftrace.c
parent20e5227e9f55ae1969934821ccbf581563785bbe (diff)
ftrace: fix dyn ftrace filter
Impact: correct implementation of dyn ftrace filter The old decisions made by the filter algorithm was complex and incorrect. This lead to inconsistent enabling or disabling of functions when the filter was used. This patch simplifies that code and in doing so, corrects the usage of the filters. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r--kernel/trace/ftrace.c83
1 files changed, 36 insertions, 47 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index cc4219135dc9..b9f2e22faf2e 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -394,72 +394,62 @@ __ftrace_replace_code(struct dyn_ftrace *rec, int enable)
394 394
395 ip = rec->ip; 395 ip = rec->ip;
396 396
397 if (ftrace_filtered && enable) { 397 /*
398 * If this record is not to be traced and
399 * it is not enabled then do nothing.
400 *
401 * If this record is not to be traced and
402 * it is enabled then disabled it.
403 *
404 */
405 if (rec->flags & FTRACE_FL_NOTRACE) {
406 if (rec->flags & FTRACE_FL_ENABLED)
407 rec->flags &= ~FTRACE_FL_ENABLED;
408 else
409 return 0;
410
411 } else if (ftrace_filtered && enable) {
398 /* 412 /*
399 * If filtering is on: 413 * Filtering is on:
400 *
401 * If this record is set to be filtered and
402 * is enabled then do nothing.
403 *
404 * If this record is set to be filtered and
405 * it is not enabled, enable it.
406 *
407 * If this record is not set to be filtered
408 * and it is not enabled do nothing.
409 *
410 * If this record is set not to trace then
411 * do nothing.
412 *
413 * If this record is set not to trace and
414 * it is enabled then disable it.
415 *
416 * If this record is not set to be filtered and
417 * it is enabled, disable it.
418 */ 414 */
419 415
420 fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE | 416 fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED);
421 FTRACE_FL_ENABLED);
422 417
423 if ((fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) || 418 /* Record is filtered and enabled, do nothing */
424 (fl == (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE)) || 419 if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED))
425 !fl || (fl == FTRACE_FL_NOTRACE))
426 return 0; 420 return 0;
427 421
428 /* 422 /* Record is not filtered and is not enabled do nothing */
429 * If it is enabled disable it, 423 if (!fl)
430 * otherwise enable it! 424 return 0;
431 */ 425
432 if (fl & FTRACE_FL_ENABLED) { 426 /* Record is not filtered but enabled, disable it */
433 enable = 0; 427 if (fl == FTRACE_FL_ENABLED)
434 rec->flags &= ~FTRACE_FL_ENABLED; 428 rec->flags &= ~FTRACE_FL_ENABLED;
435 } else { 429 else
436 enable = 1; 430 /* Otherwise record is filtered but not enabled, enable it */
437 rec->flags |= FTRACE_FL_ENABLED; 431 rec->flags |= FTRACE_FL_ENABLED;
438 }
439 } else { 432 } else {
433 /* Disable or not filtered */
440 434
441 if (enable) { 435 if (enable) {
442 /* 436 /* if record is enabled, do nothing */
443 * If this record is set not to trace and is
444 * not enabled, do nothing.
445 */
446 fl = rec->flags & (FTRACE_FL_NOTRACE | FTRACE_FL_ENABLED);
447 if (fl == FTRACE_FL_NOTRACE)
448 return 0;
449 }
450
451 if (enable) {
452 if (rec->flags & FTRACE_FL_ENABLED) 437 if (rec->flags & FTRACE_FL_ENABLED)
453 return 0; 438 return 0;
439
454 rec->flags |= FTRACE_FL_ENABLED; 440 rec->flags |= FTRACE_FL_ENABLED;
441
455 } else { 442 } else {
443
444 /* if record is not enabled do nothing */
456 if (!(rec->flags & FTRACE_FL_ENABLED)) 445 if (!(rec->flags & FTRACE_FL_ENABLED))
457 return 0; 446 return 0;
447
458 rec->flags &= ~FTRACE_FL_ENABLED; 448 rec->flags &= ~FTRACE_FL_ENABLED;
459 } 449 }
460 } 450 }
461 451
462 if (enable) 452 if (rec->flags & FTRACE_FL_ENABLED)
463 return ftrace_make_call(rec, FTRACE_ADDR); 453 return ftrace_make_call(rec, FTRACE_ADDR);
464 else 454 else
465 return ftrace_make_nop(NULL, rec, FTRACE_ADDR); 455 return ftrace_make_nop(NULL, rec, FTRACE_ADDR);
@@ -554,8 +544,7 @@ static void ftrace_startup(void)
554 544
555 mutex_lock(&ftrace_start_lock); 545 mutex_lock(&ftrace_start_lock);
556 ftrace_start_up++; 546 ftrace_start_up++;
557 if (ftrace_start_up == 1) 547 command |= FTRACE_ENABLE_CALLS;
558 command |= FTRACE_ENABLE_CALLS;
559 548
560 if (saved_ftrace_func != ftrace_trace_function) { 549 if (saved_ftrace_func != ftrace_trace_function) {
561 saved_ftrace_func = ftrace_trace_function; 550 saved_ftrace_func = ftrace_trace_function;