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 <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
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 */
/* 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)
{
/* XXXX OpenBSD avoids space pool, presumably Rees believed the kernel
* allocator did as well or better */
-#if 0
void
osi_FreeSmallSpace(void *p)
{
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)
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
#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 */
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. */
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;
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)
{
afs_stats_cmperf.SmallBlocksActive);
}
}
+
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;
#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 */