On Mon, Oct 20, 2008 at 12:34:08PM +0100, Andy Whitcroft wrote:
> On Mon, Oct 20, 2008 at 11:47:10AM +0100, Mel Gorman wrote:
> > On (17/10/08 17:14), Andy Whitcroft didst pronounce:
> > > Add a new private utilities library consisting of various useful helpers
> > > normally hidden within libhugetlbfs.  Extend the library local marker 
> > > idiom
> > > to include a private utilities marker __pu_.  When we build libhugetlbfs
> > > these are forced local when building libhugetlbfs_privutils these are the
> > > only routines exported.  This makes it very hard for the two libraries to
> > > interfere with each other when both are linked to the same binary, which 
> > > is
> > > particularly important when testing the library; we must test the real 
> > > one.
> > > 
> > > Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]>
> > > ---
> > >  Makefile                 |   31 ++++++++++++++++++++++++++-----
> > >  init_privutils.c         |   25 +++++++++++++++++++++++++
> > >  libhugetlbfs_internal.h  |    7 ++++++-
> > >  libhugetlbfs_privutils.h |   22 ++++++++++++++++++++++
> > >  privutils.lds            |    6 ++++++
> > >  tests/Makefile           |    2 +-
> > >  tests/counters.c         |    1 +
> > >  tests/hugetests.h        |    3 +++
> > >  tests/libtestutils.c     |    1 +
> > >  version.lds              |    1 +
> > >  10 files changed, 92 insertions(+), 7 deletions(-)
> > >  create mode 100644 init_privutils.c
> > >  create mode 100644 libhugetlbfs_privutils.h
> > >  create mode 100644 privutils.lds
> > > 
> > > diff --git a/Makefile b/Makefile
> > > index 2d5a120..1bb4589 100644
> > > --- a/Makefile
> > > +++ b/Makefile
> > > @@ -2,7 +2,8 @@ PREFIX = /usr/local
> > >  EXEDIR = /bin
> > >  
> > >  LIBOBJS = hugeutils.o version.o init.o morecore.o debug.o alloc.o shm.o 
> > > kernel-features.o
> > > -INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a
> > > +LIBPUOBJS = init_privutils.o debug.o
> > > +INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a 
> > > libhugetlbfs_privutils.so
> > 
> > Ok, so distribution SPEC files and the like will need to be aware there
> > is another library being installed. This is not a problem as such, but
> > it's worth noting.
> 
> Yes, that is a concern.  It is only used actually for the tests, and I
> don't know if we package those or not.  For the utilities we deliberatly
> link against the libhugetlbfs_privutils.a to ensure we have no
> dependancies for those utilities.
> 

We do package them but as long as the library is installed correctly
(which appears to be the case), they should get picked up correctly.

> > >  BIN_OBJ_DIR=obj
> > >  INSTALL_BIN = hugectl hugeedit hugeadm pagesize
> > >  INSTALL_HEADERS = hugetlbfs.h
> > > @@ -20,7 +21,7 @@ NODEPTARGETS=<version.h> <clean>
> > >  
> > >  INSTALL = install
> > >  
> > > -LDFLAGS += --no-undefined-version -Wl,--version-script=version.lds -ldl
> > > +LDFLAGS += --no-undefined-version -ldl
> > 
> > Ok, this is clear as well as we now have two lds files and we need to
> > distinguish between them.
> > 
> > >  CFLAGS ?= -O2 -g
> > >  CFLAGS += -Wall -fPIC
> > >  CPPFLAGS += -D__LIBHUGETLBFS__
> > > @@ -154,7 +155,7 @@ all:  libs tests tools
> > >  
> > >  .PHONY:  tests libs
> > >  
> > > -libs:    $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file)))
> > > +libs:    $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file))) 
> > > $(BIN_OBJ_DIR)/libhugetlbfs_privutils.a
> > >  
> > >  tests:   libs # Force make to build the library first
> > >  tests:   tests/all
> > > @@ -227,11 +228,31 @@ obj64/libhugetlbfs.a: $(LIBOBJS64)
> > >  
> > >  obj32/libhugetlbfs.so: $(LIBOBJS32)
> > >   @$(VECHO) LD32 "(shared)" $@
> > > - $(CC32) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > > + $(CC32) $(LDFLAGS) -Wl,--version-script=version.lds 
> > > -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > >  
> > >  obj64/libhugetlbfs.so: $(LIBOBJS64)
> > >   @$(VECHO) LD64 "(shared)" $@
> > > - $(CC64) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > > + $(CC64) $(LDFLAGS) -Wl,--version-script=version.lds 
> > > -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > > +
> > > +#obj32/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj32/%)
> > > +#        @$(VECHO) AR32 $@
> > > +#        $(AR) $(ARFLAGS) $@ $^
> > > +#
> > > +#obj64/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj64/%)
> > > +#        @$(VECHO) AR64 $@
> > > +#        $(AR) $(ARFLAGS) $@ $^
> > > +
> > 
> > What's this comment stuff in the Makefile about?
> > 
> > (suspect it's an oversight that it still exists)
> 
> Its something I would generally deliberatly do.  It records how one
> would make the dynamic version of the library though we never need it so
> currently it is not built.
> 

Ok, just chuck a comment above it explaining that and we're all good.

> > > +$(BIN_OBJ_DIR)/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=$(BIN_OBJ_DIR)/%)
> > > + @$(VECHO) ARHOST $@
> > > + $(AR) $(ARFLAGS) $@ $^
> > > +
> > > +obj32/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj32/%)
> > > + @$(VECHO) LD32 "(shared)" $@
> > > + $(CC32) $(LDFLAGS) -Wl,--version-script=privutils.lds 
> > > -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > > +
> > > +obj64/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj64/%)
> > > + @$(VECHO) LD64 "(shared)" $@
> > > + $(CC64) $(LDFLAGS) -Wl,--version-script=privutils.lds 
> > > -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS)
> > >  
> > >  obj32/%.i:       %.c
> > >   @$(VECHO) CPP $@
> > > diff --git a/init_privutils.c b/init_privutils.c
> > > new file mode 100644
> > > index 0000000..6c9243d
> > > --- /dev/null
> > > +++ b/init_privutils.c
> > > @@ -0,0 +1,25 @@
> > > +/*
> > > + * libhugetlbfs - Easy use of Linux hugepages
> > > + * Copyright (C) 2008 Nishanth Aravamudan, 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
> > > + */
> > > +
> > > +#include "libhugetlbfs_internal.h"
> > > +
> > > +static void __attribute__ ((constructor)) setup_libhugetlbfs(void)
> > > +{
> > > + hugetlbfs_setup_debug();
> > > +}
> > > diff --git a/libhugetlbfs_internal.h b/libhugetlbfs_internal.h
> > > index 4d7add7..4e20885 100644
> > > --- a/libhugetlbfs_internal.h
> > > +++ b/libhugetlbfs_internal.h
> > > @@ -27,6 +27,8 @@
> > >  #error This header should not be included by library users.
> > >  #endif /* __LIBHUGETLBFS__ */
> > >  
> > > +#include "libhugetlbfs_privutils.h"
> > > +
> > >  #define stringify_1(x)   #x
> > >  #define stringify(x)     stringify_1(x)
> > >  
> > > @@ -45,7 +47,10 @@
> > >   * When adding a library local variable externalise the symbol as
> > >   * normal, plus add a #define of the form below.  This define effectively
> > >   * renames the routine into the local namespace __lh_* which is forced
> > > - * local in the linker script version.lds.
> > > + * local in the linker script version.lds.  Some routines may need to be
> > > + * exported in the utilities library these are marked __pu_* which marks
> > > + * them for export in libhugetlbfs_privutils; their definitions should
> > > + * appear in libhugetlbfs_privutils.h rather than here.
> > >   */
> > >  extern int __hugetlbfs_verbose;
> > >  extern int __hugetlbfs_debug;
> > > diff --git a/libhugetlbfs_privutils.h b/libhugetlbfs_privutils.h
> > > new file mode 100644
> > > index 0000000..1a45ed0
> > > --- /dev/null
> > > +++ b/libhugetlbfs_privutils.h
> > > @@ -0,0 +1,22 @@
> > > +/*
> > > + * 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
> > > + */
> > > +#ifndef _LIBHUGETLBFS_PRIVUTILS_H
> > > +#define _LIBHUGETLBFS_PRIVUTILS_H
> > > +
> > > +#endif /* _LIBHUGETLBFS_PRIVUTILS_H */
> > > diff --git a/privutils.lds b/privutils.lds
> > > new file mode 100644
> > > index 0000000..5d481e2
> > > --- /dev/null
> > > +++ b/privutils.lds
> > > @@ -0,0 +1,6 @@
> > > +VERS_1.0 {
> > > + global:
> > > +         __pu_*;
> > > + local:
> > > +         *;
> > > +};
> > > diff --git a/tests/Makefile b/tests/Makefile
> > > index e4e1ce2..f03ec68 100644
> > > --- a/tests/Makefile
> > > +++ b/tests/Makefile
> > > @@ -22,7 +22,7 @@ BADTOOLCHAIN = bad-toolchain.sh
> > >  
> > >  CFLAGS = -O2 -Wall -g
> > >  CPPFLAGS = -I..
> > > -LDLIBS = -ldl -lpthread
> > > +LDLIBS = -ldl -lpthread -lhugetlbfs_privutils
> > >  LDFLAGS32 = -L../obj32
> > >  LDFLAGS64 = -L../obj64
> > >  INSTALL = install
> > > diff --git a/tests/counters.c b/tests/counters.c
> > > index 522a00d..0284809 100644
> > > --- a/tests/counters.c
> > > +++ b/tests/counters.c
> > > @@ -181,6 +181,7 @@ void _set_nr_hugepages(unsigned long count, int line)
> > >  out:
> > >   verify_counters(line, et, ef, er, es);
> > >  }
> > > +#undef set_nr_hugepages
> > >  #define set_nr_hugepages(c) _set_nr_hugepages(c, __LINE__)
> > >  
> > >  void _map(int s, int hpages, int flags, int line)
> > > diff --git a/tests/hugetests.h b/tests/hugetests.h
> > > index bb1146e..270923b 100644
> > > --- a/tests/hugetests.h
> > > +++ b/tests/hugetests.h
> > > @@ -22,6 +22,9 @@
> > >  
> > >  #include <errno.h>
> > >  #include <string.h>
> > > +
> > > +#include "libhugetlbfs_privutils.h"
> > > +
> > >  #define DEBUG
> > >  
> > >  /* Test return codes */
> > > diff --git a/tests/libtestutils.c b/tests/libtestutils.c
> > > index 93388a9..4eeb880 100644
> > > --- a/tests/libtestutils.c
> > > +++ b/tests/libtestutils.c
> > > @@ -37,6 +37,7 @@
> > >  #include <fcntl.h>
> > >  
> > >  #include "hugetlbfs.h"
> > > +#include "libhugetlbfs_privutils.h"
> > >  #include "hugetests.h"
> > >  
> > >  void check_free_huge_pages(int nr_pages_needed)
> > > diff --git a/version.lds b/version.lds
> > > index f5c480a..ba06c82 100644
> > > --- a/version.lds
> > > +++ b/version.lds
> > > @@ -6,6 +6,7 @@ VERS_1.0 {
> > >           hugetlbfs_unlinked_fd;
> > >   local:
> > >           __lh_*;
> > > +         __pu_*;
> > >  };
> > >  
> > >  HTLBFS_2.0 {
> > 
> > As far as I can see, this makes no change to libhugetlbfs itself and
> > applications continue to use it as normal. This is good and baring the
> > strange commented out stuff in the Makefile
> > 
> > Acked-by: Mel Gorman <[EMAIL PROTECTED]>
> 
> -apw
> 

-- 
Mel Gorman
Part-time Phd Student                          Linux Technology Center
University of Limerick                         IBM Dublin Software Lab

-------------------------------------------------------------------------
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

Reply via email to