blk-mq: really fix plug list flushing for nomerge queues
[linux-2.6-block.git] / kernel / trace / ftrace.c
index b1870fbd2b67f552ef1cc8ac730a12792689769a..900dbb1efff2bb8554e3fa6edeb4172af3594d55 100644 (file)
@@ -1530,7 +1530,19 @@ static int ftrace_cmp_recs(const void *a, const void *b)
        return 0;
 }
 
-static unsigned long ftrace_location_range(unsigned long start, unsigned long end)
+/**
+ * ftrace_location_range - return the first address of a traced location
+ *     if it touches the given ip range
+ * @start: start of range to search.
+ * @end: end of range to search (inclusive). @end points to the last byte
+ *     to check.
+ *
+ * Returns rec->ip if the related ftrace location is a least partly within
+ * the given address range. That is, the first address of the instruction
+ * that is either a NOP or call to the function tracer. It checks the ftrace
+ * internal tables to determine if the address belongs or not.
+ */
+unsigned long ftrace_location_range(unsigned long start, unsigned long end)
 {
        struct ftrace_page *pg;
        struct dyn_ftrace *rec;
@@ -3444,11 +3456,23 @@ struct ftrace_glob {
        int type;
 };
 
+/*
+ * If symbols in an architecture don't correspond exactly to the user-visible
+ * name of what they represent, it is possible to define this function to
+ * perform the necessary adjustments.
+*/
+char * __weak arch_ftrace_match_adjust(char *str, const char *search)
+{
+       return str;
+}
+
 static int ftrace_match(char *str, struct ftrace_glob *g)
 {
        int matched = 0;
        int slen;
 
+       str = arch_ftrace_match_adjust(str, g->search);
+
        switch (g->type) {
        case MATCH_FULL:
                if (strcmp(str, g->search) == 0)
@@ -5713,7 +5737,6 @@ static int alloc_retstack_tasklist(struct ftrace_ret_stack **ret_stack_list)
 {
        int i;
        int ret = 0;
-       unsigned long flags;
        int start = 0, end = FTRACE_RETSTACK_ALLOC_SIZE;
        struct task_struct *g, *t;
 
@@ -5729,7 +5752,7 @@ static int alloc_retstack_tasklist(struct ftrace_ret_stack **ret_stack_list)
                }
        }
 
-       read_lock_irqsave(&tasklist_lock, flags);
+       read_lock(&tasklist_lock);
        do_each_thread(g, t) {
                if (start == end) {
                        ret = -EAGAIN;
@@ -5747,7 +5770,7 @@ static int alloc_retstack_tasklist(struct ftrace_ret_stack **ret_stack_list)
        } while_each_thread(g, t);
 
 unlock:
-       read_unlock_irqrestore(&tasklist_lock, flags);
+       read_unlock(&tasklist_lock);
 free:
        for (i = start; i < end; i++)
                kfree(ret_stack_list[i]);