From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756474AbcBIEvF (ORCPT ); Mon, 8 Feb 2016 23:51:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53149 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756224AbcBIEus (ORCPT ); Mon, 8 Feb 2016 23:50:48 -0500 From: Jessica Yu To: Josh Poimboeuf , Seth Jennings , Jiri Kosina , Vojtech Pavlik , Miroslav Benes , Petr Mladek , Rusty Russell , Steven Rostedt , Ingo Molnar Cc: live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, Jessica Yu Subject: [PATCH v4 1/4] modules: split part of complete_formation() into prepare_coming_module() Date: Mon, 8 Feb 2016 23:50:21 -0500 Message-Id: <1454993424-31031-2-git-send-email-jeyu@redhat.com> In-Reply-To: <1454993424-31031-1-git-send-email-jeyu@redhat.com> References: <1454993424-31031-1-git-send-email-jeyu@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Put all actions that are performed after module->state is set to MODULE_STATE_COMING in complete_formation() into a separate function prepare_coming_module(). This prepares for the removal of ftrace and livepatch module coming notifiers and instead the corresponding work will be done in prepare_coming_module(). This split will also allow for appropriate error handling. Signed-off-by: Jessica Yu --- kernel/module.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index 9537da3..a174335 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3366,6 +3366,14 @@ out_unlocked: return err; } +static int prepare_coming_module(struct module *mod) +{ + + blocking_notifier_call_chain(&module_notify_list, + MODULE_STATE_COMING, mod); + return 0; +} + static int complete_formation(struct module *mod, struct load_info *info) { int err; @@ -3389,8 +3397,6 @@ static int complete_formation(struct module *mod, struct load_info *info) mod->state = MODULE_STATE_COMING; mutex_unlock(&module_mutex); - blocking_notifier_call_chain(&module_notify_list, - MODULE_STATE_COMING, mod); return 0; out: @@ -3512,13 +3518,17 @@ static int load_module(struct load_info *info, const char __user *uargs, if (err) goto ddebug_cleanup; + err = prepare_coming_module(mod); + if (err) + goto bug_cleanup; + /* Module is ready to execute: parsing args may do that. */ after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, -32768, 32767, mod, unknown_module_param_cb); if (IS_ERR(after_dashes)) { err = PTR_ERR(after_dashes); - goto bug_cleanup; + goto coming_cleanup; } else if (after_dashes) { pr_warn("%s: parameters '%s' after `--' ignored\n", mod->name, after_dashes); @@ -3527,7 +3537,7 @@ static int load_module(struct load_info *info, const char __user *uargs, /* Link in to syfs. */ err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp); if (err < 0) - goto bug_cleanup; + goto coming_cleanup; /* Get rid of temporary copy. */ free_copy(info); @@ -3537,15 +3547,16 @@ static int load_module(struct load_info *info, const char __user *uargs, return do_init_module(mod); + coming_cleanup: + blocking_notifier_call_chain(&module_notify_list, + MODULE_STATE_GOING, mod); + bug_cleanup: /* module_bug_cleanup needs module_mutex protection */ mutex_lock(&module_mutex); module_bug_cleanup(mod); mutex_unlock(&module_mutex); - blocking_notifier_call_chain(&module_notify_list, - MODULE_STATE_GOING, mod); - /* we can't deallocate the module until we clear memory protection */ module_disable_ro(mod); module_disable_nx(mod); -- 2.4.3