From: Petr Mladek <pmladek@suse.cz>
To: Seth Jennings <sjenning@redhat.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>,
Jiri Kosina <jkosina@suse.cz>, Vojtech Pavlik <vojtech@suse.cz>,
Steven Rostedt <rostedt@goodmis.org>,
live-patching@vger.kernel.org, kpatch@redhat.com,
linux-kernel@vger.kernel.org
Subject: Re: module notifier: was Re: [PATCH 2/2] kernel: add support for live patching
Date: Fri, 7 Nov 2014 19:40:11 +0100 [thread overview]
Message-ID: <20141107184011.GF1136@dhcp128.suse.cz> (raw)
In-Reply-To: <20141107180711.GC2057@cerebellum.variantweb.net>
On Fri 2014-11-07 12:07:11, Seth Jennings wrote:
> On Fri, Nov 07, 2014 at 06:13:07PM +0100, Petr Mladek wrote:
> > On Thu 2014-11-06 08:39:08, Seth Jennings wrote:
> > > This commit introduces code for the live patching core. It implements
> > > an ftrace-based mechanism and kernel interface for doing live patching
> > > of kernel and kernel module functions.
> > >
> > > It represents the greatest common functionality set between kpatch and
> > > kgraft and can accept patches built using either method.
> > >
> > > This first version does not implement any consistency mechanism that
> > > ensures that old and new code do not run together. In practice, ~90% of
> > > CVEs are safe to apply in this way, since they simply add a conditional
> > > check. However, any function change that can not execute safely with
> > > the old version of the function can _not_ be safely applied in this
> > > version.
> >
> > [...]
> >
> > > +/******************************
> > > + * module notifier
> > > + *****************************/
> > > +
> > > +static int lp_module_notify(struct notifier_block *nb, unsigned long action,
> > > + void *data)
> > > +{
> > > + struct module *mod = data;
> > > + struct lpc_patch *patch;
> > > + struct lpc_object *obj;
> > > + int ret = 0;
> > > +
> > > + if (action != MODULE_STATE_COMING)
> > > + return 0;
> >
> > IMHO, we should handle also MODULE_STATE_GOING. We should unregister
> > the ftrace handlers and update the state of the affected objects
> > (ENABLED -> DISABLED)
>
> The mechanism we use to avoid this right now is taking a reference on
> patched module. We only release that reference after the patch is
> disabled, which unregisters all the patched functions from ftrace.
I see. This was actually another thing that I noticed and wanted to
investigate :-) I think that we should not force users to disable
the entire patch if they want to remove some module.
> However, your comment reminded me of an idea I had to use
> MODULE_STATE_GOING and let the lpc_mutex protect against races. I think
> it could be cleaner, but I haven't fleshed the idea out fully.
AFAIK, the going module is not longer used when the notifier is
called. Therefore we could remove the patch fast way even when
patching would require the slow path otherwise.
> >
> > > + down(&lpc_mutex);
> > > +
> > > + list_for_each_entry(patch, &lpc_patches, list) {
> > > + if (patch->state == DISABLED)
> > > + continue;
> > > + list_for_each_entry(obj, &patch->objs, list) {
> > > + if (strcmp(obj->name, mod->name))
> > > + continue;
> > > + pr_notice("load of module '%s' detected, applying patch '%s'\n",
> > > + mod->name, patch->mod->name);
> > > + obj->mod = mod;
> > > + ret = lpc_enable_object(patch->mod, obj);
> > > + if (ret)
> > > + goto out;
> > > + break;
> > > + }
> > > + }
> > > +
> > > + up(&lpc_mutex);
> > > + return 0;
> > > +out:
> >
> > I would name this err_our or so to make it clear that it is used when
> > something fails.
>
> Just "err" good?
Fine with me.
> > > + up(&lpc_mutex);
> > > + WARN("failed to apply patch '%s' to module '%s'\n",
> > > + patch->mod->name, mod->name);
> > > + return 0;
> > > +}
> > > +
> > > +static struct notifier_block lp_module_nb = {
> > > + .notifier_call = lp_module_notify,
> > > + .priority = INT_MIN, /* called last */
> >
> > The handler for MODULE_STATE_COMMING would need have higger priority,
> > if we want to cleanly unregister the ftrace handlers.
>
> Yes, we might need two handlers at different priorities if we decide to
> go that direction: one for MODULE_STATE_GOING at high/max and one for
> MODULE_STATE_COMING at low/min.
kGraft has notifier only for the going state. The initialization is
called directly from load_module() after ftrace_module_init()
and complete_formation() before it is executed by parse_args().
I need to investigate if the notifier is more elegant and safe or not.
Best Regards,
Petr
next prev parent reply other threads:[~2014-11-07 18:40 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-06 14:39 [PATCH 0/2] Kernel Live Patching Seth Jennings
2014-11-06 14:39 ` [PATCH 1/2] kernel: add TAINT_LIVEPATCH Seth Jennings
2014-11-09 20:19 ` Greg KH
2014-11-11 14:54 ` Seth Jennings
2014-11-06 14:39 ` [PATCH 2/2] kernel: add support for live patching Seth Jennings
2014-11-06 15:11 ` Jiri Kosina
2014-11-06 16:20 ` Seth Jennings
2014-11-06 16:32 ` Josh Poimboeuf
2014-11-06 18:00 ` Vojtech Pavlik
2014-11-06 22:20 ` Jiri Kosina
2014-11-07 12:50 ` Josh Poimboeuf
2014-11-07 13:13 ` Jiri Kosina
2014-11-07 13:22 ` Josh Poimboeuf
2014-11-07 14:57 ` Seth Jennings
2014-11-06 15:51 ` Jiri Slaby
2014-11-06 16:57 ` Seth Jennings
2014-11-06 17:12 ` Josh Poimboeuf
2014-11-07 18:21 ` Petr Mladek
2014-11-07 20:31 ` Josh Poimboeuf
2014-11-30 12:23 ` Pavel Machek
2014-12-01 16:49 ` Seth Jennings
2014-11-06 20:02 ` Steven Rostedt
2014-11-06 20:19 ` Seth Jennings
2014-11-07 17:13 ` module notifier: was " Petr Mladek
2014-11-07 18:07 ` Seth Jennings
2014-11-07 18:40 ` Petr Mladek [this message]
2014-11-07 18:55 ` Seth Jennings
2014-11-11 19:40 ` Seth Jennings
2014-11-11 22:17 ` Jiri Kosina
2014-11-11 22:48 ` Seth Jennings
2014-11-07 17:39 ` more patches for the same func: " Petr Mladek
2014-11-07 21:54 ` Josh Poimboeuf
2014-11-07 19:40 ` Andy Lutomirski
2014-11-07 19:42 ` Seth Jennings
2014-11-07 19:52 ` Seth Jennings
2014-11-10 10:08 ` Jiri Kosina
2014-11-10 17:31 ` Josh Poimboeuf
2014-11-13 10:16 ` Miroslav Benes
2014-11-13 14:38 ` Josh Poimboeuf
2014-11-13 17:12 ` Seth Jennings
2014-11-14 13:30 ` Miroslav Benes
2014-11-14 14:52 ` Petr Mladek
2014-11-06 18:44 ` [PATCH 0/2] Kernel Live Patching Christoph Hellwig
2014-11-06 18:51 ` Vojtech Pavlik
2014-11-06 18:58 ` Christoph Hellwig
2014-11-06 19:34 ` Josh Poimboeuf
2014-11-06 19:49 ` Steven Rostedt
2014-11-06 20:02 ` Josh Poimboeuf
2014-11-07 7:46 ` Christoph Hellwig
2014-11-07 7:45 ` Christoph Hellwig
2014-11-06 20:24 ` Vojtech Pavlik
2014-11-07 7:47 ` Christoph Hellwig
2014-11-07 13:11 ` Josh Poimboeuf
2014-11-07 14:04 ` Vojtech Pavlik
2014-11-07 15:45 ` Josh Poimboeuf
2014-11-07 21:27 ` Vojtech Pavlik
2014-11-08 3:45 ` Josh Poimboeuf
2014-11-08 8:07 ` Vojtech Pavlik
2014-11-10 17:09 ` Josh Poimboeuf
2014-11-11 9:05 ` Vojtech Pavlik
2014-11-11 17:45 ` Josh Poimboeuf
2014-11-11 1:24 ` Masami Hiramatsu
2014-11-11 10:26 ` Vojtech Pavlik
2014-11-12 17:33 ` Masami Hiramatsu
2014-11-12 21:47 ` Vojtech Pavlik
2014-11-13 15:56 ` Masami Hiramatsu
2014-11-13 16:38 ` Vojtech Pavlik
2014-11-18 12:47 ` Petr Mladek
2014-11-18 18:58 ` Josh Poimboeuf
2014-11-07 12:31 ` Josh Poimboeuf
2014-11-07 12:48 ` Vojtech Pavlik
2014-11-07 13:06 ` Josh Poimboeuf
2014-11-09 20:16 ` Greg KH
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=20141107184011.GF1136@dhcp128.suse.cz \
--to=pmladek@suse.cz \
--cc=jkosina@suse.cz \
--cc=jpoimboe@redhat.com \
--cc=kpatch@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=sjenning@redhat.com \
--cc=vojtech@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®