From: Chas Williams (CONTRACTOR) Date: Mon, 4 Oct 2010 19:08:10 +0000 (-0400) Subject: Allow private implementations of osi_AllocSmall/LargeSpace X-Git-Tag: openafs-devel-1_7_1~1395 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=dcb40c9fb8629e028e2dfa6333423b0ce0c00abc Allow private implementations of osi_AllocSmall/LargeSpace NBSD seemed to already do this at one point but was partly disabled. This patches generalizes this feature by adding a define to disable the standard pool macros. Linux's slab based allocator should out perform this single threaded allocator/pool. Change-Id: Id8d498c11874b7d87736968b99f7ca023af4af36 Reviewed-on: http://gerrit.openafs.org/2998 Tested-by: BuildBot Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/afs/LINUX/osi_alloc.c b/src/afs/LINUX/osi_alloc.c index b10bbab..99256e4 100644 --- a/src/afs/LINUX/osi_alloc.c +++ b/src/afs/LINUX/osi_alloc.c @@ -403,3 +403,34 @@ osi_linux_verify_alloced_memory() up(&afs_linux_alloc_sem); return; } + +#ifdef AFS_PRIVATE_OSI_ALLOCSPACES + +void +osi_FreeLargeSpace(void *p) +{ + kfree(p); +} + +void +osi_FreeSmallSpace(void *p) +{ + kfree(p); +} + +void * +osi_AllocLargeSpace(size_t size) +{ + if (size > AFS_LRALLOCSIZ) + osi_Panic("osi_AllocLargeSpace: size=%d\n", (int) size); + return kmalloc(AFS_LRALLOCSIZ, GFP_NOFS); +} + +void * +osi_AllocSmallSpace(size_t size) +{ + if (size > AFS_SMALLOCSIZ) + osi_Panic("osi_AllocSmallS: size=%d\n", (int)size); + return kmalloc(AFS_SMALLOCSIZ, GFP_NOFS); +} +#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */ diff --git a/src/afs/NBSD/osi_misc.c b/src/afs/NBSD/osi_misc.c index 845aa97..7c0b2bc 100644 --- a/src/afs/NBSD/osi_misc.c +++ b/src/afs/NBSD/osi_misc.c @@ -135,7 +135,7 @@ afs_osi_FreeStr(char *x) /* XXXX OpenBSD avoids space pool, presumably Rees believed the kernel * allocator did as well or better */ -#if 0 +#ifdef AFS_PRIVATE_OSI_ALLOCSPACES void osi_FreeLargeSpace(void *p) { @@ -144,7 +144,6 @@ osi_FreeLargeSpace(void *p) /* XXXX OpenBSD avoids space pool, presumably Rees believed the kernel * allocator did as well or better */ -#if 0 void osi_FreeSmallSpace(void *p) { @@ -167,9 +166,7 @@ osi_AllocSmallSpace(size_t size) return (osi_nbsd_Alloc(size, 1)); } -#endif /* Space undef */ - -#endif /* Space undef */ +#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */ int afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval) diff --git a/src/afs/afs_init.c b/src/afs/afs_init.c index 7721a3f..1ad7725 100644 --- a/src/afs/afs_init.c +++ b/src/afs/afs_init.c @@ -522,7 +522,7 @@ afs_ResourceInit(int preallocs) AFS_RWLOCK_INIT(&afs_icl_lock, "afs_icl_lock"); AFS_RWLOCK_INIT(&afs_xinterface, "afs_xinterface"); LOCK_INIT(&afs_puttofileLock, "afs_puttofileLock"); -#ifndef AFS_FBSD_ENV +#ifndef AFS_PRIVATE_OSI_ALLOCSPACES LOCK_INIT(&osi_fsplock, "osi_fsplock"); LOCK_INIT(&osi_flplock, "osi_flplock"); #endif diff --git a/src/afs/afs_osi_alloc.c b/src/afs/afs_osi_alloc.c index 6855afa..fa750c4 100644 --- a/src/afs/afs_osi_alloc.c +++ b/src/afs/afs_osi_alloc.c @@ -24,15 +24,18 @@ #include "sys/sleep.h" #include "sys/syspest.h" #include "sys/lock_def.h" -/*lock_t osi_fsplock = LOCK_AVAIL;*/ #endif +#ifndef AFS_PRIVATE_OSI_ALLOCSPACES + afs_lock_t osi_fsplock; +afs_lock_t osi_flplock; static struct osi_packet { struct osi_packet *next; -} *freePacketList = NULL, *freeSmallList; -afs_lock_t osi_flplock; +} *freePacketList = NULL, *freeSmallList = NULL; + +#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */ static char memZero; /* address of 0 bytes for kmem_alloc */ @@ -122,6 +125,10 @@ afs_osi_FreeStr(char *x) afs_osi_Free(x, strlen(x) + 1); } +#endif /* !AFS_NBSD_ENV && !defined(AFS_NBSD50_ENV) */ + +#ifndef AFS_PRIVATE_OSI_ALLOCSPACES + /* free space allocated by AllocLargeSpace. Also called by mclput when freeing * a packet allocated by osi_NetReceive. */ @@ -217,13 +224,13 @@ osi_AllocSmallSpace(size_t size) ReleaseWriteLock(&osi_fsplock); return (char *)tp; } - -#endif /* !AFS_NBSD_ENV && !defined(AFS_NBSD50_ENV) */ +#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */ void shutdown_osinet(void) { AFS_STATCNT(shutdown_osinet); +#ifndef AFS_PRIVATE_OSI_ALLOCSPACES if (afs_cold_shutdown) { struct osi_packet *tp; @@ -245,6 +252,7 @@ shutdown_osinet(void) LOCK_INIT(&osi_fsplock, "osi_fsplock"); LOCK_INIT(&osi_flplock, "osi_flplock"); } +#endif /* AFS_PRIVATE_OSI_ALLOCSPACES */ if (afs_stats_cmperf.LargeBlocksActive || afs_stats_cmperf.SmallBlocksActive) { @@ -253,3 +261,4 @@ shutdown_osinet(void) afs_stats_cmperf.SmallBlocksActive); } } + diff --git a/src/afs/afs_pag_call.c b/src/afs/afs_pag_call.c index 2df8c02..7ca57dc 100644 --- a/src/afs/afs_pag_call.c +++ b/src/afs/afs_pag_call.c @@ -108,10 +108,6 @@ afspag_Init(afs_int32 nfs_server_addr) AFS_RWLOCK_INIT(&afs_xpagcell, "afs_xpagcell"); AFS_RWLOCK_INIT(&afs_xpagsys, "afs_xpagsys"); AFS_RWLOCK_INIT(&afs_icl_lock, "afs_icl_lock"); -#ifndef AFS_FBSD_ENV - LOCK_INIT(&osi_fsplock, "osi_fsplock"); - LOCK_INIT(&osi_flplock, "osi_flplock"); -#endif afs_resourceinit_flag = 1; afs_nfs_server_addr = nfs_server_addr; diff --git a/src/config/param.linux26.h b/src/config/param.linux26.h index 48e4b87..73836ec 100644 --- a/src/config/param.linux26.h +++ b/src/config/param.linux26.h @@ -33,6 +33,8 @@ #define AFS_USE_GETTIMEOFDAY 1 /* use gettimeofday to implement rx clock */ #define AFS_MAXVCOUNT_ENV 1 +#define AFS_PRIVATE_OSI_ALLOCSPACES 1 + #if defined(__KERNEL__) && !defined(KDUMP_KERNEL) #define AFS_GLOBAL_SUNLOCK #endif /* __KERNEL__ && !DUMP_KERNEL */