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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel