On Wed, 16 Oct 2024 17:01:28 -0400
Steven Rostedt <rost...@goodmis.org> wrote:

> If this is only needed for module load, can we at least still use the
> text_poke_early() at boot up?
> 
>       if (ftrace_poke_late) {
>               text_poke_queue((void *)ip, new_code, MCOUNT_INSN_SIZE, NULL);
>       } else if (system_state == SYSTEM_BOOTING) {
>               text_poke_early((void *)ip, new_code, MCOUNT_INSN_SIZE);
>       } else {
>               mutex_lock(&text_mutex);
>               text_poke((void *)ip, new_code, MCOUNT_INSN_SIZE);
>               mutex_unlock(&text_mutex);
>       }
> 
> ?
> 
> The above if statement looks to slow things down just slightly, but only by
> 2ms, which is more reasonable.

I changed the above to this (yes it's a little hacky) and got my 2ms back!

-- Steve

DEFINE_STATIC_KEY_TRUE(ftrace_modify_boot);

static int __init ftrace_boot_init_done(void)
{
        static_branch_disable(&ftrace_modify_boot);
        return 0;
}
/* Ftrace updates happen before core init */
core_initcall(ftrace_boot_init_done);

/*
 * Marked __ref because it calls text_poke_early() which is .init.text. That is
 * ok because that call will happen early, during boot, when .init sections are
 * still present.
 */
static int __ref
ftrace_modify_code_direct(unsigned long ip, const char *old_code,
                          const char *new_code)
{
        int ret = ftrace_verify_code(ip, old_code);

        if (ret)
                return ret;

        /* replace the text with the new text */
        if (static_branch_unlikely(&ftrace_modify_boot)) {
                text_poke_early((void *)ip, new_code, MCOUNT_INSN_SIZE);
        } else if (ftrace_poke_late) {
                text_poke_queue((void *)ip, new_code, MCOUNT_INSN_SIZE, NULL);
        } else {
                mutex_lock(&text_mutex);
                text_poke((void *)ip, new_code, MCOUNT_INSN_SIZE);
                mutex_unlock(&text_mutex);
        }
        return 0;
}

_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to