diff --git a/opal/mca/paffinity/hwloc/hwloc/NEWS b/opal/mca/paffinity/hwloc/hwloc/NEWS index 5c9b2254ba..e492d4f8bc 100644 --- a/opal/mca/paffinity/hwloc/hwloc/NEWS +++ b/opal/mca/paffinity/hwloc/hwloc/NEWS @@ -23,6 +23,7 @@ Version 1.0.0 + Add x86 cpuid based backend. + Add Linux cgroup support to the Linux cpuset code. + Support binding of entire multithreaded process on Linux. + + Fix and enable Group support in Windows. + Cleanup XML export/import. * Objects + HWLOC_OBJ_PROC is renamed into HWLOC_OBJ_PU for "Processing Unit", diff --git a/opal/mca/paffinity/hwloc/hwloc/README b/opal/mca/paffinity/hwloc/hwloc/README index c880a81fbb..ee3fa1289f 100644 --- a/opal/mca/paffinity/hwloc/hwloc/README +++ b/opal/mca/paffinity/hwloc/hwloc/README @@ -308,7 +308,7 @@ int main(void) levels++; size += obj->attr->cache.size; } - printf("*** Logical processor 0 has %u caches totaling %luKB\n", + printf("*** Logical processor 0 has %d caches totaling %luKB\n", levels, size / 1024); /***************************************************************** @@ -398,6 +398,16 @@ Questions should be sent to the devel mailing list (http://www.open-mpi.org/ community/lists/hwloc.php). Bug reports should be reported in the tracker ( https://svn.open-mpi.org/trac/hwloc/). +If hwloc discovers an incorrect topology for your machine, the very first thing +you should check is to ensure that you have the most recent updates installed +for your operating system. Indeed, most of hwloc topology discovery relies on +hardware information retrieved through the operation system (e.g., via the /sys +virtual filesystem of the Linux kernel). If upgrading your OS or Linux kernel +does not solve your problem, you may also want to ensure that you are running +the most recent version of the BIOS for your machine. + +If those things fail, contact us on the mailing list for additional help. + History / credits hwloc is the evolution and merger of the libtopology (http:// diff --git a/opal/mca/paffinity/hwloc/hwloc/VERSION b/opal/mca/paffinity/hwloc/hwloc/VERSION index b49364d64e..fc6bdb9ae8 100644 --- a/opal/mca/paffinity/hwloc/hwloc/VERSION +++ b/opal/mca/paffinity/hwloc/hwloc/VERSION @@ -16,7 +16,7 @@ release=0 # requirement is that it must be entirely printable ASCII characters # and have no white space. -greek=rc3 +greek=rc6 # If want_svn=1, then the SVN r number will be included in the overall # hwloc version number in some form. @@ -33,11 +33,11 @@ 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=r2013 +svn_r=r2092 # The date when this release was created -date="Apr 29, 2010" +date="May 12, 2010" # The shared library version of hwloc's public library. This version # is maintained in accordance with the "Library Interface Versions" diff --git a/opal/mca/paffinity/hwloc/hwloc/config/hwloc.m4 b/opal/mca/paffinity/hwloc/hwloc/config/hwloc.m4 index a010ce14db..a404c78b2e 100644 --- a/opal/mca/paffinity/hwloc/hwloc/config/hwloc.m4 +++ b/opal/mca/paffinity/hwloc/hwloc/config/hwloc.m4 @@ -224,7 +224,15 @@ EOF]) hwloc_CC_save=$CC hwloc_CFLAGS_save=$CFLAGS AC_PROG_CC_C99 - hwloc_CC_c99_flags=`echo $CC | sed -e s/^$hwloc_CC_save//` + AS_IF([test x"$ac_cv_prog_cc_c99" = xno], + [AC_WARN([C99 support is required by hwloc]) + $3], + [HWLOC_SETUP_CORE_AFTER_C99($1, $2, $3, $4)]) +]) + +dnl Same order of parameters form HWLOC-SETUP-CORE +AC_DEFUN([HWLOC_SETUP_CORE_AFTER_C99],[ + hwloc_CC_c99_flags=`echo $CC | sed -e "s/^$hwloc_CC_save//"` CC=$hwloc_CC_save CFLAGS=$hwloc_CFLAGS_save @@ -546,7 +554,6 @@ EOF]) ) # Cleanup - unset hwloc_config_happy AC_LANG_POP # Success diff --git a/opal/mca/paffinity/hwloc/hwloc/configure b/opal/mca/paffinity/hwloc/hwloc/configure index 5950bf1ca5..23ea086e5a 100755 --- a/opal/mca/paffinity/hwloc/hwloc/configure +++ b/opal/mca/paffinity/hwloc/hwloc/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for hwloc 1.0rc3. +# Generated by GNU Autoconf 2.65 for hwloc 1.0rc6. # # Report bugs to . # @@ -701,8 +701,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='hwloc' PACKAGE_TARNAME='hwloc' -PACKAGE_VERSION='1.0rc3' -PACKAGE_STRING='hwloc 1.0rc3' +PACKAGE_VERSION='1.0rc6' +PACKAGE_STRING='hwloc 1.0rc6' PACKAGE_BUGREPORT='http://www.open-mpi.org/community/help/' PACKAGE_URL='' @@ -1541,7 +1541,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures hwloc 1.0rc3 to adapt to many kinds of systems. +\`configure' configures hwloc 1.0rc6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1616,7 +1616,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of hwloc 1.0rc3:";; + short | recursive ) echo "Configuration of hwloc 1.0rc6:";; esac cat <<\_ACEOF @@ -1770,7 +1770,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -hwloc configure 1.0rc3 +hwloc configure 1.0rc6 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. @@ -2412,7 +2412,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by hwloc $as_me 1.0rc3, which was +It was created by hwloc $as_me 1.0rc6, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ @@ -3346,7 +3346,7 @@ fi # Define the identity of the package. PACKAGE='hwloc' - VERSION='1.0rc3' + VERSION='1.0rc6' cat >>confdefs.h <<_ACEOF @@ -5764,7 +5764,13 @@ if test "x$ac_cv_prog_cc_c99" != xno; then : fi - hwloc_CC_c99_flags=`echo $CC | sed -e s/^$hwloc_CC_save//` + if test x"$ac_cv_prog_cc_c99" = xno; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C99 support is required by hwloc" >&5 +$as_echo "$as_me: WARNING: C99 support is required by hwloc" >&2;} + as_fn_error "Cannot continue" "$LINENO" 5 +else + + hwloc_CC_c99_flags=`echo $CC | sed -e "s/^$hwloc_CC_save//"` CC=$hwloc_CC_save CFLAGS=$hwloc_CFLAGS_save @@ -9967,7 +9973,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Cleanup - unset hwloc_config_happy ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -9978,10 +9983,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Success -if test "$hwloc_setup" = "unhappy"; then : - as_fn_error "Cannot continue" "$LINENO" 5 fi + # Setup hwloc's docs, utils, and tests { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } @@ -12523,13 +12527,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:12526: $ac_compile\"" >&5) + (eval echo "\"\$as_me:12530: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:12529: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:12533: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:12532: output\"" >&5) + (eval echo "\"\$as_me:12536: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -13731,7 +13735,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 13734 "configure"' > conftest.$ac_ext + echo '#line 13738 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -15231,11 +15235,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15234: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15238: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15238: \$? = $ac_status" >&5 + echo "$as_me:15242: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15570,11 +15574,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15573: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15577: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15577: \$? = $ac_status" >&5 + echo "$as_me:15581: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15675,11 +15679,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15678: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15682: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15682: \$? = $ac_status" >&5 + echo "$as_me:15686: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15730,11 +15734,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15733: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15737: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15737: \$? = $ac_status" >&5 + echo "$as_me:15741: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18097,7 +18101,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18100 "configure" +#line 18104 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18193,7 +18197,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18196 "configure" +#line 18200 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -19056,7 +19060,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by hwloc $as_me 1.0rc3, which was +This file was extended by hwloc $as_me 1.0rc6, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -19126,7 +19130,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -hwloc config.status 1.0rc3 +hwloc config.status 1.0rc6 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" diff --git a/opal/mca/paffinity/hwloc/hwloc/configure.ac b/opal/mca/paffinity/hwloc/hwloc/configure.ac index 3c89152d84..85ba51e239 100644 --- a/opal/mca/paffinity/hwloc/hwloc/configure.ac +++ b/opal/mca/paffinity/hwloc/hwloc/configure.ac @@ -124,9 +124,7 @@ AS_IF([test "$enable_embedded_mode" != "yes"], [HWLOC_BUILD_STANDALONE])]) # Setup the hwloc core -HWLOC_SETUP_CORE([], [], [hwloc_setup=unhappy], [1]) -AS_IF([test "$hwloc_setup" = "unhappy"], - [AC_MSG_ERROR([Cannot continue])]) +HWLOC_SETUP_CORE([], [], [AC_MSG_ERROR([Cannot continue])], [1]) # Setup hwloc's docs, utils, and tests AS_IF([test "$hwloc_mode" = "standalone"], diff --git a/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.am b/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.am index ff493bcd75..afc3b4ecd4 100644 --- a/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.am +++ b/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.am @@ -408,7 +408,9 @@ endif if HWLOC_BUILD_DOXYGEN $(man3_MANS): $(DOX_TAG) -$(DOX_A4PDF): $(DOX_TAG) +# Enforce some ordering so that "make -j X" works properly (i.e., +# doesn't try to build both PDFs at the same time) +$(DOX_A4PDF): $(DOX_TAG) $(DOX_LETTERPDF) $(DOX_LETTERPDF): $(DOX_TAG) $(DOX_HTML_DIR): $(DOX_TAG) $(DOX_LATEX_DIR): $(DOX_TAG) diff --git a/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.in b/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.in index e4772e0a87..50cbeda9e1 100644 --- a/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.in +++ b/opal/mca/paffinity/hwloc/hwloc/doc/Makefile.in @@ -1148,7 +1148,9 @@ uninstall-man: uninstall-man3 # @HWLOC_BUILD_DOXYGEN_TRUE@$(man3_MANS): $(DOX_TAG) -@HWLOC_BUILD_DOXYGEN_TRUE@$(DOX_A4PDF): $(DOX_TAG) +# Enforce some ordering so that "make -j X" works properly (i.e., +# doesn't try to build both PDFs at the same time) +@HWLOC_BUILD_DOXYGEN_TRUE@$(DOX_A4PDF): $(DOX_TAG) $(DOX_LETTERPDF) @HWLOC_BUILD_DOXYGEN_TRUE@$(DOX_LETTERPDF): $(DOX_TAG) @HWLOC_BUILD_DOXYGEN_TRUE@$(DOX_HTML_DIR): $(DOX_TAG) @HWLOC_BUILD_DOXYGEN_TRUE@$(DOX_LATEX_DIR): $(DOX_TAG) diff --git a/opal/mca/paffinity/hwloc/hwloc/doc/hwloc-hello.c b/opal/mca/paffinity/hwloc/hwloc/doc/hwloc-hello.c index 6152bd33d5..15bc554f8c 100644 --- a/opal/mca/paffinity/hwloc/hwloc/doc/hwloc-hello.c +++ b/opal/mca/paffinity/hwloc/hwloc/doc/hwloc-hello.c @@ -99,7 +99,7 @@ int main(void) levels++; size += obj->attr->cache.size; } - printf("*** Logical processor 0 has %u caches totaling %luKB\n", + printf("*** Logical processor 0 has %d caches totaling %luKB\n", levels, size / 1024); /***************************************************************** diff --git a/opal/mca/paffinity/hwloc/hwloc/doc/hwloc.doxy b/opal/mca/paffinity/hwloc/hwloc/doc/hwloc.doxy index e79377f126..4d60255a4d 100644 --- a/opal/mca/paffinity/hwloc/hwloc/doc/hwloc.doxy +++ b/opal/mca/paffinity/hwloc/hwloc/doc/hwloc.doxy @@ -317,6 +317,18 @@ list (http://www.open-mpi.org/community/lists/hwloc.php). Bug reports should be reported in the tracker (https://svn.open-mpi.org/trac/hwloc/). +If hwloc discovers an incorrect topology for your machine, the very +first thing you should check is to ensure that you have the most +recent updates installed for your operating system. Indeed, most of +hwloc topology discovery relies on hardware information retrieved +through the operation system (e.g., via the /sys virtual filesystem of +the Linux kernel). If upgrading your OS or Linux kernel does not +solve your problem, you may also want to ensure that you are running +the most recent version of the BIOS for your machine. + +If those things fail, contact us on the mailing list for additional +help. + \htmlonly
\endhtmlonly diff --git a/opal/mca/paffinity/hwloc/hwloc/include/hwloc.h b/opal/mca/paffinity/hwloc/hwloc/include/hwloc.h index e8236b59fc..2b3409155f 100644 --- a/opal/mca/paffinity/hwloc/hwloc/include/hwloc.h +++ b/opal/mca/paffinity/hwloc/hwloc/include/hwloc.h @@ -691,7 +691,8 @@ HWLOC_DECLSPEC hwloc_obj_type_t hwloc_obj_type_of_string (const char * string) _ * It differs from hwloc_obj_type_string() because it prints type attributes such * as cache depth. * - * \return how many characters were actually written (not including the ending \\0). + * \return how many characters were actually written (not including the ending + * \\0), or -1 on error. */ HWLOC_DECLSPEC int hwloc_obj_type_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, int verbose); @@ -702,7 +703,8 @@ HWLOC_DECLSPEC int hwloc_obj_type_snprintf(char * __hwloc_restrict string, size_ * * Only the major attributes are printed in non-verbose mode. * - * \return how many characters were actually written (not including the ending \\0). + * \return how many characters were actually written (not including the ending + * \\0), or -1 on error. */ HWLOC_DECLSPEC int hwloc_obj_attr_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, const char * __hwloc_restrict separator, int verbose); @@ -722,7 +724,8 @@ HWLOC_DECLSPEC int hwloc_obj_attr_snprintf(char * __hwloc_restrict string, size_ * \p indexprefix is used to prefix the \p os_index attribute number of * the object in the description. If \c NULL, the \c # character is used. * - * \return how many characters were actually written (not including the ending \\0). + * \return how many characters were actually written (not including the ending + * \\0), or -1 on error. */ HWLOC_DECLSPEC int hwloc_obj_snprintf(char * __hwloc_restrict string, size_t size, hwloc_topology_t topology, hwloc_obj_t obj, diff --git a/opal/mca/paffinity/hwloc/hwloc/include/private/cpuid.h b/opal/mca/paffinity/hwloc/hwloc/include/private/cpuid.h index 8d3d657648..7199c126d2 100644 --- a/opal/mca/paffinity/hwloc/hwloc/include/private/cpuid.h +++ b/opal/mca/paffinity/hwloc/hwloc/include/private/cpuid.h @@ -31,14 +31,14 @@ static inline int hwloc_have_cpuid(void) "pushfl \n\t" \ "pop %1 \n\t" \ "cmp %1,%2\n\t" /* Compare with expected value */ \ - "jnz L1 \n\t" /* Unexpected, failure */ \ + "jnz Lhwloc1\n\t" /* Unexpected, failure */ \ TRY_TOGGLE /* Try to set/clear */ TRY_TOGGLE /* Try to clear/set */ "mov $1,%0\n\t" /* Passed the test! */ - "L1: \n\t" + "Lhwloc1: \n\t" "popfl \n\t" /* Restore flags */ : "=r" (ret), "=&r" (tmp), "=&r" (tmp2)); diff --git a/opal/mca/paffinity/hwloc/hwloc/src/misc.c b/opal/mca/paffinity/hwloc/hwloc/src/misc.c index 9aa6377981..68e0b90b6a 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/misc.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/misc.c @@ -1,6 +1,6 @@ /* * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1 - * Copyright © 2009 Cisco Systems, Inc. All rights reserved. + * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. * See COPYING in top-level directory. */ @@ -39,6 +39,8 @@ int hwloc_snprintf(char *str, size_t size, const char *format, ...) do { size *= 2; str = malloc(size); + if (NULL == str) + return -1; va_start(ap, format); errno = 0; ret = vsnprintf(str, size, format, ap); diff --git a/opal/mca/paffinity/hwloc/hwloc/src/topology-linux.c b/opal/mca/paffinity/hwloc/hwloc/src/topology-linux.c index 3a9ed2e158..cca65e7ecb 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/topology-linux.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/topology-linux.c @@ -319,13 +319,24 @@ hwloc_linux_get_proc_tids(DIR *taskdir, unsigned *nr_tidsp, pid_t ** tidsp) max_tids = sb.st_nlink; tids = malloc(max_tids*sizeof(pid_t)); + if (!tids) { + errno = ENOMEM; + return -1; + } rewinddir(taskdir); while ((dirent = readdir(taskdir)) != NULL) { if (nr_tids == max_tids) { + pid_t *newtids; max_tids += 8; - tids = realloc(tids, max_tids*sizeof(pid_t)); + newtids = realloc(tids, max_tids*sizeof(pid_t)); + if (!newtids) { + free(tids); + errno = ENOMEM; + return -1; + } + tids = newtids; } if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) continue; @@ -495,7 +506,7 @@ static int hwloc_linux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused) { if (topology->pid) { - errno = -ENOSYS; + errno = ENOSYS; return -1; } return hwloc_linux_set_tid_cpubind(topology, 0, hwloc_set); @@ -505,7 +516,7 @@ static int hwloc_linux_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int policy __hwloc_attribute_unused) { if (topology->pid) { - errno = -ENOSYS; + errno = ENOSYS; return -1; } return hwloc_linux_get_tid_cpubind(topology, 0, hwloc_set); @@ -520,7 +531,7 @@ hwloc_linux_set_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_c int err; if (topology->pid) { - errno = -ENOSYS; + errno = ENOSYS; return -1; } @@ -587,7 +598,7 @@ hwloc_linux_get_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_c int err; if (topology->pid) { - errno = -ENOSYS; + errno = ENOSYS; return -1; } diff --git a/opal/mca/paffinity/hwloc/hwloc/src/topology-synthetic.c b/opal/mca/paffinity/hwloc/hwloc/src/topology-synthetic.c index fe37d20447..caa7f9c955 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/topology-synthetic.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/topology-synthetic.c @@ -26,6 +26,7 @@ hwloc_backend_synthetic_init(struct hwloc_topology *topology, const char *descri int cache_depth = 0, group_depth = 0; int nb_machine_levels = 0, nb_node_levels = 0; int nb_pu_levels = 0; + int nb_pu = 1; assert(topology->backend_type == HWLOC_BACKEND_NONE); @@ -81,6 +82,12 @@ hwloc_backend_synthetic_init(struct hwloc_topology *topology, const char *descri return -1; } + nb_pu *= item; + if (nb_pu > HWLOC_NBMAXCPUS) { + fprintf(stderr, "To many PUs, max %d\n", HWLOC_NBMAXCPUS); + return -1; + } + topology->backend_params.synthetic.arity[count-1] = (unsigned)item; topology->backend_params.synthetic.type[count] = type; topology->backend_params.synthetic.id[count] = 0; diff --git a/opal/mca/paffinity/hwloc/hwloc/src/topology-windows.c b/opal/mca/paffinity/hwloc/hwloc/src/topology-windows.c index 85e1d90d04..319365226a 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/topology-windows.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/topology-windows.c @@ -47,7 +47,7 @@ typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { RelationCache, RelationProcessorPackage, RelationGroup, - RelationAll = 0xffff, + RelationAll = 0xffff } LOGICAL_PROCESSOR_RELATIONSHIP; #endif @@ -82,15 +82,16 @@ typedef struct _GROUP_AFFINITY { #ifndef HAVE_PROCESSOR_RELATIONSHIP typedef struct _PROCESSOR_RELATIONSHIP { BYTE Flags; - ULONGLONG Reserved[2]; - GROUP_AFFINITY GroupMask; + BYTE Reserved[21]; + WORD GroupCount; + GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; #endif #ifndef HAVE_NUMA_NODE_RELATIONSHIP typedef struct _NUMA_NODE_RELATIONSHIP { DWORD NodeNumber; - ULONGLONG Reserved[2]; + BYTE Reserved[20]; GROUP_AFFINITY GroupMask; } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; #endif @@ -102,7 +103,7 @@ typedef struct _CACHE_RELATIONSHIP { WORD LineSize; DWORD CacheSize; PROCESSOR_CACHE_TYPE Type; - ULONGLONG Reserved[2]; + BYTE Reserved[20]; GROUP_AFFINITY GroupMask; } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; #endif @@ -111,8 +112,8 @@ typedef struct _CACHE_RELATIONSHIP { typedef struct _PROCESSOR_GROUP_INFO { BYTE MaximumProcessorCount; BYTE ActiveProcessorCount; + BYTE Reserved[38]; KAFFINITY ActiveProcessorMask; - ULONGLONG Reserved[4]; } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; #endif @@ -199,6 +200,8 @@ hwloc_look_windows(struct hwloc_topology *topology) BOOL WINAPI (*GetLogicalProcessorInformationProc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, PDWORD ReturnLength); BOOL WINAPI (*GetLogicalProcessorInformationExProc)(LOGICAL_PROCESSOR_RELATIONSHIP relationship, PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, PDWORD ReturnLength); BOOL WINAPI (*GetNumaAvailableMemoryNodeProc)(UCHAR Node, PULONGLONG AvailableBytes); + BOOL WINAPI (*GetNumaAvailableMemoryNodeExProc)(USHORT Node, PULONGLONG AvailableBytes); + DWORD length; HMODULE kernel32; @@ -207,8 +210,10 @@ hwloc_look_windows(struct hwloc_topology *topology) if (kernel32) { GetLogicalProcessorInformationProc = GetProcAddress(kernel32, "GetLogicalProcessorInformation"); GetNumaAvailableMemoryNodeProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNode"); + GetNumaAvailableMemoryNodeExProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNodeEx"); + GetLogicalProcessorInformationExProc = GetProcAddress(kernel32, "GetLogicalProcessorInformationEx"); - if (GetLogicalProcessorInformationProc) { + if (!GetLogicalProcessorInformationExProc && GetLogicalProcessorInformationProc) { PSYSTEM_LOGICAL_PROCESSOR_INFORMATION procInfo; unsigned id; unsigned i; @@ -223,8 +228,7 @@ hwloc_look_windows(struct hwloc_topology *topology) break; if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return; - free(procInfo); - procInfo = malloc(length); + procInfo = realloc(procInfo, length); } for (i = 0; i < length / sizeof(*procInfo); i++) { @@ -267,7 +271,8 @@ hwloc_look_windows(struct hwloc_topology *topology) ULONGLONG avail; obj->nodeset = hwloc_cpuset_alloc(); hwloc_cpuset_set(obj->nodeset, id); - if (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail)) + if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail)) + || (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail))) obj->memory.local_memory = avail; obj->memory.page_types_len = 1; obj->memory.page_types = malloc(sizeof(*obj->memory.page_types)); @@ -293,19 +298,12 @@ hwloc_look_windows(struct hwloc_topology *topology) free(procInfo); } - GetLogicalProcessorInformationExProc = GetProcAddress(kernel32, "GetLogicalProcessorInformationEx"); - - /* Disabled for now as it wasn't tested at all. */ - if (0 && GetLogicalProcessorInformationExProc) { + if (GetLogicalProcessorInformationExProc) { PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX procInfoTotal, procInfo; - signed id; + unsigned id; struct hwloc_obj *obj; hwloc_obj_type_t type; - KAFFINITY mask; - WORD group; - - fprintf(stderr,"Note: GetLogicalProcessorInformationEx was never tested yet!\n"); length = 0; procInfoTotal = NULL; @@ -315,13 +313,14 @@ hwloc_look_windows(struct hwloc_topology *topology) break; if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return; - free(procInfoTotal); - procInfo = malloc(length); + procInfoTotal = realloc(procInfoTotal, length); } for (procInfo = procInfoTotal; (void*) procInfo < (void*) ((unsigned long) procInfoTotal + length); procInfo = (void*) ((unsigned long) procInfo + procInfo->Size)) { + unsigned num, i; + GROUP_AFFINITY *GroupMask; /* Ignore non-data caches */ if (procInfo->Relationship == RelationCache && @@ -333,32 +332,34 @@ hwloc_look_windows(struct hwloc_topology *topology) switch (procInfo->Relationship) { case RelationNumaNode: type = HWLOC_OBJ_NODE; - mask = procInfo->NumaNode.GroupMask.Mask; - group = procInfo->NumaNode.GroupMask.Group; + num = 1; + GroupMask = &procInfo->NumaNode.GroupMask; id = procInfo->NumaNode.NodeNumber; break; case RelationProcessorPackage: type = HWLOC_OBJ_SOCKET; - mask = procInfo->Processor.GroupMask.Mask; - group = procInfo->Processor.GroupMask.Group; + num = procInfo->Processor.GroupCount; + GroupMask = procInfo->Processor.GroupMask; break; case RelationCache: type = HWLOC_OBJ_CACHE; - mask = procInfo->Cache.GroupMask.Mask; - group = procInfo->Cache.GroupMask.Group; + num = 1; + GroupMask = &procInfo->Cache.GroupMask; break; case RelationProcessorCore: type = HWLOC_OBJ_CORE; - mask = procInfo->Processor.GroupMask.Mask; - group = procInfo->Processor.GroupMask.Group; + num = procInfo->Processor.GroupCount; + GroupMask = procInfo->Processor.GroupMask; break; case RelationGroup: /* So strange an interface... */ for (id = 0; id < procInfo->Group.ActiveGroupCount; id++) { + KAFFINITY mask; obj = hwloc_alloc_setup_object(HWLOC_OBJ_GROUP, id); obj->cpuset = hwloc_cpuset_alloc(); mask = procInfo->Group.GroupInfo[id].ActiveProcessorMask; - hwloc_debug("group %d mask %lx\n", id, mask); + hwloc_debug("group %u %d cpus mask %lx\n", id, + procInfo->Group.GroupInfo[id].ActiveProcessorCount, mask); hwloc_cpuset_from_ith_ulong(obj->cpuset, id, mask); hwloc_insert_object_by_cpuset(topology, obj); } @@ -370,21 +371,28 @@ hwloc_look_windows(struct hwloc_topology *topology) obj = hwloc_alloc_setup_object(type, id); obj->cpuset = hwloc_cpuset_alloc(); - hwloc_debug("%s#%d mask %d:%lx\n", hwloc_obj_type_string(type), id, group, mask); - hwloc_cpuset_from_ith_ulong(obj->cpuset, group, mask); + for (i = 0; i < num; i++) { + hwloc_debug("%s#%u %d: mask %d:%lx\n", hwloc_obj_type_string(type), id, i, GroupMask[i].Group, GroupMask[i].Mask); + hwloc_cpuset_from_ith_ulong(obj->cpuset, GroupMask[i].Group, GroupMask[i].Mask); + } switch (type) { case HWLOC_OBJ_NODE: - obj->nodeset = hwloc_cpuset_alloc(); - hwloc_cpuset_set(obj->nodeset, id); - obj->memory.local_memory = 0; /* TODO GetNumaAvailableMemoryNodeEx */ - obj->memory.page_types_len = 1; - obj->memory.page_types = malloc(sizeof(*obj->memory.page_types)); - memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types)); + { + ULONGLONG avail; + obj->nodeset = hwloc_cpuset_alloc(); + hwloc_cpuset_set(obj->nodeset, id); + if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail)) + || (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail))) + obj->memory.local_memory = avail; + obj->memory.page_types_len = 1; + obj->memory.page_types = malloc(sizeof(*obj->memory.page_types)); + memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types)); #ifdef HAVE__SC_LARGE_PAGESIZE - obj->memory.page_types[0].size = sysconf(_SC_LARGE_PAGESIZE); + obj->memory.page_types[0].size = sysconf(_SC_LARGE_PAGESIZE); #endif - break; + break; + } case HWLOC_OBJ_CACHE: obj->attr->cache.size = procInfo->Cache.CacheSize; obj->attr->cache.depth = procInfo->Cache.Level; diff --git a/opal/mca/paffinity/hwloc/hwloc/src/topology.c b/opal/mca/paffinity/hwloc/hwloc/src/topology.c index 21efc47469..8e668aed79 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/topology.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/topology.c @@ -41,6 +41,9 @@ #include #endif +static void +hwloc_topology_clear (struct hwloc_topology *topology); + #if defined(HAVE_SYSCTLBYNAME) int hwloc_get_sysctlbyname(const char *name, int *ret) { @@ -698,13 +701,14 @@ hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t cur, /* if both objects have a page_types array, just keep the biggest one for now */ if (obj->memory.page_types_len && child->memory.page_types_len) hwloc_debug("%s", "merging page_types by keeping the biggest one only\n"); - if (obj->memory.page_types_len > child->memory.page_types_len) { - free(child->memory.page_types); - } else { + if (obj->memory.page_types_len < child->memory.page_types_len) { free(obj->memory.page_types); - obj->memory.page_types_len = child->memory.page_types_len; - obj->memory.page_types = child->memory.page_types; - child->memory.page_types = NULL; + } else { + free(child->memory.page_types); + child->memory.page_types_len = obj->memory.page_types_len; + child->memory.page_types = obj->memory.page_types; + obj->memory.page_types = NULL; + obj->memory.page_types_len = 0; } break; case HWLOC_OBJ_CACHE: @@ -1376,7 +1380,7 @@ static void alloc_cpusets(hwloc_obj_t obj) } /* Main discovery loop */ -static void +static int hwloc_discover(struct hwloc_topology *topology) { unsigned l, i=0, taken_i, new_i, j; @@ -1514,7 +1518,7 @@ hwloc_discover(struct hwloc_topology *topology) print_objects(topology, 0, topology->levels[0][0]); - if (!topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM) { + if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM)) { hwloc_debug("%s", "\nRemoving unauthorized and offline cpusets from all cpusets\n"); remove_unused_cpusets(topology->levels[0][0]); @@ -1558,6 +1562,11 @@ hwloc_discover(struct hwloc_topology *topology) l = 0; n_objs = topology->levels[0][0]->arity; objs = malloc(n_objs * sizeof(objs[0])); + if (!objs) { + errno = ENOMEM; + hwloc_topology_clear(topology); + return -1; + } memcpy(objs, topology->levels[0][0]->children, n_objs * sizeof(objs[0])); /* Keep building levels while there are objects left in OBJS. */ @@ -1722,6 +1731,8 @@ hwloc_discover(struct hwloc_topology *topology) DO(set_thread_cpubind); DO(get_thread_cpubind); } + + return 0; } /* To be before discovery is actually launched, @@ -1958,6 +1969,7 @@ int hwloc_topology_load (struct hwloc_topology *topology) { char *local_env; + int err; if (topology->is_loaded) { hwloc_topology_clear(topology); @@ -2015,7 +2027,9 @@ hwloc_topology_load (struct hwloc_topology *topology) } /* actual topology discovery */ - hwloc_discover(topology); + err = hwloc_discover(topology); + if (err < 0) + return err; /* enforce THISSYSTEM if given in a FORCE variable */ local_env = getenv("HWLOC_FORCE_THISSYSTEM"); diff --git a/opal/mca/paffinity/hwloc/hwloc/src/traversal.c b/opal/mca/paffinity/hwloc/hwloc/src/traversal.c index f5f1b764f5..9a02f5a403 100644 --- a/opal/mca/paffinity/hwloc/hwloc/src/traversal.c +++ b/opal/mca/paffinity/hwloc/hwloc/src/traversal.c @@ -265,7 +265,7 @@ hwloc_obj_snprintf(char *string, size_t size, hwloc_obj_type_snprintf(type, sizeof(type), l, verbose); attrlen = hwloc_obj_attr_snprintf(attr, sizeof(attr), l, " ", verbose); - if (attrlen) + if (attrlen > 0) return hwloc_snprintf(string, size, "%s%s(%s)", type, os_index, attr); else return hwloc_snprintf(string, size, "%s%s", type, os_index); diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.am b/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.am index 7db6e2ea70..12736957c0 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.am +++ b/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.am @@ -39,8 +39,10 @@ endif HWLOC_BUILD_TESTS # Only install man pages if we're building in standalone mode if HWLOC_BUILD_UTILS -man_pages = hwloc.7 lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-calc.1 -EXTRA_DIST += $(man_pages:.1=.1in) +man1_pages = lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-calc.1 +man7_pages = hwloc.7 +man_pages = $(man7_pages) $(man1_pages) +EXTRA_DIST += $(man1_pages:.1=.1in) $(man7_pages:.7=.7in) nodist_man_MANS = $(man_pages) .1in.1: diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.in b/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.in index 8a8f52b5dc..4a2f35abf0 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.in +++ b/opal/mca/paffinity/hwloc/hwloc/utils/Makefile.in @@ -45,7 +45,7 @@ target_triplet = @target@ @HWLOC_HAVE_CAIRO_TRUE@am__append_1 = lstopo-cairo.c @HWLOC_HAVE_XML_TRUE@am__append_2 = lstopo-xml.c @HWLOC_HAVE_WINDOWS_TRUE@am__append_3 = lstopo-windows.c -@HWLOC_BUILD_UTILS_TRUE@am__append_4 = $(man_pages:.1=.1in) +@HWLOC_BUILD_UTILS_TRUE@am__append_4 = $(man1_pages:.1=.1in) $(man7_pages:.7=.7in) subdir = utils DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/test-hwloc-distrib.sh.in @@ -334,7 +334,9 @@ hwloc_calc_SOURCES = hwloc-calc.c hwloc-calc.h @HWLOC_BUILD_TESTS_TRUE@@HWLOC_HAVE_MINGW32_FALSE@TESTS = test-hwloc-distrib.sh # Only install man pages if we're building in standalone mode -@HWLOC_BUILD_UTILS_TRUE@man_pages = hwloc.7 lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-calc.1 +@HWLOC_BUILD_UTILS_TRUE@man1_pages = lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-calc.1 +@HWLOC_BUILD_UTILS_TRUE@man7_pages = hwloc.7 +@HWLOC_BUILD_UTILS_TRUE@man_pages = $(man7_pages) $(man1_pages) @HWLOC_BUILD_UTILS_TRUE@nodist_man_MANS = $(man_pages) all: all-am diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7 b/opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7in similarity index 99% rename from opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7 rename to opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7in index 87521e595e..562b412d47 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7 +++ b/opal/mca/paffinity/hwloc/hwloc/utils/hwloc.7in @@ -1,6 +1,6 @@ .\" -*- nroff -*- .\" Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. -.TH HWLOC "1" "Apr 16, 2010" "1.0rc1" "hwloc" +.TH HWLOC "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#" .SH NAME hwloc - General information about hwloc ("hardware locality"). . diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-cairo.c b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-cairo.c index 232ec42855..24abd8d13c 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-cairo.c +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-cairo.c @@ -32,12 +32,14 @@ #include #include #include +#include #endif /* CAIRO_HAS_XLIB_SURFACE */ #include #include #include #include +#include #include "lstopo.h" @@ -109,6 +111,7 @@ struct display { Display *dpy; cairo_surface_t *cs; Window win; + Cursor hand; int screen_width, screen_height; /** visible part size */ int width, height; /** total size */ int x, y; /** top left corner of the visible part */ @@ -124,6 +127,7 @@ x11_start(void *output __hwloc_attribute_unused, int width, int height) Screen *screen; int screen_width = width, screen_height = height; struct display *disp; + Cursor hand; if (!(dpy = XOpenDisplay(NULL))) { fprintf(stderr, "couldn't connect to X\n"); @@ -138,6 +142,8 @@ x11_start(void *output __hwloc_attribute_unused, int width, int height) root = RootWindow(dpy, scr); top = XCreateSimpleWindow(dpy, root, 0, 0, screen_width, screen_height, 0, WhitePixel(dpy, scr), WhitePixel(dpy, scr)); win = XCreateSimpleWindow(dpy, top, 0, 0, width, height, 0, WhitePixel(dpy, scr), WhitePixel(dpy, scr)); + hand = XCreateFontCursor(dpy, XC_fleur); + XDefineCursor(dpy, win, hand); XSelectInput(dpy, win, KeyPressMask | @@ -154,6 +160,7 @@ x11_start(void *output __hwloc_attribute_unused, int width, int height) disp->dpy = dpy; disp->cs = cs; disp->win = win; + disp->hand = hand; disp->screen_width = screen_width; disp->screen_height = screen_height; disp->width = width; @@ -255,13 +262,63 @@ output_x11(hwloc_topology_t topology, const char *filename __hwloc_attribute_unu case KeyPress: { KeySym keysym; XLookupString(&e.xkey, NULL, 0, &keysym, NULL); - if (keysym == XK_q || keysym == XK_Q) - finish = 1; + switch (keysym) { + case XK_q: + case XK_Q: + case XK_Escape: + finish = 1; + break; + case XK_Left: + disp->x -= disp->screen_width/10; + move_x11(disp); + break; + case XK_Right: + disp->x += disp->screen_width/10; + move_x11(disp); + break; + case XK_Up: + disp->y -= disp->screen_height/10; + move_x11(disp); + break; + case XK_Down: + disp->y += disp->screen_height/10; + move_x11(disp); + break; + case XK_Page_Up: + if (e.xkey.state & ControlMask) { + disp->x -= disp->screen_width; + move_x11(disp); + } else { + disp->y -= disp->screen_height; + move_x11(disp); + } + break; + case XK_Page_Down: + if (e.xkey.state & ControlMask) { + disp->x += disp->screen_width; + move_x11(disp); + } else { + disp->y += disp->screen_height; + move_x11(disp); + } + break; + case XK_Home: + disp->x = 0; + disp->y = 0; + move_x11(disp); + break; + case XK_End: + disp->x = INT_MAX; + disp->y = INT_MAX; + move_x11(disp); + break; + } break; } } } cairo_surface_destroy(disp->cs); + XFreeCursor(disp->dpy, disp->hand); XCloseDisplay(disp->dpy); free(disp); } diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-draw.c b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-draw.c index f913150563..76d5f1210e 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-draw.c +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-draw.c @@ -338,12 +338,12 @@ lstopo_obj_snprintf(char *text, size_t textlen, hwloc_obj_t obj, int logical) char typestr[32]; char indexstr[32]= ""; char attrstr[256]; - size_t attrlen; + int attrlen; hwloc_obj_type_snprintf(typestr, sizeof(typestr), obj, 0); if (idx != (unsigned)-1 && obj->depth != 0) snprintf(indexstr, sizeof(indexstr), "%s%u", indexprefix, idx); attrlen = hwloc_obj_attr_snprintf(attrstr, sizeof(attrstr), obj, " ", 0); - if (attrlen) + if (attrlen > 0) return snprintf(text, textlen, "%s%s (%s)", typestr, indexstr, attrstr); else return snprintf(text, textlen, "%s%s", typestr, indexstr); @@ -365,7 +365,7 @@ pu_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hw methods->box(output, FORBIDDEN_R_COLOR, FORBIDDEN_G_COLOR, FORBIDDEN_B_COLOR, depth, x, *retwidth, y, *retheight); else { hwloc_cpuset_t bind = hwloc_cpuset_alloc(); - if (pid > 0) + if (pid != (hwloc_pid_t) -1 && pid != 0) hwloc_get_proc_cpubind(topology, pid, bind, 0); else if (pid == 0) hwloc_get_cpubind(topology, bind, 0); @@ -398,12 +398,12 @@ cache_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, unsigned myheight = gridsize + (fontsize ? (fontsize + gridsize) : 0) + gridsize, totheight; unsigned mywidth = 0, totwidth; unsigned textwidth = fontsize ? ((logical ? level->logical_index : level->os_index) == (unsigned) -1 ? 7*fontsize : 9*fontsize) : 0; + /* Do not separate objects when in L1 (SMT) */ unsigned separator = level->attr->cache.depth > 1 ? gridsize : 0; DYNA_CHECK(); - /* Do not separate objects when in L1 (SMT) */ - RECURSE_HORIZ(level, &null_draw_methods, separator, 0); + RECURSE_RECT(level, &null_draw_methods, separator, 0); methods->box(output, CACHE_R_COLOR, CACHE_G_COLOR, CACHE_B_COLOR, depth, x, totwidth, y, myheight - gridsize); @@ -414,7 +414,7 @@ cache_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text); } - RECURSE_HORIZ(level, methods, separator, 0); + RECURSE_RECT(level, methods, separator, 0); DYNA_SAVE(); } @@ -428,7 +428,7 @@ core_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, DYNA_CHECK(); - RECURSE_HORIZ(level, &null_draw_methods, 0, gridsize); + RECURSE_RECT(level, &null_draw_methods, 0, gridsize); methods->box(output, CORE_R_COLOR, CORE_G_COLOR, CORE_B_COLOR, depth, x, totwidth, y, totheight); @@ -438,7 +438,7 @@ core_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text); } - RECURSE_HORIZ(level, methods, 0, gridsize); + RECURSE_RECT(level, methods, 0, gridsize); DYNA_SAVE(); } @@ -485,7 +485,7 @@ node_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, DYNA_CHECK(); /* Compute the size needed by sublevels */ - RECURSE_HORIZ(level, &null_draw_methods, gridsize, gridsize); + RECURSE_RECT(level, &null_draw_methods, gridsize, gridsize); /* Draw the epoxy box */ methods->box(output, NODE_R_COLOR, NODE_G_COLOR, NODE_B_COLOR, depth, x, totwidth, y, totheight); @@ -500,7 +500,7 @@ node_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, } /* Restart, now really drawing sublevels */ - RECURSE_HORIZ(level, methods, gridsize, gridsize); + RECURSE_RECT(level, methods, gridsize, gridsize); /* Save result for dynamic programming */ DYNA_SAVE(); diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-text.c b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-text.c index f435281d73..a03c27dd48 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-text.c +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-text.c @@ -341,7 +341,7 @@ set_color(int fr, int fg, int fb, int br, int bg, int bb) /* We we can, allocate rgb colors */ static void -text_declare_color(void *output __hwloc_attribute_unused, int r, int g, int b) +text_declare_color(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused) { #ifdef HWLOC_HAVE_LIBTERMCAP int color = declare_color(r, g, b); @@ -363,7 +363,7 @@ text_declare_color(void *output __hwloc_attribute_unused, int r, int g, int b) /* output text, erasing any previous content */ static void -put(struct display *disp, int x, int y, character c, int fr, int fg, int fb, int br, int bg, int bb) +put(struct display *disp, int x, int y, character c, int fr __hwloc_attribute_unused, int fg __hwloc_attribute_unused, int fb __hwloc_attribute_unused, int br __hwloc_attribute_unused, int bg __hwloc_attribute_unused, int bb __hwloc_attribute_unused) { if (x >= disp->width || y >= disp->height) { /* fprintf(stderr, "%"PRIchar" overflowed to (%d,%d)\n", c, x, y); */ @@ -389,7 +389,7 @@ enum { up = (1<<0), down = (1<<1), left = (1<<2), - right = (1<<3), + right = (1<<3) }; /* Convert a bar character into its directions */ @@ -605,8 +605,8 @@ void output_text(hwloc_topology_t topology, const char *filename, int logical, i int lbr, lbg, lbb; /* Last background color */ #ifdef HWLOC_HAVE_LIBTERMCAP int term = 0; -#endif char *tmp; +#endif if (!filename || !strcmp(filename, "-")) output = stdout; diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-windows.c b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-windows.c index aee8f48b71..f4b23cee20 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-windows.c +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo-windows.c @@ -11,6 +11,7 @@ #include #include +#include #include "lstopo.h" @@ -40,10 +41,16 @@ struct draw_methods windows_draw_methods; static hwloc_topology_t the_topology; static int the_logical; +static int state, control; +static int x, y, x_delta, y_delta; +static int finish; +static int the_width, the_height; +static int win_width, win_height; static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { + int redraw = 0; switch (message) { case WM_PAINT: { HDC hdc; @@ -53,31 +60,141 @@ WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) EndPaint(hwnd, &ps); break; } + case WM_LBUTTONDOWN: + state = 1; + x = GET_X_LPARAM(lparam); + y = GET_Y_LPARAM(lparam); + break; + case WM_LBUTTONUP: + state = 0; + break; + case WM_MOUSEMOVE: + if (!(wparam & MK_LBUTTON)) + state = 0; + if (state) { + int new_x = GET_X_LPARAM(lparam); + int new_y = GET_Y_LPARAM(lparam); + x_delta -= new_x - x; + y_delta -= new_y - y; + x = new_x; + y = new_y; + redraw = 1; + } + break; + case WM_KEYDOWN: + switch (wparam) { + case 'q': + case 'Q': + case VK_ESCAPE: + finish = 1; + break; + case VK_LEFT: + x_delta -= win_width/10; + redraw = 1; + break; + case VK_RIGHT: + x_delta += win_width/10; + redraw = 1; + break; + case VK_UP: + y_delta -= win_height/10; + redraw = 1; + break; + case VK_DOWN: + y_delta += win_height/10; + redraw = 1; + break; + case VK_PRIOR: + if (control) { + x_delta -= win_width; + redraw = 1; + } else { + y_delta -= win_height; + redraw = 1; + } + break; + case VK_NEXT: + if (control) { + x_delta += win_width; + redraw = 1; + } else { + y_delta += win_height; + redraw = 1; + } + break; + case VK_HOME: + x_delta = 0; + y_delta = 0; + redraw = 1; + break; + case VK_END: + x_delta = INT_MAX; + y_delta = INT_MAX; + redraw = 1; + break; + case VK_CONTROL: + control = 1; + break; + } + break; + case WM_KEYUP: + switch (wparam) { + case VK_CONTROL: + control = 0; + break; + } + break; case WM_DESTROY: PostQuitMessage(0); return 0; + case WM_SIZE: + win_width = LOWORD(lparam); + win_height = HIWORD(lparam); + redraw = 1; + break; + } + if (redraw) { + if (x_delta > the_width - win_width) + x_delta = the_width - win_width; + if (y_delta > the_height - win_height) + y_delta = the_height - win_height; + if (x_delta < 0) + x_delta = 0; + if (y_delta < 0) + y_delta = 0; + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } return DefWindowProc(hwnd, message, wparam, lparam); } static void * -windows_start(void *output_, int width, int height) +windows_start(void *output_ __hwloc_attribute_unused, int width, int height) { WNDCLASS wndclass = { .hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH), - .hCursor = LoadCursor(NULL, IDC_ARROW), + .hCursor = LoadCursor(NULL, IDC_SIZEALL), .hIcon = LoadIcon(NULL, IDI_APPLICATION), .lpfnWndProc = WndProc, .lpszClassName = "lstopo", }; HWND toplevel; + win_width = width + 2*GetSystemMetrics(SM_CXSIZEFRAME); + win_height = height + 2*GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION); + + if (win_width > GetSystemMetrics(SM_CXFULLSCREEN)) + win_width = GetSystemMetrics(SM_CXFULLSCREEN); + + if (win_height > GetSystemMetrics(SM_CYFULLSCREEN)) + win_height = GetSystemMetrics(SM_CYFULLSCREEN); + RegisterClass(&wndclass); toplevel = CreateWindow("lstopo", "lstopo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, - width + 2*GetSystemMetrics(SM_CXSIZEFRAME), - height + 2*GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYSMCAPTION), - NULL, NULL, NULL, NULL); + win_width, win_height, NULL, NULL, NULL, NULL); + + the_width = width; + the_height = height; ShowWindow(toplevel, SW_SHOWDEFAULT); @@ -85,7 +202,7 @@ windows_start(void *output_, int width, int height) } static void -windows_declare_color(void *output_, int r, int g, int b) +windows_declare_color(void *output_ __hwloc_attribute_unused, int r, int g, int b) { HBRUSH brush; COLORREF color = RGB(r, g, b); @@ -105,32 +222,32 @@ windows_declare_color(void *output_, int r, int g, int b) } static void -windows_box(void *output, int r, int g, int b, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height) +windows_box(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned width, unsigned y, unsigned height) { PAINTSTRUCT *ps = output; SelectObject(ps->hdc, rgb_to_brush(r, g, b)); SetBkColor(ps->hdc, RGB(r, g, b)); - Rectangle(ps->hdc, x, y, x + width, y + height); + Rectangle(ps->hdc, x - x_delta, y - y_delta, x + width - x_delta, y + height - y_delta); } static void -windows_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2) +windows_line(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x1, unsigned y1, unsigned x2, unsigned y2) { PAINTSTRUCT *ps = output; SelectObject(ps->hdc, rgb_to_brush(r, g, b)); - MoveToEx(ps->hdc, x1, y1, NULL); - LineTo(ps->hdc, x2, y2); + MoveToEx(ps->hdc, x1 - x_delta, y1 - y_delta, NULL); + LineTo(ps->hdc, x2 - x_delta, y2 - y_delta); } static void -windows_text(void *output, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text) +windows_text(void *output, int r, int g, int b, int size, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned y, const char *text) { PAINTSTRUCT *ps = output; HFONT font; SetTextColor(ps->hdc, RGB(r, g, b)); font = CreateFont(size, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); SelectObject(ps->hdc, (HGDIOBJ) font); - TextOut(ps->hdc, x, y, text, strlen(text)); + TextOut(ps->hdc, x - x_delta, y - y_delta, text, strlen(text)); DeleteObject(font); } @@ -143,7 +260,7 @@ struct draw_methods windows_draw_methods = { }; void -output_windows (hwloc_topology_t topology, const char *filename, int logical, int verbose_mode) +output_windows (hwloc_topology_t topology, const char *filename __hwloc_attribute_unused, int logical, int verbose_mode __hwloc_attribute_unused) { HWND toplevel; the_topology = topology; @@ -151,7 +268,7 @@ output_windows (hwloc_topology_t topology, const char *filename, int logical, in toplevel = output_draw_start(&windows_draw_methods, logical, topology, NULL); UpdateWindow(toplevel); MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { + while (!finish && GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.1in b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.1in index 847c98369f..7cbfdcc978 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.1in +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.1in @@ -214,6 +214,16 @@ running lstopo in one context may show a specific CPU as red, but running lstopo in a different context may show the same CPU as white). . .\" ************************** +.\" Layout Section +.\" ************************** +.SH LAYOUT +In its graphical output, lstopo uses simple rectangular heuristics +to try to achieve a 4/3 ratio between width and height. However, +in the particular case of NUMA nodes, the layout is always a flat +rectangle, to avoid letting the user believe any particular NUMA +topology (lstopo is not able to render that yet). +. +.\" ************************** .\" Examples Section .\" ************************** .SH EXAMPLES diff --git a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.c b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.c index 4f7b813e97..373784e5f1 100644 --- a/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.c +++ b/opal/mca/paffinity/hwloc/hwloc/utils/lstopo.c @@ -27,7 +27,7 @@ unsigned int gridsize = 10; unsigned int force_horiz = 0; unsigned int force_vert = 0; unsigned int top = 0; -hwloc_pid_t pid = -1; +hwloc_pid_t pid = (hwloc_pid_t) -1; FILE *open_file(const char *filename, const char *mode) { @@ -341,7 +341,7 @@ main (int argc, char *argv[]) return EXIT_FAILURE; } } - if (pid > 0) { + if (pid != (hwloc_pid_t) -1 && pid != 0) { if (hwloc_topology_set_pid(topology, pid)) { perror("Setting target pid"); return EXIT_FAILURE;