Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754379AbcDATfj (ORCPT ); Fri, 1 Apr 2016 15:35:39 -0400 Received: from mx2.suse.de ([195.135.220.15]:60403 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751907AbcDATfi (ORCPT ); Fri, 1 Apr 2016 15:35:38 -0400 Date: Fri, 1 Apr 2016 21:35:34 +0200 (CEST) From: Jiri Kosina X-X-Sender: jkosina@pobox.suse.cz To: Chris J Arges cc: Miroslav Benes , jeyu@redhat.com, jpoimboe@redhat.com, eugene.shatokhin@rosalab.ru, live-patching@vger.kernel.org, Linux Kernel Mailing List , pmladek@suse.cz Subject: Re: Bug with paravirt ops and livepatches In-Reply-To: <20160401190704.GB7837@canonical.com> Message-ID: References: <20160329120518.GA21252@canonical.com> <20160401190704.GB7837@canonical.com> User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2684 Lines: 83 On Fri, 1 Apr 2016, Chris J Arges wrote: > Loading, please wait... > starting version 229 > [ 1.182869] random: udevadm urandom read with 2 bits of entropy available > [ 1.241404] BUG: unable to handle kernel paging request at ffffffffc000f35f Gah, we surely can't change pages with RO PTE. Thanks for such a prompt testing. You do have CONFIG_DEBUG_SET_MODULE_RONX set, don't you? The patch below should fix that by marking the module RO (and relevant parts NX) only when it's guaranteed that .text is not going to be modified any more (and includes the error handling fix Miroslav spotted as well). Thanks. diff --git a/kernel/module.c b/kernel/module.c index 5f71aa6..430606d 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3211,7 +3211,7 @@ int __weak module_finalize(const Elf_Ehdr *hdr, return 0; } -static int post_relocation(struct module *mod, const struct load_info *info) +static void post_relocation(struct module *mod, const struct load_info *info) { /* Sort exception table now relocations are done. */ sort_extable(mod->extable, mod->extable + mod->num_exentries); @@ -3222,9 +3222,6 @@ static int post_relocation(struct module *mod, const struct load_info *info) /* Setup kallsyms-specific fields. */ add_kallsyms(mod, info); - - /* Arch-specific module finalizing. */ - return module_finalize(info->hdr, info->sechdrs, mod); } /* Is this module of this name done loading? No locks held. */ @@ -3441,10 +3438,6 @@ static int complete_formation(struct module *mod, struct load_info *info) /* This relies on module_mutex for list integrity. */ module_bug_finalize(info->hdr, info->sechdrs, mod); - /* Set RO and NX regions */ - module_enable_ro(mod); - module_enable_nx(mod); - /* Mark state as coming so strong_try_module_get() ignores us, * but kallsyms etc. can see us. */ mod->state = MODULE_STATE_COMING; @@ -3562,9 +3555,7 @@ static int load_module(struct load_info *info, const char __user *uargs, if (err < 0) goto free_modinfo; - err = post_relocation(mod, info); - if (err < 0) - goto free_modinfo; + post_relocation(mod, info); flush_module_icache(mod); @@ -3589,6 +3580,15 @@ static int load_module(struct load_info *info, const char __user *uargs, if (err) goto bug_cleanup; + /* Arch-specific module finalizing. */ + err = module_finalize(info->hdr, info->sechdrs, mod); + if (err) + goto coming_cleanup; + + /* Set RO and NX regions */ + module_enable_ro(mod); + module_enable_nx(mod); + /* 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, -- Jiri Kosina SUSE Labs