Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing: Factorize filter creation

There are four places where new filter for a given filter string is
created, which involves several different steps. This patch factors
those steps into create_[system_]filter() functions which in turn make
use of create_filter_{start|finish}() for common parts.

The only functional change is that if replace_filter_string() is
requested and fails, creation fails without any side effect instead of
being ignored.

Note that system filter is now installed after the processing is
complete which makes freeing before and then restoring filter string
on error unncessary.

-v2: Rebased to resolve conflict with 49aa29513e and updated both
create_filter() functions to always set *filterp instead of
requiring the caller to clear it to %NULL on entry.

Link: http://lkml.kernel.org/r/1323988305-1469-2-git-send-email-tj@kernel.org

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

authored by

Tejun Heo and committed by
Steven Rostedt
38b78eb8 762e1207

+142 -141
+142 -141
kernel/trace/trace_events_filter.c
··· 1738 1738 return -ENOMEM; 1739 1739 } 1740 1740 1741 + static int create_filter_start(char *filter_str, bool set_str, 1742 + struct filter_parse_state **psp, 1743 + struct event_filter **filterp) 1744 + { 1745 + struct event_filter *filter; 1746 + struct filter_parse_state *ps = NULL; 1747 + int err = 0; 1748 + 1749 + WARN_ON_ONCE(*psp || *filterp); 1750 + 1751 + /* allocate everything, and if any fails, free all and fail */ 1752 + filter = __alloc_filter(); 1753 + if (filter && set_str) 1754 + err = replace_filter_string(filter, filter_str); 1755 + 1756 + ps = kzalloc(sizeof(*ps), GFP_KERNEL); 1757 + 1758 + if (!filter || !ps || err) { 1759 + kfree(ps); 1760 + __free_filter(filter); 1761 + return -ENOMEM; 1762 + } 1763 + 1764 + /* we're committed to creating a new filter */ 1765 + *filterp = filter; 1766 + *psp = ps; 1767 + 1768 + parse_init(ps, filter_ops, filter_str); 1769 + err = filter_parse(ps); 1770 + if (err && set_str) 1771 + append_filter_err(ps, filter); 1772 + return err; 1773 + } 1774 + 1775 + static void create_filter_finish(struct filter_parse_state *ps) 1776 + { 1777 + if (ps) { 1778 + filter_opstack_clear(ps); 1779 + postfix_clear(ps); 1780 + kfree(ps); 1781 + } 1782 + } 1783 + 1784 + /** 1785 + * create_filter - create a filter for a ftrace_event_call 1786 + * @call: ftrace_event_call to create a filter for 1787 + * @filter_str: filter string 1788 + * @set_str: remember @filter_str and enable detailed error in filter 1789 + * @filterp: out param for created filter (always updated on return) 1790 + * 1791 + * Creates a filter for @call with @filter_str. If @set_str is %true, 1792 + * @filter_str is copied and recorded in the new filter. 1793 + * 1794 + * On success, returns 0 and *@filterp points to the new filter. On 1795 + * failure, returns -errno and *@filterp may point to %NULL or to a new 1796 + * filter. In the latter case, the returned filter contains error 1797 + * information if @set_str is %true and the caller is responsible for 1798 + * freeing it. 1799 + */ 1800 + static int create_filter(struct ftrace_event_call *call, 1801 + char *filter_str, bool set_str, 1802 + struct event_filter **filterp) 1803 + { 1804 + struct event_filter *filter = NULL; 1805 + struct filter_parse_state *ps = NULL; 1806 + int err; 1807 + 1808 + err = create_filter_start(filter_str, set_str, &ps, &filter); 1809 + if (!err) { 1810 + err = replace_preds(call, filter, ps, filter_str, false); 1811 + if (err && set_str) 1812 + append_filter_err(ps, filter); 1813 + } 1814 + create_filter_finish(ps); 1815 + 1816 + *filterp = filter; 1817 + return err; 1818 + } 1819 + 1820 + /** 1821 + * create_system_filter - create a filter for an event_subsystem 1822 + * @system: event_subsystem to create a filter for 1823 + * @filter_str: filter string 1824 + * @filterp: out param for created filter (always updated on return) 1825 + * 1826 + * Identical to create_filter() except that it creates a subsystem filter 1827 + * and always remembers @filter_str. 1828 + */ 1829 + static int create_system_filter(struct event_subsystem *system, 1830 + char *filter_str, struct event_filter **filterp) 1831 + { 1832 + struct event_filter *filter = NULL; 1833 + struct filter_parse_state *ps = NULL; 1834 + int err; 1835 + 1836 + err = create_filter_start(filter_str, true, &ps, &filter); 1837 + if (!err) { 1838 + err = replace_system_preds(system, ps, filter_str); 1839 + if (!err) { 1840 + /* System filters just show a default message */ 1841 + kfree(filter->filter_string); 1842 + filter->filter_string = NULL; 1843 + } else { 1844 + append_filter_err(ps, filter); 1845 + } 1846 + } 1847 + create_filter_finish(ps); 1848 + 1849 + *filterp = filter; 1850 + return err; 1851 + } 1852 + 1741 1853 int apply_event_filter(struct ftrace_event_call *call, char *filter_string) 1742 1854 { 1743 - struct filter_parse_state *ps; 1744 1855 struct event_filter *filter; 1745 - struct event_filter *tmp; 1746 1856 int err = 0; 1747 1857 1748 1858 mutex_lock(&event_mutex); ··· 1869 1759 goto out_unlock; 1870 1760 } 1871 1761 1872 - err = -ENOMEM; 1873 - ps = kzalloc(sizeof(*ps), GFP_KERNEL); 1874 - if (!ps) 1875 - goto out_unlock; 1762 + err = create_filter(call, filter_string, true, &filter); 1876 1763 1877 - filter = __alloc_filter(); 1878 - if (!filter) { 1879 - kfree(ps); 1880 - goto out_unlock; 1881 - } 1882 - 1883 - replace_filter_string(filter, filter_string); 1884 - 1885 - parse_init(ps, filter_ops, filter_string); 1886 - err = filter_parse(ps); 1887 - if (err) { 1888 - append_filter_err(ps, filter); 1889 - goto out; 1890 - } 1891 - 1892 - err = replace_preds(call, filter, ps, filter_string, false); 1893 - if (err) { 1894 - filter_disable(call); 1895 - append_filter_err(ps, filter); 1896 - } else 1897 - call->flags |= TRACE_EVENT_FL_FILTERED; 1898 - out: 1899 1764 /* 1900 1765 * Always swap the call filter with the new filter 1901 1766 * even if there was an error. If there was an error 1902 1767 * in the filter, we disable the filter and show the error 1903 1768 * string 1904 1769 */ 1905 - tmp = call->filter; 1906 - rcu_assign_pointer(call->filter, filter); 1907 - if (tmp) { 1908 - /* Make sure the call is done with the filter */ 1909 - synchronize_sched(); 1910 - __free_filter(tmp); 1770 + if (filter) { 1771 + struct event_filter *tmp = call->filter; 1772 + 1773 + if (!err) 1774 + call->flags |= TRACE_EVENT_FL_FILTERED; 1775 + else 1776 + filter_disable(call); 1777 + 1778 + rcu_assign_pointer(call->filter, filter); 1779 + 1780 + if (tmp) { 1781 + /* Make sure the call is done with the filter */ 1782 + synchronize_sched(); 1783 + __free_filter(tmp); 1784 + } 1911 1785 } 1912 - filter_opstack_clear(ps); 1913 - postfix_clear(ps); 1914 - kfree(ps); 1915 1786 out_unlock: 1916 1787 mutex_unlock(&event_mutex); 1917 1788 ··· 1902 1811 int apply_subsystem_event_filter(struct event_subsystem *system, 1903 1812 char *filter_string) 1904 1813 { 1905 - struct filter_parse_state *ps; 1906 1814 struct event_filter *filter; 1907 1815 int err = 0; 1908 1816 ··· 1925 1835 goto out_unlock; 1926 1836 } 1927 1837 1928 - err = -ENOMEM; 1929 - ps = kzalloc(sizeof(*ps), GFP_KERNEL); 1930 - if (!ps) 1931 - goto out_unlock; 1932 - 1933 - filter = __alloc_filter(); 1934 - if (!filter) 1935 - goto out; 1936 - 1937 - /* System filters just show a default message */ 1938 - kfree(filter->filter_string); 1939 - filter->filter_string = NULL; 1940 - 1941 - /* 1942 - * No event actually uses the system filter 1943 - * we can free it without synchronize_sched(). 1944 - */ 1945 - __free_filter(system->filter); 1946 - system->filter = filter; 1947 - 1948 - parse_init(ps, filter_ops, filter_string); 1949 - err = filter_parse(ps); 1950 - if (err) 1951 - goto err_filter; 1952 - 1953 - err = replace_system_preds(system, ps, filter_string); 1954 - if (err) 1955 - goto err_filter; 1956 - 1957 - out: 1958 - filter_opstack_clear(ps); 1959 - postfix_clear(ps); 1960 - kfree(ps); 1838 + err = create_system_filter(system, filter_string, &filter); 1839 + if (filter) { 1840 + /* 1841 + * No event actually uses the system filter 1842 + * we can free it without synchronize_sched(). 1843 + */ 1844 + __free_filter(system->filter); 1845 + system->filter = filter; 1846 + } 1961 1847 out_unlock: 1962 1848 mutex_unlock(&event_mutex); 1963 1849 1964 1850 return err; 1965 - 1966 - err_filter: 1967 - replace_filter_string(filter, filter_string); 1968 - append_filter_err(ps, system->filter); 1969 - goto out; 1970 1851 } 1971 1852 1972 1853 #ifdef CONFIG_PERF_EVENTS ··· 1955 1894 { 1956 1895 int err; 1957 1896 struct event_filter *filter; 1958 - struct filter_parse_state *ps; 1959 1897 struct ftrace_event_call *call; 1960 1898 1961 1899 mutex_lock(&event_mutex); ··· 1969 1909 if (event->filter) 1970 1910 goto out_unlock; 1971 1911 1972 - filter = __alloc_filter(); 1973 - if (!filter) { 1974 - err = PTR_ERR(filter); 1975 - goto out_unlock; 1976 - } 1977 - 1978 - err = -ENOMEM; 1979 - ps = kzalloc(sizeof(*ps), GFP_KERNEL); 1980 - if (!ps) 1981 - goto free_filter; 1982 - 1983 - parse_init(ps, filter_ops, filter_str); 1984 - err = filter_parse(ps); 1985 - if (err) 1986 - goto free_ps; 1987 - 1988 - err = replace_preds(call, filter, ps, filter_str, false); 1912 + err = create_filter(call, filter_str, false, &filter); 1989 1913 if (!err) 1990 1914 event->filter = filter; 1991 - 1992 - free_ps: 1993 - filter_opstack_clear(ps); 1994 - postfix_clear(ps); 1995 - kfree(ps); 1996 - 1997 - free_filter: 1998 - if (err) 1915 + else 1999 1916 __free_filter(filter); 2000 1917 2001 1918 out_unlock: ··· 1990 1953 1991 1954 #define CREATE_TRACE_POINTS 1992 1955 #include "trace_events_filter_test.h" 1993 - 1994 - static int test_get_filter(char *filter_str, struct ftrace_event_call *call, 1995 - struct event_filter **pfilter) 1996 - { 1997 - struct event_filter *filter; 1998 - struct filter_parse_state *ps; 1999 - int err = -ENOMEM; 2000 - 2001 - filter = __alloc_filter(); 2002 - if (!filter) 2003 - goto out; 2004 - 2005 - ps = kzalloc(sizeof(*ps), GFP_KERNEL); 2006 - if (!ps) 2007 - goto free_filter; 2008 - 2009 - parse_init(ps, filter_ops, filter_str); 2010 - err = filter_parse(ps); 2011 - if (err) 2012 - goto free_ps; 2013 - 2014 - err = replace_preds(call, filter, ps, filter_str, false); 2015 - if (!err) 2016 - *pfilter = filter; 2017 - 2018 - free_ps: 2019 - filter_opstack_clear(ps); 2020 - postfix_clear(ps); 2021 - kfree(ps); 2022 - 2023 - free_filter: 2024 - if (err) 2025 - __free_filter(filter); 2026 - 2027 - out: 2028 - return err; 2029 - } 2030 1956 2031 1957 #define DATA_REC(m, va, vb, vc, vd, ve, vf, vg, vh, nvisit) \ 2032 1958 { \ ··· 2109 2109 struct test_filter_data_t *d = &test_filter_data[i]; 2110 2110 int err; 2111 2111 2112 - err = test_get_filter(d->filter, &event_ftrace_test_filter, 2113 - &filter); 2112 + err = create_filter(&event_ftrace_test_filter, d->filter, 2113 + false, &filter); 2114 2114 if (err) { 2115 2115 printk(KERN_INFO 2116 2116 "Failed to get filter for '%s', err %d\n", 2117 2117 d->filter, err); 2118 + __free_filter(filter); 2118 2119 break; 2119 2120 } 2120 2121