diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 107 |
1 files changed, 23 insertions, 84 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 25edd5cc5935..8c804e24f96f 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1016,71 +1016,35 @@ static int | |||
1016 | __ftrace_replace_code(struct dyn_ftrace *rec, int enable) | 1016 | __ftrace_replace_code(struct dyn_ftrace *rec, int enable) |
1017 | { | 1017 | { |
1018 | unsigned long ftrace_addr; | 1018 | unsigned long ftrace_addr; |
1019 | unsigned long ip, fl; | 1019 | unsigned long flag = 0UL; |
1020 | 1020 | ||
1021 | ftrace_addr = (unsigned long)FTRACE_ADDR; | 1021 | ftrace_addr = (unsigned long)FTRACE_ADDR; |
1022 | 1022 | ||
1023 | ip = rec->ip; | ||
1024 | |||
1025 | /* | 1023 | /* |
1026 | * If this record is not to be traced and | 1024 | * If this record is not to be traced or we want to disable it, |
1027 | * it is not enabled then do nothing. | 1025 | * then disable it. |
1028 | * | 1026 | * |
1029 | * If this record is not to be traced and | 1027 | * If we want to enable it and filtering is off, then enable it. |
1030 | * it is enabled then disable it. | ||
1031 | * | 1028 | * |
1029 | * If we want to enable it and filtering is on, enable it only if | ||
1030 | * it's filtered | ||
1032 | */ | 1031 | */ |
1033 | if (rec->flags & FTRACE_FL_NOTRACE) { | 1032 | if (enable && !(rec->flags & FTRACE_FL_NOTRACE)) { |
1034 | if (rec->flags & FTRACE_FL_ENABLED) | 1033 | if (!ftrace_filtered || (rec->flags & FTRACE_FL_FILTER)) |
1035 | rec->flags &= ~FTRACE_FL_ENABLED; | 1034 | flag = FTRACE_FL_ENABLED; |
1036 | else | 1035 | } |
1037 | return 0; | ||
1038 | |||
1039 | } else if (ftrace_filtered && enable) { | ||
1040 | /* | ||
1041 | * Filtering is on: | ||
1042 | */ | ||
1043 | |||
1044 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED); | ||
1045 | |||
1046 | /* Record is filtered and enabled, do nothing */ | ||
1047 | if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) | ||
1048 | return 0; | ||
1049 | |||
1050 | /* Record is not filtered or enabled, do nothing */ | ||
1051 | if (!fl) | ||
1052 | return 0; | ||
1053 | |||
1054 | /* Record is not filtered but enabled, disable it */ | ||
1055 | if (fl == FTRACE_FL_ENABLED) | ||
1056 | rec->flags &= ~FTRACE_FL_ENABLED; | ||
1057 | else | ||
1058 | /* Otherwise record is filtered but not enabled, enable it */ | ||
1059 | rec->flags |= FTRACE_FL_ENABLED; | ||
1060 | } else { | ||
1061 | /* Disable or not filtered */ | ||
1062 | |||
1063 | if (enable) { | ||
1064 | /* if record is enabled, do nothing */ | ||
1065 | if (rec->flags & FTRACE_FL_ENABLED) | ||
1066 | return 0; | ||
1067 | |||
1068 | rec->flags |= FTRACE_FL_ENABLED; | ||
1069 | |||
1070 | } else { | ||
1071 | 1036 | ||
1072 | /* if record is not enabled, do nothing */ | 1037 | /* If the state of this record hasn't changed, then do nothing */ |
1073 | if (!(rec->flags & FTRACE_FL_ENABLED)) | 1038 | if ((rec->flags & FTRACE_FL_ENABLED) == flag) |
1074 | return 0; | 1039 | return 0; |
1075 | 1040 | ||
1076 | rec->flags &= ~FTRACE_FL_ENABLED; | 1041 | if (flag) { |
1077 | } | 1042 | rec->flags |= FTRACE_FL_ENABLED; |
1043 | return ftrace_make_call(rec, ftrace_addr); | ||
1078 | } | 1044 | } |
1079 | 1045 | ||
1080 | if (rec->flags & FTRACE_FL_ENABLED) | 1046 | rec->flags &= ~FTRACE_FL_ENABLED; |
1081 | return ftrace_make_call(rec, ftrace_addr); | 1047 | return ftrace_make_nop(NULL, rec, ftrace_addr); |
1082 | else | ||
1083 | return ftrace_make_nop(NULL, rec, ftrace_addr); | ||
1084 | } | 1048 | } |
1085 | 1049 | ||
1086 | static void ftrace_replace_code(int enable) | 1050 | static void ftrace_replace_code(int enable) |
@@ -1375,7 +1339,6 @@ struct ftrace_iterator { | |||
1375 | unsigned flags; | 1339 | unsigned flags; |
1376 | unsigned char buffer[FTRACE_BUFF_MAX+1]; | 1340 | unsigned char buffer[FTRACE_BUFF_MAX+1]; |
1377 | unsigned buffer_idx; | 1341 | unsigned buffer_idx; |
1378 | unsigned filtered; | ||
1379 | }; | 1342 | }; |
1380 | 1343 | ||
1381 | static void * | 1344 | static void * |
@@ -1438,18 +1401,13 @@ static int t_hash_show(struct seq_file *m, void *v) | |||
1438 | { | 1401 | { |
1439 | struct ftrace_func_probe *rec; | 1402 | struct ftrace_func_probe *rec; |
1440 | struct hlist_node *hnd = v; | 1403 | struct hlist_node *hnd = v; |
1441 | char str[KSYM_SYMBOL_LEN]; | ||
1442 | 1404 | ||
1443 | rec = hlist_entry(hnd, struct ftrace_func_probe, node); | 1405 | rec = hlist_entry(hnd, struct ftrace_func_probe, node); |
1444 | 1406 | ||
1445 | if (rec->ops->print) | 1407 | if (rec->ops->print) |
1446 | return rec->ops->print(m, rec->ip, rec->ops, rec->data); | 1408 | return rec->ops->print(m, rec->ip, rec->ops, rec->data); |
1447 | 1409 | ||
1448 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); | 1410 | seq_printf(m, "%pf:%pf", (void *)rec->ip, (void *)rec->ops->func); |
1449 | seq_printf(m, "%s:", str); | ||
1450 | |||
1451 | kallsyms_lookup((unsigned long)rec->ops->func, NULL, NULL, NULL, str); | ||
1452 | seq_printf(m, "%s", str); | ||
1453 | 1411 | ||
1454 | if (rec->data) | 1412 | if (rec->data) |
1455 | seq_printf(m, ":%p", rec->data); | 1413 | seq_printf(m, ":%p", rec->data); |
@@ -1547,7 +1505,6 @@ static int t_show(struct seq_file *m, void *v) | |||
1547 | { | 1505 | { |
1548 | struct ftrace_iterator *iter = m->private; | 1506 | struct ftrace_iterator *iter = m->private; |
1549 | struct dyn_ftrace *rec = v; | 1507 | struct dyn_ftrace *rec = v; |
1550 | char str[KSYM_SYMBOL_LEN]; | ||
1551 | 1508 | ||
1552 | if (iter->flags & FTRACE_ITER_HASH) | 1509 | if (iter->flags & FTRACE_ITER_HASH) |
1553 | return t_hash_show(m, v); | 1510 | return t_hash_show(m, v); |
@@ -1560,9 +1517,7 @@ static int t_show(struct seq_file *m, void *v) | |||
1560 | if (!rec) | 1517 | if (!rec) |
1561 | return 0; | 1518 | return 0; |
1562 | 1519 | ||
1563 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); | 1520 | seq_printf(m, "%pf\n", (void *)rec->ip); |
1564 | |||
1565 | seq_printf(m, "%s\n", str); | ||
1566 | 1521 | ||
1567 | return 0; | 1522 | return 0; |
1568 | } | 1523 | } |
@@ -1601,17 +1556,6 @@ ftrace_avail_open(struct inode *inode, struct file *file) | |||
1601 | return ret; | 1556 | return ret; |
1602 | } | 1557 | } |
1603 | 1558 | ||
1604 | int ftrace_avail_release(struct inode *inode, struct file *file) | ||
1605 | { | ||
1606 | struct seq_file *m = (struct seq_file *)file->private_data; | ||
1607 | struct ftrace_iterator *iter = m->private; | ||
1608 | |||
1609 | seq_release(inode, file); | ||
1610 | kfree(iter); | ||
1611 | |||
1612 | return 0; | ||
1613 | } | ||
1614 | |||
1615 | static int | 1559 | static int |
1616 | ftrace_failures_open(struct inode *inode, struct file *file) | 1560 | ftrace_failures_open(struct inode *inode, struct file *file) |
1617 | { | 1561 | { |
@@ -2317,7 +2261,6 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, | |||
2317 | } | 2261 | } |
2318 | 2262 | ||
2319 | if (isspace(ch)) { | 2263 | if (isspace(ch)) { |
2320 | iter->filtered++; | ||
2321 | iter->buffer[iter->buffer_idx] = 0; | 2264 | iter->buffer[iter->buffer_idx] = 0; |
2322 | ret = ftrace_process_regex(iter->buffer, | 2265 | ret = ftrace_process_regex(iter->buffer, |
2323 | iter->buffer_idx, enable); | 2266 | iter->buffer_idx, enable); |
@@ -2448,7 +2391,6 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
2448 | iter = file->private_data; | 2391 | iter = file->private_data; |
2449 | 2392 | ||
2450 | if (iter->buffer_idx) { | 2393 | if (iter->buffer_idx) { |
2451 | iter->filtered++; | ||
2452 | iter->buffer[iter->buffer_idx] = 0; | 2394 | iter->buffer[iter->buffer_idx] = 0; |
2453 | ftrace_match_records(iter->buffer, iter->buffer_idx, enable); | 2395 | ftrace_match_records(iter->buffer, iter->buffer_idx, enable); |
2454 | } | 2396 | } |
@@ -2479,14 +2421,14 @@ static const struct file_operations ftrace_avail_fops = { | |||
2479 | .open = ftrace_avail_open, | 2421 | .open = ftrace_avail_open, |
2480 | .read = seq_read, | 2422 | .read = seq_read, |
2481 | .llseek = seq_lseek, | 2423 | .llseek = seq_lseek, |
2482 | .release = ftrace_avail_release, | 2424 | .release = seq_release_private, |
2483 | }; | 2425 | }; |
2484 | 2426 | ||
2485 | static const struct file_operations ftrace_failures_fops = { | 2427 | static const struct file_operations ftrace_failures_fops = { |
2486 | .open = ftrace_failures_open, | 2428 | .open = ftrace_failures_open, |
2487 | .read = seq_read, | 2429 | .read = seq_read, |
2488 | .llseek = seq_lseek, | 2430 | .llseek = seq_lseek, |
2489 | .release = ftrace_avail_release, | 2431 | .release = seq_release_private, |
2490 | }; | 2432 | }; |
2491 | 2433 | ||
2492 | static const struct file_operations ftrace_filter_fops = { | 2434 | static const struct file_operations ftrace_filter_fops = { |
@@ -2548,7 +2490,6 @@ static void g_stop(struct seq_file *m, void *p) | |||
2548 | static int g_show(struct seq_file *m, void *v) | 2490 | static int g_show(struct seq_file *m, void *v) |
2549 | { | 2491 | { |
2550 | unsigned long *ptr = v; | 2492 | unsigned long *ptr = v; |
2551 | char str[KSYM_SYMBOL_LEN]; | ||
2552 | 2493 | ||
2553 | if (!ptr) | 2494 | if (!ptr) |
2554 | return 0; | 2495 | return 0; |
@@ -2558,9 +2499,7 @@ static int g_show(struct seq_file *m, void *v) | |||
2558 | return 0; | 2499 | return 0; |
2559 | } | 2500 | } |
2560 | 2501 | ||
2561 | kallsyms_lookup(*ptr, NULL, NULL, NULL, str); | 2502 | seq_printf(m, "%pf\n", v); |
2562 | |||
2563 | seq_printf(m, "%s\n", str); | ||
2564 | 2503 | ||
2565 | return 0; | 2504 | return 0; |
2566 | } | 2505 | } |