Skip to content

Commit

Permalink
Merge libumem port.
Browse files Browse the repository at this point in the history
  • Loading branch information
wizeman committed Feb 25, 2007
2 parents 13a10ea + 13a10ea commit 649fa86
Show file tree
Hide file tree
Showing 28 changed files with 155 additions and 34 deletions.
2 changes: 2 additions & 0 deletions .hgignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
^src/cmd/zpool/zpool$
^src/cmd/ztest/ztest$

^src/lib/libnvpair/build-user/
^src/lib/libnvpair/build-kernel/
^src/lib/libzpool/build-user/
^src/lib/libzpool/build-kernel/
^src/lib/libzfscommon/build-user/
Expand Down
4 changes: 2 additions & 2 deletions HACKING
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ src/ -> source code
......./libnvpair/ -> Name-value pairs, used by almost all ZFS libraries
......./libsolcompat/ -> Solaris headers/code not available in Linux
......./libsolkerncompat/ -> Solaris kernel headers/code necessary for the zfs-fuse process
......./libumem/ -> Memory management library, currently it simply uses malloc() and free()
......./libumem/ -> Memory management library
......./libuutil/ -> Solaris userland utility functions
......./libzfs/ -> ZFS library used by zfs and zpool
......./libzfscommon/ -> Common ZFS code between libzpool and libzfs. Compiles into libzfscommon-user and libzpool-kernel.
......./libzfscommon/ -> Common ZFS code between libzpool and libzfs. Compiles into libzfscommon-user and libzfscommon-kernel.
......./libzpool/ -> Main ZFS code. Compiles into libzpool-user (used by zdb and ztest) and libzpool-kernel (used by zfs-fuse process). Also contains "userland" zfs_context.h.
1 change: 0 additions & 1 deletion TODO
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ In no particular order:
- Get EFI labels working, necessary for whole disk support.
- Get zfs_fm.c to work.
- Device in use detection?
- Integrate libumem linux port.
- Fix FIXMEs
- Fix TODOs
2 changes: 1 addition & 1 deletion src/SConscript-symlinks
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ env.Execute(SymLink('lib/libsolkerncompat/taskq.c', 'lib/libzpool/taskq.c'))
env.Execute(SymLink('lib/libsolkerncompat/i386', 'lib/libsolcompat/i386'))
env.Execute(SymLink('lib/libsolkerncompat/amd64', 'lib/libsolcompat/amd64'))

files = Split('ia32 i386 amd64 stdarg.h sys/byteorder.h sys/dkio.h sys/dklabel.h sys/feature_tests.h sys/file.h sys/inttypes.h sys/int_types.h sys/isa_defs.h sys/note.h sys/sysmacros.h sys/types.h sys/types32.h sys/va_list.h sys/vmem.h')
files = Split('ia32 i386 amd64 stdarg.h sys/byteorder.h sys/dkio.h sys/dklabel.h sys/feature_tests.h sys/file.h sys/inttypes.h sys/int_limits.h sys/int_types.h sys/isa_defs.h sys/note.h sys/sysmacros.h sys/types.h sys/types32.h sys/va_list.h sys/vmem.h rpc/xdr.h')

for file in files:
env.Execute(SymLink('lib/libsolkerncompat/include/' + file, 'lib/libsolcompat/include/' + file))
Expand Down
4 changes: 2 additions & 2 deletions src/cmd/zdb/SConscript
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Import('env')

objects = Split('zdb.c zdb_il.c ptrace.c #lib/libavl/libavl.a #lib/libnvpair/libnvpair.a #lib/libumem/libumem.a #lib/libzpool/libzpool-user.a #lib/libzfscommon/libzfscommon-user.a #lib/libsolcompat/libsolcompat.a')
objects = Split('zdb.c zdb_il.c ptrace.c #lib/libavl/libavl.a #lib/libnvpair/libnvpair-user.a #lib/libumem/libumem.a #lib/libzpool/libzpool-user.a #lib/libzfscommon/libzfscommon-user.a #lib/libsolcompat/libsolcompat.a')
cpppath = Split('#lib/libavl/include #lib/libnvpair/include #lib/libumem/include #lib/libzfscommon/include #lib/libzpool/include #lib/libsolcompat/include')

libs = Split('rt pthread')
libs = Split('rt pthread dl')

env.Program('zdb', objects, CPPPATH = env['CPPPATH'] + cpppath, LIBS = libs)
2 changes: 1 addition & 1 deletion src/cmd/zfs/SConscript
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Import('env')

objects = Split('zfs_main.c zfs_iter.c ptrace.c #lib/libzfs/libzfs.a #lib/libzfscommon/libzfscommon-user.a #lib/libnvpair/libnvpair.a #lib/libumem/libumem.a #lib/libuutil/libuutil.a #lib/libavl/libavl.a #lib/libsolcompat/libsolcompat.a')
objects = Split('zfs_main.c zfs_iter.c ptrace.c #lib/libzfs/libzfs.a #lib/libzfscommon/libzfscommon-user.a #lib/libnvpair/libnvpair-user.a #lib/libumem/libumem.a #lib/libuutil/libuutil.a #lib/libavl/libavl.a #lib/libsolcompat/libsolcompat.a')
cpppath = Split('#lib/libuutil/include #lib/libnvpair/include #lib/libumem/include #lib/libzfscommon/include #lib/libzfs/include #lib/libsolcompat/include')

libs = Split('pthread m dl')
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/zpool/SConscript
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Import('env')

objects = Split('zpool_iter.c zpool_main.c zpool_util.c zpool_vdev.c ptrace.c #lib/libnvpair/libnvpair.a #lib/libumem/libumem.a #lib/libzfs/libzfs.a #lib/libzfscommon/libzfscommon-user.a #lib/libuutil/libuutil.a #lib/libavl/libavl.a #lib/libsolcompat/libsolcompat.a')
objects = Split('zpool_iter.c zpool_main.c zpool_util.c zpool_vdev.c ptrace.c #lib/libnvpair/libnvpair-user.a #lib/libumem/libumem.a #lib/libzfs/libzfs.a #lib/libzfscommon/libzfscommon-user.a #lib/libuutil/libuutil.a #lib/libavl/libavl.a #lib/libsolcompat/libsolcompat.a')
cpppath = Split('#lib/libuutil/include #lib/libnvpair/include #lib/libumem/include #lib/libzfscommon/include #lib/libzfs/include #lib/libsolcompat/include')

libs = Split('pthread m dl')
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ztest/SConscript
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Import('env')

objects = Split('ztest.c #lib/libzpool/libzpool-user.a #lib/libzfscommon/libzfscommon-user.a #lib/libnvpair/libnvpair.a #lib/libavl/libavl.a #lib/libumem/libumem.a #lib/libsolcompat/libsolcompat.a')
objects = Split('ztest.c #lib/libzpool/libzpool-user.a #lib/libzfscommon/libzfscommon-user.a #lib/libnvpair/libnvpair-user.a #lib/libavl/libavl.a #lib/libumem/libumem.a #lib/libsolcompat/libsolcompat.a')
cpppath = Split('#lib/libavl/include #lib/libnvpair/include #lib/libumem/include #lib/libzfscommon/include #lib/libzpool/include #lib/libsolcompat/include')

libs = Split('m dl rt pthread')
Expand Down
15 changes: 13 additions & 2 deletions src/lib/libnvpair/SConscript
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
Import('env')

BuildDir('build-user', '.')
BuildDir('build-kernel', '.')

objects = Split('libnvpair.c nvpair.c nvpair_alloc_fixed.c nvpair_alloc_system.c')
cpppath = Split('./include #lib/libsolcompat/include')

env.StaticLibrary('libnvpair', objects, CPPPATH = env['CPPPATH'] + cpppath)
objects_user = ['build-user/' + o for o in objects]
objects_kernel = ['build-kernel/' + o for o in objects]

cpppath_user = Split('./include #lib/libsolcompat/include')
cpppath_kernel = Split('./include #lib/libsolkerncompat/include #lib/libumem/include')

ccflags_kernel = ['-D_KERNEL']

env.StaticLibrary('libnvpair-user', objects_user, CPPPATH = env['CPPPATH'] + cpppath_user)
env.StaticLibrary('libnvpair-kernel', objects_kernel, CPPPATH = env['CPPPATH'] + cpppath_kernel, CCFLAGS = env['CCFLAGS'] + ccflags_kernel)
9 changes: 9 additions & 0 deletions src/lib/libnvpair/nvpair_alloc_system.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,22 @@
static void *
nv_alloc_sys(nv_alloc_t *nva, size_t size)
{
#ifdef _KERNEL
return (kmem_alloc(size, KM_NOSLEEP));
#else
return (malloc(size));
#endif
}

/*ARGSUSED*/
static void
nv_free_sys(nv_alloc_t *nva, void *buf, size_t size)
{
#ifdef _KERNEL
kmem_free(buf, size);
#else
free(buf);
#endif
}

const nv_alloc_ops_t system_ops_def = {
Expand All @@ -57,3 +65,4 @@ nv_alloc_t nv_alloc_nosleep_def = {
};

nv_alloc_t *nv_alloc_nosleep = &nv_alloc_nosleep_def;
nv_alloc_t *nv_alloc_sleep = &nv_alloc_nosleep_def;
Empty file.
2 changes: 2 additions & 0 deletions src/lib/libsolkerncompat/include/sys/conf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#include <sys/systm.h>

9 changes: 8 additions & 1 deletion src/lib/libsolkerncompat/include/sys/kmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@
#include <sys/types.h>
#include <umem.h>

/* Maximum zfs-fuse memory usage */
#define ZFSFUSE_MAX_MEMORY (64<<20)

#define ZFSFUSE_MAX_ARCSIZE (ZFSFUSE_MAX_MEMORY - (10<<20))

extern uint64_t kern_memusage;

/*
Expand All @@ -54,6 +59,8 @@ extern void *kmem_cache_alloc(kmem_cache_t *, int);
extern void kmem_cache_free(kmem_cache_t *, void *);

#define kmem_debugging() 0
#define kmem_cache_reap_now(c)
#define kmem_cache_reap_now(c) umem_reap()

extern uint64_t get_real_memusage();

#endif
1 change: 1 addition & 0 deletions src/lib/libsolkerncompat/include/sys/stropts.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <sys/conf.h>
1 change: 1 addition & 0 deletions src/lib/libsolkerncompat/include/sys/systm.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <sys/dditypes.h>

#include <string.h>
#include <strings.h>
#include <errno.h>

extern uint64_t physmem;
Expand Down
54 changes: 52 additions & 2 deletions src/lib/libsolkerncompat/kmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@
#include <sys/kmem.h>
#include <sys/atomic.h>
#include <umem.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

uint64_t kern_memusage = 0;

Expand All @@ -49,12 +54,57 @@ void kmem_free(void *buf, size_t size)

void *kmem_cache_alloc(kmem_cache_t *cp, int kmflag)
{
atomic_add_64(&kern_memusage, umem_get_bufsize(cp));
atomic_add_64(&kern_memusage, umem_cache_get_bufsize(cp));
return umem_cache_alloc(cp, kmflag);
}

void kmem_cache_free(kmem_cache_t *cp, void *buf)
{
umem_cache_free(cp, buf);
atomic_add_64(&kern_memusage, -umem_get_bufsize(cp));
atomic_add_64(&kern_memusage, -umem_cache_get_bufsize(cp));
}

/* This really sucks but we have no choice since getrusage() doesn't work.. */
uint64_t get_real_memusage()
{
int error_n = -1;

FILE *f = fopen("/proc/self/status", "r");

if(f == NULL) {
error_n = errno;
goto error;
}

uint64_t memusage = 0;

for(;;) {
char buf[512];
char key[100];
u_longlong_t val;

if(fgets(buf, sizeof(buf), f) == NULL)
goto error;

int res = sscanf(buf, "%99[^:]: %Lu", key, &val);

if(res == 2 && strcmp(key, "VmRSS") == 0) {
memusage = val << 10;
break;
}
}

fclose(f);

return memusage;

error:
if(f == NULL)
fprintf(stderr, "Error: unable to open /proc/self/status (error %i)\nMake sure you have the proc filesystem mounted.\n", error_n);
else {
fprintf(stderr, "Error: unable to read /proc/self/status (error %i)\n", error_n);
fclose(f);
}

exit(1);
}
4 changes: 2 additions & 2 deletions src/lib/libumem/SConscript
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Import('env')

objects = Split('umem.c')
cpppath = Split('./include #lib/libsolcompat/include')
objects = Split('init_lib.c umem_agent_support.c umem_fail.c umem_fork.c umem_update_thread.c vmem_mmap.c vmem_sbrk.c envvar.c getpcstack.c misc.c vmem_base.c umem.c vmem.c')
cpppath = Split('. ./include')

env.StaticLibrary('libumem', objects, CPPPATH = env['CPPPATH'] + cpppath)
13 changes: 13 additions & 0 deletions src/lib/libumem/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef CONFIG_H
#define CONFIG_H

#define UMEM_PTHREAD_MUTEX_TOO_BIG 1

#define HAVE_SYS_TIME_H 1
#define HAVE_DLFCN_H 1
#define HAVE_UNISTD_H 1
#define HAVE_SYS_MMAN_H 1
#define HAVE_SYS_SYSMACROS_H 1
#define HAVE_STRINGS_H 1

#endif
5 changes: 5 additions & 0 deletions src/lib/libumem/envvar.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,11 @@ process_item(const umem_env_item_t *item, const char *item_arg)
case ITEM_SIZE:
arg_required = 1;
break;

default:
log_message("%s: %s: Invalid type. Ignored\n",
CURRENT, item->item_name);
return (1);
}

switch (item->item_type) {
Expand Down
3 changes: 3 additions & 0 deletions src/lib/libumem/include/umem.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ extern void umem_cache_free(umem_cache_t *, void *);

extern void umem_reap(void);

/* ZFSFUSE */
extern size_t umem_cache_get_bufsize(umem_cache_t *);

#ifdef __cplusplus
}
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/lib/libumem/init_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ umem_type_init(caddr_t start, size_t len, size_t pgsize)
SYSTEM_INFO info;
GetSystemInfo(&info);
pagesize = info.dwPageSize;
#elseif !defined(__FreeBSD__)
#elif !defined(__FreeBSD__)
pagesize = _sysconf(_SC_PAGESIZE);
#else
pagesize = PAGE_SIZE;
Expand Down
3 changes: 3 additions & 0 deletions src/lib/libumem/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ umem_error_enter(const char *error_str)
umem_log_enter(error_str, 1);
}

/* ZFSFUSE: defined in libzpool/kernel.c and in libsolkerncompat/bitmap.c */
#if 0
int
highbit(ulong_t i)
{
Expand Down Expand Up @@ -150,6 +152,7 @@ highbit(ulong_t i)
}
return (h);
}
#endif

int
lowbit(ulong_t i)
Expand Down
4 changes: 2 additions & 2 deletions src/lib/libumem/sol_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ static INLINE int thr_create(void *stack_base,
static INLINE uint_t ec_atomic_cas(uint_t *mem, uint_t with, uint_t cmp)
{
uint_t prev;
asm volatile ("lock; cmpxchgl %1, %2"
__asm volatile ("lock; cmpxchgl %1, %2"
: "=a" (prev)
: "r" (with), "m" (*(mem)), "0" (cmp)
: "memory");
Expand Down Expand Up @@ -165,7 +165,7 @@ static INLINE uint_t ec_atomic_inc(uint_t *mem)

#ifdef _WIN32
#define issetugid() 0
#elseif !defined(__FreeBSD__)
#elif !defined(__FreeBSD__)
#define issetugid() (geteuid() == 0)
#endif

Expand Down
2 changes: 1 addition & 1 deletion src/lib/libumem/sys/vmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ typedef void (vmem_free_t)(vmem_t *, void *, size_t);
*/
typedef void *(vmem_ximport_t)(vmem_t *, size_t *, int);

#ifdef _KERNEL
#if 0
extern vmem_t *vmem_init(const char *, void *, size_t, size_t,
vmem_alloc_t *, vmem_free_t *);
extern void vmem_update(void *);
Expand Down
18 changes: 16 additions & 2 deletions src/lib/libumem/umem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2382,6 +2382,7 @@ umem_reap(void)
(void) mutex_unlock(&umem_update_lock);
return;
}

umem_reaping = UMEM_REAP_ADDING; /* lock out other reaps */

(void) mutex_unlock(&umem_update_lock);
Expand Down Expand Up @@ -2902,10 +2903,16 @@ umem_cache_init(void)
* umem_startup() is called early on, and must be called explicitly if we're
* the standalone version.
*/
static void
umem_startup() __attribute__((constructor));

void
umem_startup(caddr_t start, size_t len, size_t pagesize, caddr_t minstack,
caddr_t maxstack)
umem_startup()
{
caddr_t start = NULL;
size_t len = 0;
size_t pagesize = 0;

#ifdef UMEM_STANDALONE
int idx;
/* Standalone doesn't fork */
Expand Down Expand Up @@ -3192,3 +3199,10 @@ umem_init(void)
(void) mutex_unlock(&umem_init_lock);
return (0);
}

size_t
umem_cache_get_bufsize(umem_cache_t *cache)
{
return cache->cache_bufsize;
}

1 change: 0 additions & 1 deletion src/lib/libumem/umem_fail.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,5 +173,4 @@ __umem_assert_failed(const char *assertion, const char *file, int line)
assertion, file, line);
umem_do_abort();
/*NOTREACHED*/
return (0);
}
Loading

0 comments on commit 649fa86

Please sign in to comment.