From c17794bb23576b30c6ccc3112ba06ea1cd766b6d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 1 Apr 2003 04:42:30 -0800 Subject: [PATCH] [PATCH] Extable list removal This removes the extable list, and the struct exception_table, in favour of just iterating through the modules. Now all iteration is within kernel/module.c, this is a fairly trivial cleanup. --- include/linux/module.h | 17 +++++------------ kernel/extable.c | 1 + kernel/module.c | 26 ++++++++++---------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index a7c673ea41a72..8aef11352270b 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -18,7 +18,6 @@ #include #include -#include /* For struct exception_table_entry */ /* Not Yet Implemented */ #define MODULE_AUTHOR(name) @@ -51,6 +50,8 @@ extern int init_module(void); extern void cleanup_module(void); /* Archs provide a method of finding the correct exception table. */ +struct exception_table_entry; + const struct exception_table_entry * search_extable(const struct exception_table_entry *first, const struct exception_table_entry *last, @@ -114,15 +115,6 @@ extern const struct gtype##_id __mod_##gtype##_table \ /* Given an address, look for it in the exception tables */ const struct exception_table_entry *search_exception_tables(unsigned long add); -struct exception_table -{ - struct list_head list; - - unsigned int num_entries; - const struct exception_table_entry *entry; -}; - - #ifdef CONFIG_MODULES /* Get/put a kernel symbol (calls must be symmetric) */ @@ -197,8 +189,9 @@ struct module unsigned int num_gpl_syms; const unsigned long *gpl_crcs; - /* Exception tables */ - struct exception_table extable; + /* Exception table */ + unsigned int num_exentries; + const struct exception_table_entry *extable; /* Startup function. */ int (*init)(void); diff --git a/kernel/extable.c b/kernel/extable.c index 817f069166226..5363e7f6f9e4a 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -16,6 +16,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include +#include extern const struct exception_table_entry __start___ex_table[]; extern const struct exception_table_entry __stop___ex_table[]; diff --git a/kernel/module.c b/kernel/module.c index 065e49805334d..163e5c00e74c8 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -52,13 +52,12 @@ #define symbol_is(literal, string) \ (strcmp(MODULE_SYMBOL_PREFIX literal, (string)) == 0) -/* Protects extables and symbols lists */ +/* Protects module list */ static spinlock_t modlist_lock = SPIN_LOCK_UNLOCKED; /* List of modules, protected by module_mutex AND modlist_lock */ static DECLARE_MUTEX(module_mutex); static LIST_HEAD(modules); -static LIST_HEAD(extables); /* We require a truly strong try_module_get() */ static inline int strong_try_module_get(struct module *mod) @@ -883,7 +882,6 @@ static void free_module(struct module *mod) /* Delete from various lists */ spin_lock_irq(&modlist_lock); list_del(&mod->list); - list_del(&mod->extable.list); spin_unlock_irq(&modlist_lock); /* Module unload stuff */ @@ -1268,14 +1266,9 @@ static struct module *load_module(void *umod, } #endif - /* Set up exception table */ - if (exindex) { - /* FIXME: Sort exception table. */ - mod->extable.num_entries = (sechdrs[exindex].sh_size - / sizeof(struct - exception_table_entry)); - mod->extable.entry = (void *)sechdrs[exindex].sh_addr; - } + /* Set up exception table */ + mod->num_exentries = sechdrs[exindex].sh_size / sizeof(*mod->extable); + mod->extable = (void *)sechdrs[exindex].sh_addr; /* Now do relocations. */ for (i = 1; i < hdr->e_shnum; i++) { @@ -1374,7 +1367,6 @@ sys_init_module(void *umod, /* Now sew it into the lists. They won't access us, since strong_try_module_get() will fail. */ spin_lock_irq(&modlist_lock); - list_add(&mod->extable.list, &extables); list_add(&mod->list, &modules); spin_unlock_irq(&modlist_lock); @@ -1539,14 +1531,16 @@ const struct exception_table_entry *search_module_extables(unsigned long addr) { unsigned long flags; const struct exception_table_entry *e = NULL; - struct exception_table *i; + struct module *mod; spin_lock_irqsave(&modlist_lock, flags); - list_for_each_entry(i, &extables, list) { - if (i->num_entries == 0) + list_for_each_entry(mod, &modules, list) { + if (mod->num_exentries == 0) continue; - e = search_extable(i->entry, i->entry+i->num_entries-1, addr); + e = search_extable(mod->extable, + mod->extable + mod->num_exentries - 1, + addr); if (e) break; } -- 2.53.0