Refs trac:1435
Bring in a new version of PLPA (v1.2b2) with some new capabilities for offline processors and mapping of the Nth processor/socket/core to its corresponding Linux processor/socket/core ID. (Sorry for the configure change in the middle of the day, folks -- I need it to be able to continue to integrate paffinity changes for #1435...) This commit was SVN r19282. The following Trac tickets were found above: Ticket 1435 --> https://svn.open-mpi.org/trac/ompi/ticket/1435
Этот коммит содержится в:
родитель
dd16e4e4a6
Коммит
a19cf02c2b
@ -28,7 +28,20 @@ AC_DEFUN([MCA_paffinity_linux_POST_CONFIG],[
|
||||
])dnl
|
||||
|
||||
AC_DEFUN([MCA_paffinity_linux_CONFIG],[
|
||||
OMPI_VAR_SCOPE_PUSH([PLPA_VERSION])
|
||||
|
||||
# Setup PLPA
|
||||
PLPA_SET_SYMBOL_PREFIX([opal_paffinity_linux_plpa_])
|
||||
PLPA_INCLUDED([opal/mca/paffinity/linux/plpa])
|
||||
PLPA_INIT([$1],[$2])
|
||||
PLPA_INCLUDED
|
||||
PLPA_INIT([opal/mca/paffinity/linux/plpa],
|
||||
[AC_MSG_CHECKING([for PLPA version])
|
||||
PLPA_VERSION=`$srcdir/opal/mca/paffinity/linux/plpa/config/plpa_get_version.sh $srcdir/opal/mca/paffinity/linux/plpa/VERSION`
|
||||
AC_DEFINE_UNQUOTED([PAFFINITY_LINUX_PLPA_VERSION],
|
||||
["$PLPA_VERSION"],
|
||||
[Version of PLPA embedded in OMPI])
|
||||
AC_MSG_RESULT([$PLPA_VERSION])
|
||||
$1],
|
||||
[$2])
|
||||
|
||||
OMPI_VAR_SCOPE_POP
|
||||
])dnl
|
||||
|
@ -78,6 +78,10 @@ static int linux_register(void)
|
||||
"priority",
|
||||
"Priority of the linux paffinity component",
|
||||
false, false, 10, NULL);
|
||||
mca_base_param_reg_string(&mca_paffinity_linux_component.base_version,
|
||||
"plpa_version",
|
||||
"Version of PLPA that is embedded in Open MPI",
|
||||
false, true, PAFFINITY_LINUX_PLPA_VERSION, NULL);
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
||||
|
@ -16,6 +16,27 @@ 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.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
|
||||
---
|
||||
|
||||
|
@ -263,10 +263,55 @@ In more detail:
|
||||
support topology information (e.g., 2.6.16 or later):
|
||||
|
||||
- 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()
|
||||
- plpa_max_processor_id()
|
||||
- plpa_max_socket()
|
||||
- plpa_max_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
|
||||
|
||||
*** NOTE: Topology information (i.e., (socket_id, core_id) tuples)
|
||||
are not 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.
|
||||
|
||||
On unsupported kernels, a negative value is returned to indicate
|
||||
graceful failure. Additionally, the function
|
||||
@ -376,14 +421,21 @@ acinclude.m4 (assuming the use of Automake):
|
||||
|
||||
m4_include(path/to/plpa.m4)
|
||||
|
||||
The following macros can then be used from your configure script:
|
||||
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.
|
||||
or
|
||||
PLPA_INCLUDED(config-prefix)
|
||||
NOTE: 1-argument form is deprecated and will be removed in PLPA
|
||||
v1.2
|
||||
Force the building of PLPA in included mode. See PLPA_INIT for a
|
||||
description of config-prefix (note that passing config-prefix
|
||||
through PLPA_INIT is the preferred way to set it).
|
||||
|
||||
- PLPA_SET_SYMBOL_PREFIX(foo)
|
||||
Tells the PLPA to prefix all types and public symbols with "foo"
|
||||
@ -408,12 +460,26 @@ The following macros can then be used from your configure script:
|
||||
Provides the same result as the --disable-executables configure
|
||||
flag, and is implicit in included mode.
|
||||
|
||||
- PLPA_INIT(action-upon-success, action-upon-failure)
|
||||
- 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)
|
||||
or
|
||||
PLPA_INIT(action-upon-success, action-upon-failure)
|
||||
NOTE: 2-argument form is deprecated and will be removed in PLPA
|
||||
v1.2
|
||||
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
|
||||
INCLUDED / STANDALONE / SET_SYMBOL_PREFIX macros.
|
||||
INCLUDED / STANDALONE / SET_SYMBOL_PREFIX macros. The first
|
||||
argument is the 3-argument form is the prefix to use for AC_OUTPUT
|
||||
files. Hence, if your embedded PLPA is located in the source tree
|
||||
at contrib/plpa, you'd pass [contrib/plpa] as the first argument.
|
||||
The 2-argument form assumes the prefix ".".
|
||||
|
||||
- PLPA_DO_AM_CONDITIONALS
|
||||
If you embed PLPA in a larger project and build it conditionally
|
||||
|
@ -6,7 +6,7 @@
|
||||
# <major>.<minor>.<release>. If release is zero, then it is omitted.
|
||||
|
||||
major=1
|
||||
minor=1
|
||||
minor=2
|
||||
release=0
|
||||
|
||||
# greek is used for alpha or beta release tags. If it is non-empty,
|
||||
@ -16,7 +16,7 @@ release=0
|
||||
# requirement is that it must be entirely printable ASCII characters
|
||||
# and have no white space.
|
||||
|
||||
greek=
|
||||
greek=b2
|
||||
|
||||
# If want_svn=1, then the SVN r number will be included in the overall
|
||||
# PLPA version number in some form.
|
||||
@ -33,4 +33,4 @@ 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=r192
|
||||
|
714
opal/mca/paffinity/linux/plpa/aclocal.m4
поставляемый
714
opal/mca/paffinity/linux/plpa/aclocal.m4
поставляемый
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
8
opal/mca/paffinity/linux/plpa/config/config.guess
поставляемый
8
opal/mca/paffinity/linux/plpa/config/config.guess
поставляемый
@ -4,7 +4,7 @@
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2008-01-23'
|
||||
timestamp='2008-04-14'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
@ -985,9 +985,6 @@ EOF
|
||||
a.out-i386-linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit ;;
|
||||
coff-i386)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
|
||||
exit ;;
|
||||
"")
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||
# one that does not give us useful --help.
|
||||
@ -1216,6 +1213,9 @@ EOF
|
||||
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
||||
echo i586-pc-beos
|
||||
exit ;;
|
||||
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
|
||||
echo i586-pc-haiku
|
||||
exit ;;
|
||||
SX-4:SUPER-UX:*:*)
|
||||
echo sx4-nec-superux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
|
29
opal/mca/paffinity/linux/plpa/config/config.sub
поставляемый
29
opal/mca/paffinity/linux/plpa/config/config.sub
поставляемый
@ -4,7 +4,7 @@
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2008-01-16'
|
||||
timestamp='2008-06-16'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@ -250,12 +250,14 @@ case $basic_machine in
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep \
|
||||
| maxq | mb | microblaze | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64octeon | mips64octeonel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64r5900 | mips64r5900el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
@ -331,12 +333,14 @@ case $basic_machine in
|
||||
| ip2k-* | iq2000-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64octeon-* | mips64octeonel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64r5900-* | mips64r5900el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
@ -364,7 +368,7 @@ case $basic_machine in
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
|
||||
| tron-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| we32k-* \
|
||||
@ -459,6 +463,10 @@ case $basic_machine in
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
@ -526,6 +534,10 @@ case $basic_machine in
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dicos)
|
||||
basic_machine=i686-pc
|
||||
os=-dicos
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
@ -1248,7 +1260,7 @@ case $os in
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
@ -1388,6 +1400,9 @@ case $os in
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
|
@ -1,9 +1,9 @@
|
||||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2006-10-15.18
|
||||
scriptversion=2007-03-29.01
|
||||
|
||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
|
||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
|
||||
# Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
@ -215,34 +215,39 @@ aix)
|
||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
||||
# start of each line; $object doesn't have directory information.
|
||||
# Version 6 uses the directory in both cases.
|
||||
stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
|
||||
tmpdepfile="$stripped.u"
|
||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||
test "x$dir" = "x$object" && dir=
|
||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
tmpdepfile3=$dir.libs/$base.u
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$dir$base.u
|
||||
tmpdepfile3=$dir$base.u
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
|
||||
if test -f "$tmpdepfile"; then :
|
||||
else
|
||||
stripped=`echo "$stripped" | sed 's,^.*/,,'`
|
||||
tmpdepfile="$stripped.u"
|
||||
fi
|
||||
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
outname="$stripped.o"
|
||||
# Each line is of the form `foo.o: dependent.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
|
||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||
# That's a tab and a space in the [].
|
||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
# The sourcefile does not contain any dependencies, so just
|
||||
# store a dummy comment line, to avoid errors with the Makefile
|
||||
|
@ -91,10 +91,9 @@ cd config
|
||||
set configdir="`pwd`"
|
||||
mkdir tmp.$$
|
||||
cd tmp.$$
|
||||
# "Temporary" instructions at ftp.gnu.org/gnu/config advise using the
|
||||
# following URLs:
|
||||
wget -t 1 -T 10 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess'
|
||||
wget -t 1 -T 10 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub'
|
||||
# Official HTTP git mirrors for config.guess / config.sub
|
||||
wget -t 1 -T 10 -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=master'
|
||||
wget -t 1 -T 10 -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=master'
|
||||
chmod +x config.guess config.sub
|
||||
|
||||
# Recently, ftp.gnu.org has had zero-legnth config.guess / config.sub
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2006-10-14.15
|
||||
scriptversion=2006-12-25.00
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
@ -48,7 +48,7 @@ IFS=" "" $nl"
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
doit=${DOITPROG-}
|
||||
if test -z "$doit"; then
|
||||
doit_exec=exec
|
||||
else
|
||||
@ -58,34 +58,49 @@ fi
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_glob='?'
|
||||
initialize_posix_glob='
|
||||
test "$posix_glob" != "?" || {
|
||||
if (set -f) 2>/dev/null; then
|
||||
posix_glob=
|
||||
else
|
||||
posix_glob=:
|
||||
fi
|
||||
}
|
||||
'
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
chgrpcmd=
|
||||
stripcmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dstarg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
no_target_directory=
|
||||
|
||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
@ -95,7 +110,11 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
@ -103,57 +122,43 @@ Options:
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) shift
|
||||
continue;;
|
||||
-c) ;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
shift
|
||||
shift
|
||||
case $mode in
|
||||
*' '* | *' '* | *'
|
||||
'* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
continue;;
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
shift;;
|
||||
|
||||
-s) stripcmd=$stripprog
|
||||
shift
|
||||
continue;;
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-t) dstarg=$2
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
-t) dst_arg=$2
|
||||
shift;;
|
||||
|
||||
-T) no_target_directory=true
|
||||
shift
|
||||
continue;;
|
||||
-T) no_target_directory=true;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
@ -165,21 +170,22 @@ while test $# -ne 0; do
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dstarg"; then
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dstarg"
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dstarg=$arg
|
||||
dst_arg=$arg
|
||||
done
|
||||
fi
|
||||
|
||||
@ -242,12 +248,12 @@ do
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dstarg"; then
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dst=$dstarg
|
||||
dst=$dst_arg
|
||||
# Protect names starting with `-'.
|
||||
case $dst in
|
||||
-*) dst=./$dst;;
|
||||
@ -257,7 +263,7 @@ do
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dstarg: Is a directory" >&2
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
@ -378,26 +384,19 @@ do
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix=/ ;;
|
||||
-*) prefix=./ ;;
|
||||
*) prefix= ;;
|
||||
/*) prefix='/';;
|
||||
-*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
case $posix_glob in
|
||||
'')
|
||||
if (set -f) 2>/dev/null; then
|
||||
posix_glob=true
|
||||
else
|
||||
posix_glob=false
|
||||
fi ;;
|
||||
esac
|
||||
eval "$initialize_posix_glob"
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
$posix_glob && set -f
|
||||
$posix_glob set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
$posix_glob && set +f
|
||||
$posix_glob set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
@ -459,41 +458,54 @@ do
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
||||
&& { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
|
||||
eval "$initialize_posix_glob" &&
|
||||
$posix_glob set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
$posix_glob set +f &&
|
||||
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
{ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
|
||||
|| {
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
if test -f "$dst"; then
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null \
|
||||
|| { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
|
||||
&& { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
|
||||
|| {
|
||||
echo "$0: cannot unlink or rename $dst" >&2
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
else
|
||||
:
|
||||
fi
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
} || exit 1
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -15,31 +15,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])
|
||||
@ -51,15 +73,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])
|
||||
@ -71,16 +93,16 @@ 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(
|
||||
@ -93,14 +115,13 @@ int i = 1;],
|
||||
)
|
||||
|
||||
# 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
|
||||
@ -109,7 +130,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
|
||||
@ -143,6 +168,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])
|
||||
@ -163,12 +196,25 @@ AC_DEFUN([_PLPA_INTERNAL_SETUP],[
|
||||
plpa_emulate=no
|
||||
fi
|
||||
|
||||
# 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
|
||||
if test "$enable_executables" = ""; then
|
||||
plpa_executables=no
|
||||
fi
|
||||
else
|
||||
plpa_mode=standalone
|
||||
fi
|
||||
@ -184,16 +230,6 @@ dnl else
|
||||
dnl plpa_fortran=no
|
||||
dnl fi
|
||||
|
||||
# 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
|
||||
|
||||
# Change the symbol prefix?
|
||||
AC_ARG_WITH([plpa-symbol-prefix],
|
||||
AC_HELP_STRING([--with-plpa-symbol-prefix=STRING],
|
||||
@ -203,6 +239,21 @@ 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
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
@ -215,6 +266,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.
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# ylwrap - wrapper for lex/yacc invocations.
|
||||
|
||||
scriptversion=2005-05-14.22
|
||||
scriptversion=2007-11-22.22
|
||||
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005
|
||||
# Free Software Foundation, Inc.
|
||||
# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005,
|
||||
# 2007 Free Software Foundation, Inc.
|
||||
#
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
@ -101,14 +101,14 @@ esac
|
||||
# FIXME: add hostname here for parallel makes that run commands on
|
||||
# other machines. But that might take us over the 14-char limit.
|
||||
dirname=ylwrap$$
|
||||
trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
|
||||
trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
|
||||
mkdir $dirname || exit 1
|
||||
|
||||
cd $dirname
|
||||
|
||||
case $# in
|
||||
0) $prog "$input" ;;
|
||||
*) $prog "$@" "$input" ;;
|
||||
0) "$prog" "$input" ;;
|
||||
*) "$prog" "$@" "$input" ;;
|
||||
esac
|
||||
ret=$?
|
||||
|
||||
|
4404
opal/mca/paffinity/linux/plpa/configure
поставляемый
4404
opal/mca/paffinity/linux/plpa/configure
поставляемый
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -125,43 +125,15 @@ if test "$want_picky" = 1; then
|
||||
CFLAGS="$CFLAGS $add"
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([whether to enable debug mode])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--disable-debug],
|
||||
[When in Subversion checkouts of PLPA and compiling with gcc, the default is to debugging. Use --disable-debug or --enable-debug overrides any default setting]))
|
||||
|
||||
# Slightly different tests for whether we're in a svn checkout or not
|
||||
want_debug=no
|
||||
if test -d "$srcdir/.svn"; then
|
||||
if test "$enable_debug" = "no"; then
|
||||
value=0
|
||||
msg="no"
|
||||
else
|
||||
value=1
|
||||
msg="yes (default)"
|
||||
fi
|
||||
else
|
||||
if test "$enable_debug" = "yes"; then
|
||||
value=1
|
||||
msg="yes"
|
||||
else
|
||||
value=0
|
||||
msg="no (default)"
|
||||
fi
|
||||
fi
|
||||
if test "$value" = "1"; then
|
||||
CFLAGS="$CFLAGS -g"
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([PLPA_DEBUG], [$value], [Whether we're in debugging mode or not])
|
||||
# Stupid emacs mode: '
|
||||
AC_MSG_RESULT([$msg])
|
||||
|
||||
# Setup the PLPA (taking all defaults)
|
||||
PLPA_STANDALONE
|
||||
PLPA_INIT([plpa_setup=happy], [plpa_setup=unhappy])
|
||||
PLPA_INIT([.], [plpa_setup=happy], [plpa_setup=unhappy])
|
||||
AS_IF([test "$plpa_setup" = "unhappy"],
|
||||
[AC_MSG_ERROR([Cannot continue])])
|
||||
|
||||
if test "$plpa_debug" = "1"; then
|
||||
CFLAGS="$CFLAGS -g"
|
||||
fi
|
||||
|
||||
# Setup libtool
|
||||
AM_ENABLE_SHARED
|
||||
AM_DISABLE_STATIC
|
||||
|
@ -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,74 @@ 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. */
|
||||
/* 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. */
|
||||
int PLPA_NAME(get_processor_info)(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." Returns 0
|
||||
upon success. */
|
||||
int PLPA_NAME(get_processor_id)(int processor_num, 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." 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."
|
||||
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);
|
||||
|
||||
/* Set PLPA's cache behavior. Returns 0 upon success. */
|
||||
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);
|
||||
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
|
||||
|
@ -70,7 +70,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 */
|
||||
|
@ -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):
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
*
|
||||
* Portions of this file originally contributed by Advanced Micro
|
||||
* Devices, Inc. See notice below.
|
||||
@ -122,24 +122,27 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct tuple_t_ {
|
||||
int processor_id, socket, core;
|
||||
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_num = -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 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)
|
||||
{
|
||||
@ -156,25 +159,31 @@ static void clear_cache(void)
|
||||
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_processors = max_processor_id = -1;
|
||||
num_sockets = max_socket_id = -1;
|
||||
max_core_id_overall = -1;
|
||||
}
|
||||
|
||||
static void load_cache(const char *sysfs_mount)
|
||||
static void load_cache(void)
|
||||
{
|
||||
int i, j, k, invalid_entry, fd;
|
||||
int i, j, k, invalid_entry, fd, found_online;
|
||||
char path[PATH_MAX], buf[8] = "\0\0\0\0\0\0\0\0";
|
||||
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);
|
||||
@ -182,16 +191,41 @@ static void load_cache(const char *sysfs_mount)
|
||||
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;
|
||||
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) {
|
||||
@ -202,52 +236,103 @@ static void load_cache(const char *sysfs_mount)
|
||||
/* 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));
|
||||
(max_processor_id + 2));
|
||||
if (NULL == map_processor_id_to_tuple) {
|
||||
clear_cache();
|
||||
return;
|
||||
}
|
||||
for (i = 0; i <= max_processor_num; ++i) {
|
||||
for (i = 0; i <= max_processor_id; ++i) {
|
||||
if (PLPA_CPU_ISSET(i, &valid_processors)) {
|
||||
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;
|
||||
} 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 = -1;
|
||||
map_processor_id_to_tuple[invalid_entry].core = -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_num; ++i) {
|
||||
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;
|
||||
}
|
||||
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 ) {
|
||||
continue;
|
||||
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;
|
||||
}
|
||||
if ( read(fd, buf, 7) <= 0 ) {
|
||||
continue;
|
||||
}
|
||||
sscanf(buf, "%d", &(map_processor_id_to_tuple[i].core));
|
||||
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 ) {
|
||||
continue;
|
||||
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));
|
||||
}
|
||||
if ( read(fd, buf, 7) <= 0 ) {
|
||||
continue;
|
||||
}
|
||||
sscanf(buf, "%d", &(map_processor_id_to_tuple[i].socket));
|
||||
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 > max_socket_id) {
|
||||
max_socket_id = map_processor_id_to_tuple[i].socket;
|
||||
if (map_processor_id_to_tuple[i].socket_id > max_socket_id) {
|
||||
max_socket_id = map_processor_id_to_tuple[i].socket_id;
|
||||
}
|
||||
}
|
||||
|
||||
@ -276,23 +361,20 @@ static void load_cache(const char *sysfs_mount)
|
||||
}
|
||||
|
||||
/* Find the max core number on each socket */
|
||||
for (i = 0; i <= max_processor_num; ++i) {
|
||||
/* If we don't have the core/socket for a given processor ID,
|
||||
then skip it */
|
||||
if (map_processor_id_to_tuple[i].core < 0 ||
|
||||
map_processor_id_to_tuple[i].socket < 0) {
|
||||
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 >
|
||||
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 (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] >
|
||||
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];
|
||||
max_core_id[map_processor_id_to_tuple[i].socket_id];
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,15 +404,15 @@ static void load_cache(const char *sysfs_mount)
|
||||
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_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 < PLPA_BITMASK_CPU_MAX; ++j) {
|
||||
for (j = 0; j <= max_core_id[i]; ++j) {
|
||||
if (PLPA_CPU_ISSET(j, &(cores_on_sockets[i]))) {
|
||||
++count;
|
||||
}
|
||||
@ -345,44 +427,35 @@ static void load_cache(const char *sysfs_mount)
|
||||
(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));
|
||||
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;
|
||||
}
|
||||
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) {
|
||||
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). */
|
||||
map_tuple_to_processor_id[i][j] =
|
||||
&map_processor_id_to_tuple[invalid_entry];
|
||||
*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_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];
|
||||
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: (socket %d, core %d) -> ID %d\n",
|
||||
printf("Creating map [%d]: (socket %d, core %d) -> ID %d\n",
|
||||
i * (max_core_id_overall + 1) + j,
|
||||
i, j, k);
|
||||
#endif
|
||||
break;
|
||||
@ -394,29 +467,25 @@ static void load_cache(const char *sysfs_mount)
|
||||
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)
|
||||
static int cache_action(void)
|
||||
{
|
||||
const char *sysfs_mount = "/sys";
|
||||
char *temp;
|
||||
|
||||
temp = getenv("PLPA_SYSFS_MOUNT");
|
||||
if (temp) {
|
||||
sysfs_mount = temp;
|
||||
switch (cache_behavior) {
|
||||
case PLPA_NAME_CAPS(CACHE_USE):
|
||||
if (NULL == map_processor_id_to_tuple) {
|
||||
load_cache();
|
||||
}
|
||||
break;
|
||||
|
||||
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)
|
||||
{
|
||||
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 */
|
||||
@ -440,7 +509,8 @@ int PLPA_NAME(have_topology_information)(int *supported_arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -451,25 +521,31 @@ int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 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 < 0 || socket > max_socket_id ||
|
||||
core < 0 || core > max_core_id_overall) {
|
||||
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][core]->processor_id;
|
||||
ret = map_tuple_to_processor_id[socket_id * (max_core_id_overall + 1) +
|
||||
core_id]->processor_id;
|
||||
if (-1 == ret) {
|
||||
return ENOENT;
|
||||
}
|
||||
@ -479,7 +555,8 @@ int PLPA_NAME(map_to_processor_id)(int socket, int core, int *processor_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -490,33 +567,39 @@ int PLPA_NAME(map_to_socket_core)(int processor_id, int *socket, int *core)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 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_num) {
|
||||
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;
|
||||
ret = map_processor_id_to_tuple[processor_id].socket_id;
|
||||
if (-1 == ret) {
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
/* Ok, all should be good -- return the mapping */
|
||||
*socket = ret;
|
||||
*core = map_processor_id_to_tuple[processor_id].core;
|
||||
*socket_id = ret;
|
||||
*core_id = map_processor_id_to_tuple[processor_id].core_id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PLPA_NAME(get_processor_info)(int *num_processors_arg,
|
||||
int *max_processor_num_arg)
|
||||
int *max_processor_id_arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -527,19 +610,122 @@ int PLPA_NAME(get_processor_info)(int *num_processors_arg,
|
||||
}
|
||||
}
|
||||
|
||||
/* 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_num_arg || NULL == num_processors_arg) {
|
||||
if (NULL == max_processor_id_arg || NULL == num_processors_arg) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
/* All done */
|
||||
*num_processors_arg = num_processors;
|
||||
*max_processor_id_arg = max_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, int *processor_id)
|
||||
{
|
||||
int ret, i, 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;
|
||||
}
|
||||
|
||||
/* All done */
|
||||
*num_processors_arg = num_processors;
|
||||
*max_processor_num_arg = max_processor_num;
|
||||
/* 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) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -555,24 +741,85 @@ int PLPA_NAME(get_socket_info)(int *num_sockets_arg, int *max_socket_id_arg)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
printf("get_socket_id bad 1\n");
|
||||
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) {
|
||||
printf("get_socket_id bad 2\n");
|
||||
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 */
|
||||
printf("get_socket id bad 3\n");
|
||||
return ENODEV;
|
||||
}
|
||||
|
||||
/* 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 PLPA_NAME(get_core_info)(int socket_id, int *num_cores_arg,
|
||||
int *max_core_id_arg)
|
||||
{
|
||||
int ret;
|
||||
@ -584,27 +831,168 @@ int PLPA_NAME(get_core_info)(int socket, int *num_cores_arg,
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 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;
|
||||
/* 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 + 1]->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;
|
||||
}
|
||||
|
||||
/* All done */
|
||||
*num_cores_arg = ret;
|
||||
*max_core_id_arg = max_core_id[socket];
|
||||
return 0;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -26,7 +26,9 @@ int main(int argc, char *argv[])
|
||||
int ret = 0;
|
||||
int need_help = 0;
|
||||
int show_topo = 0;
|
||||
int have_topo, num_sockets, max_socket_num, num_cores, max_core_num;
|
||||
int have_topo, num_sockets, max_socket_num, num_cores, max_core_id;
|
||||
int num_processors, max_processor_id, processor_id;
|
||||
int socket_id, exists, online, num_offline;
|
||||
PLPA_NAME(api_type_t) api_probe;
|
||||
|
||||
for (i = 1; i < argc; ++i) {
|
||||
@ -90,14 +92,49 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (show_topo) {
|
||||
if (have_topo) {
|
||||
/* Remember that max_socket and max_core values are
|
||||
0-indexed */
|
||||
for (i = 0; i <= max_socket_num; ++i) {
|
||||
ret = PLPA_NAME(get_core_info)(i, &num_cores, &max_core_num);
|
||||
if (0 == ret) {
|
||||
printf("Socket %d: %d core%s (max core ID: %d)\n",
|
||||
i, num_cores, (1 == num_cores) ? "" : "s",
|
||||
max_core_num);
|
||||
/* Go through all the sockets */
|
||||
for (i = 0; i < num_sockets; ++i) {
|
||||
/* Turn the socket number into a Linux socket ID */
|
||||
if (0 != PLPA_NAME(get_socket_id)(i, &socket_id)) {
|
||||
fprintf(stderr, "plpa_get_socket_id failed\n");
|
||||
break;
|
||||
}
|
||||
/* Find out about the cores on that socket */
|
||||
if (0 != PLPA_NAME(get_core_info)(socket_id,
|
||||
&num_cores, &max_core_id)) {
|
||||
fprintf(stderr, "plpa_get_core_info failed\n");
|
||||
break;
|
||||
}
|
||||
|
||||
printf("Socket %d (ID %d): %d core%s (max core ID: %d)\n",
|
||||
i, socket_id, num_cores, (1 == num_cores) ? "" : "s",
|
||||
max_core_id);
|
||||
}
|
||||
|
||||
/* Go through all the processors and count how many are
|
||||
offline; we have no topology information for offline
|
||||
processors */
|
||||
if (0 != PLPA_NAME(get_processor_info)(&num_processors,
|
||||
&max_processor_id)) {
|
||||
fprintf(stderr, "plpa_get_processor_info failed\n");
|
||||
} else {
|
||||
for (num_offline = i = 0; i < num_processors; ++i) {
|
||||
if (0 != PLPA_NAME(get_processor_id)(i, &processor_id)) {
|
||||
fprintf(stderr, "pla_get_processor_id failed\n");
|
||||
break;
|
||||
}
|
||||
if (0 != PLPA_NAME(get_processor_flags)(processor_id,
|
||||
&exists,
|
||||
&online)) {
|
||||
fprintf(stderr, "plpa_get_processor_flags failed\n");
|
||||
break;
|
||||
}
|
||||
if (exists && !online) {
|
||||
++num_offline;
|
||||
}
|
||||
}
|
||||
if (num_offline > 0) {
|
||||
printf("%d processor%s offline (no topology information available)\n", num_offline, (1 == num_offline ? "" : "s"));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Cisco, Inc. All rights reserved.
|
||||
* Copyright (c) 2007-2008 Cisco, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -39,11 +39,17 @@ static void show_help(char *argv0, int ret)
|
||||
argv0);
|
||||
printf("set or get the affinity of a process\n\n");
|
||||
printf(" -p, --pid operating on existing given pid\n");
|
||||
printf(" pid can also be \"self\" or \"parent\"\n");
|
||||
printf(" -c, --cpu-list display and specify cpus in list format\n");
|
||||
printf(" -h, --help display this help\n");
|
||||
printf(" -v, --version output version information\n");
|
||||
printf("\n");
|
||||
printf("[mask] is a bitmask of Linux processor IDs\n");
|
||||
printf("[cpu-list] is a list of Linux processor IDs, or a <core>@<socket>\n");
|
||||
printf(" specification list; <core> and <socket> are either keywords ('all',\n");
|
||||
printf(" 'even', 'odd') or Linux core / socket IDs, respectively (vs.\n");
|
||||
printf(" the Nth socket / core)\n");
|
||||
printf("[pid] can be a PID or 'parent' or 'self'\n");
|
||||
printf("\n");
|
||||
printf("The default behavior is to run a new command:\n");
|
||||
printf(" %s 03 sshd -b 1024\n", argv0);
|
||||
printf("You can retrieve the mask of an existing task:\n");
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user