| @@ -965,7 +965,7 @@ void event_trigger_unregister(struct event_command *cmd_ops, · 964 unmodified lines |
| 965 | * @file: The trace_event_file associated with the event | 965 | * @file: The trace_event_file associated with the event |
| 966 | * @glob: The raw string used to register the trigger | 966 | * @glob: The raw string used to register the trigger |
| 967 | * @cmd: The cmd portion of the string used to register the trigger | 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 | * Common implementation for event command parsing and trigger | 970 | * Common implementation for event command parsing and trigger |
| 971 | * instantiation. | 971 | * instantiation. |
| @@ -978,72 +978,39 @@ void event_trigger_unregister(struct event_command *cmd_ops, · 6 unmodified lines |
| 978 | static int | 978 | static int |
| 979 | event_trigger_parse(struct event_command *cmd_ops, | 979 | event_trigger_parse(struct event_command *cmd_ops, |
| 980 | struct trace_event_file *file, | 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 | struct event_trigger_data *trigger_data; | 983 | struct event_trigger_data *trigger_data; |
| 984 | struct event_trigger_ops *trigger_ops; | 984 | char *param, *filter; |
| 985 | char *trigger = NULL; | 985 | bool remove; |
| 986 | char *number; | | |
| 987 | int ret; | 986 | int ret; |
| 988 | | 987 | |
| 989 | /* separate the trigger from the filter (t:n [if filter]) */ | 988 | remove = event_trigger_check_remove(glob); |
| 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 | } | | |
| 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 | ret = -ENOMEM; | 994 | ret = -ENOMEM; |
| 1002 | trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); | 995 | trigger_data = event_trigger_alloc(cmd_ops, cmd, param, file); |
| 1003 | if (!trigger_data) | 996 | if (!trigger_data) |
| 1004 | goto out; | 997 | goto out; |
| 1005 | | 998 | |
| 1006 | trigger_data->count = -1; | 999 | if (remove) { |
| 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] == '!') { | | |
| 1014 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); | 1000 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); |
| 1015 | kfree(trigger_data); | 1001 | kfree(trigger_data); |
| 1016 | ret = 0; | 1002 | ret = 0; |
| 1017 | goto out; | 1003 | goto out; |
| 1018 | } | 1004 | } |
| 1019 | | 1005 | |
| 1020 | if (trigger) { | 1006 | ret = event_trigger_parse_num(param, trigger_data); |
| 1021 | number = strsep(&trigger, ":"); | 1007 | if (ret) |
| 1022 | | 1008 | goto out_free; |
| 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; | | |
| 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 | if (ret < 0) | 1011 | if (ret < 0) |
| 1044 | goto out_free; | 1012 | goto out_free; |
| 1045 | | 1013 | |
| 1046 | out_reg: | | |
| 1047 | /* Up the trigger_data count to make sure reg doesn't free it on failure */ | 1014 | /* Up the trigger_data count to make sure reg doesn't free it on failure */ |
| 1048 | event_trigger_init(trigger_data); | 1015 | event_trigger_init(trigger_data); |
| 1049 | | 1016 | |
| @@ -1057,8 +1024,7 @@ event_trigger_parse(struct event_command *cmd_ops, · 7 unmodified lines |
| 1057 | return ret; | 1024 | return ret; |
| 1058 | | 1025 | |
| 1059 | out_free: | 1026 | out_free: |
| 1060 | if (cmd_ops->set_filter) | 1027 | event_trigger_reset_filter(cmd_ops, trigger_data); |
| 1061 | cmd_ops->set_filter(NULL, trigger_data, NULL); | | |
| 1062 | kfree(trigger_data); | 1028 | kfree(trigger_data); |
| 1063 | goto out; | 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 | int event_enable_trigger_parse(struct event_command *cmd_ops, | 1719 | int event_enable_trigger_parse(struct event_command *cmd_ops, |
| 1754 | struct trace_event_file *file, | 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 | struct trace_event_file *event_enable_file; | 1723 | struct trace_event_file *event_enable_file; |
| 1758 | struct enable_trigger_data *enable_data; | 1724 | struct enable_trigger_data *enable_data; |
| 1759 | struct event_trigger_data *trigger_data; | 1725 | struct event_trigger_data *trigger_data; |
| 1760 | struct event_trigger_ops *trigger_ops; | | |
| 1761 | struct trace_array *tr = file->tr; | 1726 | struct trace_array *tr = file->tr; |
| | 1727 | char *param, *filter; |
| | 1728 | bool enable, remove; |
| 1762 | const char *system; | 1729 | const char *system; |
| 1763 | const char *event; | 1730 | const char *event; |
| 1764 | bool hist = false; | 1731 | bool hist = false; |
| 1765 | char *trigger; | | |
| 1766 | char *number; | | |
| 1767 | bool enable; | | |
| 1768 | int ret; | 1732 | int ret; |
| 1769 | | 1733 | |
| 1770 | if (!param) | 1734 | remove = event_trigger_check_remove(glob); |
| 1771 | return -EINVAL; | | |
| 1772 | | 1735 | |
| 1773 | /* separate the trigger from the filter (s:e:n [if filter]) */ | 1736 | if (event_trigger_empty_param(param_and_filter)) |
| 1774 | trigger = strsep(¶m, " \t"); | | |
| 1775 | if (!trigger) | | |
| 1776 | return -EINVAL; | 1737 | return -EINVAL; |
| 1777 | if (param) { | | |
| 1778 | param = skip_spaces(param); | | |
| 1779 | if (!*param) | | |
| 1780 | param = NULL; | | |
| 1781 | } | | |
| 1782 | | 1738 | |
| 1783 | system = strsep(&trigger, ":"); | 1739 | ret = event_trigger_separate_filter(param_and_filter, ¶m, &filter, true); |
| 1784 | if (!trigger) | 1740 | if (ret) |
| | 1741 | return ret; |
| | 1742 | |
| | 1743 | system = strsep(¶m, ":"); |
| | 1744 | if (!param) |
| 1785 | return -EINVAL; | 1745 | return -EINVAL; |
| 1786 | | 1746 | |
| 1787 | event = strsep(&trigger, ":"); | 1747 | event = strsep(¶m, ":"); |
| 1788 | | 1748 | |
| 1789 | ret = -EINVAL; | 1749 | ret = -EINVAL; |
| 1790 | event_enable_file = find_event_file(tr, system, event); | 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 | #else | 1760 | #else |
| 1801 | enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; | 1761 | enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; |
| 1802 | #endif | 1762 | #endif |
| 1803 | trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); | | |
| 1804 | | | |
| 1805 | ret = -ENOMEM; | 1763 | ret = -ENOMEM; |
| 1806 | trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); | | |
| 1807 | if (!trigger_data) | | |
| 1808 | goto out; | | |
| 1809 | | 1764 | |
| 1810 | enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL); | 1765 | enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL); |
| 1811 | if (!enable_data) { | 1766 | if (!enable_data) |
| 1812 | kfree(trigger_data); | | |
| 1813 | goto out; | 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 | enable_data->hist = hist; | 1769 | enable_data->hist = hist; |
| 1823 | enable_data->enable = enable; | 1770 | enable_data->enable = enable; |
| 1824 | enable_data->file = event_enable_file; | 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 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); | 1780 | event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); |
| 1829 | kfree(trigger_data); | 1781 | kfree(trigger_data); |
| 1830 | kfree(enable_data); | 1782 | kfree(enable_data); |
| @@ -1835,33 +1787,14 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, · 4 unmodified lines |
| 1835 | /* Up the trigger_data count to make sure nothing frees it on failure */ | 1787 | /* Up the trigger_data count to make sure nothing frees it on failure */ |
| 1836 | event_trigger_init(trigger_data); | 1788 | event_trigger_init(trigger_data); |
| 1837 | | 1789 | |
| 1838 | if (trigger) { | 1790 | ret = event_trigger_parse_num(param, trigger_data); |
| 1839 | number = strsep(&trigger, ":"); | 1791 | if (ret) |
| 1840 | | 1792 | goto out_free; |
| 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; | | |
| 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 | if (ret < 0) | 1795 | if (ret < 0) |
| 1862 | goto out_free; | 1796 | goto out_free; |
| 1863 | | 1797 | |
| 1864 | out_reg: | | |
| 1865 | /* Don't let event modules unload while probe registered */ | 1798 | /* Don't let event modules unload while probe registered */ |
| 1866 | ret = trace_event_try_get_ref(event_enable_file->event_call); | 1799 | ret = trace_event_try_get_ref(event_enable_file->event_call); |
| 1867 | if (!ret) { | 1800 | if (!ret) { |
| @@ -1880,16 +1813,15 @@ int event_enable_trigger_parse(struct event_command *cmd_ops, · 12 unmodified lines |
| 1880 | event_trigger_free(trigger_data); | 1813 | event_trigger_free(trigger_data); |
| 1881 | out: | 1814 | out: |
| 1882 | return ret; | 1815 | return ret; |
| 1883 | | | |
| 1884 | out_disable: | 1816 | out_disable: |
| 1885 | trace_event_enable_disable(event_enable_file, 0, 1); | 1817 | trace_event_enable_disable(event_enable_file, 0, 1); |
| 1886 | out_put: | 1818 | out_put: |
| 1887 | trace_event_put_ref(event_enable_file->event_call); | 1819 | trace_event_put_ref(event_enable_file->event_call); |
| 1888 | out_free: | 1820 | out_free: |
| 1889 | if (cmd_ops->set_filter) | 1821 | event_trigger_reset_filter(cmd_ops, trigger_data); |
| 1890 | cmd_ops->set_filter(NULL, trigger_data, NULL); | | |
| 1891 | event_trigger_free(trigger_data); | 1822 | event_trigger_free(trigger_data); |
| 1892 | kfree(enable_data); | 1823 | kfree(enable_data); |
| | 1824 | |
| 1893 | goto out; | 1825 | goto out; |
| 1894 | } | 1826 | } |
| 1895 | | 1827 | |