diff --git a/Makefile.am b/Makefile.am index a958235b..cd274394 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ if HAVE_PLPA -SUBDIRS = plpa-1.1 +SUBDIRS = plpa-1.3.2 endif bin_PROGRAMS = htop @@ -38,7 +38,7 @@ SUFFIXES = .h BUILT_SOURCES = $(myhtopheaders) htop_SOURCES = $(myhtopheaders) $(myhtopsources) config.h debug.h if HAVE_PLPA -htop_LDADD = $(top_builddir)/plpa-1.1/src/libplpa_included.la +htop_LDADD = $(top_builddir)/plpa-1.3.2/src/libplpa/libplpa_included.la endif profile: diff --git a/acinclude.m4 b/acinclude.m4 index 1062729c..8f20ba4e 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1 +1 @@ -m4_include(plpa-1.1/plpa.m4) +m4_include(plpa-1.3.2/plpa.m4) diff --git a/configure.ac b/configure.ac index bb6767f6..0200545f 100644 --- a/configure.ac +++ b/configure.ac @@ -97,8 +97,8 @@ fi AC_CHECK_FILE($PROCDIR/stat,,AC_MSG_ERROR(Cannot find /proc/stat. Make sure you have a Linux-compatible /proc filesystem mounted. See the file README for help.)) AC_CHECK_FILE($PROCDIR/meminfo,,AC_MSG_ERROR(Cannot find /proc/meminfo. Make sure you have a Linux-compatible /proc filesystem mounted. See the file README for help.)) -PLPA_INCLUDED(plpa-1.1) -PLPA_INIT(plpa_happy=yes, plpa_happy=no) +PLPA_INCLUDED +PLPA_INIT([./plpa-1.3.2], [plpa_happy=yes], [plpa_happy=no]) AM_CONDITIONAL([HAVE_PLPA], [test "$plpa_happy" = "yes"]) if test "$plpa_happy" = "yes"; then AC_DEFINE([HAVE_PLPA], [1], [Have plpa]) diff --git a/plpa-1.1/Makefile.in b/plpa-1.1/Makefile.in deleted file mode 100644 index a004a6a6..00000000 --- a/plpa-1.1/Makefile.in +++ /dev/null @@ -1,498 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = plpa-1.1 -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - AUTHORS -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/plpa-1.1/plpa.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h \ - $(top_builddir)/plpa-1.1/src/plpa_config.h \ - $(top_builddir)/plpa-1.1/src/plpa.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = src -DIST_SUBDIRS = $(SUBDIRS) -EXTRA_DIST = README VERSION LICENSE AUTHORS plpa.m4 -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plpa-1.1/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu plpa-1.1/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/plpa-1.1/README b/plpa-1.1/README deleted file mode 100644 index 4659e248..00000000 --- a/plpa-1.1/README +++ /dev/null @@ -1,29 +0,0 @@ -This is a stripped-down version of the PLPA 1.1 package, adapted to -be embedded in the htop code base. For the full PLPA package, go to -http://www.open-mpi.org/projects/plpa/. Copyright notice for PLPA -follows below. - - -- Hisham Muhammad, htop author. March 2008. - -=========================================================================== - -This is the Portable Linux Processor Affinity (PLPA) package -(pronounced "pli-pa"). It is intended for developers who wish to use -Linux processor affinity via the sched_setaffinity() and -sched_getaffinity() library calls, but don't want to wade through the -morass of 3 different APIs that have been offered through the life of -these calls in various Linux distributions and glibc versions. - -Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana - University Research and Technology - Corporation. All rights reserved. -Copyright (c) 2004-2005 The Regents of the University of California. - All rights reserved. -Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. -$COPYRIGHT$ - -See LICENSE file for a rollup of all copyright notices. - -$HEADER$ - -=========================================================================== diff --git a/plpa-1.1/src/Makefile.in b/plpa-1.1/src/Makefile.in deleted file mode 100644 index e7f55f94..00000000 --- a/plpa-1.1/src/Makefile.in +++ /dev/null @@ -1,578 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ - -# See which mode we're building in -@PLPA_BUILD_STANDALONE_TRUE@am__append_1 = libplpa.la -@PLPA_BUILD_STANDALONE_TRUE@am__append_2 = $(public_headers) -@PLPA_BUILD_STANDALONE_FALSE@am__append_3 = libplpa_included.la -@PLPA_BUILD_STANDALONE_FALSE@am__append_4 = $(public_headers) -subdir = plpa-1.1/src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/plpa.h.in $(srcdir)/plpa_config.h.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/plpa-1.1/plpa.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h plpa_config.h plpa.h -CONFIG_CLEAN_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" -libLTLIBRARIES_INSTALL = $(INSTALL) -LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) -libplpa_la_LIBADD = -am__objects_1 = plpa_api_probe.lo plpa_dispatch.lo plpa_runtime.lo \ - plpa_map.lo -am_libplpa_la_OBJECTS = $(am__objects_1) -libplpa_la_OBJECTS = $(am_libplpa_la_OBJECTS) -@PLPA_BUILD_STANDALONE_TRUE@am_libplpa_la_rpath = -rpath $(libdir) -libplpa_included_la_LIBADD = -am_libplpa_included_la_OBJECTS = $(am__objects_1) -libplpa_included_la_OBJECTS = $(am_libplpa_included_la_OBJECTS) -@PLPA_BUILD_STANDALONE_FALSE@am_libplpa_included_la_rpath = -DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(libplpa_la_SOURCES) $(libplpa_included_la_SOURCES) -DIST_SOURCES = $(libplpa_la_SOURCES) $(libplpa_included_la_SOURCES) -nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER) -HEADERS = $(nodist_include_HEADERS) $(nodist_noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ - -# Defaults -lib_LTLIBRARIES = $(am__append_1) -noinst_LTLIBRARIES = $(am__append_3) -nodist_include_HEADERS = $(am__append_2) -nodist_noinst_HEADERS = $(am__append_4) - -# Note that this file is generated by configure, so we don't want to -# ship it in the tarball. Hence the "nodist_" prefixes to the HEADERS -# macros, below. -public_headers = plpa.h - -# The sources -plpa_sources = \ - plpa_internal.h \ - plpa_api_probe.c \ - plpa_dispatch.c \ - plpa_runtime.c \ - plpa_map.c - -libplpa_la_SOURCES = $(plpa_sources) -libplpa_included_la_SOURCES = $(plpa_sources) -all: plpa_config.h plpa.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plpa-1.1/src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu plpa-1.1/src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -plpa_config.h: stamp-h2 - @if test ! -f $@; then \ - rm -f stamp-h2; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h2; \ - else :; fi - -stamp-h2: $(srcdir)/plpa_config.h.in $(top_builddir)/config.status - @rm -f stamp-h2 - cd $(top_builddir) && $(SHELL) ./config.status plpa-1.1/src/plpa_config.h -$(srcdir)/plpa_config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h2 - touch $@ - -plpa.h: stamp-h3 - @if test ! -f $@; then \ - rm -f stamp-h3; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h3; \ - else :; fi - -stamp-h3: $(srcdir)/plpa.h.in $(top_builddir)/config.status - @rm -f stamp-h3 - cd $(top_builddir) && $(SHELL) ./config.status plpa-1.1/src/plpa.h - -distclean-hdr: - -rm -f plpa_config.h stamp-h2 plpa.h stamp-h3 -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ - else :; fi; \ - done - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libplpa.la: $(libplpa_la_OBJECTS) $(libplpa_la_DEPENDENCIES) - $(LINK) $(am_libplpa_la_rpath) $(libplpa_la_OBJECTS) $(libplpa_la_LIBADD) $(LIBS) -libplpa_included.la: $(libplpa_included_la_OBJECTS) $(libplpa_included_la_DEPENDENCIES) - $(LINK) $(am_libplpa_included_la_rpath) $(libplpa_included_la_OBJECTS) $(libplpa_included_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_api_probe.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_dispatch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_map.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpa_runtime.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-nodist_includeHEADERS: $(nodist_include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" - @list='$(nodist_include_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(nodist_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ - $(nodist_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ - done - -uninstall-nodist_includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(nodist_include_HEADERS)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ - rm -f "$(DESTDIR)$(includedir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) plpa_config.h.in plpa.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) plpa_config.h.in plpa.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) plpa_config.h.in plpa.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) plpa_config.h.in plpa.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) plpa_config.h plpa.h -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-noinstLTLIBRARIES mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-nodist_includeHEADERS - -install-dvi: install-dvi-am - -install-exec-am: install-libLTLIBRARIES - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ - ctags distclean distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-libLTLIBRARIES \ - install-man install-nodist_includeHEADERS install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-libLTLIBRARIES \ - uninstall-nodist_includeHEADERS - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/plpa-1.1/src/plpa_map.c b/plpa-1.1/src/plpa_map.c deleted file mode 100644 index 84b1d0ea..00000000 --- a/plpa-1.1/src/plpa_map.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. - * - * Portions of this file originally contributed by Advanced Micro - * Devices, Inc. See notice below. - */ -/* ============================================================ - License Agreement - - Copyright (c) 2006, 2007 Advanced Micro Devices, Inc. - All rights reserved. - - Redistribution and use in any form of this material and any product - thereof including software in source or binary forms, along with any - related documentation, with or without modification ("this material"), - is permitted provided that the following conditions are met: - - + Redistributions of source code of any software must retain the above - copyright notice and all terms of this license as part of the code. - - + Redistributions in binary form of any software must reproduce the - above copyright notice and all terms of this license in any related - documentation and/or other materials. - - + Neither the names nor trademarks of Advanced Micro Devices, Inc. or - any copyright holders or contributors may be used to endorse or - promote products derived from this material without specific prior - written permission. - - + Notice about U.S. Government restricted rights: This material is - provided with "RESTRICTED RIGHTS." Use, duplication or disclosure by - the U.S. Government is subject to the full extent of restrictions set - forth in FAR52.227 and DFARS252.227 et seq., or any successor or - applicable regulations. Use of this material by the U.S. Government - constitutes acknowledgment of the proprietary rights of Advanced Micro - Devices, Inc. - and any copyright holders and contributors. - - + In no event shall anyone redistributing or accessing or using this - material commence or participate in any arbitration or legal action - relating to this material against Advanced Micro Devices, Inc. or any - copyright holders or contributors. The foregoing shall survive any - expiration or termination of this license or any agreement or access - or use related to this material. - - + ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE - REVOCATION OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL. - - THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY - COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION - AND WITHOUT ANY REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR - IN ANY WAY RELATED TO SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED - OPERATION, OR THAT IT IS FREE FROM DEFECTS OR VIRUSES. ALL - OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER EXPRESS, IMPLIED, OR - STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF - TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, - COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT. IN - NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, REVENUE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED OR BASED ON ANY THEORY OF LIABILITY ARISING IN ANY WAY RELATED - TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES, INC. AND - ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS - (US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL - ACCEPTS THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO - DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND - ALL LIABILITIES, OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN - DOLLARS (US $10.00). THE FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE - AND, IF ANY OF THESE TERMS ARE CONSTRUED AS UNENFORCEABLE, FAIL IN - ESSENTIAL PURPOSE, OR BECOME VOID OR DETRIMENTAL TO ADVANCED MICRO - DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR CONTRIBUTORS FOR ANY REASON, - THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL SHALL - TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL SURVIVE ANY - EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR ACCESS - OR USE RELATED TO THIS MATERIAL. - - NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING - THIS MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE - SUBJECT TO RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED - STATES OR OTHER COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. - EXPORT CONTROL LAWS SUCH AS THE EXPORT ADMINISTRATION REGULATIONS AND - NATIONAL SECURITY CONTROLS AS DEFINED THEREUNDER, AS WELL AS STATE - DEPARTMENT CONTROLS UNDER THE U.S. MUNITIONS LIST. THIS MATERIAL MAY - NOT BE USED, RELEASED, TRANSFERRED, IMPORTED, EXPORTED AND/OR RE- - EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS, INCLUDING - U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS, - COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY - CONTROLS. - MOREOVER, - THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY - LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL. - - This license forms the entire agreement regarding the subject matter - hereof and supersedes all proposals and prior discussions and writings - between the parties with respect thereto. This license does not affect - any ownership, rights, title, or interest in, or relating to, this - material. No terms of this license can be modified or waived, and no - breach of this license can be excused, unless done so in a writing - signed by all affected parties. Each term of this license is - separately enforceable. If any term of this license is determined to - be or becomes unenforceable or illegal, such term shall be reformed to - the minimum extent necessary in order for this license to remain in - effect in accordance with its terms as modified by such reformation. - This license shall be governed by and construed in accordance with the - laws of the State of Texas without regard to rules on conflicts of law - of any state or jurisdiction or the United Nations Convention on the - International Sale of Goods. All disputes arising out of this license - shall be subject to the jurisdiction of the federal and state courts - in Austin, Texas, and all defenses are hereby waived concerning - personal jurisdiction and venue of these courts. - ============================================================ */ - -#include "plpa_config.h" -#include "plpa.h" -#include "plpa_internal.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct tuple_t_ { - int processor_id, socket, core; -} tuple_t; - -static int supported = 0; -static int num_processors = -1; -static int max_processor_num = -1; -static int num_sockets = -1; -static int max_socket_id = -1; -static int *max_core_id = NULL; -static int *num_cores = NULL; -static int max_core_id_overall = -1; -static tuple_t *map_processor_id_to_tuple = NULL; -static tuple_t ***map_tuple_to_processor_id = NULL; - -static void clear_cache(void) -{ - if (NULL != max_core_id) { - free(max_core_id); - max_core_id = NULL; - } - if (NULL != num_cores) { - free(num_cores); - num_cores = NULL; - } - if (NULL != map_processor_id_to_tuple) { - free(map_processor_id_to_tuple); - map_processor_id_to_tuple = NULL; - } - if (NULL != map_tuple_to_processor_id) { - if (NULL != map_tuple_to_processor_id[0]) { - free(map_tuple_to_processor_id[0]); - map_tuple_to_processor_id = NULL; - } - free(map_tuple_to_processor_id); - map_tuple_to_processor_id = NULL; - } - - num_processors = max_processor_num = -1; - num_sockets = max_socket_id = -1; - max_core_id_overall = -1; -} - -static void load_cache(const char *sysfs_mount) -{ - int i, j, k, invalid_entry, fd; - char path[PATH_MAX], buf[8]; - PLPA_NAME(cpu_set_t) *cores_on_sockets; - int found; - - /* Check for the parent directory */ - sprintf(path, "%s/devices/system/cpu", sysfs_mount); - if (access(path, R_OK|X_OK)) { - return; - } - - /* Go through and find the max processor ID */ - for (num_processors = max_processor_num = i = 0; - i < PLPA_BITMASK_CPU_MAX; ++i) { - sprintf(path, "%s/devices/system/cpu/cpu%d", sysfs_mount, i); - if (0 != access(path, (R_OK | X_OK))) { - max_processor_num = i - 1; - break; - } - ++num_processors; - } - - /* If we found no processors, then we have no topology info */ - if (0 == num_processors) { - clear_cache(); - return; - } - - /* Malloc space for the first map (processor ID -> tuple). - Include enough space for one invalid entry. */ - map_processor_id_to_tuple = malloc(sizeof(tuple_t) * - (max_processor_num + 2)); - if (NULL == map_processor_id_to_tuple) { - return; - } - for (i = 0; i <= max_processor_num; ++i) { - map_processor_id_to_tuple[i].processor_id = i; - map_processor_id_to_tuple[i].socket = -1; - map_processor_id_to_tuple[i].core = -1; - } - /* Set the invalid entry */ - invalid_entry = i; - map_processor_id_to_tuple[invalid_entry].processor_id = -1; - map_processor_id_to_tuple[invalid_entry].socket = -1; - map_processor_id_to_tuple[invalid_entry].core = -1; - - /* Build a cached map of (socket,core) tuples */ - for (found = 0, i = 0; i <= max_processor_num; ++i) { - sprintf(path, "%s/devices/system/cpu/cpu%d/topology/core_id", - sysfs_mount, i); - fd = open(path, O_RDONLY); - if ( fd < 0 ) { - continue; - } - if ( read(fd, buf, 7) <= 0 ) { - continue; - } - sscanf(buf, "%d", &(map_processor_id_to_tuple[i].core)); - close(fd); - - sprintf(path, - "%s/devices/system/cpu/cpu%d/topology/physical_package_id", - sysfs_mount, i); - fd = open(path, O_RDONLY); - if ( fd < 0 ) { - continue; - } - if ( read(fd, buf, 7) <= 0 ) { - continue; - } - sscanf(buf, "%d", &(map_processor_id_to_tuple[i].socket)); - close(fd); - found = 1; - - /* Keep a running tab on the max socket number */ - if (map_processor_id_to_tuple[i].socket > max_socket_id) { - max_socket_id = map_processor_id_to_tuple[i].socket; - } - } - - /* Now that we know the max number of sockets, allocate some - arrays */ - max_core_id = malloc(sizeof(int) * (max_socket_id + 1)); - if (NULL == max_core_id) { - clear_cache(); - return; - } - num_cores = malloc(sizeof(int) * (max_socket_id + 1)); - if (NULL == num_cores) { - clear_cache(); - return; - } - for (i = 0; i <= max_socket_id; ++i) { - num_cores[i] = -1; - max_core_id[i] = -1; - } - - /* Find the max core number on each socket */ - for (i = 0; i <= max_processor_num; ++i) { - if (map_processor_id_to_tuple[i].core > - max_core_id[map_processor_id_to_tuple[i].socket]) { - max_core_id[map_processor_id_to_tuple[i].socket] = - map_processor_id_to_tuple[i].core; - } - if (max_core_id[map_processor_id_to_tuple[i].socket] > - max_core_id_overall) { - max_core_id_overall = - max_core_id[map_processor_id_to_tuple[i].socket]; - } - } - - /* If we didn't find any core_id/physical_package_id's, then we - don't have the topology info */ - if (!found) { - clear_cache(); - return; - } - - /* Go through and count the number of unique sockets found. It - may not be the same as max_socket_id because there may be - "holes" -- e.g., sockets 0 and 3 are used, but sockets 1 and 2 - are empty. */ - for (j = i = 0; i <= max_socket_id; ++i) { - if (max_core_id[i] >= 0) { - ++j; - } - } - if (j > 0) { - num_sockets = j; - } - - /* Count how many cores are available on each socket. This may - not be the same as max_core_id[socket_num] if there are - "holes". I don't know if holes can happen (i.e., if specific - cores can be taken offline), but what the heck... */ - cores_on_sockets = malloc(sizeof(PLPA_NAME(cpu_set_t)) * - (max_socket_id + 1)); - if (NULL == cores_on_sockets) { - clear_cache(); - return; - } - for (i = 0; i <= max_socket_id; ++i) { - PLPA_CPU_ZERO(&(cores_on_sockets[i])); - } - for (i = 0; i <= max_processor_num; ++i) { - if (map_processor_id_to_tuple[i].socket >= 0) { - PLPA_CPU_SET(map_processor_id_to_tuple[i].core, - &(cores_on_sockets[map_processor_id_to_tuple[i].socket])); - } - } - for (i = 0; i <= max_socket_id; ++i) { - int count = 0; - for (j = 0; j < PLPA_BITMASK_CPU_MAX; ++j) { - if (PLPA_CPU_ISSET(j, &(cores_on_sockets[i]))) { - ++count; - } - } - if (count > 0) { - num_cores[i] = count; - } - } - - /* Now go through and build the map in the other direction: - (socket,core) => processor_id. This map simply points to - entries in the other map (i.e., it's by reference instead of by - value). */ - map_tuple_to_processor_id = malloc(sizeof(tuple_t **) * - (max_socket_id + 1)); - if (NULL == map_tuple_to_processor_id) { - clear_cache(); - return; - } - map_tuple_to_processor_id[0] = malloc(sizeof(tuple_t *) * - ((max_socket_id + 1) * - (max_core_id_overall + 1))); - if (NULL == map_tuple_to_processor_id[0]) { - clear_cache(); - return; - } - /* Set pointers for 2nd dimension */ - for (i = 1; i <= max_socket_id; ++i) { - map_tuple_to_processor_id[i] = - map_tuple_to_processor_id[i - 1] + max_core_id_overall + 1; - } - /* Compute map */ - for (i = 0; i <= max_socket_id; ++i) { - for (j = 0; j <= max_core_id_overall; ++j) { - /* Default to the invalid entry in the other map, meaning - that this (socket,core) combination doesn't exist - (e.g., the core number does not exist in this socket, - although it does exist in other sockets). */ - map_tuple_to_processor_id[i][j] = - &map_processor_id_to_tuple[invalid_entry]; - - /* See if this (socket,core) tuple exists in the other - map. If so, set this entry to point to it (overriding - the invalid entry default). */ - for (k = 0; k <= max_processor_num; ++k) { - if (map_processor_id_to_tuple[k].socket == i && - map_processor_id_to_tuple[k].core == j) { - map_tuple_to_processor_id[i][j] = - &map_processor_id_to_tuple[k]; -#if defined(PLPA_DEBUG) && PLPA_DEBUG - printf("Creating map: (socket %d, core %d) -> ID %d\n", - i, j, k); -#endif - break; - } - } - } - } - - supported = 1; -} - -/* Internal function to setup the mapping data. Guaranteed to be - calling during PLPA_NAME(init), so we don't have to worry about - thread safety here. */ -int PLPA_NAME(map_init)(void) -{ - const char *sysfs_mount = "/sys"; - char *temp; - - temp = getenv("PLPA_SYSFS_MOUNT"); - if (temp) { - sysfs_mount = temp; - } - - load_cache(sysfs_mount); - return 0; -} - -/* Internal function to cleanup allocated memory. Only called by one - thread (during PLPA_NAME(finalize), so don't need to worry about - thread safety here. */ -void PLPA_NAME(map_finalize)(void) -{ - clear_cache(); -} - -/* Return whether this kernel supports topology information or not */ -int PLPA_NAME(have_topology_information)(int *supported_arg) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == supported_arg) { - return EINVAL; - } - - *supported_arg = supported; - return 0; -} - -int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == processor_id) { - return EINVAL; - } - - /* If this system doesn't support mapping, sorry Charlie */ - if (!supported) { - return ENOSYS; - } - - /* Check for some invalid entries */ - if (socket < 0 || socket > max_socket_id || - core < 0 || core > max_core_id_overall) { - return ENOENT; - } - /* If the mapping returns -1, then this is a non-existent - socket/core combo (even though they fall within the max socket - / max core overall values) */ - ret = map_tuple_to_processor_id[socket][core]->processor_id; - if (-1 == ret) { - return ENOENT; - } - - /* Ok, all should be good -- return the mapping */ - *processor_id = ret; - return 0; -} - -int PLPA_NAME(map_to_socket_core)(int processor_id, int *socket, int *core) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == socket || NULL == core) { - return EINVAL; - } - - /* If this system doesn't support mapping, sorry Charlie */ - if (!supported) { - return ENOSYS; - } - - /* Check for some invalid entries */ - if (processor_id < 0 || processor_id > max_processor_num) { - return ENOENT; - } - ret = map_processor_id_to_tuple[processor_id].socket; - if (-1 == ret) { - return ENOENT; - } - - /* Ok, all should be good -- return the mapping */ - *socket = ret; - *core = map_processor_id_to_tuple[processor_id].core; - return 0; -} - -int PLPA_NAME(get_processor_info)(int *num_processors_arg, - int *max_processor_num_arg) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == max_processor_num_arg || NULL == num_processors_arg) { - return EINVAL; - } - - /* If this system doesn't support mapping, sorry Charlie */ - if (!supported) { - return ENOSYS; - } - - /* All done */ - *num_processors_arg = num_processors; - *max_processor_num_arg = max_processor_num; - return 0; -} - -/* Return the max socket number */ -int PLPA_NAME(get_socket_info)(int *num_sockets_arg, int *max_socket_id_arg) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == max_socket_id_arg || NULL == num_sockets_arg) { - return EINVAL; - } - - /* If this system doesn't support mapping, sorry Charlie */ - if (!supported) { - return ENOSYS; - } - - /* All done */ - *num_sockets_arg = num_sockets; - *max_socket_id_arg = max_socket_id; - return 0; -} - -/* Return the number of cores in a socket and the max core ID number */ -int PLPA_NAME(get_core_info)(int socket, int *num_cores_arg, - int *max_core_id_arg) -{ - int ret; - - /* Initialize if not already done so */ - if (!PLPA_NAME(initialized)) { - if (0 != (ret = PLPA_NAME(init)())) { - return ret; - } - } - - /* Check for bozo arguments */ - if (NULL == max_core_id_arg || NULL == num_cores_arg) { - return EINVAL; - } - - /* If this system doesn't support mapping, sorry Charlie */ - if (!supported) { - return ENOSYS; - } - - /* Check for some invalid entries */ - if (socket < 0 || socket > max_socket_id || -1 == max_core_id[socket]) { - return ENOENT; - } - ret = num_cores[socket]; - if (-1 == ret) { - return ENOENT; - } - - /* All done */ - *num_cores_arg = ret; - *max_core_id_arg = max_core_id[socket]; - return 0; -} diff --git a/plpa-1.1/AUTHORS b/plpa-1.3.2/AUTHORS similarity index 100% rename from plpa-1.1/AUTHORS rename to plpa-1.3.2/AUTHORS diff --git a/plpa-1.1/LICENSE b/plpa-1.3.2/LICENSE similarity index 100% rename from plpa-1.1/LICENSE rename to plpa-1.3.2/LICENSE diff --git a/plpa-1.1/Makefile.am b/plpa-1.3.2/Makefile.am similarity index 89% rename from plpa-1.1/Makefile.am rename to plpa-1.3.2/Makefile.am index 43f69a02..048cc5cc 100644 --- a/plpa-1.1/Makefile.am +++ b/plpa-1.3.2/Makefile.am @@ -14,4 +14,4 @@ SUBDIRS = src DIST_SUBDIRS = $(SUBDIRS) -EXTRA_DIST = README VERSION LICENSE AUTHORS plpa.m4 +EXTRA_DIST = README VERSION LICENSE AUTHORS autogen.sh diff --git a/plpa-1.3.2/NEWS b/plpa-1.3.2/NEWS new file mode 100644 index 00000000..f5623ba3 --- /dev/null +++ b/plpa-1.3.2/NEWS @@ -0,0 +1,148 @@ +Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + University Research and Technology + Corporation. All rights reserved. +Copyright (c) 2004-2005 The Regents of the University of California. + All rights reserved. +Copyright (c) 2006-2010 Cisco Systems, Inc. All rights reserved. +$COPYRIGHT$ + +Additional copyrights may follow + +$HEADER$ + +=========================================================================== + +This file contains the main features as well as overviews of specific +bug fixes (and other actions) for each version of PLPA since +version 1.0. + +1.3.2 +----- + +- Removed a clause from AMD's license notice in plpa_map.c by + direction from Barry S. Newberger, Ph.D., Assistant General Counsel, + Advanced Micro Devices, Inc. per a Red Hat licensing concern + (initiated at https://bugzilla.redhat.com/show_bug.cgi?id=530230). + Removing this clause alleviates Red Hat's concern, even though this + resolution not shown on the above-cited bugzilla ticket. +- Julian Seward noticed that PLPA's use of the Valgrind API in the + affinity API probe was incorrect and suggested an improvement. Even + though we're ramping down PLPA development, I couldn't really ignore + the Valgrind author's suggestion! + + +1.3.1 +----- + +- Fixed bug identified by Eugene Loh at Sun; plpa-taskset -c ranges + were accidentally excluding the processor ID at the top of the + range. +- For standalone PLPA builds, the .so library is now versioned + according to the GNU Libtool guidelines. + + +1.3 +--- + +- Added --with-valgrind support that allows building support for + Valgrind into PLPA (i.e., tell Valgrind to not warn about things + that we know are ok). + + +1.2 +--- + +- Allow mapping from simple/contiguous processor, socket, and core + numbers to the corresponding back-end Linux ID (and clean up + documentation references between "X number" and "X ID", where X is + one of processor, socket, core). +- Support CPU hot plugging. +- Add explicit control over the PLPA topology information cache. + + +1.1.1 +----- + +- Ensure that --enable-included also disables executables by default. + Thanks to Brian Curtis for identifying the problem and supplying a + patch. +- Add ENABLE_EXECUTABLES m4 macro to allow behavior in m4 + configuration analogous to "--enable-included --enable-executables". + + +1.1 +--- + +- New command: plpa-taskset. It is intended as a drop-in replacement + for the "taskset" command, except it also understands sockets and + cores. See "plpa-taskset --help" for more details +- Renamed "plpa_info" to "plpa-info". +- Added PLPA_{MAJOR|MINOR|RELEASE}_VERSION integer macros in plpa.h. + This release, they have the values of 1, 1, and 0, respectively. +- Add new API functions to map from (socket,core) back and forth from + the Linux virtual processor ID. Thanks to AMD for the initial code + contribution that made this possible. See the documentation for + plpa_map_to_processor_id() as a starting point for more + information. +- Various fixes to "included" mode. + + +1.0.5 +----- + +- Fix an issue where the PLPA get/set affinity functions would only + operate on the current process; the PID argument to these functions + was effectively ignored. + + +1.0.4 +----- + +- Fix some 64 bit issues. Thanks to David Creasy for reporting the + problems. +- Fix plpa.h to be C++-friendly. Thanks to Emmanuel Paris for + pointing out this problem. + + +1.0.3 +----- + +- Resolve some sizing / units ambiguities that mistakenly did not make + it into 1.0.1. Thanks to Bert Wesarg for pointing these problems out. + + +1.0.2 +----- + +- Ensure that plpa_sched_[set|get]affinity() returns 0 upon success. + Thanks to David Creasy for bringing this to our attention. + + +1.0.1 +----- + +- Specify that cpusetsize should be in units of bytes and add some + missing "* 8"'s in plpa_dispatch.c. + + +1.0 +--- + +- Initial release. + + +0.9a2 +----- + +- Change the back-end type of the plpa_bitmask_t to unsigned long + instead of unsigned char to avoid an endian problem. +- No longer attempt to set the affinity in plpa_api_probe() to avoid a + possible race condition (setting it after getting it). +- Fix PLPA_CPU_ZERO macro. Thanks to Bogdan Costescu for pointing + this out. + + +0.9a1 +----- + +Initial public release. diff --git a/plpa-1.3.2/README b/plpa-1.3.2/README new file mode 100644 index 00000000..ac794ed7 --- /dev/null +++ b/plpa-1.3.2/README @@ -0,0 +1,659 @@ +Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana + University Research and Technology + Corporation. All rights reserved. +Copyright (c) 2004-2005 The Regents of the University of California. + All rights reserved. +Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. +$COPYRIGHT$ + +See LICENSE file for a rollup of all copyright notices. + +$HEADER$ + +=========================================================================== + +This is the Portable Linux Processor Affinity (PLPA) package +(pronounced "pli-pa"). The PLPA has evolved over time to provide the +following capabilities: + +1. Provide a stable API on Linux for processor affinity (Linux has + provided three different API signatures over time). +2. Provide a simple API that translates between Linux processor ID and + (socket ID, core ID) tuples, and allows querying processor topology + information on supported platforms. +3. Provide a command-line executable (plpa-taskset(1)) that provides + all the same functionality as the venerable taskset(1) command, and + several extensions, including the ability to bind processes to + specific (socket, core) tuples on supported platforms. + +Note that the PLPA is fully embeddable, meaning that it can be wholly +contained in larger software packages that wish to have a single, +stable version of processor affinity API functionality. See below for +more details on embedding. + +Also note that PLPA's socket/core and other topology information is +only available on certain platforms. Specifically, PLPA reads the +/sys filesystem to glean its information; if your system does not +export processor topology information through /sys, the PLPA cannot +provide that information. For example, AMD/Intel processor topology +support was included in Linux kernel v2.6.16, but POWER processor +topology information is not yet supported as of Linux kernel v2.6.26. + +In a world where the processor counts in hosts are [again] increasing, +particularly where at least some of them are NUMA-based architectures, +processor affinity is becoming more important. We hope that the PLPA +is helpful to you. Enjoy. + +Note that if you're looking into processor affinity, and if you're on +a NUMA machine, you probably also want to look into libnuma: + + ftp://ftp.suse.com/pub/people/ak/numa/ + +If you are a developer, keep reading. If you are a system +administrator or other end-user, you're probably more interested in +using the plpa-info(1) and plpa-taskset(1) executable commands; see +the output of "plpa-info" and "plpa-taskset --help" for more +information. + +=========================================================================== + +The following text is specific technical information about the +original problem that PLPA Was created to solve. + +The original intent for the PLPA was for developers who wished to use +Linux processor affinity via the sched_setaffinity() and +sched_getaffinity() library calls, but don't want to wade through the +morass of 3 different APIs that have been offered through the life of +these calls in various Linux distributions and glibc versions. + +Specifically, to compile for any given Linux system, you need some +complex compile-time tests to figure out which of the 3 APIs to use. +And if you want your application to be binary portable across +different Linux distributions, more complex run-time tests (and horrid +compile-time trickery) are required to figure out which API the system +you are running on uses. + +These problems all stem from the fact that the same 2 symbols have had +three different APIs (with different numbers and types of +parameters) throughout their life in Linux. Ick. + +The PLPA is an attempt to solve this problem by providing a single API +that developers can write to. It provides three things: + +1. A single API that developers can write to, regardless of what + back-end API the system you are compiling on has. +2. A run-time test and dispatch that will invoke the Right back-end + API depending on what back-end API the system you are running on + has. +3. Mapping information between (socket ID, core ID) tuples and Linux + virtual processor IDs. + +=========================================================================== + +What, exactly, is the problem? History. +---------------------------------------- + +There are at least 3 different ways that sched_setaffinity is +implemented in glibc (only one of which is documented in the +sched_setaffinity(2) man page), and some corresponding changes +to what the kernel considers to be valid arguments: + +1. int sched_setaffinity(pid_t pid, unsigned int len, unsigned + long *mask); + +This originated in the time period of 2.5 kernels and some distros +back-ported it to their 2.4 kernels and libraries. It's unknown if +this version was ever packaged with any 2.6 kernels. + +2. int sched_setaffinity (pid_t __pid, size_t __cpusetsize, + const cpu_set_t *__cpuset); + +This appears to be in recent distros using 2.6 kernels. We don't +know exactly when #1 changed into #2. However, this prototype is nice +because the cpu_set_t type is accompanied by fdset-like CPU_ZERO(), +CPU_SET(), CPU_ISSET(), etc. macros. + +3. int sched_setaffinity (pid_t __pid, const cpu_set_t *__mask); + +(note the missing len parameter) This is in at least some Linux +distros (e.g., MDK 10.0 with a 2.6.3 kernel, and SGI Altix, even +though the Altix uses a 2.4-based kernel and therefore likely +back-ported the 2.5 work or originated it in the first place). +Similar to #2, the cpu_set_t type is accompanied by fdset-like +CPU_ZERO(), CPU_SET(), CPU_ISSET(), etc. macros. + +But wait, it gets worse. + +Remember that getting/setting processor affinity has to involve the +kernel. The sched_[sg]etaffinity() glibc functions typically do a +little error checking and then make a syscall down into the kernel to +actually do the work. There are multiple possibilities for problems +here as the amount of checking has changed: + +1. The glibc may support the affinity functions, but the kernel may + not (and vice versa). + + This is typically only an issue with slightly older Linux distributions. + Mandrake 9.2 is an example of this. PLPA can detect this at run-time + and turn its internal functions into no-ops and return appropriate error + codes (ENOSYS). + +2. The glibc affinity functions may be buggy (i.e., they pass bad data + down to the syscall). + + This is fortunately restricted to some older versions of glibc, and + is relatively easy to check for at run-time. PLPA reliably detects + this situation at run-time and returns appropriate error codes + (ENOSYS). + + The original SuSE 9.1 version seems to have this problem, but it was + fixed it somewhere in the SuSE patching history (it is unknown exactly + when). Specifically, updating to the latest SuSE 9.1 patch level + (as of Dec 2005) seems to fix the problem. + +3. The CPU_* macros for manipulating cpu_set_t bitmasks may not + compile because of typo bugs in system header files. + + PLPA avoids this problem by providing its own PLPA_CPU_* macros for + manipulating CPU bitmasks. See "How do I use PLPA?", below, for + more details. + +The PLPA avoids all the glibc issues by using syscall() to directly +access the kernel set and get affinity functions. This is described +below. + +=========================================================================== + +How does PLPA work? +------------------- + +Jeff Squyres initially sent a mail to the Open MPI developer's mailing +list explaining the Linux processor affinity problems and asking for +help coming up with a solution (particularly for binary +compatibility): + + http://www.open-mpi.org/community/lists/devel/2005/11/0558.php + +Discussion on that thread and others eventually resulted in the +run-time tests that form the heart of the PLPA. Many thanks to Paul +Hargrove and Bogdan Costescu for their time and effort to get these +tests right. + +PLPA was written so that other developers who want to use processor +affinity in Linux don't have to go through this mess. The PLPA +provides a single interface that can be used on any platform, +regardless of which back-end API variant it has. This includes both +the sched_setaffinity() and sched_getaffinity() calls as well as the +CPU_*() macros. + +The PLPA avoids glibc altogether -- although tests were developed that +could *usually* figure out which glibc variant to use at run time, +there were still some cases where it was either impossible to +determine or the glibc interface itself was buggy. Hence, it was +decided that a simpler approach was simply to use syscall() to invoke +the back-end kernel functions directly. + +The kernel functions have gone through a few changes as well, so the +PLPA does a few run-time tests to determine which variant to use +before actually invoking the back-end functions with the +user-specified arguments. + +NOTE: The run-time tests that the PLPA performs involve getting the +current affinity for the process in question and then attempting to +set them back to the same value. By definition, this introduces a +race condition (there is no atomic get-and-set functionality for +processor affinity). The PLPA cannot guarantee consistent results if +multiple entities (such as multiple threads or multiple processes) are +setting the affinity for a process at the same time. In a worst case +scenario, the PLPA may actually determine that it cannot determine the +kernel variant at run time if another entity modifies a process' +affinity while PLPA is executing its run-time tests. + +=========================================================================== + +Does PLPA make truly portable binaries? +--------------------------------------- + +As much as Linux binaries are portable, yes. That is, if you have +within your power to make a binary that is runnable on several +different Linux distributions/versions/etc., then you may run into +problems with the Linux processor affinity functions. PLPA attempts +to solve this problem for you by *also* making the Linux processor +affinity calls be binary portable. + +Hence, you need to start with something that is already binary +portable (perhaps linking everything statically) -- then PLPA will be +of help to you. Do not fall into the misconception that PLPA will +magically make your executable be binary portable between different +Linux variants. + +=========================================================================== + +How do I use PLPA? +------------------ + +There are three main uses of the PLPA: + +1. Using the plpa-info(1) executable to check if your system supports + processor affinity and the PLPA can determine which to use at + run-time. +2. Developers using the PLPA library both to enable source and binary + Linux processor affinity portability, and to write + processor-topology-aware applications. +3. Using the plpa-taskset(1) executable to bind arbitrary executables + to Linux virtual processor IDs and/or specific socket/core tuples. + +In more detail: + +1. The plpa-info(1) executable is a few simple calls into the PLPA + library that checks which API variant the system it is running on + has. If the kernel supports processor affinity and the PLPA is + able to figure out which API variant to use, it prints "Kernel + affinity support: no". Other responses indicate an error. The + "--topo" switch will print out basic topology information about + your system, if supported. + + Since the PLPA library abstracts this kind of problem away, this is + more a diagnostic tool than anything else. + + See "plpa-info --help" for more information. A man page does not + yet exist, unfortunately. + + Note that plpa-info is *only* compiled and installed if PLPA is + installed as a standalone package (see below). + +2. Developers can use this package by including the header + file and using the following prototypes for setting and getting + processor affinity: + + int plpa_sched_setaffinity(pid_t pid, size_t cpusetsize, + const plpa_cpu_set_t *cpuset); + + int plpa_sched_getaffinity(pid_t pid, size_t cpusetsize, + const plpa_cpu_set_t *cpuset) + + These functions perform run-time tests to determine which back-end + API variant exists on the system and then dispatch to it correctly. + The units of cpusetsize is number of bytes. This should normally + just be sizeof(*cpuset), but is made available as a parameter to + allow for future expansion of the PLPA (stay tuned). + + The observant reader will notice that this is remarkably similar to + the one of the Linux API's (the function names are different and + the CPU set type is different). PLPA also provides several macros + for manipulating the plpa_cpu_set_t bitmask, quite similar to FDSET + macros (see "What, Exactly, Is the Problem?" above for a + description of problems with the native CPU_* macros): + + - PLPA_CPU_ZERO(&cpuset): Sets all bits in a plpa_cpu_set_t to + zero. + - PLPA_CPU_SET(num, &cpuset): Sets bit of to one. + - PLPA_CPU_CLR(num, &cpuset): Sets bit of to zero. + - PLPA_CPU_ISSET(num, &cpuset): Returns one if bit of + is one; returns zero otherwise. + + Note that all four macros take a *pointer* to a plpa_cpu_set_t, as + denoted by "&cpuset" in the descriptions above. + + Also note that he PLPA distinguishes between Linux processor, + socket, and core IDs and processor, socket, and core numbers. The + *Linux IDs* are kernel-assigned integer values that do not + necessarily start with zero and are not necessarily contiguous. + The *numbers* start with 0 and are contiguous to (N-1). The + numbers are therefore mainly a human convenience; they may or may + not exactly correspond to the Linux IDs; it is safest to assume + that they do not. + + The following API functions are also available on supported + platforms with kernels that support topology information (e.g., + AMD/Intel platforms with Linux kernel v2.6.16 or later). The list + below is a summary only; see plpa.h for a specific list of function + signatures: + + - plpa_have_topology_information() + Will return 1 if the PLPA is able to provide topology + information, 0 otherwise. If 0 is returned, all the functions + below will return a negative value to signify a graceful failure. + + - plpa_map_to_processor_id() + Take a (socket ID, core ID) tuple and map it to a Linux processor + ID + + - plpa_map_to_socket_core() + Take a Linux processor ID and map it to a (socket ID, core ID) + tuple + + - plpa_get_processor_info() + Return the number of processors and the max Linux processor ID + + - plpa_get_processor_id() + Return the Linux processor ID for the Nth processor (starting + with 0) + + - plpa_get_processor_flags() + Return whether a Linux processor ID exists, and if so, if it is + online + + - plpa_get_socket_info() + Return the number of sockets and the max Linux socket ID + + - plpa_get_socket_id() + Return the Linux socket ID for the Nth socket (starting with 0) + + - plpa_get_core_info() + For a given socket ID, return the number of cores and the max + Linux core ID + + - plpa_get_core_id() + For a given socket ID, return the Linux core ID of the Nth core + (starting with 0) + + - plpa_get_core_flags() + Return whether a (socket ID,core ID) tuple exists, and if so, if + it is online + + - plpa_set_cache_behavior() + Tell PLPA to use (or not) a local cache for the topology + information, or to refresh the cache right now + + - plpa_finalize() + Release all internal resources allocated and maintained by the + PLPA. It is permissible to invoke other PLPA functions after + plpa_finalize(), but if you want to release PLPA's resources, you + will need to invoke plpa_finalize() again. Note that it is not + necessary (but harmless) to invoke plpa_finalize() on systems + where plpa_have_topology_information() returns that the topology + information is not supported. + + *** NOTE: Topology information (i.e., (socket ID, core ID) tuples) + may not be reported for offline processors. Hence, if any + processors are offline, the socket/core values returned by PLPA + will likely change once the processor is brought back online. + Sorry; this is how the Linux kernel works -- there's nothing + PLPA can do about it. + + The above functions are slightly more documented in plpa.h. + Contributions of real man pages would be greatly appreciated. + +3. The plpa-taskset(1) executable represents an evolution of the + venerable "taskset(1)" command. It allows binding of arbitrary + processes to specific Linux processor IDs and/or specific (socket + ID, core ID) tuples. It supports all the same command line syntax + of the taskset(1) command, but also supports additional syntax for + specifying socket and core IDs. Hence, you can launch + processor-bound jobs without needing to modify their source code to + call the PLPA library. See "plpa-taskset --help" for more + information on the command line options available, and brief + examples of usage. A man page does not yet exist, unfortunately. + +=========================================================================== + +How do I compile / install the PLPA as a standalone package? +------------------------------------------------------------ + +The PLPA uses the standard GNU Autoconf/Automake/Libtool toolset to +build and install itself. This means that generally, the following +works: + +shell$ ./configure --prefix=/where/you/want/to/install +[...lots of output...] +shell$ make all +[...lots of output...] +shell$ make install + +Depending on your --prefix, you may need to run the "make install" +step as root or some other privileged user. + +There are a few noteworthy configure options listed below. The +enable/disable options are shown in their non-default form. For +example, if --enable-foo is shown below, it is because --disable-foo +is the default. + +--enable-emulate: allow using PLPA on platforms that do not have + __NR_sched_setaffinity (e.g., OS X); usually only useful in + development / testing scenarios. + +--disable-executables: do not build the PLPA executables; only build + the library. + +--enable-included-mode: build PLPA in the "included" mode (see + below). + +--enable-debug: this option is probably only helpful for PLPA + developers. + +--with-plpa-symbol-prefix=STRING: a string prefix to add to all public + PLPA symbols. This is usually only useful in included mode (see + below). + +--with-valgrind(=DIR): require building PLPA with Valgrind support + (requires finding include/valgrind/memcheck.h). This will add a + small number of Valgrind annotations in the PLPA code base that + remove false/irrelevant Valgrind warnings. The =DIR clause is only + necessary if Valgrind's header files cannot be found by the + preprocessor's default search path. + +"make install" will install the following: + +- in $includedir (typically $prefix/include) +- libplpa.la and libplpa.a and/or libplpa.so in $libdir (typically + $prefix/lib) +- plpa-info(1) executable in $bindir (typically $prefix/bin) +- plpa-taskset(1) executable in $bindir (typically $prefix/bin) + +Note that since PLPA builds itself with GNU Libtool, it can be built +as a static or shared library (or both). The default is to build a +shared library. You can enable building a static library by supplying +the "--enable-static" argument to configure; you can disable building +the shared library by supplying the "--disable-shared" argument to +configure. "make install" will install whichever library was built +(or both). + +"make uninstall" will fully uninstall PLPA from the prefix directory +(again, depending in filesystem permissions, you may need to run this +as root or some privileged user). + +=========================================================================== + +How do I include/embed PLPA in my software package? +--------------------------------------------------- + +It can be desirable to include PLPA in a larger software package +(be sure to check out the LICENSE file) so that users don't have to +separately download and install it before installing your software +(after all, PLPA is a tiny little project -- why make users bother +with it?). + +When used in "included" mode, PLPA will: + +- not install any header files +- not build or install any executables +- not build libplpa.* -- instead, it will build libplpa_included.* + +There are two ways to put PLPA into "included" mode. From the +configure command line: + +shell$ ./configure --enable-included-mode ... + +Or by directly integrating PLPA's m4 configure macro in your configure +script and invoking a specific macro to enable the included mode. + +Every project is different, and there are many different ways of +integrating PLPA into yours. What follows is *one* example of how to +do it. + +Copy the PLPA directory in your source tree and include the plpa.m4 +file in your configure script -- perhaps with the following line in +acinclude.m4 (assuming the use of Automake): + +m4_include(path/to/plpa.m4) + +The following macros can then be used from your configure script (only +PLPA_INIT *must* be invoked if using the m4 macros): + +- PLPA_STANDALONE + Force the building of PLPA in standalone mode. Overrides the + --enable-included-mode command line switch. + +- PLPA_INCLUDED + Force the building of PLPA in included mode. + +- PLPA_SET_SYMBOL_PREFIX(foo) + Tells the PLPA to prefix all types and public symbols with "foo" + instead of "plpa_". This is recommended behavior if you are + including PLPA in a larger project -- it is possible that your + software will be combined with other software that also includes + PLPA. If you both use different symbol prefixes, there will be no + type/symbol clashes, and everything will compile and link + successfully. If you both include PLPA and do not change the symbol + prefix, it is likely that you will get multiple symbol definitions + when linking if an external PLPA is linked against your library / + application. Note that the PLPA_CPU_*() macros are *NOT* prefixed + (because they are only used when compiling and therefore present no + link/run-time conflicts), but all other types, enum values, and + symbols are. Enum values are prefixed with an upper-case + translation if the prefix supplied. For example, + PLPA_SET_SYMBOL_PREFIX(foo_) will result in foo_init() and + FOO_PROBE_OK. Tip: It might be good to include "plpa" in the + prefix, just for clarity. + +- PLPA_DISABLE_EXECUTABLES + Provides the same result as the --disable-executables configure + flag, and is implicit in included mode. + +- PLPA_ENABLE_EXECUTABLES + Provides the same result as the --enable-executables configure flag. + If used in conjunction with PLPA_INCLUDED, it must be specified + *after* PLPA_INLCLUDED to have effect, as PLPA_INCLUDED *disables* + executables. + +- PLPA_INIT(config-prefix, action-upon-success, action-upon-failure) + Invoke the PLPA tests and setup the PLPA to build. A traversal of + "make" into the PLPA directory should build everything (it is safe + to list the PLPA directory in the SUBDIRS of a higher-level + Makefile.am, for example). ***PLPA_INIT must be invoked after the + STANDALONE, INCLUDED, SET_SYMBOL_PREFIX, DISABLE_EXECUTABLES, and + ENABLE_EXECUTABLES macros.*** The first argument is the prefix to + use for AC_OUTPUT files. Hence, if your embedded PLPA is located in + the source tree at contrib/plpa, you should pass [contrib/plpa] as + the first argument. + +- PLPA_DO_AM_CONDITIONALS + If you embed PLPA in a larger project and build it conditionally + (e.g., if PLPA_INIT is in a conditional), you must unconditionally + invoke PLPA_DO_AM_CONDITIONALS to avoid warnings from Automake (for + the cases where PLPA is not selected to be built). This macro is + necessary because PLPA uses some AM_CONDITIONALs to build itself; + AM_CONDITIONALs cannot be defined conditionally. It is safe (but + unnecessary) to call PLPA_DO_AM_CONDITIONALS even if PLPA_INIT is + invoked unconditionally. + +Here's an example of integrating with a larger project named sandbox: + +---------- +shell$ cd sandbox +shell$ cp -r /somewhere/else/plpa- plpa +shell$ edit acinclude.m4 +...add the line "m4_include(plpa/config/plpa.m4)"... +shell$ edit Makefile.am +...add "plpa" to SUBDIRS... +...add "$(top_builddir)/plpa/src/libplpa/libplpa_included.la" to + my executable's LDADD line... +...add "-I$(top_builddir)/plpa/src/libplpa" to AM_CPPFLAGS +shell$ edit configure.ac +...add "PLPA_INCLUDED" line... +...add "PLPA_SET_SYMBOL_PREFIX(sandbox_plpa_)" line... +...add "PLPA_INIT([./plpa], [plpa_happy=yes], [plpa_happy=no])" line... +...add error checking for plpa_happy=no case... +shell$ edit src/my_program.c +...add #include ... +...add calls to sandbox_plpa_sched_setaffinity()... +shell$ aclocal +shell$ autoconf +shell$ libtoolize --automake +shell$ automake -a +shell$ ./configure +...lots of output... +shell$ make +...lots of output... +---------- + +=========================================================================== + +How can I tell if PLPA is working? +---------------------------------- + +Run plpa-info; if it says "Kernel affinity support: yes", then PLPA is +working properly. + +If you want to compile your own test program to verify it, try +compiling and running the following: + +--------------------------------------------------------------------------- +#include +#include + +int main(int argc, char* argv[]) { + plpa_api_type_t p; + if (0 == plpa_api_probe(&p) && PLPA_PROBE_OK == p) { + printf("All is good!\n"); + } else { + printf("Looks like PLPA is not working\n"); + } + return 0; +} +--------------------------------------------------------------------------- + +You may need to supply appropriate -I and -L arguments to the +compiler/linker, respectively, to tell it where to find the PLPA +header and library files. Also don't forget to supply -lplpa to link +in the PLPA library itself. For example, if you configured PLPA with: + +shell$ ./configure --prefix=$HOME/my-plpa-install + +Then you would compile the above program with: + +shell$ gcc my-plpa-test.c \ + -I$HOME/my-plpa-install/include \ + -L$HOME/my-plpa-install/lib -lplpa \ + -o my-plpa-test +shell$ ./my-plpa-test + +If it compiles, links, runs, and prints "All is good!", then all +should be well. + +=========================================================================== + +What license does PLPA use? +--------------------------- + +This package is distributed under the BSD license (see the LICENSE +file in the top-level directory of a PLPA distribution). The +copyrights of several institutions appear throughout the code base +because some of the code was directly derived from the Open MPI +project (http://www.open-mpi.org/), which is also distributed under +the BSD license. + +=========================================================================== + +How do I get involved in PLPA? +------------------------------ + +The PLPA continues to evolve, particularly as core counts increase and +internal host topology becomes more important. We want to hear your +opinions. + +The best way to report bugs, send comments, or ask questions is to +sign up on the user's mailing list: + + plpa-users@open-mpi.org + +Because of spam, only subscribers are allowed to post to this list +(ensure that you subscribe with and post from exactly the same e-mail +address -- joe@example.com is considered different than +joe@mycomputer.example.com!). Visit this page to subscribe to the +list: + + http://www.open-mpi.org/mailman/listinfo.cgi/plpa-users + +Thanks for your time. diff --git a/plpa-1.1/VERSION b/plpa-1.3.2/VERSION similarity index 69% rename from plpa-1.1/VERSION rename to plpa-1.3.2/VERSION index 4b49c930..9043c155 100644 --- a/plpa-1.1/VERSION +++ b/plpa-1.3.2/VERSION @@ -6,8 +6,8 @@ # ... If release is zero, then it is omitted. major=1 -minor=1 -release=0 +minor=3 +release=2 # greek is used for alpha or beta release tags. If it is non-empty, # it will be appended to the version number. It does not have to be @@ -33,4 +33,20 @@ want_svn=0 # distribution tarball is being made from an SVN checkout, the value # of svn_r in this file is replaced with the output of "svnversion". -svn_r=r147:149 +svn_r=r264 + +# The shared library version of PLPA's public library. This version +# is maintained in accordance with the "Library Interface Versions" +# chapter from the GNU Libtool documentation. PLPA v<=1.3 reported +# version 0:0:0; the next release after v1.3 will explicitly set its +# .so version numbers according to the rules in the Libtool +# documentation. Notes: + +# 1. Since version numbers are associated with *releases*, the version +# number maintained on the PLPA SVN trunk (and developer branches) is +# always 0:0:0. + +# 2. Version numbers are described in the Libtool current:revision:age +# format. + +libplpa_so_version=0:1:0 diff --git a/plpa-1.1/plpa.m4 b/plpa-1.3.2/plpa.m4 similarity index 51% rename from plpa-1.1/plpa.m4 rename to plpa-1.3.2/plpa.m4 index 7931b79d..0546c697 100644 --- a/plpa-1.1/plpa.m4 +++ b/plpa-1.3.2/plpa.m4 @@ -5,7 +5,9 @@ # Corporation. All rights reserved. # Copyright (c) 2004-2005 The Regents of the University of California. # All rights reserved. -# Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved. +# Copyright (c) 2004-2008 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2006-2009 Cisco Systems, Inc. All rights reserved. # $COPYRIGHT$ # # Additional copyrights may follow @@ -15,29 +17,53 @@ # Main PLPA m4 macro, to be invoked by the user # -# Expects two paramters: -# 1. What to do upon success -# 2. What to do upon failure +# Expects two or three paramters: +# 1. Configuration prefix (optional; if not specified, "." is assumed) +# 2. What to do upon success +# 3. What to do upon failure # AC_DEFUN([PLPA_INIT],[ + # If we used the 2 param variant of PLPA_INIT, then assume the + # config prefix is ".". Otherwise, it's $1. + m4_ifval([$3], + [_PLPA_INIT_COMPAT([$1], [$2], [$3])], + [AC_MSG_WARN([The 2-argument form of the PLPA INIT m4 macro is deprecated]) + AC_MSG_WARN([It was removed starting with PLPA v1.2]) + AC_MSG_ERROR([Cannot continue])]) +])dnl + +#----------------------------------------------------------------------- + +# Do the main work for PLPA_INIT +# +# Expects three paramters: +# 1. Configuration prefix +# 2. What to do upon success +# 3. What to do upon failure +# +AC_DEFUN([_PLPA_INIT_COMPAT],[ AC_REQUIRE([_PLPA_INTERNAL_SETUP]) AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AM_PROG_LEX]) + AC_REQUIRE([AC_PROG_YACC]) + + m4_define([plpa_config_prefix],[$1]) # Check for syscall() - AC_CHECK_FUNC([syscall], [happy=1], [happy=0]) + AC_CHECK_FUNC([syscall], [plpa_config_happy=1], [plpa_config_happy=0]) # Look for syscall.h - if test "$happy" = 1; then - AC_CHECK_HEADER([sys/syscall.h], [happy=1], [happy=0]) + if test "$plpa_config_happy" = 1; then + AC_CHECK_HEADER([sys/syscall.h], [plpa_config_happy=1], [plpa_config_happy=0]) fi # Look for unistd.h - if test "$happy" = 1; then - AC_CHECK_HEADER([unistd.h], [happy=1], [happy=0]) + if test "$plpa_config_happy" = 1; then + AC_CHECK_HEADER([unistd.h], [plpa_config_happy=1], [plpa_config_happy=0]) fi # Check for __NR_sched_setaffinity - if test "$happy" = 1; then + if test "$plpa_config_happy" = 1; then AC_MSG_CHECKING([for __NR_sched_setaffinity]) if test "$plpa_emulate" = "yes"; then AC_MSG_RESULT([emulated]) @@ -49,15 +75,15 @@ AC_DEFUN([PLPA_INIT],[ #endif int i = 1;], [AC_MSG_RESULT([yes]) - happy=1], + plpa_config_happy=1], [AC_MSG_RESULT([no]) - happy=0]) + plpa_config_happy=0]) fi fi # Check for __NR_sched_getaffinity (probably overkill, but what # the heck?) - if test "$happy" = 1; then + if test "$plpa_config_happy" = 1; then AC_MSG_CHECKING([for __NR_sched_getaffinity]) if test "$plpa_emulate" = "yes"; then AC_MSG_RESULT([emulated]) @@ -69,32 +95,32 @@ int i = 1;], #endif int i = 1;], [AC_MSG_RESULT([yes]) - happy=1], + plpa_config_happy=1], [AC_MSG_RESULT([no]) - happy=0]) + plpa_config_happy=0]) fi fi # If all was good, do the real init - AS_IF([test "$happy" = "1"], - [_PLPA_INIT($1, $2)], - [$2]) + AS_IF([test "$plpa_config_happy" = "1"], + [_PLPA_INIT($2, $3)], + [$3]) PLPA_DO_AM_CONDITIONALS AC_CONFIG_FILES( plpa_config_prefix[/Makefile] plpa_config_prefix[/src/Makefile] + plpa_config_prefix[/src/libplpa/Makefile] ) # Cleanup - unset happy + unset plpa_config_happy ])dnl #----------------------------------------------------------------------- # Build PLPA as a standalone package AC_DEFUN([PLPA_STANDALONE],[ - m4_define([plpa_config_prefix],[.]) AC_REQUIRE([_PLPA_INTERNAL_SETUP]) plpa_mode=standalone ])dnl @@ -103,7 +129,11 @@ AC_DEFUN([PLPA_STANDALONE],[ # Build PLPA as an included package AC_DEFUN([PLPA_INCLUDED],[ - m4_define([plpa_config_prefix],[$1]) + m4_ifval([$1], + [AC_MSG_WARN([The 1-argument form of the PLPA INCLUDED m4 macro is deprecated]) + AC_MSG_WARN([It was removed starting with PLPA v1.2]) + AC_MSG_ERROR([Cannot continue])]) + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) plpa_mode=included PLPA_DISABLE_EXECUTABLES @@ -137,6 +167,14 @@ AC_DEFUN([PLPA_DISABLE_EXECUTABLES],[ #----------------------------------------------------------------------- +# Disable building the executables +AC_DEFUN([PLPA_ENABLE_EXECUTABLES],[ + AC_REQUIRE([_PLPA_INTERNAL_SETUP]) + plpa_executables=yes +])dnl + +#----------------------------------------------------------------------- + # Specify the symbol prefix AC_DEFUN([PLPA_SET_SYMBOL_PREFIX],[ AC_REQUIRE([_PLPA_INTERNAL_SETUP]) @@ -148,26 +186,37 @@ AC_DEFUN([PLPA_SET_SYMBOL_PREFIX],[ # Internals AC_DEFUN([_PLPA_INTERNAL_SETUP],[ - AC_ARG_ENABLE([plpa_emulate], - AC_HELP_STRING([--enable-plpa-emulate], + AC_ARG_ENABLE([emulate], + AC_HELP_STRING([--enable-emulate], [Emulate __NR_sched_setaffinity and __NR_sched_getaffinity, to allow building on non-Linux systems (for testing)])) - if test "$enable_plpa_emulate" = "yes"; then + if test "$enable_emulate" = "yes"; then plpa_emulate=yes else plpa_emulate=no fi -dnl Hisham Muhammad: don't expose flags to htop's configure -dnl -dnl # Included mode, or standalone? -dnl AC_ARG_ENABLE([included-mode], -dnl AC_HELP_STRING([--enable-included-mode], -dnl [Using --enable-included-mode puts the PLPA into "included" mode. The default is --disable-included-mode, meaning that the PLPA is in "standalone" mode.])) -dnl if test "$enable_included_mode" = "yes"; then + # Build and install the executables or no? + AC_ARG_ENABLE([executables], + AC_HELP_STRING([--disable-executables], + [Using --disable-executables disables building and installing the PLPA executables])) + if test "$enable_executables" = "yes" -o "$enable_executables" = ""; then + plpa_executables=yes + else + plpa_executables=no + fi + + # Included mode, or standalone? + AC_ARG_ENABLE([included-mode], + AC_HELP_STRING([--enable-included-mode], + [Using --enable-included-mode puts the PLPA into "included" mode. The default is --disable-included-mode, meaning that the PLPA is in "standalone" mode.])) + if test "$enable_included_mode" = "yes"; then plpa_mode=included -dnl else -dnl plpa_mode=standalone -dnl fi + if test "$enable_executables" = ""; then + plpa_executables=no + fi + else + plpa_mode=standalone + fi dnl JMS: No fortran bindings yet dnl # Fortran bindings, or no? @@ -180,30 +229,30 @@ dnl else dnl plpa_fortran=no dnl fi -dnl Hisham Muhammad: don't expose flags to htop's configure -dnl -dnl # Build and install the executables or no? -dnl AC_ARG_ENABLE([executables], -dnl AC_HELP_STRING([--disable-executables], -dnl [Using --disable-executables disables building and installing the PLPA executables])) -dnl if test "$enable_executables" = "yes" -o "$enable_executables" = ""; then -dnl plpa_executables=yes -dnl else - plpa_executables=no -dnl fi - -dnl Hisham Muhammad: don't expose flags to htop's configure -dnl -dnl # Change the symbol prefix? -dnl AC_ARG_WITH([plpa-symbol-prefix], -dnl AC_HELP_STRING([--with-plpa-symbol-prefix=STRING], -dnl [STRING can be any valid C symbol name. It will be prefixed to all public PLPA symbols. Default: "plpa_"])) -dnl if test "$with_plpa_symbol_prefix" = ""; then + # Change the symbol prefix? + AC_ARG_WITH([plpa-symbol-prefix], + AC_HELP_STRING([--with-plpa-symbol-prefix=STRING], + [STRING can be any valid C symbol name. It will be prefixed to all public PLPA symbols. Default: "plpa_"])) + if test "$with_plpa_symbol_prefix" = ""; then plpa_symbol_prefix_value=plpa_ -dnl else -dnl plpa_symbol_prefix_value=$with_plpa_symbol_prefix -dnl fi + else + plpa_symbol_prefix_value=$with_plpa_symbol_prefix + fi + # Debug mode? + AC_ARG_ENABLE([debug], + AC_HELP_STRING([--enable-debug], + [Using --enable-debug enables various maintainer-level debugging controls. This option is not recomended for end users.])) + if test "$enable_debug" = "yes"; then + plpa_debug=1 + plpa_debug_msg="enabled" + elif test "$enable_debug" = "" -a -d .svn; then + plpa_debug=1 + plpa_debug_msg="enabled (SVN checkout default)" + else + plpa_debug=0 + plpa_debug_msg="disabled" + fi ])dnl #----------------------------------------------------------------------- @@ -216,6 +265,11 @@ AC_DEFUN([_PLPA_INIT],[ AC_MSG_CHECKING([for PLPA building mode]) AC_MSG_RESULT([$plpa_mode]) + # Debug mode? + AC_MSG_CHECKING([if want PLPA maintainer support]) + AC_DEFINE_UNQUOTED(PLPA_DEBUG, [$plpa_debug], [Whether we are in debugging more or not]) + AC_MSG_RESULT([$plpa_debug_msg]) + # We need to set a path for header, etc files depending on whether # we're standalone or included. this is taken care of by PLPA_INCLUDED. @@ -226,8 +280,8 @@ AC_DEFUN([_PLPA_INIT],[ # becomes the "main" config header file. Any AM_CONFIG_HEADERs # after that (plpa.h) will only have selective #defines replaced, # not the entire file. - AM_CONFIG_HEADER(plpa_config_prefix[/src/plpa_config.h]) - AM_CONFIG_HEADER(plpa_config_prefix[/src/plpa.h]) + AM_CONFIG_HEADER(plpa_config_prefix[/src/libplpa/plpa_config.h]) + AM_CONFIG_HEADER(plpa_config_prefix[/src/libplpa/plpa.h]) # What prefix are we using? AC_MSG_CHECKING([for PLPA symbol prefix]) @@ -240,6 +294,42 @@ AC_DEFUN([_PLPA_INIT],[ [The PLPA symbol prefix in all caps]) AC_MSG_RESULT([$plpa_symbol_prefix_value]) + # Build with valgrind support if we can find it, unless it was + # explicitly disabled + AC_ARG_WITH([valgrind], + [AC_HELP_STRING([--with-valgrind(=DIR)], + [Directory where the valgrind software is installed])]) + CPPFLAGS_save="$CPPFLAGS" + valgrind_happy=no + AS_IF([test "$with_valgrind" != "no"], + [AS_IF([test ! -z "$with_valgrind" -a "$with_valgrind" != "yes"], + [CPPFLAGS="$CPPFLAGS -I$with_valgrind/include"]) + AC_CHECK_HEADERS([valgrind/valgrind.h], + [AC_MSG_CHECKING([for VALGRIND_CHECK_MEM_IS_ADDRESSABLE]) + AC_LINK_IFELSE(AC_LANG_PROGRAM([[ +#include "valgrind/memcheck.h" +]], + [[char buffer = 0xff; + VALGRIND_CHECK_MEM_IS_ADDRESSABLE(&buffer, sizeof(buffer));]]), + [AC_MSG_RESULT([yes]) + valgrind_happy=yes], + [AC_MSG_RESULT([no]) + AC_MSG_WARN([Need Valgrind version 3.2.0 or later.])], + [AC_MSG_RESULT([cross-compiling; assume yes...?]) + AC_MSG_WARN([PLPA will fail to compile if you do not have Valgrind version 3.2.0 or later]) + valgrind_happy=yes]), + ], + [AC_MSG_WARN([valgrind.h not found])]) + AS_IF([test "$valgrind_happy" = "no" -a "x$with_valgrind" != "x"], + [AC_MSG_WARN([Valgrind support requested but not possible]) + AC_MSG_ERROR([Cannot continue])])]) + AS_IF([test "$valgrind_happy" = "no"], + [CPPFLAGS="$CPPFLAGS_save" + valgrind_define=0], + [valgrind_define=1]) + AC_DEFINE_UNQUOTED([PLPA_WANT_VALGRIND_SUPPORT], [$valgrind_define], + [Whether we want Valgrind support or not]) + dnl JMS: No fortran bindings yet dnl # Check for fortran dnl AC_MSG_CHECKING([whether to build PLPA Fortran API]) diff --git a/plpa-1.3.2/src/Makefile.am b/plpa-1.3.2/src/Makefile.am new file mode 100644 index 00000000..83c6f572 --- /dev/null +++ b/plpa-1.3.2/src/Makefile.am @@ -0,0 +1,15 @@ +# +# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana +# University Research and Technology +# Corporation. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +SUBDIRS = libplpa diff --git a/plpa-1.1/src/Makefile.am b/plpa-1.3.2/src/libplpa/Makefile.am similarity index 65% rename from plpa-1.1/src/Makefile.am rename to plpa-1.3.2/src/libplpa/Makefile.am index 8819d880..6b3d3c1f 100644 --- a/plpa-1.1/src/Makefile.am +++ b/plpa-1.3.2/src/libplpa/Makefile.am @@ -9,7 +9,7 @@ # University of Stuttgart. All rights reserved. # Copyright (c) 2004-2005 The Regents of the University of California. # All rights reserved. -# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved. +# Copyright (c) 2006-2009 Cisco Systems, Inc. All rights reserved. # $COPYRIGHT$ # # Additional copyrights may follow @@ -32,6 +32,7 @@ public_headers = plpa.h if PLPA_BUILD_STANDALONE lib_LTLIBRARIES += libplpa.la nodist_include_HEADERS += $(public_headers) +libplpa_la_LDFLAGS = -version-info $(libplpa_so_version) else noinst_LTLIBRARIES += libplpa_included.la nodist_noinst_HEADERS += $(public_headers) @@ -47,3 +48,20 @@ plpa_sources = \ libplpa_la_SOURCES = $(plpa_sources) libplpa_included_la_SOURCES = $(plpa_sources) + +# Add a hook to run *after* the header file has been installed out to +# the target location. It changes the pesky PACKAGE_* macros that +# autoconf automatically generates (and there is no way of turning +# off) into PLPA_PACKAGE_* in order to make safe to include +# with other files. + +if PLPA_BUILD_STANDALONE +install-data-hook: + sed -e 's/define PACKAGE/define PLPA_PACKAGE/' \ + $(DESTDIR)$(includedir)/plpa.h \ + > $(DESTDIR)$(includedir)/plpa.h.install + cp $(DESTDIR)$(includedir)/plpa.h.install \ + $(DESTDIR)$(includedir)/plpa.h + rm -f $(DESTDIR)$(includedir)/plpa.h.install + chmod 0644 $(DESTDIR)$(includedir)/plpa.h +endif diff --git a/plpa-1.1/src/plpa.h.in b/plpa-1.3.2/src/libplpa/plpa.h.in similarity index 63% rename from plpa-1.1/src/plpa.h.in rename to plpa-1.3.2/src/libplpa/plpa.h.in index c69e4ed7..6ee3e4ac 100644 --- a/plpa-1.1/src/plpa.h.in +++ b/plpa-1.3.2/src/libplpa/plpa.h.in @@ -32,6 +32,16 @@ * function with a different prefix than "plpa_" when the * --enable-included-mode and --with-plpa-symbol-prefix options are * supplied to PLPA's configure script. + * + * Note that this header file differentiates between a + * processor/socket/core ID and a processor/socket/core number. The + * "ID" is the integer that is used by Linux to identify that entity. + * These integers may or may not be contiguous. The "number" is a + * contiguous set of integers starting with 0 and going to (count-1), + * where (count) is the number of processors, sockets, and cores + * (where the count of cores is dependent upon the socket). Hence, + * "number" is a human convenience, and "ID" is the actual Linux + * identifier. */ #ifndef PLPA_H @@ -156,7 +166,8 @@ int PLPA_NAME(api_probe)(PLPA_NAME(api_type_t) *api_type); /* Set processor affinity. Use the PLPA_CPU_* macros to set the cpuset value. The same rules and restrictions about pid apply as - they do for the sched_setaffinity(2) system call. Returns 0 upon + they do for the sched_setaffinity(2) system call. Bits set in the + CPU mask correspond to Linux processor IDs. Returns 0 upon success. */ int PLPA_NAME(sched_setaffinity)(pid_t pid, size_t cpusetsize, const PLPA_NAME(cpu_set_t) *cpuset); @@ -164,6 +175,7 @@ int PLPA_NAME(sched_setaffinity)(pid_t pid, size_t cpusetsize, /* Get processor affinity. Use the PLPA_CPU_* macros to analyze the returned value of cpuset. The same rules and restrictions about pid apply as they do for the sched_getaffinity(2) system call. + Bits set in the CPU mask corresopnd to Linux processor IDs. Returns 0 upon success. */ int PLPA_NAME(sched_getaffinity)(pid_t pid, size_t cpusetsize, PLPA_NAME(cpu_set_t) *cpuset); @@ -173,34 +185,106 @@ int PLPA_NAME(sched_getaffinity)(pid_t pid, size_t cpusetsize, available if supported == 1 and the function returns 0. */ int PLPA_NAME(have_topology_information)(int *supported); -/* Map (socket,core) tuple to virtual processor ID. processor_id is +/* Map (socket_id,core_id) tuple to virtual processor ID. processor_id is then suitable for use with the PLPA_CPU_* macros, probably leading to a call to plpa_sched_setaffinity(). Returns 0 upon success. */ -int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id); +int PLPA_NAME(map_to_processor_id)(int socket_id, int core_id, + int *processor_id); -/* Map processor_id to (socket,core) tuple. The processor_id input is +/* Map processor_id to (socket_id,core_id) tuple. The processor_id input is usually obtained from the return from the plpa_sched_getaffinity() call, using PLPA_CPU_ISSET to find individual bits in the map that were set/unset. plpa_map_to_socket_core() can map the bit indexes to a socket/core tuple. Returns 0 upon success. */ -int PLPA_NAME(map_to_socket_core)(int processor_id, int *socket, int *core); +int PLPA_NAME(map_to_socket_core)(int processor_id, + int *socket_id, int *core_id); -/* Return the max processor ID. Returns both the number of processors - (cores) in a system and the maximum Linux virtual processor ID - (because it may be higher than the number of processors if there - are "holes" in the available Linux virtual processor IDs). Returns - 0 upon success. */ +/* This function is deprecated and will disappear in a future release. + It is exactly equivalent to calling + plpa_get_processor_data(PLPA_COUNT_ALL, num_processors, + max_processor_id). */ int PLPA_NAME(get_processor_info)(int *num_processors, int *max_processor_id); +/* Typedefs for specifying which processors / sockets / cores to count + in get_processor_data() and get_processor_id() */ +typedef enum { + /* Only count online processors */ + PLPA_NAME_CAPS(COUNT_ONLINE), + /* Only count offline processors */ + PLPA_NAME_CAPS(COUNT_OFFLINE), + /* Count all processors (online and offline) */ + PLPA_NAME_CAPS(COUNT_ALL) +} PLPA_NAME(count_specification_t); + +/* Returns both the number of processors in a system and the maximum + Linux virtual processor ID (because it may be higher than the + number of processors if there are "holes" in the available Linux + virtual processor IDs). The count_spec argument specifies whether + to count all processors, only online processors, or only offline + processors. Returns 0 upon success. */ +int PLPA_NAME(get_processor_data)(PLPA_NAME(count_specification_t) count_spec, + int *num_processors, int *max_processor_id); + +/* Returns the Linux processor ID for the Nth processor. For example, + if the Linux processor IDs have "holes", use this function to say + "give me the Linux processor ID of the 4th processor." count_spec + specifies whether to count online, offline, or all processors when + looking for the processor_num'th processor. Returns 0 upon + success. */ +int PLPA_NAME(get_processor_id)(int processor_num, + PLPA_NAME(count_specification_t) count_spec, + int *processor_id); + +/* Check to see if a given Linux processor ID exists / is online. + Returns 0 on success. */ +int PLPA_NAME(get_processor_flags)(int processor_id, int *exists, int *online); + /* Returns both the number of sockets in the system and the maximum socket ID number (in case there are "holes" in the list of available socket IDs). Returns 0 upon sucess. */ int PLPA_NAME(get_socket_info)(int *num_sockets, int *max_socket_id); +/* Returns the Linux socket ID for the Nth socket. For example, if + the socket IDs have "holes", use this function to say "give me the + Linux socket ID of the 2nd socket." Linux does not specify the + socket/core tuple information for offline processors, so a + plpa_count_specification_t parameter is not used here. Returns 0 + upon success. */ +int PLPA_NAME(get_socket_id)(int socket_num, int *socket_id); + /* Return both the number of cores and the max code ID for a given socket (in case there are "holes" in the list of available core IDs). Returns 0 upon success. */ -int PLPA_NAME(get_core_info)(int socket, int *num_cores, int *max_core_id); +int PLPA_NAME(get_core_info)(int socket_id, int *num_cores, int *max_core_id); + +/* Given a specific socket, returns the Linux core ID for the Nth + core. For example, if the core IDs have "holes", use this function + to say "give me the Linux core ID of the 4th core on socket ID 7." + Linux does not specify the socket/core tuple information for + offline processors, so a plpa_count_specification_t parameter is + not used here. Returns 0 upon success. Returns 0 upon success. */ +int PLPA_NAME(get_core_id)(int socket_id, int core_num, int *core_id); + +/* Check to see if a given Linux (socket_id,core_id) tuple exists / is + online. Returns 0 on success. */ +int PLPA_NAME(get_core_flags)(int socket_id, int core_id, + int *exists, int *online); + +/* Typedefs for specifying the cache behavior via + plpa_set_cache_behavior() */ +typedef enum { + /* Use the cache (default behavior); fills the cache right now if + it's not already full */ + PLPA_NAME_CAPS(CACHE_USE), + /* Never use the cache; always look up the information in + the kernel */ + PLPA_NAME_CAPS(CACHE_IGNORE), + /* Refresh the cache right now */ + PLPA_NAME_CAPS(CACHE_REFRESH) +} PLPA_NAME(cache_behavior_t); + +/* Set PLPA's cache behavior. Returns 0 upon success. */ +int PLPA_NAME(set_cache_behavior)(PLPA_NAME(cache_behavior_t)); /* Shut down PLPA. This function releases resources used by the PLPA. It should be the last PLPA function invoked, or can be used to diff --git a/plpa-1.1/src/plpa_api_probe.c b/plpa-1.3.2/src/libplpa/plpa_api_probe.c similarity index 77% rename from plpa-1.1/src/plpa_api_probe.c rename to plpa-1.3.2/src/libplpa/plpa_api_probe.c index 5dc0c383..5f059c32 100644 --- a/plpa-1.1/src/plpa_api_probe.c +++ b/plpa-1.3.2/src/libplpa/plpa_api_probe.c @@ -20,6 +20,10 @@ #include #include +#if PLPA_WANT_VALGRIND_SUPPORT +#include "valgrind/memcheck.h" +#endif + /* Cache, just to make things a little more efficient */ static PLPA_NAME(api_type_t) cache = PLPA_NAME_CAPS(PROBE_UNSET); @@ -40,7 +44,20 @@ int PLPA_NAME(api_probe_init)(void) size_t tmp = (0 != rc) ? ((size_t) rc) : len; /* Pass mask=NULL, expect errno==EFAULT if tmp was OK as a length */ +#if PLPA_WANT_VALGRIND_SUPPORT + /* Lie to Valgrind and say that this memory is addressible + so that we don't get a false positive here -- we *know* + that 0 is unaddressible; that's the whole point of this + test (to see what error NR_sched_set_affinity will + return). So let's not see a warning from Valgrind from + something that we know is wrong. :-) */ + VALGRIND_MAKE_MEM_DEFINED(0, len); +#endif rc = syscall(__NR_sched_setaffinity, 0, tmp, NULL); +#if PLPA_WANT_VALGRIND_SUPPORT + VALGRIND_MAKE_MEM_UNDEFINED(0, len); + VALGRIND_MAKE_MEM_NOACCESS(0, len); +#endif if ((rc < 0) && (errno == EFAULT)) { cache = PLPA_NAME_CAPS(PROBE_OK); PLPA_NAME(len) = tmp; diff --git a/plpa-1.1/src/plpa_config.h.in b/plpa-1.3.2/src/libplpa/plpa_config.h.in similarity index 92% rename from plpa-1.1/src/plpa_config.h.in rename to plpa-1.3.2/src/libplpa/plpa_config.h.in index 5efd5936..f67020e7 100644 --- a/plpa-1.1/src/plpa_config.h.in +++ b/plpa-1.3.2/src/libplpa/plpa_config.h.in @@ -48,6 +48,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define to 1 if you have the header file. */ +#undef HAVE_VALGRIND_VALGRIND_H + /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR @@ -70,7 +73,7 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* Whether we're in debugging mode or not */ +/* Whether we are in debugging more or not */ #undef PLPA_DEBUG /* Major version of PLPA */ @@ -88,6 +91,9 @@ /* The PLPA symbol prefix in all caps */ #undef PLPA_SYM_PREFIX_CAPS +/* Whether we want Valgrind support or not */ +#undef PLPA_WANT_VALGRIND_SUPPORT + /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS diff --git a/plpa-1.1/src/plpa_dispatch.c b/plpa-1.3.2/src/libplpa/plpa_dispatch.c similarity index 96% rename from plpa-1.1/src/plpa_dispatch.c rename to plpa-1.3.2/src/libplpa/plpa_dispatch.c index 45e35add..13dc8208 100644 --- a/plpa-1.1/src/plpa_dispatch.c +++ b/plpa-1.3.2/src/libplpa/plpa_dispatch.c @@ -106,11 +106,7 @@ int PLPA_NAME(sched_setaffinity)(pid_t pid, size_t cpusetsize, /* Return 0 upon success. According to http://www.open-mpi.org/community/lists/plpa-users/2006/02/0016.php, all the kernel implementations return >= 0 upon success. */ - if (ret >= 0) { - return 0; - } else { - return ret; - } + return (ret >= 0) ? 0 : ret; break; case PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED): @@ -180,11 +176,7 @@ int PLPA_NAME(sched_getaffinity)(pid_t pid, size_t cpusetsize, /* Return 0 upon success. According to http://www.open-mpi.org/community/lists/plpa-users/2006/02/0016.php, all the kernel implementations return >= 0 upon success. */ - if (ret >= 0) { - return 0; - } else { - return ret; - } + return (ret >= 0) ? 0 : ret; break; case PLPA_NAME_CAPS(PROBE_NOT_SUPPORTED): diff --git a/plpa-1.1/src/plpa_internal.h b/plpa-1.3.2/src/libplpa/plpa_internal.h similarity index 76% rename from plpa-1.1/src/plpa_internal.h rename to plpa-1.3.2/src/libplpa/plpa_internal.h index 14ef2ccb..1c22a2ae 100644 --- a/plpa-1.1/src/plpa_internal.h +++ b/plpa-1.3.2/src/libplpa/plpa_internal.h @@ -4,7 +4,7 @@ * All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -23,14 +23,8 @@ extern int PLPA_NAME(initialized); /* Cached size of the affinity buffers that the kernel expects */ extern size_t PLPA_NAME(len); -/* Setup topology information */ -int PLPA_NAME(map_init)(void); - /* Setup API type */ int PLPA_NAME(api_probe_init)(void); -/* Free all mapping memory */ -void PLPA_NAME(map_finalize)(void); - #endif /* PLPA_INTERNAL_H */ diff --git a/plpa-1.3.2/src/libplpa/plpa_map.c b/plpa-1.3.2/src/libplpa/plpa_map.c new file mode 100644 index 00000000..89e107f9 --- /dev/null +++ b/plpa-1.3.2/src/libplpa/plpa_map.c @@ -0,0 +1,1060 @@ +/* + * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. + * + * Portions of this file originally contributed by Advanced Micro + * Devices, Inc. See notice below. + */ +/* ============================================================ + License Agreement + + Copyright (c) 2006, 2007 Advanced Micro Devices, Inc. + All rights reserved. + + Redistribution and use in any form of this material and any product + thereof including software in source or binary forms, along with any + related documentation, with or without modification ("this material"), + is permitted provided that the following conditions are met: + + + Redistributions of source code of any software must retain the above + copyright notice and all terms of this license as part of the code. + + + Redistributions in binary form of any software must reproduce the + above copyright notice and all terms of this license in any related + documentation and/or other materials. + + + Neither the names nor trademarks of Advanced Micro Devices, Inc. or + any copyright holders or contributors may be used to endorse or + promote products derived from this material without specific prior + written permission. + + + Notice about U.S. Government restricted rights: This material is + provided with "RESTRICTED RIGHTS." Use, duplication or disclosure by + the U.S. Government is subject to the full extent of restrictions set + forth in FAR52.227 and DFARS252.227 et seq., or any successor or + applicable regulations. Use of this material by the U.S. Government + constitutes acknowledgment of the proprietary rights of Advanced Micro + Devices, Inc. + and any copyright holders and contributors. + + + ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE + REVOCATION OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL. + + THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY + COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION + AND WITHOUT ANY REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR + IN ANY WAY RELATED TO SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED + OPERATION, OR THAT IT IS FREE FROM DEFECTS OR VIRUSES. ALL + OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER EXPRESS, IMPLIED, OR + STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF + TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, + COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT. IN + NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, REVENUE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED OR BASED ON ANY THEORY OF LIABILITY ARISING IN ANY WAY RELATED + TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES, INC. AND + ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS + (US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL + ACCEPTS THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO + DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND + ALL LIABILITIES, OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN + DOLLARS (US $10.00). THE FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE + AND, IF ANY OF THESE TERMS ARE CONSTRUED AS UNENFORCEABLE, FAIL IN + ESSENTIAL PURPOSE, OR BECOME VOID OR DETRIMENTAL TO ADVANCED MICRO + DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR CONTRIBUTORS FOR ANY REASON, + THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL SHALL + TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL SURVIVE ANY + EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR ACCESS + OR USE RELATED TO THIS MATERIAL. + + NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING + THIS MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE + SUBJECT TO RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED + STATES OR OTHER COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. + EXPORT CONTROL LAWS SUCH AS THE EXPORT ADMINISTRATION REGULATIONS AND + NATIONAL SECURITY CONTROLS AS DEFINED THEREUNDER, AS WELL AS STATE + DEPARTMENT CONTROLS UNDER THE U.S. MUNITIONS LIST. THIS MATERIAL MAY + NOT BE USED, RELEASED, TRANSFERRED, IMPORTED, EXPORTED AND/OR RE- + EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS, INCLUDING + U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS, + COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY + CONTROLS. + MOREOVER, + THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY + LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL. + + This license forms the entire agreement regarding the subject matter + hereof and supersedes all proposals and prior discussions and writings + between the parties with respect thereto. This license does not affect + any ownership, rights, title, or interest in, or relating to, this + material. No terms of this license can be modified or waived, and no + breach of this license can be excused, unless done so in a writing + signed by all affected parties. Each term of this license is + separately enforceable. If any term of this license is determined to + be or becomes unenforceable or illegal, such term shall be reformed to + the minimum extent necessary in order for this license to remain in + effect in accordance with its terms as modified by such reformation. + This license shall be governed by and construed in accordance with the + laws of the State of Texas without regard to rules on conflicts of law + of any state or jurisdiction or the United Nations Convention on the + International Sale of Goods. All disputes arising out of this license + shall be subject to the jurisdiction of the federal and state courts + in Austin, Texas, and all defenses are hereby waived concerning + personal jurisdiction and venue of these courts. + ============================================================ */ + +#include "plpa_config.h" +#include "plpa.h" +#include "plpa_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct tuple_t_ { + int processor_id, socket_id, core_id, online; +} tuple_t; + +static const char *sysfs_mount = "/sys"; +static int supported = 0; +static int num_processors = -1; +static int max_processor_id = -1; +static int num_sockets = -1; +static int max_socket_id = -1; +static int *max_core_id = NULL; +static int *num_cores = NULL; +static int max_core_id_overall = -1; +static tuple_t *map_processor_id_to_tuple = NULL; +static tuple_t **map_tuple_to_processor_id = NULL; +static PLPA_NAME(cache_behavior_t) cache_behavior = PLPA_NAME_CAPS(CACHE_IGNORE); + +static void clear_cache(void) +{ + if (NULL != max_core_id) { + free(max_core_id); + max_core_id = NULL; + } + if (NULL != num_cores) { + free(num_cores); + num_cores = NULL; + } + if (NULL != map_processor_id_to_tuple) { + free(map_processor_id_to_tuple); + map_processor_id_to_tuple = NULL; + } + if (NULL != map_tuple_to_processor_id) { + free(map_tuple_to_processor_id); + map_tuple_to_processor_id = NULL; + } + + num_processors = max_processor_id = -1; + num_sockets = max_socket_id = -1; + max_core_id_overall = -1; +} + +static void load_cache(void) +{ + int i, j, k, invalid_entry, fd, found_online; + char path[PATH_MAX], buf[8]; + PLPA_NAME(cpu_set_t) valid_processors; + PLPA_NAME(cpu_set_t) *cores_on_sockets; + int found; + DIR *dir; + struct dirent dentry, *dentryp = NULL; + +#if PLPA_DEBUG + char *temp = getenv("PLPA_SYSFS_MOUNT"); + if (temp) { + sysfs_mount = temp; + } +#endif + + /* Check for the parent directory */ + sprintf(path, "%s/devices/system/cpu", sysfs_mount); + if (access(path, R_OK|X_OK)) { + return; + } + + dir = opendir(path); + if (NULL == dir) { + return; + } + + /* Catch all entries of format "cpu%d", count them and maintain + max_processor_id */ + num_processors = 0; + PLPA_CPU_ZERO(&valid_processors); + do { + int ret = readdir_r(dir, &dentry, &dentryp); + if (0 != ret) { + closedir(dir); + clear_cache(); + return; + } + + if (dentryp) { + int cpuid; + + ret = sscanf(dentryp->d_name, "cpu%d", &cpuid); + if (1 == ret) { + ++num_processors; + if (cpuid >= PLPA_BITMASK_CPU_MAX) { + closedir(dir); + clear_cache(); + return; + } else if (cpuid > max_processor_id) { + max_processor_id = cpuid; + } + PLPA_CPU_SET(cpuid, &valid_processors); + } + } + } while (NULL != dentryp); + closedir(dir); + + /* If we found no processors, then we have no topology info */ + if (0 == num_processors) { + clear_cache(); + return; + } + + /* Malloc space for the first map (processor ID -> tuple). + Include enough space for one invalid entry. */ + map_processor_id_to_tuple = malloc(sizeof(tuple_t) * + (max_processor_id + 2)); + if (NULL == map_processor_id_to_tuple) { + clear_cache(); + return; + } + for (i = 0; i <= max_processor_id; ++i) { + if (PLPA_CPU_ISSET(i, &valid_processors)) { + map_processor_id_to_tuple[i].processor_id = i; + } else { + map_processor_id_to_tuple[i].processor_id = -1; + } + map_processor_id_to_tuple[i].socket_id = -1; + map_processor_id_to_tuple[i].core_id = -1; + } + /* Set the invalid entry */ + invalid_entry = i; + map_processor_id_to_tuple[invalid_entry].processor_id = -1; + map_processor_id_to_tuple[invalid_entry].socket_id = -1; + map_processor_id_to_tuple[invalid_entry].core_id = -1; + + /* Build a cached map of (socket,core) tuples */ + for (found = 0, i = 0; i <= max_processor_id; ++i) { + + /* Check for invalid processor ID */ + if (map_processor_id_to_tuple[i].processor_id < 0) { + continue; + } + + /* Read the "online" state for this processor. If the online + file is not there, then the kernel likely doesn't have + hotplug support so just assume that it's online. Some notes: + + - the perms on the "online" file are root/600, so only root + will see this info + - if online is 0, then all the topology files disappear (!) + -- so PLPA needs to compensate for that + */ + found_online = 0; + sprintf(path, "%s/devices/system/cpu/cpu%d/online", + sysfs_mount, i); + fd = open(path, O_RDONLY); + memset(buf, 0, sizeof(buf)); + if (fd >= 0 && read(fd, buf, sizeof(buf) - 1) > 0) { + found_online = 1; + sscanf(buf, "%d", &(map_processor_id_to_tuple[i].online)); + } else { + map_processor_id_to_tuple[i].online = 1; + } + if (fd >= 0) { + close(fd); + } + + /* Core ID */ + sprintf(path, "%s/devices/system/cpu/cpu%d/topology/core_id", + sysfs_mount, i); + fd = open(path, O_RDONLY); + if (fd >= 0) { + memset(buf, 0, sizeof(buf)); + if (read(fd, buf, sizeof(buf) - 1) > 0) { + sscanf(buf, "%d", &(map_processor_id_to_tuple[i].core_id)); + } else { + map_processor_id_to_tuple[i].core_id = -1; + } + close(fd); + } + /* Special case: we didn't find the core_id file, but we *did* + find the online file and the processor is offline -- then + just mark the core ID as "unknown" and keep going (because + if a processor is offline, the core_id file won't exist -- + grumble) */ + else if (found_online && 0 == map_processor_id_to_tuple[i].online) { + map_processor_id_to_tuple[i].core_id = -1; + } + + /* Socket ID */ + sprintf(path, + "%s/devices/system/cpu/cpu%d/topology/physical_package_id", + sysfs_mount, i); + fd = open(path, O_RDONLY); + if (fd >= 0) { + memset(buf, 0, sizeof(buf)); + if (read(fd, buf, sizeof(buf) - 1) > 0) { + sscanf(buf, "%d", &(map_processor_id_to_tuple[i].socket_id)); + } + close(fd); + found = 1; + } + /* Special case: we didn't find the socket_id file, but we + *did* find the online file and the processor is offline -- + then just mark the socket ID as "unknown" and keep going + (because if a processor is offline, the socket_id file won't + exist -- grumble) */ + else if (found_online && 0 == map_processor_id_to_tuple[i].online) { + map_processor_id_to_tuple[i].socket_id = -1; + } + + /* Keep a running tab on the max socket number */ + if (map_processor_id_to_tuple[i].socket_id > max_socket_id) { + max_socket_id = map_processor_id_to_tuple[i].socket_id; + } + } + + /* If we didn't find any core_id/physical_package_id's, then we + don't have the topology info */ + if (!found) { + clear_cache(); + return; + } + + /* Now that we know the max number of sockets, allocate some + arrays */ + max_core_id = malloc(sizeof(int) * (max_socket_id + 1)); + if (NULL == max_core_id) { + clear_cache(); + return; + } + num_cores = malloc(sizeof(int) * (max_socket_id + 1)); + if (NULL == num_cores) { + clear_cache(); + return; + } + for (i = 0; i <= max_socket_id; ++i) { + num_cores[i] = -1; + max_core_id[i] = -1; + } + + /* Find the max core number on each socket */ + for (i = 0; i <= max_processor_id; ++i) { + if (map_processor_id_to_tuple[i].processor_id < 0 || + map_processor_id_to_tuple[i].socket_id < 0) { + continue; + } + if (map_processor_id_to_tuple[i].core_id > + max_core_id[map_processor_id_to_tuple[i].socket_id]) { + max_core_id[map_processor_id_to_tuple[i].socket_id] = + map_processor_id_to_tuple[i].core_id; + } + if (max_core_id[map_processor_id_to_tuple[i].socket_id] > + max_core_id_overall) { + max_core_id_overall = + max_core_id[map_processor_id_to_tuple[i].socket_id]; + } + } + + /* Go through and count the number of unique sockets found. It + may not be the same as max_socket_id because there may be + "holes" -- e.g., sockets 0 and 3 are used, but sockets 1 and 2 + are empty. */ + for (j = i = 0; i <= max_socket_id; ++i) { + if (max_core_id[i] >= 0) { + ++j; + } + } + if (j > 0) { + num_sockets = j; + } + + /* Count how many cores are available on each socket. This may + not be the same as max_core_id[socket_num] if there are + "holes". I don't know if holes can happen (i.e., if specific + cores can be taken offline), but what the heck... */ + cores_on_sockets = malloc(sizeof(PLPA_NAME(cpu_set_t)) * + (max_socket_id + 1)); + if (NULL == cores_on_sockets) { + clear_cache(); + return; + } + for (i = 0; i <= max_socket_id; ++i) { + PLPA_CPU_ZERO(&(cores_on_sockets[i])); + } + for (i = 0; i <= max_processor_id; ++i) { + if (map_processor_id_to_tuple[i].socket_id >= 0) { + PLPA_CPU_SET(map_processor_id_to_tuple[i].core_id, + &(cores_on_sockets[map_processor_id_to_tuple[i].socket_id])); + } + } + for (i = 0; i <= max_socket_id; ++i) { + int count = 0; + for (j = 0; j <= max_core_id[i]; ++j) { + if (PLPA_CPU_ISSET(j, &(cores_on_sockets[i]))) { + ++count; + } + } + if (count > 0) { + num_cores[i] = count; + } + } + free(cores_on_sockets); + + /* Now go through and build the map in the other direction: + (socket,core) => processor_id. This map simply points to + entries in the other map (i.e., it's by reference instead of by + value). */ + map_tuple_to_processor_id = malloc(sizeof(tuple_t *) * + ((max_socket_id + 1) * + (max_core_id_overall + 1))); + if (NULL == map_tuple_to_processor_id) { + clear_cache(); + return; + } + /* Compute map */ + for (i = 0; i <= max_socket_id; ++i) { + for (j = 0; j <= max_core_id_overall; ++j) { + tuple_t **tuple_ptr = &map_tuple_to_processor_id[ + i * (max_core_id_overall + 1) + j]; + + /* Default to the invalid entry in the other map, meaning + that this (socket,core) combination doesn't exist + (e.g., the core number does not exist in this socket, + although it does exist in other sockets). */ + *tuple_ptr = &map_processor_id_to_tuple[invalid_entry]; + + /* See if this (socket,core) tuple exists in the other + map. If so, set this entry to point to it (overriding + the invalid entry default). */ + for (k = 0; k <= max_processor_id; ++k) { + if (map_processor_id_to_tuple[k].socket_id == i && + map_processor_id_to_tuple[k].core_id == j) { + *tuple_ptr = &map_processor_id_to_tuple[k]; +#if defined(PLPA_DEBUG) && PLPA_DEBUG + printf("Creating map [%d]: (socket %d, core %d) -> ID %d\n", + i * (max_core_id_overall + 1) + j, + i, j, k); +#endif + break; + } + } + } + } + + supported = 1; +} + +static int cache_action(void) +{ + switch (cache_behavior) { + case PLPA_NAME_CAPS(CACHE_USE): + if (NULL == map_processor_id_to_tuple) { + load_cache(); + } + break; + + case PLPA_NAME_CAPS(CACHE_IGNORE): + clear_cache(); + load_cache(); + break; + + default: + return EINVAL; + } + + return 0; +} + +/* Return whether this kernel supports topology information or not */ +int PLPA_NAME(have_topology_information)(int *supported_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* Check for bozo arguments */ + if (NULL == supported_arg) { + return EINVAL; + } + + *supported_arg = supported; + return 0; +} + +int PLPA_NAME(map_to_processor_id)(int socket_id, int core_id, + int *processor_id) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == processor_id) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for some invalid entries */ + if (socket_id < 0 || socket_id > max_socket_id || + core_id < 0 || core_id > max_core_id[socket_id]) { + return ENOENT; + } + /* If the mapping returns -1, then this is a non-existent + socket/core combo (even though they fall within the max socket + / max core overall values) */ + ret = map_tuple_to_processor_id[socket_id * (max_core_id_overall + 1) + + core_id]->processor_id; + if (-1 == ret) { + return ENOENT; + } + + /* Ok, all should be good -- return the mapping */ + *processor_id = ret; + return 0; +} + +int PLPA_NAME(map_to_socket_core)(int processor_id, + int *socket_id, int *core_id) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == socket_id || NULL == core_id) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for some invalid entries */ + if (processor_id < 0 || processor_id > max_processor_id || + map_processor_id_to_tuple[processor_id].processor_id < 0) { + return ENOENT; + } + ret = map_processor_id_to_tuple[processor_id].socket_id; + if (-1 == ret) { + return ENOENT; + } + + /* Ok, all should be good -- return the mapping */ + *socket_id = ret; + *core_id = map_processor_id_to_tuple[processor_id].core_id; + return 0; +} + +/* Deprecated function */ +int PLPA_NAME(get_processor_info)(int *num_processors_arg, + int *max_processor_id_arg) +{ + return PLPA_NAME(get_processor_data)(PLPA_NAME_CAPS(COUNT_ALL), + num_processors_arg, + max_processor_id_arg); +} + +int PLPA_NAME(get_processor_data)(PLPA_NAME(count_specification_t) count_spec, + int *num_processors_arg, + int *max_processor_id_arg) +{ + int i, ret; + bool match; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for bozo arguments */ + if (NULL == max_processor_id_arg || NULL == num_processors_arg) { + return EINVAL; + } + + /* If we wanted all processors, we're done */ + if (PLPA_NAME_CAPS(COUNT_ALL) == count_spec) { + *num_processors_arg = num_processors; + *max_processor_id_arg = max_processor_id; + } else { + /* Otherwise, count the appropriate type */ + *num_processors_arg = 0; + *max_processor_id_arg = 0; + for (i = 0; i <= max_processor_id; ++i) { + if (map_processor_id_to_tuple[i].processor_id >= 0) { + match = false; + switch (count_spec) { + case PLPA_NAME_CAPS(COUNT_ONLINE): + if (map_processor_id_to_tuple[i].online) { + match = true; + } + break; + + case PLPA_NAME_CAPS(COUNT_OFFLINE): + if (!map_processor_id_to_tuple[i].online) { + match = true; + } + break; + default: + /* Just so that compilers don't complain */ + break; + } + if (match) { + ++(*num_processors_arg); + if (*max_processor_id_arg < + map_processor_id_to_tuple[i].processor_id) { + *max_processor_id_arg = + map_processor_id_to_tuple[i].processor_id; + } + } + } + } + } + return 0; +} + +/* Returns the Linux processor ID for the Nth processor (starting with + 0). */ +int PLPA_NAME(get_processor_id)(int processor_num, + PLPA_NAME(count_specification_t) count_spec, + int *processor_id) +{ + int ret, i, count; + bool match; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == processor_id) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for out of range params */ + if (processor_num < 0 || processor_num > num_processors) { + return EINVAL; + } + + /* Find the processor_num'th processor */ + for (count = i = 0; i <= max_processor_id; ++i) { + if (map_processor_id_to_tuple[i].processor_id >= 0) { + match = false; + switch (count_spec) { + case PLPA_NAME_CAPS(COUNT_ONLINE): + if (map_processor_id_to_tuple[i].online) { + match = true; + } + break; + + case PLPA_NAME_CAPS(COUNT_OFFLINE): + if (!map_processor_id_to_tuple[i].online) { + match = true; + } + break; + + case PLPA_NAME_CAPS(COUNT_ALL): + match = true; + break; + } + if (match) { + if (count++ == processor_num) { + *processor_id = map_processor_id_to_tuple[i].processor_id; + return 0; + } + } + } + } + + /* Didn't find it */ + return ENODEV; +} + +/* Check to see if a given Linux processor ID exists / is online. + Returns 0 on success. */ +int PLPA_NAME(get_processor_flags)(int processor_id, + int *exists_arg, int *online_arg) +{ + int ret, exists, online; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == exists_arg && NULL == online_arg) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for out of range params */ + if (processor_id < 0 || processor_id > max_processor_id) { + return EINVAL; + } + + exists = online = 0; + if (processor_id == map_processor_id_to_tuple[processor_id].processor_id) { + exists = 1; + if (map_processor_id_to_tuple[processor_id].online) { + online = 1; + } + } + if (NULL != exists_arg) { + *exists_arg = exists; + } + if (NULL != online_arg) { + *online_arg = online; + } + + return 0; +} + +/* Return the max socket number */ +int PLPA_NAME(get_socket_info)(int *num_sockets_arg, int *max_socket_id_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for bozo arguments */ + if (NULL == max_socket_id_arg || NULL == num_sockets_arg) { + return EINVAL; + } + + /* All done */ + *num_sockets_arg = num_sockets; + *max_socket_id_arg = max_socket_id; + return 0; +} + +/* Returns the Linux socket ID for the Nth socket (starting with 0). */ +int PLPA_NAME(get_socket_id)(int socket_num, int *socket_id) +{ + int ret, i, j, k, count; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == socket_id) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for out of range params */ + if (socket_num < 0 || socket_num > num_sockets) { + return EINVAL; + } + + /* Find the socket_num'th socket */ + for (count = i = 0; i <= max_socket_id; ++i) { + /* See if any core in this socket is active. If so, count + this socket */ + for (j = 0; j <= max_core_id_overall; ++j) { + k = i * (max_core_id_overall + 1) + j; + if (map_tuple_to_processor_id[k]->processor_id >= 0) { + if (count++ == socket_num) { + *socket_id = map_tuple_to_processor_id[k]->socket_id; + return 0; + } + /* Ok, we found one -- skip to the end of this socket */ + j = max_core_id_overall + 1; + } + } + } + + /* Didn't find it */ + return ENODEV; +} + +/* Return the number of cores in a socket and the max core ID number */ +int PLPA_NAME(get_core_info)(int socket_id, int *num_cores_arg, + int *max_core_id_arg) +{ + int ret; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == max_core_id_arg || NULL == num_cores_arg) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for some invalid entries */ + if (socket_id < 0 || socket_id > max_socket_id || + -1 == max_core_id[socket_id]) { + return ENOENT; + } + ret = num_cores[socket_id]; + if (-1 == ret) { + return ENOENT; + } + + /* All done */ + *num_cores_arg = ret; + *max_core_id_arg = max_core_id[socket_id]; + return 0; +} + +/* Given a specific socket, returns the Linux core ID for the Nth core + (starting with 0) */ +int PLPA_NAME(get_core_id)(int socket_id, int core_num, int *core_id) +{ + int ret, i, j, count; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == core_id) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for out of range params */ + if (socket_id < 0 || socket_id > max_socket_id || + core_num < 0 || core_num > max_core_id_overall) { + return EINVAL; + } + + /* Find the core_num'th core */ + for (count = i = 0, j = socket_id * (max_core_id_overall + 1); + i <= max_core_id_overall; ++i) { + if (map_tuple_to_processor_id[j + i]->processor_id >= 0) { + if (count++ == core_num) { + *core_id = map_tuple_to_processor_id[j + i]->core_id; + return 0; + } + } + } + + /* Didn't find it */ + return ENODEV; +} + +/* Check to see if a given Linux (socket_id,core_id) tuple exists / is + online. Returns 0 on success. */ +int PLPA_NAME(get_core_flags)(int socket_id, int core_id, + int *exists_arg, int *online_arg) +{ + int ret, i, exists, online; + + /* Initialize if not already done so */ + if (!PLPA_NAME(initialized)) { + if (0 != (ret = PLPA_NAME(init)())) { + return ret; + } + } + + /* If this system doesn't support mapping, sorry Charlie */ + if (!supported) { + return ENOSYS; + } + + /* Check for bozo arguments */ + if (NULL == exists_arg && NULL == online_arg) { + return EINVAL; + } + + /* Check cache behavior */ + if (0 != (ret = cache_action())) { + return ret; + } + + /* Check for out of range params */ + if (socket_id < 0 || socket_id > max_socket_id || + core_id < 0 || core_id > max_core_id_overall) { + return EINVAL; + } + + exists = online = 0; + i = socket_id * (max_core_id_overall + 1) + core_id; + if (map_tuple_to_processor_id[i]->processor_id >= 0) { + exists = 1; + if (map_tuple_to_processor_id[i]->online) { + online = 1; + } + } + + if (NULL != exists_arg) { + *exists_arg = exists; + } + if (NULL != online_arg) { + *online_arg = online; + } + return 0; +} + +/* Set PLPA's caching behavior */ +int PLPA_NAME(set_cache_behavior)(PLPA_NAME(cache_behavior_t) behavior) +{ + switch (behavior) { + case PLPA_NAME_CAPS(CACHE_USE): + if (PLPA_NAME_CAPS(CACHE_USE) != cache_behavior) { + load_cache(); + cache_behavior = PLPA_NAME_CAPS(CACHE_USE); + } + break; + + case PLPA_NAME_CAPS(CACHE_IGNORE): + if (PLPA_NAME_CAPS(CACHE_IGNORE) != cache_behavior) { + clear_cache(); + cache_behavior = PLPA_NAME_CAPS(CACHE_IGNORE); + } + break; + + case PLPA_NAME_CAPS(CACHE_REFRESH): + if (PLPA_NAME_CAPS(CACHE_USE) != cache_behavior) { + return EINVAL; + } + clear_cache(); + load_cache(); + break; + + default: + return EINVAL; + } + + return 0; +} diff --git a/plpa-1.1/src/plpa_runtime.c b/plpa-1.3.2/src/libplpa/plpa_runtime.c similarity index 91% rename from plpa-1.1/src/plpa_runtime.c rename to plpa-1.3.2/src/libplpa/plpa_runtime.c index b5a8c05c..97f1549c 100644 --- a/plpa-1.1/src/plpa_runtime.c +++ b/plpa-1.3.2/src/libplpa/plpa_runtime.c @@ -35,7 +35,7 @@ int PLPA_NAME(init)(void) /* Otherwise, initialize all the sybsystems */ if (0 != (ret = pthread_mutex_init(&mutex, NULL)) || 0 != (ret = PLPA_NAME(api_probe_init)()) || - 0 != (ret = PLPA_NAME(map_init)())) { + 0 != (ret = PLPA_NAME(set_cache_behavior)(PLPA_NAME_CAPS(CACHE_USE)))) { return ret; } @@ -66,7 +66,7 @@ int PLPA_NAME(finalize)(void) } /* Ok, we're the last one. Cleanup. */ - PLPA_NAME(map_finalize)(); + PLPA_NAME(set_cache_behavior)(PLPA_NAME_CAPS(CACHE_IGNORE)); pthread_mutex_destroy(&mutex); PLPA_NAME(initialized) = 0; return 0;