From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Ingo Molnar <mingo@elte.hu>
Cc: Jason Baron <jbaron@redhat.com>,
linux-kernel@vger.kernel.org, tglx@linutronix.de,
rostedt@goodmis.org, ak@suse.de, roland@redhat.com,
rth@redhat.com, mhiramat@redhat.com
Subject: Re: [PATCH 1/4] jump label - make init_kernel_text() global
Date: Sat, 3 Oct 2009 08:39:00 -0400 [thread overview]
Message-ID: <20091003123900.GA22046@Krystal> (raw)
In-Reply-To: <20091003104335.GB15919@elte.hu>
* Ingo Molnar (mingo@elte.hu) wrote:
>
> * Jason Baron <jbaron@redhat.com> wrote:
>
> > On Thu, Oct 01, 2009 at 01:20:03PM +0200, Ingo Molnar wrote:
> > > * Jason Baron <jbaron@redhat.com> wrote:
> > >
> > > > allow usage of init_kernel_text - we need this in jump labeling to
> > > > avoid attemtpting to patch code that has been freed as in the __init
> > > > sections
> > >
> > > s/attemtpting/attempting
> > >
> > > > Signed-off-by: Jason Baron <jbaron@redhat.com>
> > > > ---
> > > > include/linux/kernel.h | 1 +
> > > > kernel/extable.c | 2 +-
> > > > 2 files changed, 2 insertions(+), 1 deletions(-)
> > > >
> > > > diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> > > > index f61039e..9d3419f 100644
> > > > --- a/include/linux/kernel.h
> > > > +++ b/include/linux/kernel.h
> > > > @@ -295,6 +295,7 @@ extern int get_option(char **str, int *pint);
> > > > extern char *get_options(const char *str, int nints, int *ints);
> > > > extern unsigned long long memparse(const char *ptr, char **retptr);
> > > >
> > > > +extern int init_kernel_text(unsigned long addr);
> > > > extern int core_kernel_text(unsigned long addr);
> > > > extern int __kernel_text_address(unsigned long addr);
> > > > extern int kernel_text_address(unsigned long addr);
> > > > diff --git a/kernel/extable.c b/kernel/extable.c
> > > > index 7f8f263..f6893ad 100644
> > > > --- a/kernel/extable.c
> > > > +++ b/kernel/extable.c
> > > > @@ -52,7 +52,7 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr)
> > > > return e;
> > > > }
> > > >
> > > > -static inline int init_kernel_text(unsigned long addr)
> > > > +int init_kernel_text(unsigned long addr)
> > > > {
> > > > if (addr >= (unsigned long)_sinittext &&
> > > > addr <= (unsigned long)_einittext)
> > >
> > > i'm confused. Later on jump_label_update() does:
> > >
> > > + if (!(system_state == SYSTEM_RUNNING &&
> > > + (init_kernel_text(iter->code))))
> > > + jump_label_transform(iter, type);
> > >
> > > which is:
> > >
> > > + if (system_state != SYSTEM_RUNNING ||
> > > + !init_kernel_text(iter->code)))
> > > + jump_label_transform(iter, type);
> > >
> > > What is the logic behind that? System going into SYSTEM_RUNNING does not
> > > coincide with free_initmem() precisely.
> > >
> >
> > The specific case I hit was in modifying code in arch_kdebugfs_init()
> > which is '__init' after the system was up and running. The tracepoint is
> > in 'kmalloc()' which is marked as __always_inline.
> >
> >
> > > Also, do we ever want to patch init-text tracepoints? I think we want to
> > > stay away from them as much as possible.
> >
> > I was trying to make sure that tracepoints in init-text were honored.
> >
> > >
> > > It appears to me that what we want here is a straight:
> > >
> > > if (kernel_text(iter->code))
> > > jump_label_transform(iter, type);
> > >
> > > Also, maybe a WARN_ONCE(!kernel_text()) - we should never even attempt
> > > to transform non-patchable code. If yes then we want to know about that
> > > in a noisy way and not skip it silently.
> > >
> >
> > hmmm....indeed, kernel_text_address() does do what I want here (I must
> > have mis-read its definition). Although, I'm not sure there isn't a
> > race here betweeen freeing the init sections and possibly updating
> > them. For modules, there is no race since the module init free code
> > takes the module_mutex, and I do as well in this code...
> >
> > I've now also tested this code on 32-bit x86 system, and it seems to
> > perform nicely. I'm seeing a 15 cycle improvement per tracepoint.
> >
> > I've based the text section updating on text_poke_fixup(), which has
> > recently come into question about safety of cross modifying code. I
> > could rebase my patches back to use stop_machine()? I guess I'm
> > looking for some advice on how to proceed here.
>
> I think this very limited form of code patching that you are using here
> (patching a JMP) _should_ be safe - so we can avoid stop_machine().
>
I might be missing a bit of context here, I just want to make sure we
are on the same page: patching a jmp instruction is safe on UP, safe
with stop_machine(), is very likely safe with the breakpoint-ipi
approach (but we need the confirmation from Intel, which hpa is trying
to get), but is definitely _not_ safe if neither of these methods are
used on a SMP system. If a non-aligned multi-word jump is modified while
another CPU is fetching the instruction, bad things could happen.
BTW, patching kernel and module init sections can be done without
sop_machine(), because only one CPU is ever accessing the init code.
But again, I might be missing some context. If so, sorry for the noise.
Thanks,
Mathieu
> Ingo
--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2009-10-03 12:39 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-24 23:17 [PATCH 0/4] jump label patches Jason Baron
2009-09-24 23:17 ` [PATCH 1/4] jump label - make init_kernel_text() global Jason Baron
2009-10-01 11:20 ` Ingo Molnar
2009-10-01 12:58 ` Mathieu Desnoyers
2009-10-01 20:39 ` Jason Baron
2009-10-03 10:43 ` Ingo Molnar
2009-10-03 12:39 ` Mathieu Desnoyers [this message]
2009-10-07 1:54 ` Steven Rostedt
2009-10-07 2:32 ` Mathieu Desnoyers
2009-10-07 3:10 ` Masami Hiramatsu
2009-10-07 3:23 ` Mathieu Desnoyers
2009-10-07 3:29 ` Mathieu Desnoyers
2009-10-07 12:56 ` Steven Rostedt
2009-10-07 13:35 ` Mathieu Desnoyers
2009-09-24 23:17 ` [PATCH 2/4] jump label - base patch Jason Baron
2009-09-25 0:49 ` Roland McGrath
2009-09-26 10:21 ` Steven Rostedt
2009-10-01 11:36 ` Ingo Molnar
2009-09-24 23:17 ` [PATCH 3/4] jump label - add module support Jason Baron
2009-09-24 23:18 ` [PATCH 4/4] jump label - tracepoint implementation Jason Baron
2009-10-06 5:39 ` [PATCH 0/4] jump label patches Roland McGrath
2009-10-06 14:07 ` Jason Baron
2009-10-06 23:24 ` Richard Henderson
2009-10-07 0:14 ` Roland McGrath
2009-10-07 15:35 ` Richard Henderson
2009-10-06 6:04 ` Roland McGrath
2009-10-06 14:09 ` Steven Rostedt
2009-10-06 14:13 ` Masami Hiramatsu
2009-10-06 14:30 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091003123900.GA22046@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=ak@suse.de \
--cc=jbaron@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@redhat.com \
--cc=mingo@elte.hu \
--cc=roland@redhat.com \
--cc=rostedt@goodmis.org \
--cc=rth@redhat.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.