Commit d9a16d3a authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Steven Rostedt

trace: Don't use __weak in header files

The commit that added a check for this to checkpatch says:

"Using weak declarations can have unintended link defects.  The __weak on
the declaration causes non-weak definitions to become weak."

In this case, when a PowerPC kernel is built with CONFIG_KPROBE_EVENT
but not CONFIG_UPROBE_EVENT, it generates the following warning:

WARNING: 1 bad relocations
c0000000014f2190 R_PPC64_ADDR64    uprobes_fetch_type_table

This is fixed by passing the fetch_table arrays to
traceprobe_parse_probe_arg() which also means that they can never be NULL.

Link: http://lkml.kernel.org/r/20150312165834.4482cb48@canb.auug.org.auAcked-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 754cb007
...@@ -250,7 +250,7 @@ DEFINE_FETCH_symbol(string_size) ...@@ -250,7 +250,7 @@ DEFINE_FETCH_symbol(string_size)
#define fetch_file_offset_string_size NULL #define fetch_file_offset_string_size NULL
/* Fetch type information table */ /* Fetch type information table */
const struct fetch_type kprobes_fetch_type_table[] = { static const struct fetch_type kprobes_fetch_type_table[] = {
/* Special types */ /* Special types */
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string, [FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
sizeof(u32), 1, "__data_loc char[]"), sizeof(u32), 1, "__data_loc char[]"),
...@@ -760,7 +760,8 @@ static int create_trace_kprobe(int argc, char **argv) ...@@ -760,7 +760,8 @@ static int create_trace_kprobe(int argc, char **argv)
/* Parse fetch argument */ /* Parse fetch argument */
ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg, ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
is_return, true); is_return, true,
kprobes_fetch_type_table);
if (ret) { if (ret) {
pr_info("Parse error at argument[%d]. (%d)\n", i, ret); pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
goto error; goto error;
......
...@@ -356,17 +356,14 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t, ...@@ -356,17 +356,14 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
/* Recursive argument parser */ /* Recursive argument parser */
static int parse_probe_arg(char *arg, const struct fetch_type *t, static int parse_probe_arg(char *arg, const struct fetch_type *t,
struct fetch_param *f, bool is_return, bool is_kprobe) struct fetch_param *f, bool is_return, bool is_kprobe,
const struct fetch_type *ftbl)
{ {
const struct fetch_type *ftbl;
unsigned long param; unsigned long param;
long offset; long offset;
char *tmp; char *tmp;
int ret = 0; int ret = 0;
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
BUG_ON(ftbl == NULL);
switch (arg[0]) { switch (arg[0]) {
case '$': case '$':
ret = parse_probe_vars(arg + 1, t, f, is_return, is_kprobe); ret = parse_probe_vars(arg + 1, t, f, is_return, is_kprobe);
...@@ -447,7 +444,7 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t, ...@@ -447,7 +444,7 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
dprm->fetch_size = get_fetch_size_function(t, dprm->fetch_size = get_fetch_size_function(t,
dprm->fetch, ftbl); dprm->fetch, ftbl);
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return, ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
is_kprobe); is_kprobe, ftbl);
if (ret) if (ret)
kfree(dprm); kfree(dprm);
else { else {
...@@ -505,15 +502,12 @@ static int __parse_bitfield_probe_arg(const char *bf, ...@@ -505,15 +502,12 @@ static int __parse_bitfield_probe_arg(const char *bf,
/* String length checking wrapper */ /* String length checking wrapper */
int traceprobe_parse_probe_arg(char *arg, ssize_t *size, int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
struct probe_arg *parg, bool is_return, bool is_kprobe) struct probe_arg *parg, bool is_return, bool is_kprobe,
const struct fetch_type *ftbl)
{ {
const struct fetch_type *ftbl;
const char *t; const char *t;
int ret; int ret;
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
BUG_ON(ftbl == NULL);
if (strlen(arg) > MAX_ARGSTR_LEN) { if (strlen(arg) > MAX_ARGSTR_LEN) {
pr_info("Argument is too long.: %s\n", arg); pr_info("Argument is too long.: %s\n", arg);
return -ENOSPC; return -ENOSPC;
...@@ -535,7 +529,8 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size, ...@@ -535,7 +529,8 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
} }
parg->offset = *size; parg->offset = *size;
*size += parg->type->size; *size += parg->type->size;
ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return, is_kprobe); ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return,
is_kprobe, ftbl);
if (ret >= 0 && t != NULL) if (ret >= 0 && t != NULL)
ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch); ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);
......
...@@ -229,13 +229,6 @@ ASSIGN_FETCH_FUNC(file_offset, ftype), \ ...@@ -229,13 +229,6 @@ ASSIGN_FETCH_FUNC(file_offset, ftype), \
#define FETCH_TYPE_STRING 0 #define FETCH_TYPE_STRING 0
#define FETCH_TYPE_STRSIZE 1 #define FETCH_TYPE_STRSIZE 1
/*
* Fetch type information table.
* It's declared as a weak symbol due to conditional compilation.
*/
extern __weak const struct fetch_type kprobes_fetch_type_table[];
extern __weak const struct fetch_type uprobes_fetch_type_table[];
#ifdef CONFIG_KPROBE_EVENT #ifdef CONFIG_KPROBE_EVENT
struct symbol_cache; struct symbol_cache;
unsigned long update_symbol_cache(struct symbol_cache *sc); unsigned long update_symbol_cache(struct symbol_cache *sc);
...@@ -333,7 +326,8 @@ find_event_file_link(struct trace_probe *tp, struct ftrace_event_file *file) ...@@ -333,7 +326,8 @@ find_event_file_link(struct trace_probe *tp, struct ftrace_event_file *file)
} }
extern int traceprobe_parse_probe_arg(char *arg, ssize_t *size, extern int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
struct probe_arg *parg, bool is_return, bool is_kprobe); struct probe_arg *parg, bool is_return, bool is_kprobe,
const struct fetch_type *ftbl);
extern int traceprobe_conflict_field_name(const char *name, extern int traceprobe_conflict_field_name(const char *name,
struct probe_arg *args, int narg); struct probe_arg *args, int narg);
......
...@@ -196,7 +196,7 @@ DEFINE_FETCH_file_offset(string) ...@@ -196,7 +196,7 @@ DEFINE_FETCH_file_offset(string)
DEFINE_FETCH_file_offset(string_size) DEFINE_FETCH_file_offset(string_size)
/* Fetch type information table */ /* Fetch type information table */
const struct fetch_type uprobes_fetch_type_table[] = { static const struct fetch_type uprobes_fetch_type_table[] = {
/* Special types */ /* Special types */
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string, [FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
sizeof(u32), 1, "__data_loc char[]"), sizeof(u32), 1, "__data_loc char[]"),
...@@ -535,7 +535,8 @@ static int create_trace_uprobe(int argc, char **argv) ...@@ -535,7 +535,8 @@ static int create_trace_uprobe(int argc, char **argv)
/* Parse fetch argument */ /* Parse fetch argument */
ret = traceprobe_parse_probe_arg(arg, &tu->tp.size, parg, ret = traceprobe_parse_probe_arg(arg, &tu->tp.size, parg,
is_return, false); is_return, false,
uprobes_fetch_type_table);
if (ret) { if (ret) {
pr_info("Parse error at argument[%d]. (%d)\n", i, ret); pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
goto error; goto error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment