Re: [PATCH 1/3] jump_label: Warn on failed jump_label patch

From: Jason Baron
Date: Wed Feb 14 2018 - 12:19:03 EST




On 02/14/2018 12:01 PM, Steven Rostedt wrote:
> On Wed, 14 Feb 2018 10:40:41 -0600
> Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote:
>
>> When the jump label code encounters an address which isn't recognized by
>> kernel_text_address(), it just silently fails.
>>
>> This can be dangerous because jump labels are used in a variety of
>> places, and are generally expected to work. Convert the silent failure
>> to a warning.
>
> I made ftrace function tracing work on init code, can we do the same
> with tracepoints (aka jump labels)?
>

jump labels do work on init code, except they don't work on it after it
has been freed :)

It uses 'kernel_text_address()', which will return true for init code if
system_state < SYSTEM_RUNNING. See: core_kernel_text().

So I'm guessing that the warnings here are coming from init code that
has already been freed. Are we sure that these warnings are coming from
init code that hasn't already been freed?

Thanks,

-Jason

> But I have to say that this goes with my argument that there exists
> tracepoints in the kernel that nobody cares about ;-)
>
> -- Steve
>
>>
>> Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
>> ---
>> kernel/jump_label.c | 8 ++++++--
>> 1 file changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
>> index b4517095db6a..c71fb7cdfc41 100644
>> --- a/kernel/jump_label.c
>> +++ b/kernel/jump_label.c
>> @@ -370,8 +370,12 @@ static void __jump_label_update(struct static_key *key,
>> * kernel_text_address() verifies we are not in core kernel
>> * init code, see jump_label_invalidate_module_init().
>> */
>> - if (entry->code && kernel_text_address(entry->code))
>> - arch_jump_label_transform(entry, jump_label_type(entry));
>> + if (entry->code) {
>> + if (kernel_text_address(entry->code))
>> + arch_jump_label_transform(entry, jump_label_type(entry));
>> + else
>> + WARN_ONCE(1, "can't patch jump_label at %pS", (void *)entry->code);
>> + }
>> }
>> }
>>
>