Skip to content

Commit

Permalink
ftrace: Separate out functionality from ftrace_location_range()
Browse files Browse the repository at this point in the history
Create a new function called lookup_rec() from the functionality of
ftrace_location_range(). The difference between lookup_rec() is that it
returns the record that it finds, where as ftrace_location_range() returns
only if it found a match or not.

The lookup_rec() is static, and can be used for new functionality where
ftrace needs to find a record of a specific address.

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
  • Loading branch information
rostedt committed Nov 8, 2019
1 parent 714641c commit 7e16f58
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions kernel/trace/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1541,6 +1541,26 @@ static int ftrace_cmp_recs(const void *a, const void *b)
return 0;
}

static struct dyn_ftrace *lookup_rec(unsigned long start, unsigned long end)
{
struct ftrace_page *pg;
struct dyn_ftrace *rec = NULL;
struct dyn_ftrace key;

key.ip = start;
key.flags = end; /* overload flags, as it is unsigned long */

for (pg = ftrace_pages_start; pg; pg = pg->next) {
if (end < pg->records[0].ip ||
start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE))
continue;
rec = bsearch(&key, pg->records, pg->index,
sizeof(struct dyn_ftrace),
ftrace_cmp_recs);
}
return rec;
}

/**
* ftrace_location_range - return the first address of a traced location
* if it touches the given ip range
Expand All @@ -1555,23 +1575,11 @@ static int ftrace_cmp_recs(const void *a, const void *b)
*/
unsigned long ftrace_location_range(unsigned long start, unsigned long end)
{
struct ftrace_page *pg;
struct dyn_ftrace *rec;
struct dyn_ftrace key;

key.ip = start;
key.flags = end; /* overload flags, as it is unsigned long */

for (pg = ftrace_pages_start; pg; pg = pg->next) {
if (end < pg->records[0].ip ||
start >= (pg->records[pg->index - 1].ip + MCOUNT_INSN_SIZE))
continue;
rec = bsearch(&key, pg->records, pg->index,
sizeof(struct dyn_ftrace),
ftrace_cmp_recs);
if (rec)
return rec->ip;
}
rec = lookup_rec(start, end);
if (rec)
return rec->ip;

return 0;
}
Expand Down

0 comments on commit 7e16f58

Please sign in to comment.