From 412854593cf368006c18e6c0dc607a9ecd76a0e0 Mon Sep 17 00:00:00 2001 From: Niklas Edmundsson Date: Sun, 3 Apr 2005 19:13:30 +0000 Subject: [PATCH] aix5-allocator-cleanup-20050403 * Removed memory allocation functions only used on AIX and ancient HPUX. If the performance penalty is noticeable, implement a wrapper at the osi-level in the same manner as LINUX/FBSD (ie not sprayed throughout the code). * Removed all remnants of splnet()-style locking, it was not sufficient for MP anyway which the real locks are. Affects only AIX and HPUX. * Drop the global locking in rxi_Alloc since the real locks do their jobs, affects only AIX41 and up (ie. MP capable OS). * Fix the non-kernel wrapper for osi_Alloc/Free on AIX to take void * in the same manner as the rest of the functions. IMO this wrapper shouldn't be necessary since you should never ever malloc() 0 bytes, but since it's there I'd guess someone made stupid assumptions somewhere... * Restores MAXKTCTICKETLEN to 12000 on AIX * Restores AFS_LWP_MINSTACKSIZE to 48k on AIX (might affect server-stuff) --- src/afs/afs_daemons.c | 16 ---- src/afs/afs_init.c | 31 ------- src/afs/afs_osi_alloc.c | 214 +---------------------------------------------- src/afs/afs_prototypes.h | 7 -- src/afs/sysincludes.h | 4 - src/lwp/lwp.h | 8 +- src/rx/rx.c | 41 +-------- src/rx/rx_prototypes.h | 12 +-- src/rx/rx_user.c | 16 ++-- src/rxkad/rxkad.p.h | 9 -- 10 files changed, 21 insertions(+), 337 deletions(-) diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index b8c01b3..7ee41b7 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -145,22 +145,6 @@ afs_Daemon(void) afs_FlushVCBs(1); /* flush queued callbacks */ afs_MaybeWakeupTruncateDaemon(); /* free cache space if have too */ rx_CheckPackets(); /* Does RX need more packets? */ -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - /* - * Hack: We always want to make sure there are plenty free - * entries in the small free pool so that we don't have to - * worry about rx (with disabled interrupts) to have to call - * malloc). So we do the dummy call below... - */ - if (((afs_stats_cmperf.SmallBlocksAlloced - - afs_stats_cmperf.SmallBlocksActive) - <= AFS_SALLOC_LOW_WATER)) - osi_FreeSmallSpace(osi_AllocSmallSpace(AFS_SMALLOCSIZ)); - if (((afs_stats_cmperf.MediumBlocksAlloced - - afs_stats_cmperf.MediumBlocksActive) - <= AFS_MALLOC_LOW_WATER + 50)) - osi_AllocMoreMSpace(AFS_MALLOC_LOW_WATER * 2); -#endif now = osi_Time(); if (lastCBSlotBump + CBHTSLOTLEN < now) { /* pretty time-dependant */ diff --git a/src/afs/afs_init.c b/src/afs/afs_init.c index 2c872c9..219bd8b 100644 --- a/src/afs/afs_init.c +++ b/src/afs/afs_init.c @@ -111,26 +111,6 @@ afs_CacheInit(afs_int32 astatSize, afs_int32 afiles, afs_int32 ablocks, RWLOCK_INIT(&afs_xaxs, "afs_xaxs"); osi_dnlc_init(); - -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - { - afs_int32 preallocs; - - /* - * We want to also reserve space for the gnode struct which is associated - * with each vnode (vcache) one; we want to use the pinned pool for them - * since they're referenced at interrupt level. - */ - if (afs_stats_cmperf.SmallBlocksAlloced + astatSize < 3600) - preallocs = astatSize; - else { - preallocs = 3600 - afs_stats_cmperf.SmallBlocksAlloced; - if (preallocs <= 0) - preallocs = 10; - } - osi_AllocMoreSSpace(preallocs); - } -#endif /* * create volume list structure */ @@ -488,9 +468,7 @@ afs_ResourceInit(int preallocs) RWLOCK_INIT(&afs_xinterface, "afs_xinterface"); LOCK_INIT(&afs_puttofileLock, "afs_puttofileLock"); #ifndef AFS_FBSD_ENV -#ifndef AFS_AIX32_ENV LOCK_INIT(&osi_fsplock, "osi_fsplock"); -#endif LOCK_INIT(&osi_flplock, "osi_flplock"); #endif RWLOCK_INIT(&afs_xconn, "afs_xconn"); @@ -507,15 +485,6 @@ afs_ResourceInit(int preallocs) afs_sysname = afs_sysnamelist[0]; strcpy(afs_sysname, SYS_NAME); afs_sysnamecount = 1; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - { - - if ((preallocs > 256) && (preallocs < 3600)) - afs_preallocs = preallocs; - osi_AllocMoreSSpace(afs_preallocs); - osi_AllocMoreMSpace(100); - } -#endif } secobj = rxnull_NewServerSecurityObject(); diff --git a/src/afs/afs_osi_alloc.c b/src/afs/afs_osi_alloc.c index 13bcaff..539bc8b 100644 --- a/src/afs/afs_osi_alloc.c +++ b/src/afs/afs_osi_alloc.c @@ -20,16 +20,17 @@ RCSID #include "afs/afs_stats.h" /* afs statistics */ #ifndef AFS_FBSD_ENV + #ifdef AFS_AIX41_ENV #include "sys/lockl.h" #include "sys/sleep.h" #include "sys/syspest.h" #include "sys/lock_def.h" /*lock_t osi_fsplock = LOCK_AVAIL;*/ -#else -afs_lock_t osi_fsplock; #endif +afs_lock_t osi_fsplock; + static struct osi_packet { @@ -38,29 +39,6 @@ static struct osi_packet { afs_lock_t osi_flplock; -afs_int32 afs_preallocs = 512; /* Reserve space for all small allocs! */ -void -osi_AllocMoreSSpace(register afs_int32 preallocs) -{ - register int i; - char *p; - - p = (char *)afs_osi_Alloc(AFS_SMALLOCSIZ * preallocs); -#ifdef KERNEL_HAVE_PIN - pin(p, AFS_SMALLOCSIZ * preallocs); /* XXXX */ -#endif - for (i = 0; i < preallocs; i++, p += AFS_SMALLOCSIZ) { -#ifdef AFS_AIX32_ENV - *p = '\0'; /* page fault it in. */ -#endif - osi_FreeSmallSpace((char *)p); - } - afs_stats_cmperf.SmallBlocksAlloced += preallocs; - afs_stats_cmperf.SmallBlocksActive += preallocs; -} - - - /* free space allocated by AllocLargeSpace. Also called by mclput when freeing * a packet allocated by osi_NetReceive. */ @@ -82,98 +60,16 @@ void osi_FreeSmallSpace(void *adata) { -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif - AFS_ASSERT_GLOCK(); AFS_STATCNT(osi_FreeSmallSpace); afs_stats_cmperf.SmallBlocksActive--; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - x = splnet(); /*lockl(&osi_fsplock, LOCK_SHORT); */ -#else MObtainWriteLock(&osi_fsplock, 323); -#endif ((struct osi_packet *)adata)->next = freeSmallList; freeSmallList = adata; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - splx(x); /*unlockl(&osi_fsplock); */ -#else MReleaseWriteLock(&osi_fsplock); -#endif } -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) -static struct osi_packet *freeMediumList; - -osi_AllocMoreMSpace(register afs_int32 preallocs) -{ - register int i; - char *p; - - p = (char *)afs_osi_Alloc(AFS_MDALLOCSIZ * preallocs); -#ifdef KERNEL_HAVE_PIN - pin(p, AFS_MDALLOCSIZ * preallocs); /* XXXX */ -#endif - for (i = 0; i < preallocs; i++, p += AFS_MDALLOCSIZ) { -#ifdef AFS_AIX32_ENV - *p = '\0'; /* page fault it in. */ -#endif - osi_FreeMediumSpace((char *)p); - } - afs_stats_cmperf.MediumBlocksAlloced += preallocs; - afs_stats_cmperf.MediumBlocksActive += preallocs; -} - - -void * -osi_AllocMediumSpace(size_t size) -{ - register struct osi_packet *tp; -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif - - afs_stats_cmperf.MediumBlocksActive++; - retry: - x = splnet(); - tp = freeMediumList; - if (tp) - freeMediumList = tp->next; - splx(x); - if (!tp) { - osi_AllocMoreMSpace(AFS_MALLOC_LOW_WATER); - goto retry; - } - return tp; -} - -void -osi_FreeMediumSpace(void *adata) -{ - -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif - - afs_stats_cmperf.MediumBlocksActive--; - x = splnet(); - ((struct osi_packet *)adata)->next = freeMediumList; - freeMediumList = adata; - splx(x); -} -#endif /* defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) */ - /* allocate space for sender */ void * @@ -210,129 +106,28 @@ osi_AllocLargeSpace(size_t size) return (char *)tp; } -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) -/* - * XXX We could have used a macro around osi_AllocSmallSpace but it's - * probably better like this so that we can remove this at some point. - */ -/* morespace 1 - means we called at splnet level */ -char * -osi_AllocSmall(register afs_int32 size, register afs_int32 morespace) -{ - register struct osi_packet *tp; -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif - - AFS_ASSERT_GLOCK(); - - AFS_STATCNT(osi_AllocSmallSpace); - if (size > AFS_SMALLOCSIZ) - osi_Panic("osi_AllocSmall, size=%d", size); - if ((!morespace - && - ((afs_stats_cmperf.SmallBlocksAlloced - - afs_stats_cmperf.SmallBlocksActive) - <= AFS_SALLOC_LOW_WATER)) - || !freeSmallList) { - osi_AllocMoreSSpace(AFS_SALLOC_LOW_WATER * 2); - } - afs_stats_cmperf.SmallBlocksActive++; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - x = splnet(); /*lockl(&osi_fsplock, LOCK_SHORT); */ -#else - MObtainWriteLock(&osi_fsplock, 325); -#endif - tp = freeSmallList; - if (tp) - freeSmallList = tp->next; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - splx(x); /*unlockl(&osi_fsplock); */ -#else - MReleaseWriteLock(&osi_fsplock); -#endif - - return (char *)tp; -} - -int -osi_FreeSmall(register struct osi_packet *adata) -{ -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif - - AFS_STATCNT(osi_FreeSmallSpace); - afs_stats_cmperf.SmallBlocksActive--; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - x = splnet(); /*lockl(&osi_fsplock, LOCK_SHORT); */ -#else - MObtainWriteLock(&osi_fsplock, 326); -#endif - adata->next = freeSmallList; - freeSmallList = adata; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - splx(x); /*unlockl(&osi_fsplock); */ -#else - MReleaseWriteLock(&osi_fsplock); -#endif - return 0; -} -#endif /* AFS_AIX32_ENV || AFS_HPUX_ENV */ /* allocate space for sender */ void * osi_AllocSmallSpace(size_t size) { register struct osi_packet *tp; -#if defined(AFS_AIX32_ENV) - int x; -#endif -#if defined(AFS_HPUX_ENV) - ulong_t x; -#endif AFS_STATCNT(osi_AllocSmallSpace); if (size > AFS_SMALLOCSIZ) osi_Panic("osi_AllocSmallS: size=%d\n", size); -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - /* - * We're running out of free blocks (< 50); get some more ourselves so that - * when we don't run out of them when called under splnet() (from rx); - */ - if (((afs_stats_cmperf.SmallBlocksAlloced - - afs_stats_cmperf.SmallBlocksActive) - <= AFS_SALLOC_LOW_WATER) || !freeSmallList) { - osi_AllocMoreSSpace(AFS_SALLOC_LOW_WATER * 2); - } -#else if (!freeSmallList) { afs_stats_cmperf.SmallBlocksAlloced++; afs_stats_cmperf.SmallBlocksActive++; return afs_osi_Alloc(AFS_SMALLOCSIZ); } -#endif afs_stats_cmperf.SmallBlocksActive++; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - x = splnet(); /*lockl(&osi_fsplock, LOCK_SHORT); */ -#else MObtainWriteLock(&osi_fsplock, 327); -#endif tp = freeSmallList; if (tp) freeSmallList = tp->next; -#if defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV) - splx(x); /*unlockl(&osi_fsplock); */ -#else MReleaseWriteLock(&osi_fsplock); -#endif return (char *)tp; } @@ -362,10 +157,7 @@ shutdown_osinet(void) unpin(tp, AFS_SMALLOCSIZ); #endif } - afs_preallocs = 512; -#ifndef AFS_AIX32_ENV LOCK_INIT(&osi_fsplock, "osi_fsplock"); -#endif LOCK_INIT(&osi_flplock, "osi_flplock"); } } diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index 1541e08..0fcbabe 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -514,20 +514,13 @@ extern afs_int32 PagInCred(const struct AFS_UCRED *cred); /* afs_osi_alloc.c */ #ifndef AFS_FBSD_ENV -extern afs_int32 afs_preallocs; extern afs_lock_t osi_fsplock; extern afs_lock_t osi_flplock; #endif extern void osi_FreeLargeSpace(void *adata); -extern void osi_FreeMediumSpace(void *adata); extern void osi_FreeSmallSpace(void *adata); extern void *osi_AllocLargeSpace(size_t size); -extern void *osi_AllocMediumSpace(size_t size); extern void *osi_AllocSmallSpace(size_t size); -#ifndef osi_AllocSmall -extern char *osi_AllocSmall(register afs_int32 size, - register afs_int32 morespace); -#endif /* afs_osi_uio.c */ extern int afsio_copy(struct uio *ainuio, struct uio *aoutuio, diff --git a/src/afs/sysincludes.h b/src/afs/sysincludes.h index 7274e7c..33c049d 100644 --- a/src/afs/sysincludes.h +++ b/src/afs/sysincludes.h @@ -304,10 +304,6 @@ MALLOC_DECLARE(M_AFS); #include "rpc/types.h" #include "rx/xdr.h" -#ifdef AFS_AIX32_ENV -# include "net/spl.h" -#endif - /* Miscellaneous headers */ #include "h/proc.h" #if !defined(AFS_FBSD_ENV) diff --git a/src/lwp/lwp.h b/src/lwp/lwp.h index f9139e4..1846a4e 100644 --- a/src/lwp/lwp.h +++ b/src/lwp/lwp.h @@ -298,17 +298,11 @@ char lwp_debug; /* ON = show LWP debugging trace */ */ #if defined(USE_UCONTEXT) && defined(HAVE_UCONTEXT_H) #define AFS_LWP_MINSTACKSIZE (288 * 1024) -#else -#if defined(AFS_LINUX22_ENV) +#elif defined(AFS_LINUX22_ENV) #define AFS_LWP_MINSTACKSIZE (192 * 1024) #else -#if defined(AFS_AIX52_ENV) -#define AFS_LWP_MINSTACKSIZE (128 * 1024) -#else #define AFS_LWP_MINSTACKSIZE (48 * 1024) #endif -#endif -#endif /* Action to take on stack overflow. */ #define LWP_SOQUIET 1 /* do nothing */ diff --git a/src/rx/rx.c b/src/rx/rx.c index 173cbc5..bdad76a 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -2194,30 +2194,13 @@ rxi_Alloc(register size_t size) { register char *p; -#if defined(AFS_AIX41_ENV) && defined(KERNEL) - /* Grab the AFS filesystem lock. See afs/osi.h for the lock - * implementation. - */ - int glockOwner = ISAFS_GLOCK(); - if (!glockOwner) - AFS_GLOCK(); -#endif MUTEX_ENTER(&rx_stats_mutex); rxi_Alloccnt++; rxi_Allocsize += size; MUTEX_EXIT(&rx_stats_mutex); -#if (defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV)) && !defined(AFS_HPUX100_ENV) && defined(KERNEL) - if (size > AFS_SMALLOCSIZ) { - p = (char *)osi_AllocMediumSpace(size); - } else - p = (char *)osi_AllocSmall(size, 1); -#if defined(AFS_AIX41_ENV) && defined(KERNEL) - if (!glockOwner) - AFS_GUNLOCK(); -#endif -#else + p = (char *)osi_Alloc(size); -#endif + if (!p) osi_Panic("rxi_Alloc error"); memset(p, 0, size); @@ -2227,30 +2210,12 @@ rxi_Alloc(register size_t size) void rxi_Free(void *addr, register size_t size) { -#if defined(AFS_AIX41_ENV) && defined(KERNEL) - /* Grab the AFS filesystem lock. See afs/osi.h for the lock - * implementation. - */ - int glockOwner = ISAFS_GLOCK(); - if (!glockOwner) - AFS_GLOCK(); -#endif MUTEX_ENTER(&rx_stats_mutex); rxi_Alloccnt--; rxi_Allocsize -= size; MUTEX_EXIT(&rx_stats_mutex); -#if (defined(AFS_AIX32_ENV) || defined(AFS_HPUX_ENV)) && !defined(AFS_HPUX100_ENV) && defined(KERNEL) - if (size > AFS_SMALLOCSIZ) - osi_FreeMediumSpace(addr); - else - osi_FreeSmall(addr); -#if defined(AFS_AIX41_ENV) && defined(KERNEL) - if (!glockOwner) - AFS_GUNLOCK(); -#endif -#else + osi_Free(addr, size); -#endif } /* Find the peer process represented by the supplied (host,port) diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 303a58e..35a086e 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -551,12 +551,12 @@ extern void osi_AssertFailU(const char *expr, const char *file, int line); extern int rx_getAllAddr(afs_int32 * buffer, int maxSize); extern void osi_Panic(); /* leave without args till stdarg rewrite */ extern void rxi_InitPeerParams(struct rx_peer *pp); -#ifdef AFS_AIX32_ENV -#ifndef osi_Alloc -extern char *osi_Alloc(afs_int32 x); -extern void osi_Free(char *x, afs_int32 size); -#endif -#endif /* AFS_AIX32_ENV */ + +#if defined(AFS_AIX32_ENV) && !defined(KERNEL) +extern void *osi_Alloc(afs_int32 x); +extern void osi_Free(void *x, afs_int32 size); +#endif /* defined(AFS_AIX32_ENV) && !defined(KERNEL) */ + extern void rx_GetIFInfo(void); extern void rx_SetNoJumbo(void); diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index dc2a4d5..9fc0be9 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -233,30 +233,30 @@ osi_AssertFailU(const char *expr, const char *file, int line) (int)file, line); } -#ifdef AFS_AIX32_ENV +#if defined(AFS_AIX32_ENV) && !defined(KERNEL) #ifndef osi_Alloc static const char memZero; -char * +void * osi_Alloc(afs_int32 x) { /* - * 0-length allocs may return NULL ptr from osi_kalloc, so we special-case + * 0-length allocs may return NULL ptr from malloc, so we special-case * things so that NULL returned iff an error occurred */ if (x == 0) - return &memZero; - return ((char *)malloc(x)); + return (void *)&memZero; + return(malloc(x)); } void -osi_Free(char *x, afs_int32 size) +osi_Free(void *x, afs_int32 size) { if (x == &memZero) return; - free((char *)x); + free(x); } #endif -#endif /* AFS_AIX32_ENV */ +#endif /* defined(AFS_AIX32_ENV) && !defined(KERNEL) */ #define ADDRSPERSITE 16 diff --git a/src/rxkad/rxkad.p.h b/src/rxkad/rxkad.p.h index 0caab62..92824f7 100644 --- a/src/rxkad/rxkad.p.h +++ b/src/rxkad/rxkad.p.h @@ -16,16 +16,7 @@ /* no ticket good for longer than 30 days */ #define MAXKTCTICKETLIFETIME (30*24*3600) #define MINKTCTICKETLEN 32 - -#if defined(AFS_AIX52_ENV) -#ifdef __XCOFF64__ -#define MAXKTCTICKETLEN 12000 /* was 344 */ -#else -#define MAXKTCTICKETLEN 344 -#endif -#else #define MAXKTCTICKETLEN 12000 /* was 344 */ -#endif #define MAXKTCNAMELEN 64 /* name & inst should be 256 */ #define MAXKTCREALMLEN 64 /* should be 256 */ -- 1.9.4