diff options
-rw-r--r-- | kernel/trace/trace.c | 78 |
1 files changed, 70 insertions, 8 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 06380dc1ebe0..18f0ab88ca85 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -70,6 +70,23 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait); | |||
70 | 70 | ||
71 | unsigned long trace_flags = TRACE_ITER_PRINT_PARENT; | 71 | unsigned long trace_flags = TRACE_ITER_PRINT_PARENT; |
72 | 72 | ||
73 | /* | ||
74 | * Only trace on a CPU if the bitmask is set: | ||
75 | */ | ||
76 | static cpumask_t tracing_cpumask __read_mostly = CPU_MASK_ALL; | ||
77 | |||
78 | /* | ||
79 | * The tracer itself will not take this lock, but still we want | ||
80 | * to provide a consistent cpumask to user-space: | ||
81 | */ | ||
82 | static DEFINE_MUTEX(tracing_cpumask_update_lock); | ||
83 | |||
84 | /* | ||
85 | * Temporary storage for the character representation of the | ||
86 | * CPU bitmask: | ||
87 | */ | ||
88 | static char mask_str[NR_CPUS]; | ||
89 | |||
73 | void trace_wake_up(void) | 90 | void trace_wake_up(void) |
74 | { | 91 | { |
75 | /* | 92 | /* |
@@ -1754,9 +1771,49 @@ static struct file_operations tracing_lt_fops = { | |||
1754 | }; | 1771 | }; |
1755 | 1772 | ||
1756 | static struct file_operations show_traces_fops = { | 1773 | static struct file_operations show_traces_fops = { |
1757 | .open = show_traces_open, | 1774 | .open = show_traces_open, |
1758 | .read = seq_read, | 1775 | .read = seq_read, |
1759 | .release = seq_release, | 1776 | .release = seq_release, |
1777 | }; | ||
1778 | |||
1779 | static ssize_t | ||
1780 | tracing_cpumask_read(struct file *filp, char __user *ubuf, | ||
1781 | size_t count, loff_t *ppos) | ||
1782 | { | ||
1783 | int err; | ||
1784 | |||
1785 | count = min(count, (size_t)NR_CPUS); | ||
1786 | |||
1787 | mutex_lock(&tracing_cpumask_update_lock); | ||
1788 | cpumask_scnprintf(mask_str, NR_CPUS, tracing_cpumask); | ||
1789 | err = copy_to_user(ubuf, mask_str, count); | ||
1790 | if (err) | ||
1791 | count = -EFAULT; | ||
1792 | mutex_unlock(&tracing_cpumask_update_lock); | ||
1793 | |||
1794 | return count; | ||
1795 | } | ||
1796 | |||
1797 | static ssize_t | ||
1798 | tracing_cpumask_write(struct file *filp, const char __user *ubuf, | ||
1799 | size_t count, loff_t *ppos) | ||
1800 | { | ||
1801 | int err; | ||
1802 | |||
1803 | mutex_lock(&tracing_cpumask_update_lock); | ||
1804 | err = cpumask_parse_user(ubuf, count, tracing_cpumask); | ||
1805 | mutex_unlock(&tracing_cpumask_update_lock); | ||
1806 | |||
1807 | if (err) | ||
1808 | return err; | ||
1809 | |||
1810 | return count; | ||
1811 | } | ||
1812 | |||
1813 | static struct file_operations tracing_cpumask_fops = { | ||
1814 | .open = tracing_open_generic, | ||
1815 | .read = tracing_cpumask_read, | ||
1816 | .write = tracing_cpumask_write, | ||
1760 | }; | 1817 | }; |
1761 | 1818 | ||
1762 | static ssize_t | 1819 | static ssize_t |
@@ -1837,9 +1894,9 @@ tracing_iter_ctrl_write(struct file *filp, const char __user *ubuf, | |||
1837 | } | 1894 | } |
1838 | 1895 | ||
1839 | static struct file_operations tracing_iter_fops = { | 1896 | static struct file_operations tracing_iter_fops = { |
1840 | .open = tracing_open_generic, | 1897 | .open = tracing_open_generic, |
1841 | .read = tracing_iter_ctrl_read, | 1898 | .read = tracing_iter_ctrl_read, |
1842 | .write = tracing_iter_ctrl_write, | 1899 | .write = tracing_iter_ctrl_write, |
1843 | }; | 1900 | }; |
1844 | 1901 | ||
1845 | static const char readme_msg[] = | 1902 | static const char readme_msg[] = |
@@ -1870,8 +1927,8 @@ tracing_readme_read(struct file *filp, char __user *ubuf, | |||
1870 | } | 1927 | } |
1871 | 1928 | ||
1872 | static struct file_operations tracing_readme_fops = { | 1929 | static struct file_operations tracing_readme_fops = { |
1873 | .open = tracing_open_generic, | 1930 | .open = tracing_open_generic, |
1874 | .read = tracing_readme_read, | 1931 | .read = tracing_readme_read, |
1875 | }; | 1932 | }; |
1876 | 1933 | ||
1877 | static ssize_t | 1934 | static ssize_t |
@@ -2334,6 +2391,11 @@ static __init void tracer_init_debugfs(void) | |||
2334 | if (!entry) | 2391 | if (!entry) |
2335 | pr_warning("Could not create debugfs 'iter_ctrl' entry\n"); | 2392 | pr_warning("Could not create debugfs 'iter_ctrl' entry\n"); |
2336 | 2393 | ||
2394 | entry = debugfs_create_file("tracing_cpumask", 0644, d_tracer, | ||
2395 | NULL, &tracing_cpumask_fops); | ||
2396 | if (!entry) | ||
2397 | pr_warning("Could not create debugfs 'tracing_cpumask' entry\n"); | ||
2398 | |||
2337 | entry = debugfs_create_file("latency_trace", 0444, d_tracer, | 2399 | entry = debugfs_create_file("latency_trace", 0444, d_tracer, |
2338 | &global_trace, &tracing_lt_fops); | 2400 | &global_trace, &tracing_lt_fops); |
2339 | if (!entry) | 2401 | if (!entry) |