Module Name: src Committed By: christos Date: Wed Apr 19 15:54:45 UTC 2017
Modified Files: src/sys/kern: subr_kobj.c Log Message: simplify. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/sys/kern/subr_kobj.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_kobj.c diff -u src/sys/kern/subr_kobj.c:1.60 src/sys/kern/subr_kobj.c:1.61 --- src/sys/kern/subr_kobj.c:1.60 Wed Apr 19 02:19:02 2017 +++ src/sys/kern/subr_kobj.c Wed Apr 19 11:54:45 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kobj.c,v 1.60 2017/04/19 06:19:02 pgoyette Exp $ */ +/* $NetBSD: subr_kobj.c,v 1.61 2017/04/19 15:54:45 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.60 2017/04/19 06:19:02 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.61 2017/04/19 15:54:45 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_modular.h" @@ -629,6 +629,29 @@ kobj_load(kobj_t ko) return error; } +static void +kobj_unload_notify(kobj_t ko, vaddr_t addr, size_t size, const char *note) +{ + if (addr == 0) + return; + + int error = kobj_machdep(ko, (void *)addr, size, false); + if (error) + kobj_error(ko, "machine dependent deinit failed (%s) %d", + note, error); +} + +#define KOBJ_SEGMENT_NOTIFY(ko, what) \ + kobj_unload_notify(ko, (ko)->ko_ ## what ## _address, \ + (ko)->ko_ ## what ## _size, # what); + +#define KOBJ_SEGMENT_FREE(ko, what) \ + do \ + if ((ko)->ko_ ## what ## _address != 0) \ + uvm_km_free(module_map, (ko)->ko_ ## what ## _address, \ + round_page((ko)->ko_ ## what ## _size), UVM_KMF_WIRED); \ + while (/*CONSTCOND*/ 0) + /* * kobj_unload: * @@ -637,51 +660,23 @@ kobj_load(kobj_t ko) void kobj_unload(kobj_t ko) { - int error; - kobj_close(ko); kobj_jettison(ko); + /* * Notify MD code that a module has been unloaded. */ if (ko->ko_loaded) { - if (ko->ko_text_address != 0) { - error = kobj_machdep(ko, (void *)ko->ko_text_address, - ko->ko_text_size, false); - if (error != 0) - kobj_error(ko, "machine dependent deinit failed" - " (text) %d", error); - } + KOBJ_SEGMENT_NOTIFY(ko, text); + KOBJ_SEGMENT_NOTIFY(ko, data); + KOBJ_SEGMENT_NOTIFY(ko, rodata); + } - if (ko->ko_data_address != 0) { - error = kobj_machdep(ko, (void *)ko->ko_data_address, - ko->ko_data_size, false); - if (error != 0) - kobj_error(ko, "machine dependent deinit failed" - "(data) %d", error); - } + KOBJ_SEGMENT_FREE(ko, text); + KOBJ_SEGMENT_FREE(ko, data); + KOBJ_SEGMENT_FREE(ko, rodata); - if (ko->ko_rodata_address != 0) { - error = kobj_machdep(ko, (void *)ko->ko_rodata_address, - ko->ko_rodata_size, false); - if (error != 0) - kobj_error(ko, "machine dependent deinit failed" - "(rodata) %d", error); - } - } - if (ko->ko_text_address != 0) { - uvm_km_free(module_map, ko->ko_text_address, - round_page(ko->ko_text_size), UVM_KMF_WIRED); - } - if (ko->ko_data_address != 0) { - uvm_km_free(module_map, ko->ko_data_address, - round_page(ko->ko_data_size), UVM_KMF_WIRED); - } - if (ko->ko_rodata_address != 0) { - uvm_km_free(module_map, ko->ko_rodata_address, - round_page(ko->ko_rodata_size), UVM_KMF_WIRED); - } if (ko->ko_ksyms == true) { ksyms_modunload(ko->ko_name); }