| @@ -965,7 +965,7 @@ void event_trigger_unregister(struct event_command *cmd_ops, · 964 unmodified lines |
| 965 | 965 | * @file: The trace_event_file associated with the event |
| 966 | 966 | * @glob: The raw string used to register the trigger |
| 967 | 967 | * @cmd: The cmd portion of the string used to register the trigger |
| 968 | | − * @param: The params portion of the string used to register the trigger |
| 968 | + * @param_and_filter: The param and filter portion of the string used to register the trigger |
| 969 | 969 | * |
| 970 | 970 | * Common implementation for event command parsing and trigger |
| 971 | 971 | * instantiation. |
| @@ -978,72 +978,39 @@ void event_trigger_unregister(struct event_command *cmd_ops, · 6 unmodified lines |
| 978 | 978 | static int |
| 979 | 979 | event_trigger_parse(struct event_command *cmd_ops, |
| 980 | 980 | struct trace_event_file *file, |
| 981 | | − char *glob, char *cmd, char *param) |
| 981 | + char *glob, char *cmd, char *param_and_filter) |
| 982 | 982 | { |
| 983 | 983 | struct event_trigger_data *trigger_data; |
| 984 | | − struct event_trigger_ops *trigger_ops; |
| 985 | | − char *trigger = NULL; |
| 986 | | − char *number; |
| 984 | + char *param, *filter; |
| 985 | + bool remove; |
| 987 | 986 | int ret; |
| 988 | 987 | |
| 989 | | − /* separate the trigger from the filter (t:n [if filter]) */ |
| 990 | | − if (param && isdigit(param[0])) { |
| 991 | | − trigger = strsep(¶m, " \t"); |
| 992 | | − if (param) { |
| 993 | | − param = skip_spaces(param); |
| 994 | | − if (!*param) |
| 995 | | − param = NULL; |
| 996 | | − } |
| 997 | | − } |
| 988 | + remove = event_trigger_check_remove(glob); |
| 998 | 989 | |
| 999 | | − trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); |
| 990 | + ret = event_trigger_separate_filter(param_and_filter, ¶m, &filter, false); |
| 991 | + if (ret) |
| 992 | + return ret; |
| 1000 | 993 | |
| 1001 | 994 | ret = -ENOMEM; |
| 1002 | | − trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); |
| 995 | + trigger_data = event_trigger_alloc(cmd_ops, cmd, param, file); |
| 1003 | 996 | if (!trigger_data) |
| 1004 | 997 | goto out; |
| 1005 | 998 | |
| 1006 | | − trigger_data->count = -1; |
| 1007 | | − trigger_data->ops = trigger_ops; |
| 1008 | | − trigger_data->cmd_ops = cmd_ops; |
| 1009 | | − trigger_data->private_data = file; |
| 1010 | | − INIT_LIST_HEAD(&trigger_data->list); |
| 1011 | | − INIT_LIST_HEAD(&trigger_data->named_list); |
| 1012 | | − |
| 1013 | | − if (glob[0] == '!') { |
| 999 | + if (remove) { |
| 1014 | 1000 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); |
| 1015 | 1001 | kfree(trigger_data); |
| 1016 | 1002 | ret = 0; |
| 1017 | 1003 | goto out; |
| 1018 | 1004 | } |
| 1019 | 1005 | |
| 1020 | | − if (trigger) { |
| 1021 | | − number = strsep(&trigger, ":"); |
| 1022 | | − |
| 1023 | | − ret = -EINVAL; |
| 1024 | | − if (!strlen(number)) |
| 1025 | | − goto out_free; |
| 1026 | | − |
| 1027 | | − /* |
| 1028 | | − * We use the callback data field (which is a pointer) |
| 1029 | | − * as our counter. |
| 1030 | | − */ |
| 1031 | | − ret = kstrtoul(number, 0, &trigger_data->count); |
| 1032 | | − if (ret) |
| 1033 | | − goto out_free; |
| 1034 | | − } |
| 1035 | | − |
| 1036 | | − if (!param) /* if param is non-empty, it's supposed to be a filter */ |
| 1037 | | − goto out_reg; |
| 1038 | | − |
| 1039 | | − if (!cmd_ops->set_filter) |
| 1040 | | − goto out_reg; |
| 1006 | + ret = event_trigger_parse_num(param, trigger_data); |
| 1007 | + if (ret) |
| 1008 | + goto out_free; |
| 1041 | 1009 | |
| 1042 | | − ret = cmd_ops->set_filter(param, trigger_data, file); |
| 1010 | + ret = event_trigger_set_filter(cmd_ops, file, filter, trigger_data); |
| 1043 | 1011 | if (ret < 0) |
| 1044 | 1012 | goto out_free; |
| 1045 | 1013 | |
| 1046 | | − out_reg: |
| 1047 | 1014 | /* Up the trigger_data count to make sure reg doesn't free it on failure */ |
| 1048 | 1015 | event_trigger_init(trigger_data); |
| 1049 | 1016 | |
| @@ -1057,8 +1024,7 @@ event_trigger_parse(struct event_command *cmd_ops, · 7 unmodified lines |
| 1057 | 1024 | return ret; |
| 1058 | 1025 | |
| 1059 | 1026 | out_free: |
| 1060 | | − if (cmd_ops->set_filter) |
| 1061 | | − cmd_ops->set_filter(NULL, trigger_data, NULL); |
| 1027 | + event_trigger_reset_filter(cmd_ops, trigger_data); |
| 1062 | 1028 | kfree(trigger_data); |
| 1063 | 1029 | goto out; |
| 1064 | 1030 | } |
| @@ -1752,39 +1718,33 @@ static struct event_trigger_ops event_disable_count_trigger_ops = { · 687 unmodified lines |
| 1752 | 1718 | |
| 1753 | 1719 | int event_enable_trigger_parse(struct event_command *cmd_ops, |
| 1754 | 1720 | struct trace_event_file *file, |
| 1755 | | − char *glob, char *cmd, char *param) |
| 1721 | + char *glob, char *cmd, char *param_and_filter) |
| 1756 | 1722 | { |
| 1757 | 1723 | struct trace_event_file *event_enable_file; |
| 1758 | 1724 | struct enable_trigger_data *enable_data; |
| 1759 | 1725 | struct event_trigger_data *trigger_data; |
| 1760 | | − struct event_trigger_ops *trigger_ops; |
| 1761 | 1726 | struct trace_array *tr = file->tr; |
| 1727 | + char *param, *filter; |
| 1728 | + bool enable, remove; |
| 1762 | 1729 | const char *system; |
| 1763 | 1730 | const char *event; |
| 1764 | 1731 | bool hist = false; |
| 1765 | | − char *trigger; |
| 1766 | | − char *number; |
| 1767 | | − bool enable; |
| 1768 | 1732 | int ret; |
| 1769 | 1733 | |
| 1770 | | − if (!param) |
| 1771 | | − return -EINVAL; |
| 1734 | + remove = event_trigger_check_remove(glob); |
| 1772 | 1735 | |
| 1773 | | − /* separate the trigger from the filter (s:e:n [if filter]) */ |
| 1774 | | − trigger = strsep(¶m, " \t"); |
| 1775 | | − if (!trigger) |
| 1736 | + if (event_trigger_empty_param(param_and_filter)) |
| 1776 | 1737 | return -EINVAL; |
| 1777 | | − if (param) { |
| 1778 | | − param = skip_spaces(param); |
| 1779 | | − if (!*param) |
| 1780 | | − param = NULL; |
| 1781 | | − } |
| 1782 | 1738 | |
| 1783 | | − system = strsep(&trigger, ":"); |
| 1784 | | − if (!trigger) |
| 1739 | + ret = event_trigger_separate_filter(param_and_filter, ¶m, &filter, true); |
| 1740 | + if (ret) |
| 1741 | + return ret; |
| 1742 | + |
| 1743 | + system = strsep(¶m, ":"); |
| 1744 | + if (!param) |
| 1785 | 1745 | return -EINVAL; |
| 1786 | 1746 | |
| 1787 | | − event = strsep(&trigger, ":"); |
| 1747 | + event = strsep(¶m, ":"); |
| 1788 | 1748 | |
| 1789 | 1749 | ret = -EINVAL; |
| 1790 | 1750 | event_enable_file = find_event_file(tr, system, event); |
| @@ -1800,31 +1760,23 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, · 9 unmodified lines |
| 1800 | 1760 | #else |
| 1801 | 1761 | enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; |
| 1802 | 1762 | #endif |
| 1803 | | − trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); |
| 1804 | | − |
| 1805 | 1763 | ret = -ENOMEM; |
| 1806 | | − trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); |
| 1807 | | − if (!trigger_data) |
| 1808 | | − goto out; |
| 1809 | 1764 | |
| 1810 | 1765 | enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL); |
| 1811 | | − if (!enable_data) { |
| 1812 | | − kfree(trigger_data); |
| 1766 | + if (!enable_data) |
| 1813 | 1767 | goto out; |
| 1814 | | − } |
| 1815 | | − |
| 1816 | | − trigger_data->count = -1; |
| 1817 | | − trigger_data->ops = trigger_ops; |
| 1818 | | − trigger_data->cmd_ops = cmd_ops; |
| 1819 | | − INIT_LIST_HEAD(&trigger_data->list); |
| 1820 | | − RCU_INIT_POINTER(trigger_data->filter, NULL); |
| 1821 | 1768 | |
| 1822 | 1769 | enable_data->hist = hist; |
| 1823 | 1770 | enable_data->enable = enable; |
| 1824 | 1771 | enable_data->file = event_enable_file; |
| 1825 | | − trigger_data->private_data = enable_data; |
| 1826 | 1772 | |
| 1827 | | − if (glob[0] == '!') { |
| 1773 | + trigger_data = event_trigger_alloc(cmd_ops, cmd, param, enable_data); |
| 1774 | + if (!trigger_data) { |
| 1775 | + kfree(enable_data); |
| 1776 | + goto out; |
| 1777 | + } |
| 1778 | + |
| 1779 | + if (remove) { |
| 1828 | 1780 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); |
| 1829 | 1781 | kfree(trigger_data); |
| 1830 | 1782 | kfree(enable_data); |
| @@ -1835,33 +1787,14 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, · 4 unmodified lines |
| 1835 | 1787 | /* Up the trigger_data count to make sure nothing frees it on failure */ |
| 1836 | 1788 | event_trigger_init(trigger_data); |
| 1837 | 1789 | |
| 1838 | | − if (trigger) { |
| 1839 | | − number = strsep(&trigger, ":"); |
| 1840 | | − |
| 1841 | | − ret = -EINVAL; |
| 1842 | | − if (!strlen(number)) |
| 1843 | | − goto out_free; |
| 1844 | | − |
| 1845 | | − /* |
| 1846 | | − * We use the callback data field (which is a pointer) |
| 1847 | | − * as our counter. |
| 1848 | | − */ |
| 1849 | | − ret = kstrtoul(number, 0, &trigger_data->count); |
| 1850 | | − if (ret) |
| 1851 | | − goto out_free; |
| 1852 | | − } |
| 1853 | | − |
| 1854 | | − if (!param) /* if param is non-empty, it's supposed to be a filter */ |
| 1855 | | − goto out_reg; |
| 1856 | | − |
| 1857 | | − if (!cmd_ops->set_filter) |
| 1858 | | − goto out_reg; |
| 1790 | + ret = event_trigger_parse_num(param, trigger_data); |
| 1791 | + if (ret) |
| 1792 | + goto out_free; |
| 1859 | 1793 | |
| 1860 | | − ret = cmd_ops->set_filter(param, trigger_data, file); |
| 1794 | + ret = event_trigger_set_filter(cmd_ops, file, filter, trigger_data); |
| 1861 | 1795 | if (ret < 0) |
| 1862 | 1796 | goto out_free; |
| 1863 | 1797 | |
| 1864 | | − out_reg: |
| 1865 | 1798 | /* Don't let event modules unload while probe registered */ |
| 1866 | 1799 | ret = trace_event_try_get_ref(event_enable_file->event_call); |
| 1867 | 1800 | if (!ret) { |
| @@ -1880,16 +1813,15 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, · 12 unmodified lines |
| 1880 | 1813 | event_trigger_free(trigger_data); |
| 1881 | 1814 | out: |
| 1882 | 1815 | return ret; |
| 1883 | | − |
| 1884 | 1816 | out_disable: |
| 1885 | 1817 | trace_event_enable_disable(event_enable_file, 0, 1); |
| 1886 | 1818 | out_put: |
| 1887 | 1819 | trace_event_put_ref(event_enable_file->event_call); |
| 1888 | 1820 | out_free: |
| 1889 | | − if (cmd_ops->set_filter) |
| 1890 | | − cmd_ops->set_filter(NULL, trigger_data, NULL); |
| 1821 | + event_trigger_reset_filter(cmd_ops, trigger_data); |
| 1891 | 1822 | event_trigger_free(trigger_data); |
| 1892 | 1823 | kfree(enable_data); |
| 1824 | + |
| 1893 | 1825 | goto out; |
| 1894 | 1826 | } |
| 1895 | 1827 | |