From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753373AbdBKElf (ORCPT ); Fri, 10 Feb 2017 23:41:35 -0500 Received: from mx1.redhat.com ([209.132.183.28]:32880 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752932AbdBKEle (ORCPT ); Fri, 10 Feb 2017 23:41:34 -0500 Date: Fri, 10 Feb 2017 23:41:34 -0500 From: Jessica Yu To: Peter Zijlstra Cc: rusty@rustcorp.com.au, Mark Rutland , linux-kernel@vger.kernel.org Subject: Re: module: Optimize search_module_extables() Message-ID: <20170211044133.GA2879@packer-debian-8-amd64.digitalocean.com> References: <20170208144801.GZ6515@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20170208144801.GZ6515@twins.programming.kicks-ass.net> X-OS: Linux eisen.io 3.16.0-4-amd64 x86_64 User-Agent: Mutt/1.5.23 (2014-03-12) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sat, 11 Feb 2017 04:41:35 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org +++ Peter Zijlstra [08/02/17 15:48 +0100]: > >While looking through the __ex_table stuff I found that we do a linear >lookup of the module. Also fix up a comment. > >Signed-off-by: Peter Zijlstra (Intel) Applied, thanks. Hm. A quick scan through module.c still shows a couple of places that use similar linear lookups, and may benefit from the same __module_address optimization. But I'll save that for a separate patch.. Jessica >--- > kernel/module.c | 27 ++++++++++++++------------- > 1 file changed, 14 insertions(+), 13 deletions(-) > >diff --git a/kernel/module.c b/kernel/module.c >index 3d8f126208e3..7bcdc35dbf95 100644 >--- a/kernel/module.c >+++ b/kernel/module.c >@@ -4165,22 +4165,23 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) > struct module *mod; > > preempt_disable(); >- list_for_each_entry_rcu(mod, &modules, list) { >- if (mod->state == MODULE_STATE_UNFORMED) >- continue; >- if (mod->num_exentries == 0) >- continue; >+ mod = __module_address(addr); >+ if (!mod) >+ goto out; > >- e = search_extable(mod->extable, >- mod->extable + mod->num_exentries - 1, >- addr); >- if (e) >- break; >- } >+ if (!mod->num_exentries) >+ goto out; >+ >+ e = search_extable(mod->extable, >+ mod->extable + mod->num_exentries - 1, >+ addr); >+out: > preempt_enable(); > >- /* Now, if we found one, we are running inside it now, hence >- we cannot unload the module, hence no refcnt needed. */ >+ /* >+ * Now, if we found one, we are running inside it now, hence >+ * we cannot unload the module, hence no refcnt needed. >+ */ > return e; > } >