diff options
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index bf56c1d07df3..f82d92dbd614 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -1011,6 +1011,7 @@ static int subsystem_open(struct inode *inode, struct file *filp) | |||
1011 | int ret; | 1011 | int ret; |
1012 | 1012 | ||
1013 | /* Make sure the system still exists */ | 1013 | /* Make sure the system still exists */ |
1014 | mutex_lock(&trace_types_lock); | ||
1014 | mutex_lock(&event_mutex); | 1015 | mutex_lock(&event_mutex); |
1015 | list_for_each_entry(tr, &ftrace_trace_arrays, list) { | 1016 | list_for_each_entry(tr, &ftrace_trace_arrays, list) { |
1016 | list_for_each_entry(dir, &tr->systems, list) { | 1017 | list_for_each_entry(dir, &tr->systems, list) { |
@@ -1026,6 +1027,7 @@ static int subsystem_open(struct inode *inode, struct file *filp) | |||
1026 | } | 1027 | } |
1027 | exit_loop: | 1028 | exit_loop: |
1028 | mutex_unlock(&event_mutex); | 1029 | mutex_unlock(&event_mutex); |
1030 | mutex_unlock(&trace_types_lock); | ||
1029 | 1031 | ||
1030 | if (!system) | 1032 | if (!system) |
1031 | return -ENODEV; | 1033 | return -ENODEV; |
@@ -1620,6 +1622,7 @@ static void __add_event_to_tracers(struct ftrace_event_call *call, | |||
1620 | int trace_add_event_call(struct ftrace_event_call *call) | 1622 | int trace_add_event_call(struct ftrace_event_call *call) |
1621 | { | 1623 | { |
1622 | int ret; | 1624 | int ret; |
1625 | mutex_lock(&trace_types_lock); | ||
1623 | mutex_lock(&event_mutex); | 1626 | mutex_lock(&event_mutex); |
1624 | 1627 | ||
1625 | ret = __register_event(call, NULL); | 1628 | ret = __register_event(call, NULL); |
@@ -1627,11 +1630,13 @@ int trace_add_event_call(struct ftrace_event_call *call) | |||
1627 | __add_event_to_tracers(call, NULL); | 1630 | __add_event_to_tracers(call, NULL); |
1628 | 1631 | ||
1629 | mutex_unlock(&event_mutex); | 1632 | mutex_unlock(&event_mutex); |
1633 | mutex_unlock(&trace_types_lock); | ||
1630 | return ret; | 1634 | return ret; |
1631 | } | 1635 | } |
1632 | 1636 | ||
1633 | /* | 1637 | /* |
1634 | * Must be called under locking both of event_mutex and trace_event_sem. | 1638 | * Must be called under locking of trace_types_lock, event_mutex and |
1639 | * trace_event_sem. | ||
1635 | */ | 1640 | */ |
1636 | static void __trace_remove_event_call(struct ftrace_event_call *call) | 1641 | static void __trace_remove_event_call(struct ftrace_event_call *call) |
1637 | { | 1642 | { |
@@ -1643,11 +1648,13 @@ static void __trace_remove_event_call(struct ftrace_event_call *call) | |||
1643 | /* Remove an event_call */ | 1648 | /* Remove an event_call */ |
1644 | void trace_remove_event_call(struct ftrace_event_call *call) | 1649 | void trace_remove_event_call(struct ftrace_event_call *call) |
1645 | { | 1650 | { |
1651 | mutex_lock(&trace_types_lock); | ||
1646 | mutex_lock(&event_mutex); | 1652 | mutex_lock(&event_mutex); |
1647 | down_write(&trace_event_sem); | 1653 | down_write(&trace_event_sem); |
1648 | __trace_remove_event_call(call); | 1654 | __trace_remove_event_call(call); |
1649 | up_write(&trace_event_sem); | 1655 | up_write(&trace_event_sem); |
1650 | mutex_unlock(&event_mutex); | 1656 | mutex_unlock(&event_mutex); |
1657 | mutex_unlock(&trace_types_lock); | ||
1651 | } | 1658 | } |
1652 | 1659 | ||
1653 | #define for_each_event(event, start, end) \ | 1660 | #define for_each_event(event, start, end) \ |
@@ -1791,6 +1798,7 @@ static int trace_module_notify(struct notifier_block *self, | |||
1791 | { | 1798 | { |
1792 | struct module *mod = data; | 1799 | struct module *mod = data; |
1793 | 1800 | ||
1801 | mutex_lock(&trace_types_lock); | ||
1794 | mutex_lock(&event_mutex); | 1802 | mutex_lock(&event_mutex); |
1795 | switch (val) { | 1803 | switch (val) { |
1796 | case MODULE_STATE_COMING: | 1804 | case MODULE_STATE_COMING: |
@@ -1801,6 +1809,7 @@ static int trace_module_notify(struct notifier_block *self, | |||
1801 | break; | 1809 | break; |
1802 | } | 1810 | } |
1803 | mutex_unlock(&event_mutex); | 1811 | mutex_unlock(&event_mutex); |
1812 | mutex_unlock(&trace_types_lock); | ||
1804 | 1813 | ||
1805 | return 0; | 1814 | return 0; |
1806 | } | 1815 | } |