>
> On Sat, 4 Oct 2008, Mathieu Desnoyers wrote:
> > >
> > > there's a relatively simple method that would solve all these
> > > impact-size problems.
> > >
> > > We cannot stop NMIs (and MCEs, etc.), but we can make kernel code
> > > modifications atomic, by adding the following thin layer ontop of it:
> > >
> > > #define MAX_CODE_SIZE 10
> > >
> > > int redo_len;
> > > u8 *redo_vaddr;
> > >
> > > u8 redo_buffer[MAX_CODE_SIZE];
> > >
> > > atomic_t __read_mostly redo_pending;
> > >
> > > and use it in do_nmi():
> > >
> > > if (unlikely(atomic_read(&redo_pending)))
> > > modify_code_redo();
> > >
> > > i.e. when we modify code, we first fill in the redo_buffer[], redo_vaddr
> > > and redo_len[], then we set redo_pending flag. Then we modify the kernel
> > > code, and clear the redo_pending flag.
> > >
> > > If an NMI (or MCE) handler intervenes, it will notice the pending
> > > 'transaction' and will copy redo_buffer[] to the (redo_vaddr,len)
> > > location and will continue.
> > >
> > > So as far as non-maskable contexts are concerned, kernel code patching
> > > becomes an atomic operation. do_nmi() has to be marked notrace but
> > > that's all and easy to maintain.
> > >
> > > Hm?
> > >
> >
> > The comment at the beginning of
> >
http://git.kernel.org/?p=linux/kernel/git/compudj/linux-2.6-lttng.git;a=blob;f=arch/x8...
>
> Mathieu, please stop pointing to git tree comments (especially those that
> are not in mainline). If you have an actual technical PDF link, that
> would be much better.
>