From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751190AbdEaMCN (ORCPT ); Wed, 31 May 2017 08:02:13 -0400 Received: from www17.your-server.de ([213.133.104.17]:51909 "EHLO www17.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751028AbdEaMCL (ORCPT ); Wed, 31 May 2017 08:02:11 -0400 Message-ID: <1496232126.31655.1.camel@m3y3r.de> Subject: [PATCH] lib/extable.c: use bsearch() library function in search_extable() From: Thomas Meyer To: linux-kernel@vger.kernel.org Date: Wed, 31 May 2017 14:02:06 +0200 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.22.6 (3.22.6-2.fc25) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Authenticated-Sender: thomas@m3y3r.de Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Thomas Meyer ---  lib/extable.c | 30 +++++++++++++-----------------  1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/extable.c b/lib/extable.c index 62968da..eb16cb3 100644 --- a/lib/extable.c +++ b/lib/extable.c @@ -9,6 +9,7 @@   * 2 of the License, or (at your option) any later version.   */   +#include  #include  #include  #include @@ -51,7 +52,7 @@ static void swap_ex(void *a, void *b, int size)   * This is used both for the kernel exception table and for   * the exception tables of modules that get loaded.   */ -static int cmp_ex(const void *a, const void *b) +static int cmp_ex_sort(const void *a, const void *b)  {   const struct exception_table_entry *x = a, *y = b;   @@ -67,7 +68,7 @@ void sort_extable(struct exception_table_entry *start,     struct exception_table_entry *finish)  {   sort(start, finish - start, sizeof(struct exception_table_entry), -      cmp_ex, swap_ex); +      cmp_ex_sort, swap_ex);  }    #ifdef CONFIG_MODULES @@ -93,6 +94,13 @@ void trim_init_extable(struct module *m)  #endif /* !ARCH_HAS_SORT_EXTABLE */    #ifndef ARCH_HAS_SEARCH_EXTABLE + +static int cmp_ex_search(const void *key, const void *elt) +{ + const struct exception_table_entry * _elt = elt; + return *(unsigned long*) key - ex_to_insn(_elt); +} +  /*   * Search one exception table for an entry corresponding to the   * given instruction address, and return the address of the entry, @@ -105,21 +113,9 @@ search_extable(const struct exception_table_entry *first,          const struct exception_table_entry *last,          unsigned long value)  { - while (first <= last) { - const struct exception_table_entry *mid; + if(last < first) + return NULL;   - mid = ((last - first) >> 1) + first; - /* -  * careful, the distance between value and insn -  * can be larger than MAX_LONG: -  */ - if (ex_to_insn(mid) < value) - first = mid + 1; - else if (ex_to_insn(mid) > value) - last = mid - 1; - else - return mid; - } - return NULL; + return bsearch(&value, first, last - first + 1, sizeof(struct exception_table_entry), cmp_ex_search);  }  #endif