mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
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.au Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
754cb0071a
commit
d9a16d3ab8
@ -250,7 +250,7 @@ DEFINE_FETCH_symbol(string_size)
|
||||
#define fetch_file_offset_string_size NULL
|
||||
|
||||
/* Fetch type information table */
|
||||
const struct fetch_type kprobes_fetch_type_table[] = {
|
||||
static const struct fetch_type kprobes_fetch_type_table[] = {
|
||||
/* Special types */
|
||||
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
|
||||
sizeof(u32), 1, "__data_loc char[]"),
|
||||
@ -760,7 +760,8 @@ static int create_trace_kprobe(int argc, char **argv)
|
||||
|
||||
/* Parse fetch argument */
|
||||
ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
|
||||
is_return, true);
|
||||
is_return, true,
|
||||
kprobes_fetch_type_table);
|
||||
if (ret) {
|
||||
pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
|
||||
goto error;
|
||||
|
@ -356,17 +356,14 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
|
||||
|
||||
/* Recursive argument parser */
|
||||
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;
|
||||
long offset;
|
||||
char *tmp;
|
||||
int ret = 0;
|
||||
|
||||
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
||||
BUG_ON(ftbl == NULL);
|
||||
|
||||
switch (arg[0]) {
|
||||
case '$':
|
||||
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,
|
||||
dprm->fetch_size = get_fetch_size_function(t,
|
||||
dprm->fetch, ftbl);
|
||||
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
|
||||
is_kprobe);
|
||||
is_kprobe, ftbl);
|
||||
if (ret)
|
||||
kfree(dprm);
|
||||
else {
|
||||
@ -505,15 +502,12 @@ static int __parse_bitfield_probe_arg(const char *bf,
|
||||
|
||||
/* String length checking wrapper */
|
||||
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;
|
||||
int ret;
|
||||
|
||||
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
||||
BUG_ON(ftbl == NULL);
|
||||
|
||||
if (strlen(arg) > MAX_ARGSTR_LEN) {
|
||||
pr_info("Argument is too long.: %s\n", arg);
|
||||
return -ENOSPC;
|
||||
@ -535,7 +529,8 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
||||
}
|
||||
parg->offset = *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)
|
||||
ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);
|
||||
|
@ -229,13 +229,6 @@ ASSIGN_FETCH_FUNC(file_offset, ftype), \
|
||||
#define FETCH_TYPE_STRING 0
|
||||
#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
|
||||
struct symbol_cache;
|
||||
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)
|
||||
}
|
||||
|
||||
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,
|
||||
struct probe_arg *args, int narg);
|
||||
|
@ -196,7 +196,7 @@ DEFINE_FETCH_file_offset(string)
|
||||
DEFINE_FETCH_file_offset(string_size)
|
||||
|
||||
/* Fetch type information table */
|
||||
const struct fetch_type uprobes_fetch_type_table[] = {
|
||||
static const struct fetch_type uprobes_fetch_type_table[] = {
|
||||
/* Special types */
|
||||
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
|
||||
sizeof(u32), 1, "__data_loc char[]"),
|
||||
@ -535,7 +535,8 @@ static int create_trace_uprobe(int argc, char **argv)
|
||||
|
||||
/* Parse fetch argument */
|
||||
ret = traceprobe_parse_probe_arg(arg, &tu->tp.size, parg,
|
||||
is_return, false);
|
||||
is_return, false,
|
||||
uprobes_fetch_type_table);
|
||||
if (ret) {
|
||||
pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
|
||||
goto error;
|
||||
|
Loading…
Reference in New Issue
Block a user