From 754d5cacba4a180be19acfa0482f1b6c48831277 Mon Sep 17 00:00:00 2001 From: "Samuel J. Greear" Date: Sat, 27 Nov 2010 10:12:06 +0000 Subject: [PATCH] nmalloc - Optimize initialization function out of hot path * Add a __constructor macro to cdefs.h * Turn malloc_init into a gcc constructor * Modify ifconfig to use the cdefs macro instead of its own --- lib/libc/stdlib/nmalloc.c | 5 +---- sbin/ifconfig/af_atalk.c | 2 +- sbin/ifconfig/af_inet.c | 2 +- sbin/ifconfig/af_inet6.c | 2 +- sbin/ifconfig/af_ipx.c | 2 +- sbin/ifconfig/af_link.c | 2 +- sbin/ifconfig/ifbridge.c | 2 +- sbin/ifconfig/ifcarp.c | 2 +- sbin/ifconfig/ifclone.c | 2 +- sbin/ifconfig/ifconfig.c | 3 ++- sbin/ifconfig/ifconfig.h | 2 -- sbin/ifconfig/ifieee80211.c | 2 +- sbin/ifconfig/ifmedia.c | 2 +- sbin/ifconfig/ifvlan.c | 2 +- sys/sys/cdefs.h | 10 ++++++++++ 15 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/libc/stdlib/nmalloc.c b/lib/libc/stdlib/nmalloc.c index 030a3f3dbb..c0d41f5c34 100644 --- a/lib/libc/stdlib/nmalloc.c +++ b/lib/libc/stdlib/nmalloc.c @@ -347,7 +347,7 @@ static void mtmagazine_destructor(void *); static slzone_t zone_alloc(int flags); static void zone_free(void *z); static void _mpanic(const char *ctl, ...); -static void malloc_init(void); +static void malloc_init(void) __constructor(0); #if defined(INVARIANTS) static void chunk_mark_allocated(slzone_t z, void *chunk); static void chunk_mark_free(slzone_t z, void *chunk); @@ -810,9 +810,6 @@ _slaballoc(size_t size, int flags) int off; void *obj; - if (!malloc_started) - malloc_init(); - /* * Handle the degenerate size == 0 case. Yes, this does happen. * Return a special pointer. This is to maintain compatibility with diff --git a/sbin/ifconfig/af_atalk.c b/sbin/ifconfig/af_atalk.c index eb26788292..dcc9517180 100644 --- a/sbin/ifconfig/af_atalk.c +++ b/sbin/ifconfig/af_atalk.c @@ -168,7 +168,7 @@ static struct afswtch af_atalk = { .af_addreq = &at_addreq, }; -static __constructor void +static __constructor(100) void atalk_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c index ffde261341..054f535919 100644 --- a/sbin/ifconfig/af_inet.c +++ b/sbin/ifconfig/af_inet.c @@ -190,7 +190,7 @@ static struct afswtch af_inet = { .af_addreq = &in_addreq, }; -static __constructor void +static __constructor(100) void inet_ctor(void) { af_register(&af_inet); diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c index fc5e427910..0e312cba2b 100644 --- a/sbin/ifconfig/af_inet6.c +++ b/sbin/ifconfig/af_inet6.c @@ -523,7 +523,7 @@ in6_Lopt_cb(const char *optarg __unused) } static struct option in6_Lopt = { "L", "[-L]", in6_Lopt_cb }; -static __constructor void +static __constructor(100) void inet6_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/af_ipx.c b/sbin/ifconfig/af_ipx.c index 4801e2e8f0..27f67b5057 100644 --- a/sbin/ifconfig/af_ipx.c +++ b/sbin/ifconfig/af_ipx.c @@ -118,7 +118,7 @@ static struct afswtch af_ipx = { .af_addreq = &ipx_addreq, }; -static __constructor void +static __constructor(100) void ipx_ctor(void) { af_register(&af_ipx); diff --git a/sbin/ifconfig/af_link.c b/sbin/ifconfig/af_link.c index 8e9fae7ccc..3e1375130a 100644 --- a/sbin/ifconfig/af_link.c +++ b/sbin/ifconfig/af_link.c @@ -115,7 +115,7 @@ static struct afswtch af_lladdr = { .af_addreq = &link_ridreq, }; -static __constructor void +static __constructor(100) void link_ctor(void) { af_register(&af_link); diff --git a/sbin/ifconfig/ifbridge.c b/sbin/ifconfig/ifbridge.c index f797f18dca..b01ffcda5d 100644 --- a/sbin/ifconfig/ifbridge.c +++ b/sbin/ifconfig/ifbridge.c @@ -548,7 +548,7 @@ static struct afswtch af_bridge = { .af_other_status = bridge_status, }; -static __constructor void +static __constructor(100) void bridge_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifcarp.c b/sbin/ifconfig/ifcarp.c index c03feddb36..ee670b25b3 100644 --- a/sbin/ifconfig/ifcarp.c +++ b/sbin/ifconfig/ifcarp.c @@ -249,7 +249,7 @@ static struct afswtch af_carp = { .af_other_status = carp_status, }; -static __constructor void +static __constructor(100) void carp_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifclone.c b/sbin/ifconfig/ifclone.c index 9077d52b58..75b18e6f4e 100644 --- a/sbin/ifconfig/ifclone.c +++ b/sbin/ifconfig/ifclone.c @@ -178,7 +178,7 @@ clone_Copt_cb(const char *optarg __unused) } static struct option clone_Copt = { .opt = "C", .opt_usage = "[-C]", .cb = clone_Copt_cb }; -static __constructor void +static __constructor(100) void clone_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index fb072795ab..bc536f8c3f 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -1138,7 +1139,7 @@ static struct cmd basic_cmds[] = { DEF_CMD_ARG("pollcpu", setifpollcpu) }; -static __constructor void +static __constructor(100) void ifconfig_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h index a0f4e296f9..e486c2e564 100644 --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -34,8 +34,6 @@ * $FreeBSD: src/sbin/ifconfig/ifconfig.h,v 1.16.2.1 2005/07/21 12:25:40 rwatson Exp $ */ -#define __constructor __attribute__((constructor)) - struct afswtch; struct cmd; diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index b8bc7f3671..c986f927a7 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -5257,7 +5257,7 @@ static struct afswtch af_ieee80211 = { .af_other_status = ieee80211_status, }; -static __constructor void +static __constructor(100) void ieee80211_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifmedia.c b/sbin/ifconfig/ifmedia.c index 3984fa7008..687614d8a8 100644 --- a/sbin/ifconfig/ifmedia.c +++ b/sbin/ifconfig/ifmedia.c @@ -739,7 +739,7 @@ static struct afswtch af_media = { .af_other_status = media_status, }; -static __constructor void +static __constructor(100) void ifmedia_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c index 72a3e97440..8bb8dddf22 100644 --- a/sbin/ifconfig/ifvlan.c +++ b/sbin/ifconfig/ifvlan.c @@ -152,7 +152,7 @@ static struct afswtch af_vlan = { .af_other_status = vlan_status, }; -static __constructor void +static __constructor(100) void vlan_ctor(void) { #define N(a) (sizeof(a) / sizeof(a[0])) diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h index 23abc01d14..db2dac12b7 100644 --- a/sys/sys/cdefs.h +++ b/sys/sys/cdefs.h @@ -293,6 +293,16 @@ #define __ARRAY_ZERO #endif +/* + * A convenient constructor macro, GCC 3.4.0 added priority support to + * constructors, provide a compatible interface for both. + */ +#if __GNUC_PREREQ__(4, 3) +#define __constructor(prio) __attribute__((constructor(prio))) +#else +#define __constructor(prio) __attribute__((constructor)) +#endif + /* * Handy GCC based macros: * -- 2.41.0