On Wed, 2008-07-30 at 11:07 +0100, Mel Gorman wrote: > There are applications that are not hugepage-aware but use shared memory such > as the postgres database. It is possible that the SHM_HUGETLB flag could > be added to such an application via libhugetlbfs and overriding shmget() > to add the SHM_HUGETLB to the flags. This patch enables libhugetlbfs to add > the SHM_HUGETLB when a HUGETLB_SHM environment variable is set to "yes". > It will work whether the application is linked to libhugetlbfs or loaded > via LD_PRELOAD. > > Signed-off-by: Mel Gorman <[EMAIL PROTECTED]> > --- > > HOWTO | 32 ++++++++++++++++++ > Makefile | 4 +- > shm.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ > tests/Makefile | 7 ++-- > tests/run_tests.sh | 4 ++ > 5 files changed, 125 insertions(+), 4 deletions(-)
This patch seems to have missed the test case. > diff -rup -X /usr/src/patchset-0.6/bin//dontdiff > libhugetlbfs-gitlatest-0010-private-export/HOWTO > libhugetlbfs-gitlatest-0020-shmget-override/HOWTO > --- libhugetlbfs-gitlatest-0010-private-export/HOWTO 2008-07-29 > 19:52:52.000000000 +0100 > +++ libhugetlbfs-gitlatest-0020-shmget-override/HOWTO 2008-07-30 > 11:01:03.000000000 +0100 > @@ -275,6 +275,38 @@ By default, the hugepage heap does not s > shrinking, set HUGETLB_MORECORE_SHRINK=yes. NB: We have been seeing some > unexpected behavior from glibc's malloc when this is enabled. > > +Using hugepage shared memory > +---------------------------- > + > +Hugepages are used for shared memory segments if the SHM_HUGETLB flag is > +set when calling shmget() and the pool is large enough. For hugepage-unaware > +applications, libhugetlbfs overrides shmget and adds the SHM_HUGETLB if the > +environment variable HUGETLB_SHM is set to "yes". The steps to use hugepages > +with applications not linked to libhugetlbfs are similar to morecore except > +for step 3. > + > +1. Set LD_PRELOAD=libhugetlbfs.so > + This tells the dynamic linker to load the libhugetlbfs shared > + library, even though the program wasn't originally linked against it. > + > + Note: If the program is linked against libhugetlbfs, preloading the > + library may lead to application crashes. You should skip this > + step in that case. > + > +2. Set LD_LIBRARY_PATH to the directory containing libhugetlbfs.so > + This is only necessary if you haven't installed libhugetlbfs.so to a > + system default path. If you set LD_LIBRARY_PATH, make sure the > + directory referenced contains the right version of the library > + (32-bit or 64-bit) as appropriate to the binary you want to run. > + > +3. Set HUGETLB_SHM=yes > + The shmget() call is overridden whether the application is linked or the > + libhugetlbfs library is preloaded. When this environment variable is set, > + the SHM_HUGETLB flag is added to the call and the size parameter is > aligned > + to back the shared memory segment with huge pages. In the event hugepages > + cannot be used, small pages will be used instead and a warning will be > + printed to explain the failure. > + > Using hugepage text, data, or BSS > --------------------------------- > > diff -rup -X /usr/src/patchset-0.6/bin//dontdiff > libhugetlbfs-gitlatest-0010-private-export/Makefile > libhugetlbfs-gitlatest-0020-shmget-override/Makefile > --- libhugetlbfs-gitlatest-0010-private-export/Makefile 2008-07-29 > 19:52:52.000000000 +0100 > +++ libhugetlbfs-gitlatest-0020-shmget-override/Makefile 2008-07-30 > 09:12:08.000000000 +0100 > @@ -1,7 +1,7 @@ > PREFIX = /usr/local > EXEDIR = /bin > > -LIBOBJS = hugeutils.o version.o init.o morecore.o debug.o alloc.o > +LIBOBJS = hugeutils.o version.o init.o morecore.o debug.o alloc.o shm.o > INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a > BIN_OBJ_DIR=obj > INSTALL_BIN = hugectl hugeedit > @@ -16,7 +16,7 @@ NODEPTARGETS=<version.h> <clean> > > INSTALL = install > > -LDFLAGS += --no-undefined-version -Wl,--version-script=version.lds > +LDFLAGS += --no-undefined-version -Wl,--version-script=version.lds -ldl > CFLAGS ?= -O2 -g > CFLAGS += -Wall -fPIC > CPPFLAGS += -D__LIBHUGETLBFS__ > diff -rup -X /usr/src/patchset-0.6/bin//dontdiff > libhugetlbfs-gitlatest-0010-private-export/shm.c > libhugetlbfs-gitlatest-0020-shmget-override/shm.c > --- libhugetlbfs-gitlatest-0010-private-export/shm.c 2008-07-30 > 09:48:17.000000000 +0100 > +++ libhugetlbfs-gitlatest-0020-shmget-override/shm.c 2008-07-30 > 11:04:01.000000000 +0100 > @@ -0,0 +1,82 @@ > +/* > + * libhugetlbfs - Easy use of Linux hugepages > + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation. > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public License > + * as published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + */ > +#define _GNU_SOURCE > +#include <dlfcn.h> > +#include <errno.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <unistd.h> > +#include <sys/ipc.h> > +#include <sys/shm.h> > +#include <sys/types.h> > +#include "libhugetlbfs_internal.h" > +#include "hugetlbfs.h" > + > +int shmget(key_t key, size_t size, int shmflg) > +{ > + static int (*real_shmget)(key_t key, size_t size, int shmflg) = NULL; > + char *error; > + int retval; > + char *hugetlbshm_env; > + size_t aligned_size = size; > + int hugetlbshm_enabled = 0; > + > + DEBUG("hugetlb_shmem: entering overridden shmget() call\n"); > + > + /* Get a handle to the "real" shmget system call */ > + if (!real_shmget) { > + real_shmget = dlsym(RTLD_NEXT, "shmget"); > + if ((error = dlerror()) != NULL) { > + ERROR("%s", error); > + return -1; > + } > + } > + > + /* Determine if shmget() calls should be overridden */ > + hugetlbshm_env = getenv("HUGETLB_SHM"); > + if (hugetlbshm_env && !strcmp(hugetlbshm_env, "yes")) > + hugetlbshm_enabled = 1; > + > + /* Align the size and set SHM_HUGETLB on request */ > + if (hugetlbshm_enabled) { > + aligned_size = ALIGN(size, gethugepagesize()); > + if (size != aligned_size) { > + DEBUG("hugetlb_shmem: size growth align %zd -> %zd\n", > + size, aligned_size); > + } > + > + DEBUG("hugetlb_shmem: Adding SHM_HUGETLB flag\n"); > + shmflg |= SHM_HUGETLB; > + } else { > + DEBUG("hugetlb_shmem: shmget override not requested\n"); > + } > + > + /* Call the "real" shmget. If hugepages fail, use small pages */ > + retval = real_shmget(key, aligned_size, shmflg); > + if (retval == -1 && hugetlbshm_enabled) { > + WARNING("While overriding shmget(%zd) to add SHM_HUGETLB: %s\n", > + aligned_size, strerror(errno)); > + shmflg &= ~SHM_HUGETLB; > + retval = real_shmget(key, size, shmflg); > + DEBUG("Using small pages for shmget despite HUGETLB_SHM\n"); > + } > + > + return retval; > +} > diff -rup -X /usr/src/patchset-0.6/bin//dontdiff > libhugetlbfs-gitlatest-0010-private-export/tests/Makefile > libhugetlbfs-gitlatest-0020-shmget-override/tests/Makefile > --- libhugetlbfs-gitlatest-0010-private-export/tests/Makefile 2008-07-29 > 19:52:52.000000000 +0100 > +++ libhugetlbfs-gitlatest-0020-shmget-override/tests/Makefile > 2008-07-30 09:11:38.000000000 +0100 > @@ -7,10 +7,10 @@ LIB_TESTS = gethugepagesize test_root fi > truncate_reserve_wraparound truncate_sigbus_versus_oom \ > map_high_truncate_2 truncate_above_4GB direct \ > misaligned_offset brk_near_huge task-size-overrun stack_grow_into_huge \ > - counters quota heap-overflow get_huge_pages > + counters quota heap-overflow get_huge_pages shmoverride_linked > LIB_TESTS_64 = straddle_4GB huge_at_4GB_normal_below \ > huge_below_4GB_normal_above > -NOLIB_TESTS = malloc malloc_manysmall dummy heapshrink > +NOLIB_TESTS = malloc malloc_manysmall dummy heapshrink shmoverride_unlinked > LDSCRIPT_TESTS = zero_filesize_segment > HUGELINK_TESTS = linkhuge linkhuge_nofd linkshare > HUGELINK_RW_TESTS = linkhuge_rw > @@ -67,6 +67,9 @@ endif > > all: $(ALLTESTS) $(ALLHELPERS) $(ALLHELPERLIBS) > > +shmoverride_linked.c: shmoverride_unlinked.c > + ln -s shmoverride_unlinked.c shmoverride_linked.c > + > obj32/%.o: %.c > @$(VECHO) CC32 $@ > @mkdir -p obj32 > diff -rup -X /usr/src/patchset-0.6/bin//dontdiff > libhugetlbfs-gitlatest-0010-private-export/tests/run_tests.sh > libhugetlbfs-gitlatest-0020-shmget-override/tests/run_tests.sh > --- libhugetlbfs-gitlatest-0010-private-export/tests/run_tests.sh > 2008-07-29 19:52:52.000000000 +0100 > +++ libhugetlbfs-gitlatest-0020-shmget-override/tests/run_tests.sh > 2008-07-30 09:11:38.000000000 +0100 > @@ -275,6 +275,10 @@ check_linkhuge_tests > # Test direct allocation API > run_test get_huge_pages > > +# Test overriding of shmget() > + run_test shmoverride_linked > + run_test LD_PRELOAD=libhugetlbfs.so shmoverride_unlinked > + > # Test hugetlbfs filesystem quota accounting > run_test quota > > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Libhugetlbfs-devel mailing list > Libhugetlbfs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel > -- Adam Litke - (agl at us.ibm.com) IBM Linux Technology Center ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Libhugetlbfs-devel mailing list Libhugetlbfs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel