diff options
author | Steven Rostedt <srostedt@redhat.com> | 2011-04-29 20:59:51 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2011-05-18 15:29:44 -0400 |
commit | 1cf41dd79993389b012e4542ab502ce36ae7343f (patch) | |
tree | e1d0b58b2256d5936cff0c9d29ca8f68a80cedd8 /kernel/trace | |
parent | b448c4e3ae6d20108dba1d7833f2c0d3dbad87ce (diff) |
ftrace: Use hash instead for FTRACE_FL_FILTER
When multiple users are allowed to have their own set of functions
to trace, having the FTRACE_FL_FILTER flag will not be enough to
handle the accounting of those users. Each user will need their own
set of functions.
Replace the FTRACE_FL_FILTER with a filter_hash instead. This is
temporary until the rest of the function filtering accounting
gets in.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/ftrace.c | 151 |
1 files changed, 69 insertions, 82 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 04c002a491fb..222eca4c3022 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -883,7 +883,11 @@ static struct ftrace_hash notrace_hash = { | |||
883 | .buckets = notrace_buckets, | 883 | .buckets = notrace_buckets, |
884 | }; | 884 | }; |
885 | 885 | ||
886 | static int ftrace_filtered; | 886 | static struct hlist_head filter_buckets[1 << FTRACE_HASH_MAX_BITS]; |
887 | static struct ftrace_hash filter_hash = { | ||
888 | .size_bits = FTRACE_HASH_MAX_BITS, | ||
889 | .buckets = filter_buckets, | ||
890 | }; | ||
887 | 891 | ||
888 | static struct dyn_ftrace *ftrace_new_addrs; | 892 | static struct dyn_ftrace *ftrace_new_addrs; |
889 | 893 | ||
@@ -1123,7 +1127,7 @@ __ftrace_replace_code(struct dyn_ftrace *rec, int enable) | |||
1123 | * it's filtered | 1127 | * it's filtered |
1124 | */ | 1128 | */ |
1125 | if (enable && !ftrace_lookup_ip(¬race_hash, rec->ip)) { | 1129 | if (enable && !ftrace_lookup_ip(¬race_hash, rec->ip)) { |
1126 | if (!ftrace_filtered || (rec->flags & FTRACE_FL_FILTER)) | 1130 | if (!filter_hash.count || ftrace_lookup_ip(&filter_hash, rec->ip)) |
1127 | flag = FTRACE_FL_ENABLED; | 1131 | flag = FTRACE_FL_ENABLED; |
1128 | } | 1132 | } |
1129 | 1133 | ||
@@ -1430,6 +1434,7 @@ struct ftrace_iterator { | |||
1430 | struct dyn_ftrace *func; | 1434 | struct dyn_ftrace *func; |
1431 | struct ftrace_func_probe *probe; | 1435 | struct ftrace_func_probe *probe; |
1432 | struct trace_parser parser; | 1436 | struct trace_parser parser; |
1437 | struct ftrace_hash *hash; | ||
1433 | int hidx; | 1438 | int hidx; |
1434 | int idx; | 1439 | int idx; |
1435 | unsigned flags; | 1440 | unsigned flags; |
@@ -1552,7 +1557,7 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
1552 | if ((rec->flags & FTRACE_FL_FREE) || | 1557 | if ((rec->flags & FTRACE_FL_FREE) || |
1553 | 1558 | ||
1554 | ((iter->flags & FTRACE_ITER_FILTER) && | 1559 | ((iter->flags & FTRACE_ITER_FILTER) && |
1555 | !(rec->flags & FTRACE_FL_FILTER)) || | 1560 | !(ftrace_lookup_ip(&filter_hash, rec->ip))) || |
1556 | 1561 | ||
1557 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 1562 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
1558 | !ftrace_lookup_ip(¬race_hash, rec->ip))) { | 1563 | !ftrace_lookup_ip(¬race_hash, rec->ip))) { |
@@ -1598,7 +1603,7 @@ static void *t_start(struct seq_file *m, loff_t *pos) | |||
1598 | * off, we can short cut and just print out that all | 1603 | * off, we can short cut and just print out that all |
1599 | * functions are enabled. | 1604 | * functions are enabled. |
1600 | */ | 1605 | */ |
1601 | if (iter->flags & FTRACE_ITER_FILTER && !ftrace_filtered) { | 1606 | if (iter->flags & FTRACE_ITER_FILTER && !filter_hash.count) { |
1602 | if (*pos > 0) | 1607 | if (*pos > 0) |
1603 | return t_hash_start(m, pos); | 1608 | return t_hash_start(m, pos); |
1604 | iter->flags |= FTRACE_ITER_PRINTALL; | 1609 | iter->flags |= FTRACE_ITER_PRINTALL; |
@@ -1695,24 +1700,16 @@ ftrace_avail_open(struct inode *inode, struct file *file) | |||
1695 | return ret; | 1700 | return ret; |
1696 | } | 1701 | } |
1697 | 1702 | ||
1698 | static void ftrace_filter_reset(int enable) | 1703 | static void ftrace_filter_reset(struct ftrace_hash *hash) |
1699 | { | 1704 | { |
1700 | struct ftrace_page *pg; | ||
1701 | struct dyn_ftrace *rec; | ||
1702 | |||
1703 | mutex_lock(&ftrace_lock); | 1705 | mutex_lock(&ftrace_lock); |
1704 | if (enable) { | 1706 | ftrace_hash_clear(hash); |
1705 | ftrace_filtered = 0; | ||
1706 | do_for_each_ftrace_rec(pg, rec) { | ||
1707 | rec->flags &= ~FTRACE_FL_FILTER; | ||
1708 | } while_for_each_ftrace_rec(); | ||
1709 | } else | ||
1710 | ftrace_hash_clear(¬race_hash); | ||
1711 | mutex_unlock(&ftrace_lock); | 1707 | mutex_unlock(&ftrace_lock); |
1712 | } | 1708 | } |
1713 | 1709 | ||
1714 | static int | 1710 | static int |
1715 | ftrace_regex_open(struct inode *inode, struct file *file, int enable) | 1711 | ftrace_regex_open(struct ftrace_hash *hash, int flag, |
1712 | struct inode *inode, struct file *file) | ||
1716 | { | 1713 | { |
1717 | struct ftrace_iterator *iter; | 1714 | struct ftrace_iterator *iter; |
1718 | int ret = 0; | 1715 | int ret = 0; |
@@ -1729,15 +1726,16 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) | |||
1729 | return -ENOMEM; | 1726 | return -ENOMEM; |
1730 | } | 1727 | } |
1731 | 1728 | ||
1729 | iter->hash = hash; | ||
1730 | |||
1732 | mutex_lock(&ftrace_regex_lock); | 1731 | mutex_lock(&ftrace_regex_lock); |
1733 | if ((file->f_mode & FMODE_WRITE) && | 1732 | if ((file->f_mode & FMODE_WRITE) && |
1734 | (file->f_flags & O_TRUNC)) | 1733 | (file->f_flags & O_TRUNC)) |
1735 | ftrace_filter_reset(enable); | 1734 | ftrace_filter_reset(hash); |
1736 | 1735 | ||
1737 | if (file->f_mode & FMODE_READ) { | 1736 | if (file->f_mode & FMODE_READ) { |
1738 | iter->pg = ftrace_pages_start; | 1737 | iter->pg = ftrace_pages_start; |
1739 | iter->flags = enable ? FTRACE_ITER_FILTER : | 1738 | iter->flags = flag; |
1740 | FTRACE_ITER_NOTRACE; | ||
1741 | 1739 | ||
1742 | ret = seq_open(file, &show_ftrace_seq_ops); | 1740 | ret = seq_open(file, &show_ftrace_seq_ops); |
1743 | if (!ret) { | 1741 | if (!ret) { |
@@ -1757,13 +1755,15 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) | |||
1757 | static int | 1755 | static int |
1758 | ftrace_filter_open(struct inode *inode, struct file *file) | 1756 | ftrace_filter_open(struct inode *inode, struct file *file) |
1759 | { | 1757 | { |
1760 | return ftrace_regex_open(inode, file, 1); | 1758 | return ftrace_regex_open(&filter_hash, FTRACE_ITER_FILTER, |
1759 | inode, file); | ||
1761 | } | 1760 | } |
1762 | 1761 | ||
1763 | static int | 1762 | static int |
1764 | ftrace_notrace_open(struct inode *inode, struct file *file) | 1763 | ftrace_notrace_open(struct inode *inode, struct file *file) |
1765 | { | 1764 | { |
1766 | return ftrace_regex_open(inode, file, 0); | 1765 | return ftrace_regex_open(¬race_hash, FTRACE_ITER_NOTRACE, |
1766 | inode, file); | ||
1767 | } | 1767 | } |
1768 | 1768 | ||
1769 | static loff_t | 1769 | static loff_t |
@@ -1808,33 +1808,24 @@ static int ftrace_match(char *str, char *regex, int len, int type) | |||
1808 | } | 1808 | } |
1809 | 1809 | ||
1810 | static int | 1810 | static int |
1811 | update_record(struct dyn_ftrace *rec, int enable, int not) | 1811 | enter_record(struct ftrace_hash *hash, struct dyn_ftrace *rec, int not) |
1812 | { | 1812 | { |
1813 | struct ftrace_func_entry *entry; | 1813 | struct ftrace_func_entry *entry; |
1814 | struct ftrace_hash *hash = ¬race_hash; | ||
1815 | int ret = 0; | 1814 | int ret = 0; |
1816 | 1815 | ||
1817 | if (enable) { | 1816 | entry = ftrace_lookup_ip(hash, rec->ip); |
1818 | if (not) | 1817 | if (not) { |
1819 | rec->flags &= ~FTRACE_FL_FILTER; | 1818 | /* Do nothing if it doesn't exist */ |
1820 | else | 1819 | if (!entry) |
1821 | rec->flags |= FTRACE_FL_FILTER; | 1820 | return 0; |
1822 | } else { | ||
1823 | if (not) { | ||
1824 | /* Do nothing if it doesn't exist */ | ||
1825 | entry = ftrace_lookup_ip(hash, rec->ip); | ||
1826 | if (!entry) | ||
1827 | return 0; | ||
1828 | 1821 | ||
1829 | remove_hash_entry(hash, entry); | 1822 | remove_hash_entry(hash, entry); |
1830 | } else { | 1823 | } else { |
1831 | /* Do nothing if it exists */ | 1824 | /* Do nothing if it exists */ |
1832 | entry = ftrace_lookup_ip(hash, rec->ip); | 1825 | if (entry) |
1833 | if (entry) | 1826 | return 0; |
1834 | return 0; | ||
1835 | 1827 | ||
1836 | ret = add_hash_entry(hash, rec->ip); | 1828 | ret = add_hash_entry(hash, rec->ip); |
1837 | } | ||
1838 | } | 1829 | } |
1839 | return ret; | 1830 | return ret; |
1840 | } | 1831 | } |
@@ -1861,7 +1852,9 @@ ftrace_match_record(struct dyn_ftrace *rec, char *mod, | |||
1861 | return ftrace_match(str, regex, len, type); | 1852 | return ftrace_match(str, regex, len, type); |
1862 | } | 1853 | } |
1863 | 1854 | ||
1864 | static int match_records(char *buff, int len, char *mod, int enable, int not) | 1855 | static int |
1856 | match_records(struct ftrace_hash *hash, char *buff, | ||
1857 | int len, char *mod, int not) | ||
1865 | { | 1858 | { |
1866 | unsigned search_len = 0; | 1859 | unsigned search_len = 0; |
1867 | struct ftrace_page *pg; | 1860 | struct ftrace_page *pg; |
@@ -1884,20 +1877,13 @@ static int match_records(char *buff, int len, char *mod, int enable, int not) | |||
1884 | do_for_each_ftrace_rec(pg, rec) { | 1877 | do_for_each_ftrace_rec(pg, rec) { |
1885 | 1878 | ||
1886 | if (ftrace_match_record(rec, mod, search, search_len, type)) { | 1879 | if (ftrace_match_record(rec, mod, search, search_len, type)) { |
1887 | ret = update_record(rec, enable, not); | 1880 | ret = enter_record(hash, rec, not); |
1888 | if (ret < 0) { | 1881 | if (ret < 0) { |
1889 | found = ret; | 1882 | found = ret; |
1890 | goto out_unlock; | 1883 | goto out_unlock; |
1891 | } | 1884 | } |
1892 | found = 1; | 1885 | found = 1; |
1893 | } | 1886 | } |
1894 | /* | ||
1895 | * Only enable filtering if we have a function that | ||
1896 | * is filtered on. | ||
1897 | */ | ||
1898 | if (enable && (rec->flags & FTRACE_FL_FILTER)) | ||
1899 | ftrace_filtered = 1; | ||
1900 | |||
1901 | } while_for_each_ftrace_rec(); | 1887 | } while_for_each_ftrace_rec(); |
1902 | out_unlock: | 1888 | out_unlock: |
1903 | mutex_unlock(&ftrace_lock); | 1889 | mutex_unlock(&ftrace_lock); |
@@ -1906,12 +1892,13 @@ static int match_records(char *buff, int len, char *mod, int enable, int not) | |||
1906 | } | 1892 | } |
1907 | 1893 | ||
1908 | static int | 1894 | static int |
1909 | ftrace_match_records(char *buff, int len, int enable) | 1895 | ftrace_match_records(struct ftrace_hash *hash, char *buff, int len) |
1910 | { | 1896 | { |
1911 | return match_records(buff, len, NULL, enable, 0); | 1897 | return match_records(hash, buff, len, NULL, 0); |
1912 | } | 1898 | } |
1913 | 1899 | ||
1914 | static int ftrace_match_module_records(char *buff, char *mod, int enable) | 1900 | static int |
1901 | ftrace_match_module_records(struct ftrace_hash *hash, char *buff, char *mod) | ||
1915 | { | 1902 | { |
1916 | int not = 0; | 1903 | int not = 0; |
1917 | 1904 | ||
@@ -1925,7 +1912,7 @@ static int ftrace_match_module_records(char *buff, char *mod, int enable) | |||
1925 | not = 1; | 1912 | not = 1; |
1926 | } | 1913 | } |
1927 | 1914 | ||
1928 | return match_records(buff, strlen(buff), mod, enable, not); | 1915 | return match_records(hash, buff, strlen(buff), mod, not); |
1929 | } | 1916 | } |
1930 | 1917 | ||
1931 | /* | 1918 | /* |
@@ -1936,6 +1923,7 @@ static int ftrace_match_module_records(char *buff, char *mod, int enable) | |||
1936 | static int | 1923 | static int |
1937 | ftrace_mod_callback(char *func, char *cmd, char *param, int enable) | 1924 | ftrace_mod_callback(char *func, char *cmd, char *param, int enable) |
1938 | { | 1925 | { |
1926 | struct ftrace_hash *hash; | ||
1939 | char *mod; | 1927 | char *mod; |
1940 | int ret = -EINVAL; | 1928 | int ret = -EINVAL; |
1941 | 1929 | ||
@@ -1955,7 +1943,12 @@ ftrace_mod_callback(char *func, char *cmd, char *param, int enable) | |||
1955 | if (!strlen(mod)) | 1943 | if (!strlen(mod)) |
1956 | return ret; | 1944 | return ret; |
1957 | 1945 | ||
1958 | ret = ftrace_match_module_records(func, mod, enable); | 1946 | if (enable) |
1947 | hash = &filter_hash; | ||
1948 | else | ||
1949 | hash = ¬race_hash; | ||
1950 | |||
1951 | ret = ftrace_match_module_records(hash, func, mod); | ||
1959 | if (!ret) | 1952 | if (!ret) |
1960 | ret = -EINVAL; | 1953 | ret = -EINVAL; |
1961 | if (ret < 0) | 1954 | if (ret < 0) |
@@ -2253,12 +2246,18 @@ static int ftrace_process_regex(char *buff, int len, int enable) | |||
2253 | { | 2246 | { |
2254 | char *func, *command, *next = buff; | 2247 | char *func, *command, *next = buff; |
2255 | struct ftrace_func_command *p; | 2248 | struct ftrace_func_command *p; |
2249 | struct ftrace_hash *hash; | ||
2256 | int ret; | 2250 | int ret; |
2257 | 2251 | ||
2252 | if (enable) | ||
2253 | hash = &filter_hash; | ||
2254 | else | ||
2255 | hash = ¬race_hash; | ||
2256 | |||
2258 | func = strsep(&next, ":"); | 2257 | func = strsep(&next, ":"); |
2259 | 2258 | ||
2260 | if (!next) { | 2259 | if (!next) { |
2261 | ret = ftrace_match_records(func, len, enable); | 2260 | ret = ftrace_match_records(hash, func, len); |
2262 | if (!ret) | 2261 | if (!ret) |
2263 | ret = -EINVAL; | 2262 | ret = -EINVAL; |
2264 | if (ret < 0) | 2263 | if (ret < 0) |
@@ -2340,16 +2339,16 @@ ftrace_notrace_write(struct file *file, const char __user *ubuf, | |||
2340 | } | 2339 | } |
2341 | 2340 | ||
2342 | static void | 2341 | static void |
2343 | ftrace_set_regex(unsigned char *buf, int len, int reset, int enable) | 2342 | ftrace_set_regex(struct ftrace_hash *hash, unsigned char *buf, int len, int reset) |
2344 | { | 2343 | { |
2345 | if (unlikely(ftrace_disabled)) | 2344 | if (unlikely(ftrace_disabled)) |
2346 | return; | 2345 | return; |
2347 | 2346 | ||
2348 | mutex_lock(&ftrace_regex_lock); | 2347 | mutex_lock(&ftrace_regex_lock); |
2349 | if (reset) | 2348 | if (reset) |
2350 | ftrace_filter_reset(enable); | 2349 | ftrace_filter_reset(hash); |
2351 | if (buf) | 2350 | if (buf) |
2352 | ftrace_match_records(buf, len, enable); | 2351 | ftrace_match_records(hash, buf, len); |
2353 | mutex_unlock(&ftrace_regex_lock); | 2352 | mutex_unlock(&ftrace_regex_lock); |
2354 | } | 2353 | } |
2355 | 2354 | ||
@@ -2364,7 +2363,7 @@ ftrace_set_regex(unsigned char *buf, int len, int reset, int enable) | |||
2364 | */ | 2363 | */ |
2365 | void ftrace_set_filter(unsigned char *buf, int len, int reset) | 2364 | void ftrace_set_filter(unsigned char *buf, int len, int reset) |
2366 | { | 2365 | { |
2367 | ftrace_set_regex(buf, len, reset, 1); | 2366 | ftrace_set_regex(&filter_hash, buf, len, reset); |
2368 | } | 2367 | } |
2369 | 2368 | ||
2370 | /** | 2369 | /** |
@@ -2379,7 +2378,7 @@ void ftrace_set_filter(unsigned char *buf, int len, int reset) | |||
2379 | */ | 2378 | */ |
2380 | void ftrace_set_notrace(unsigned char *buf, int len, int reset) | 2379 | void ftrace_set_notrace(unsigned char *buf, int len, int reset) |
2381 | { | 2380 | { |
2382 | ftrace_set_regex(buf, len, reset, 0); | 2381 | ftrace_set_regex(¬race_hash, buf, len, reset); |
2383 | } | 2382 | } |
2384 | 2383 | ||
2385 | /* | 2384 | /* |
@@ -2431,22 +2430,22 @@ static void __init set_ftrace_early_graph(char *buf) | |||
2431 | } | 2430 | } |
2432 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 2431 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
2433 | 2432 | ||
2434 | static void __init set_ftrace_early_filter(char *buf, int enable) | 2433 | static void __init set_ftrace_early_filter(struct ftrace_hash *hash, char *buf) |
2435 | { | 2434 | { |
2436 | char *func; | 2435 | char *func; |
2437 | 2436 | ||
2438 | while (buf) { | 2437 | while (buf) { |
2439 | func = strsep(&buf, ","); | 2438 | func = strsep(&buf, ","); |
2440 | ftrace_set_regex(func, strlen(func), 0, enable); | 2439 | ftrace_set_regex(hash, func, strlen(func), 0); |
2441 | } | 2440 | } |
2442 | } | 2441 | } |
2443 | 2442 | ||
2444 | static void __init set_ftrace_early_filters(void) | 2443 | static void __init set_ftrace_early_filters(void) |
2445 | { | 2444 | { |
2446 | if (ftrace_filter_buf[0]) | 2445 | if (ftrace_filter_buf[0]) |
2447 | set_ftrace_early_filter(ftrace_filter_buf, 1); | 2446 | set_ftrace_early_filter(&filter_hash, ftrace_filter_buf); |
2448 | if (ftrace_notrace_buf[0]) | 2447 | if (ftrace_notrace_buf[0]) |
2449 | set_ftrace_early_filter(ftrace_notrace_buf, 0); | 2448 | set_ftrace_early_filter(¬race_hash, ftrace_notrace_buf); |
2450 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 2449 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
2451 | if (ftrace_graph_buf[0]) | 2450 | if (ftrace_graph_buf[0]) |
2452 | set_ftrace_early_graph(ftrace_graph_buf); | 2451 | set_ftrace_early_graph(ftrace_graph_buf); |
@@ -2454,7 +2453,7 @@ static void __init set_ftrace_early_filters(void) | |||
2454 | } | 2453 | } |
2455 | 2454 | ||
2456 | static int | 2455 | static int |
2457 | ftrace_regex_release(struct inode *inode, struct file *file, int enable) | 2456 | ftrace_regex_release(struct inode *inode, struct file *file) |
2458 | { | 2457 | { |
2459 | struct seq_file *m = (struct seq_file *)file->private_data; | 2458 | struct seq_file *m = (struct seq_file *)file->private_data; |
2460 | struct ftrace_iterator *iter; | 2459 | struct ftrace_iterator *iter; |
@@ -2471,7 +2470,7 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
2471 | parser = &iter->parser; | 2470 | parser = &iter->parser; |
2472 | if (trace_parser_loaded(parser)) { | 2471 | if (trace_parser_loaded(parser)) { |
2473 | parser->buffer[parser->idx] = 0; | 2472 | parser->buffer[parser->idx] = 0; |
2474 | ftrace_match_records(parser->buffer, parser->idx, enable); | 2473 | ftrace_match_records(iter->hash, parser->buffer, parser->idx); |
2475 | } | 2474 | } |
2476 | 2475 | ||
2477 | trace_parser_put(parser); | 2476 | trace_parser_put(parser); |
@@ -2488,18 +2487,6 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
2488 | return 0; | 2487 | return 0; |
2489 | } | 2488 | } |
2490 | 2489 | ||
2491 | static int | ||
2492 | ftrace_filter_release(struct inode *inode, struct file *file) | ||
2493 | { | ||
2494 | return ftrace_regex_release(inode, file, 1); | ||
2495 | } | ||
2496 | |||
2497 | static int | ||
2498 | ftrace_notrace_release(struct inode *inode, struct file *file) | ||
2499 | { | ||
2500 | return ftrace_regex_release(inode, file, 0); | ||
2501 | } | ||
2502 | |||
2503 | static const struct file_operations ftrace_avail_fops = { | 2490 | static const struct file_operations ftrace_avail_fops = { |
2504 | .open = ftrace_avail_open, | 2491 | .open = ftrace_avail_open, |
2505 | .read = seq_read, | 2492 | .read = seq_read, |
@@ -2512,7 +2499,7 @@ static const struct file_operations ftrace_filter_fops = { | |||
2512 | .read = seq_read, | 2499 | .read = seq_read, |
2513 | .write = ftrace_filter_write, | 2500 | .write = ftrace_filter_write, |
2514 | .llseek = ftrace_regex_lseek, | 2501 | .llseek = ftrace_regex_lseek, |
2515 | .release = ftrace_filter_release, | 2502 | .release = ftrace_regex_release, |
2516 | }; | 2503 | }; |
2517 | 2504 | ||
2518 | static const struct file_operations ftrace_notrace_fops = { | 2505 | static const struct file_operations ftrace_notrace_fops = { |
@@ -2520,7 +2507,7 @@ static const struct file_operations ftrace_notrace_fops = { | |||
2520 | .read = seq_read, | 2507 | .read = seq_read, |
2521 | .write = ftrace_notrace_write, | 2508 | .write = ftrace_notrace_write, |
2522 | .llseek = ftrace_regex_lseek, | 2509 | .llseek = ftrace_regex_lseek, |
2523 | .release = ftrace_notrace_release, | 2510 | .release = ftrace_regex_release, |
2524 | }; | 2511 | }; |
2525 | 2512 | ||
2526 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 2513 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |