diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 489c0e8ada0..7136420603a 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -14,7 +14,7 @@  /* must be a power of 2 */  #define EVENT_HASHSIZE	128 -static DEFINE_MUTEX(trace_event_mutex); +static DECLARE_RWSEM(trace_event_mutex);  static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;  static int next_event_type = __TRACE_LAST_TYPE + 1; @@ -466,6 +466,7 @@ static int task_state_char(unsigned long state)   * @type: the type of event to look for   *   * Returns an event of type @type otherwise NULL + * Called with trace_event_read_lock() held.   */  struct trace_event *ftrace_find_event(int type)  { @@ -475,7 +476,7 @@ struct trace_event *ftrace_find_event(int type)  	key = type & (EVENT_HASHSIZE - 1); -	hlist_for_each_entry_rcu(event, n, &event_hash[key], node) { +	hlist_for_each_entry(event, n, &event_hash[key], node) {  		if (event->type == type)  			return event;  	} @@ -513,6 +514,16 @@ static int trace_search_list(struct list_head **list)  	return last + 1;  } +void trace_event_read_lock(void) +{ +	down_read(&trace_event_mutex); +} + +void trace_event_read_unlock(void) +{ +	up_read(&trace_event_mutex); +} +  /**   * register_ftrace_event - register output for an event type   * @event: the event type to register @@ -533,7 +544,7 @@ int register_ftrace_event(struct trace_event *event)  	unsigned key;  	int ret = 0; -	mutex_lock(&trace_event_mutex); +	down_write(&trace_event_mutex);  	if (WARN_ON(!event))  		goto out; @@ -581,11 +592,11 @@ int register_ftrace_event(struct trace_event *event)  	key = event->type & (EVENT_HASHSIZE - 1); -	hlist_add_head_rcu(&event->node, &event_hash[key]); +	hlist_add_head(&event->node, &event_hash[key]);  	ret = event->type;   out: -	mutex_unlock(&trace_event_mutex); +	up_write(&trace_event_mutex);  	return ret;  } @@ -597,10 +608,10 @@ EXPORT_SYMBOL_GPL(register_ftrace_event);   */  int unregister_ftrace_event(struct trace_event *event)  { -	mutex_lock(&trace_event_mutex); +	down_write(&trace_event_mutex);  	hlist_del(&event->node);  	list_del(&event->list); -	mutex_unlock(&trace_event_mutex); +	up_write(&trace_event_mutex);  	return 0;  }  |