lkml.org 
[lkml]   [2015]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] ftrace: fix race between ftrace and insmod
On 2015/12/16 22:28, Steven Rostedt wrote:
> On Wed, 16 Dec 2015 18:28:35 +0800
> "Zhang, Yanmin" <yanmin_zhang@linux.intel.com> wrote:
>
>>> + /*
>>> + * If the tracing is enabled, go ahead and enable the record.
>>> + *
>>> + * The reason not to enable the record immediatelly is the
>>> + * inherent check of ftrace_make_nop/ftrace_make_call for
>>> + * correct previous instructions. Making first the NOP
>>> + * conversion puts the module to the correct state, thus
>>> + * passing the ftrace_make_call check.
>>> + *
>>> + * We also delay this to after the module code already set the
>>> + * text to read-only, as we now need to set it back to read-write
>>> + * so that we can modify the text.
>>> + */
>>> + if (ftrace_start_up)
>>> + ftrace_arch_code_modify_prepare();
>>> +
>>> + do_for_each_ftrace_rec(pg, rec) {
>>> + int cnt;
>>> + /*
>>> + * do_for_each_ftrace_rec() is a double loop.
>>> + * module text shares the pg. If a record is
>>> + * not part of this module, then skip this pg,
>>> + * which the "break" will do.
>>> + */
>>> + if (!within_module_core(rec->ip, mod))
>>> + break;
>>> +
>>> + cnt = 0;
>>> +
>>> + /*
>>> + * When adding a module, we need to check if tracers are
>>> + * currently enabled and if they are, and can trace this record,
>>> + * we need to enable the module functions as well as update the
>>> + * reference counts for those function records.
>>> + */
>>> + if (ftrace_start_up)
>>> + cnt += referenced_filters(rec);
>>> +
>>> + /* This clears FTRACE_FL_DISABLED */
>>> + rec->flags = cnt;
>>> +
>>> + if (ftrace_start_up && cnt) {
>>> + int failed = __ftrace_replace_code(rec, 1);
>> If we choose to call ftrace_module_enable when receiving module notification
>> MODULE_STATE_COMING, TEXT section of the module is already changed to RO.
> And that's why we call ftrace_arch_code_modify_prepare(). That should
> change all text to RW.

Thanks for the kind pointer.
We would add codes into your patch based on notifier and send patch to you by
private email.

Yanmin



\
 
 \ /
  Last update: 2015-12-17 08:21    [W:0.076 / U:0.236 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site