tracing: Use kstrdup_const instead of private implementation
The kernel now has kstrdup_const/kfree_const for reusing .rodata (typically string literals) when possible; there's no reason to duplicate that logic in the tracing system. Moreover, as the comment above core_kernel_data states, it may not always return true for .rodata - that is for example the case on x86_64, where we thus end up kstrdup'ing all the passed-in strings. Arguably, testing for .rodata explicitly (as kstrdup_const does) is also more correct: I don't think one is supposed to be able to change the name after creating the event_subsystem by passing the address of a static char (but non-const) array. Link: http://lkml.kernel.org/r/1441833841-12955-1-git-send-email-linux@rasmusvillemoes.dk Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
37aea98b84
commit
79ac6ef521
1 changed files with 8 additions and 16 deletions
|
@ -38,21 +38,19 @@ static LIST_HEAD(ftrace_common_fields);
|
|||
static struct kmem_cache *field_cachep;
|
||||
static struct kmem_cache *file_cachep;
|
||||
|
||||
#define SYSTEM_FL_FREE_NAME (1 << 31)
|
||||
|
||||
static inline int system_refcount(struct event_subsystem *system)
|
||||
{
|
||||
return system->ref_count & ~SYSTEM_FL_FREE_NAME;
|
||||
return system->ref_count;
|
||||
}
|
||||
|
||||
static int system_refcount_inc(struct event_subsystem *system)
|
||||
{
|
||||
return (system->ref_count++) & ~SYSTEM_FL_FREE_NAME;
|
||||
return system->ref_count++;
|
||||
}
|
||||
|
||||
static int system_refcount_dec(struct event_subsystem *system)
|
||||
{
|
||||
return (--system->ref_count) & ~SYSTEM_FL_FREE_NAME;
|
||||
return --system->ref_count;
|
||||
}
|
||||
|
||||
/* Double loops, do not use break, only goto's work */
|
||||
|
@ -461,8 +459,7 @@ static void __put_system(struct event_subsystem *system)
|
|||
kfree(filter->filter_string);
|
||||
kfree(filter);
|
||||
}
|
||||
if (system->ref_count & SYSTEM_FL_FREE_NAME)
|
||||
kfree(system->name);
|
||||
kfree_const(system->name);
|
||||
kfree(system);
|
||||
}
|
||||
|
||||
|
@ -1493,13 +1490,9 @@ create_new_subsystem(const char *name)
|
|||
system->ref_count = 1;
|
||||
|
||||
/* Only allocate if dynamic (kprobes and modules) */
|
||||
if (!core_kernel_data((unsigned long)name)) {
|
||||
system->ref_count |= SYSTEM_FL_FREE_NAME;
|
||||
system->name = kstrdup(name, GFP_KERNEL);
|
||||
if (!system->name)
|
||||
goto out_free;
|
||||
} else
|
||||
system->name = name;
|
||||
system->name = kstrdup_const(name, GFP_KERNEL);
|
||||
if (!system->name)
|
||||
goto out_free;
|
||||
|
||||
system->filter = NULL;
|
||||
|
||||
|
@ -1512,8 +1505,7 @@ create_new_subsystem(const char *name)
|
|||
return system;
|
||||
|
||||
out_free:
|
||||
if (system->ref_count & SYSTEM_FL_FREE_NAME)
|
||||
kfree(system->name);
|
||||
kfree_const(system->name);
|
||||
kfree(system);
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue