Le 24/07/2012 13:39, Brice Goglin a écrit :
> Le 23/07/2012 18:40, Pavan Balaji a écrit :
>>>> 3. The changes to config/hwloc.m4 and include/private/private.h are
>>>> essentially a warning squash when getpagesize() requires an explicit
>>>> prototype declaration.  But it's not clear how easy it is for you to
>>>> absorb it as it uses an MPICH2 internal m4 macro.  Maybe there's a
>>>> cleaner way to integrate this patch.
>>> I will look at this. On which platform/system did you need this patch?
>> On regular x86_64 machines.  We use strict builds in mpich2.  I can
>> figure out the exact flags that trigger it, but my guess is that -Wall
>> would.
> Looking deeper into this, it looks like the right solution is to use
> sysconf(_SC_PAGESIZE) instead of getpagesize(). getpagesize() looks
> deprecated, that's why it's getting disabled when modern features are
> enabled. I'll send a patch to use sysconf when supported and fallback to
> the old getpagesize() otherwise.
>

Can you try this patch of some of your platforms?

I think I couldn't reproduce your problem because hwloc's
AC_USE_SYSTEM_EXTENSIONS defines _GNU_SOURCE, which defines _BSD_SOURCE,
which defines __USE_BSD, which makes getpagesize() available without
looking at other XOPEN/POSIX defines.

Brice


Brice

diff --git a/config/hwloc.m4 b/config/hwloc.m4
index b373e2e..80c8bc3 100644
--- a/config/hwloc.m4
+++ b/config/hwloc.m4
@@ -388,6 +388,8 @@ EOF])
     		_SC_NPROCESSORS_CONF,
     		_SC_NPROC_ONLN,
     		_SC_NPROC_CONF,
+    		_SC_PAGESIZE,
+    		_SC_PAGE_SIZE,
     		_SC_LARGE_PAGESIZE],,[:],[[#include <unistd.h>]])

     AC_HAVE_HEADERS([mach/mach_host.h])
diff --git a/include/private/private.h b/include/private/private.h
index bc46fdb..1083f61 100644
--- a/include/private/private.h
+++ b/include/private/private.h
@@ -17,6 +17,9 @@
 #include <hwloc/bitmap.h>
 #include <private/debug.h>
 #include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #ifdef HAVE_STDINT_H
 #include <stdint.h>
 #endif
@@ -368,4 +371,14 @@ extern void hwloc_group_by_distances(struct hwloc_topology *topology);
 #define fabsf(f) fabs((double)(f))
 #endif

+#if HAVE_DECL__SC_PAGE_SIZE
+#define hwloc_getpagesize() sysconf(_SC_PAGE_SIZE)
+#elif HAVE_DECL__SC_PAGESIZE
+#define hwloc_getpagesize() sysconf(_SC_PAGESIZE)
+#elif defined HAVE_GETPAGESIZE
+#define hwloc_getpagesize() getpagesize()
+#else
+#undef hwloc_getpagesize
+#endif
+
 #endif /* HWLOC_PRIVATE_H */
diff --git a/src/bind.c b/src/bind.c
index a828879..a9ed5aa 100644
--- a/src/bind.c
+++ b/src/bind.c
@@ -447,12 +447,12 @@ void *
 hwloc_alloc_heap(hwloc_topology_t topology __hwloc_attribute_unused, size_t len)
 {
   void *p;
-#if defined(HAVE_GETPAGESIZE) && defined(HAVE_POSIX_MEMALIGN)
-  errno = posix_memalign(&p, getpagesize(), len);
+#if defined(hwloc_getpagesize) && defined(HAVE_POSIX_MEMALIGN)
+  errno = posix_memalign(&p, hwloc_getpagesize(), len);
   if (errno)
     p = NULL;
-#elif defined(HAVE_GETPAGESIZE) && defined(HAVE_MEMALIGN)
-  p = memalign(getpagesize(), len);
+#elif defined(hwloc_getpagesize) && defined(HAVE_MEMALIGN)
+  p = memalign(hwloc_getpagesize(), len);
 #else
   p = malloc(len);
 #endif
diff --git a/src/topology-aix.c b/src/topology-aix.c
index dd62774..90a3279 100644
--- a/src/topology-aix.c
+++ b/src/topology-aix.c
@@ -613,7 +613,7 @@ look_rset(int sdl, hwloc_obj_type_t type, struct hwloc_topology *topology, int l
 	obj->memory.page_types_len = 2;
 	obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
 	memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
-	obj->memory.page_types[0].size = getpagesize();
+	obj->memory.page_types[0].size = hwloc_getpagesize();
 #ifdef HAVE__SC_LARGE_PAGESIZE
 	obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
 #endif
diff --git a/src/topology-linux.c b/src/topology-linux.c
index e56e1bd..5640721 100644
--- a/src/topology-linux.c
+++ b/src/topology-linux.c
@@ -1313,7 +1313,7 @@ hwloc_linux_get_area_membind(hwloc_topology_t topology, const void *addr, size_t
   int mixed = 0;
   int full = 0;
   int first = 1;
-  int pagesize = getpagesize();
+  int pagesize = hwloc_getpagesize();
   char *tmpaddr;
   int err;
   unsigned i;
@@ -1914,7 +1914,7 @@ hwloc_get_kerrighed_node_meminfo_info(struct hwloc_topology *topology, unsigned
 #ifdef HAVE__SC_LARGE_PAGESIZE
     memory->page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
 #endif
-    memory->page_types[0].size = getpagesize();
+    memory->page_types[0].size = hwloc_getpagesize();
   }

   snprintf(path, sizeof(path), "/proc/nodes/node%lu/meminfo", node);
@@ -1965,7 +1965,7 @@ hwloc_get_procfs_meminfo_info(struct hwloc_topology *topology, struct hwloc_obj_
 #ifdef HAVE__SC_LARGE_PAGESIZE
     memory->page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
 #endif
-    memory->page_types[0].size = getpagesize(); /* might be overwritten later by /proc/meminfo or sysfs */
+    memory->page_types[0].size = hwloc_getpagesize(); /* might be overwritten later by /proc/meminfo or sysfs */
   }

   hwloc_parse_meminfo_info(topology, "/proc/meminfo", 0 /* no prefix */,
@@ -2057,7 +2057,7 @@ hwloc_sysfs_node_meminfo_info(struct hwloc_topology *topology,
       }
     }
     /* update what's remaining as normal pages */
-    memory->page_types[0].size = getpagesize();
+    memory->page_types[0].size = hwloc_getpagesize();
     memory->page_types[0].count = remaining_local_memory / memory->page_types[0].size;
   }
 }
diff --git a/src/topology-osf.c b/src/topology-osf.c
index 7113eaf..858f36e 100644
--- a/src/topology-osf.c
+++ b/src/topology-osf.c
@@ -276,11 +276,11 @@ hwloc_look_osf(struct hwloc_topology *topology)
       indexes[radid] = radid;
       nodes[radid] = obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, radid);
       obj->cpuset = hwloc_bitmap_alloc();
-      obj->memory.local_memory = rad_get_physmem(radid) * getpagesize();
+      obj->memory.local_memory = rad_get_physmem(radid) * hwloc_getpagesize();
       obj->memory.page_types_len = 2;
       obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
       memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
-      obj->memory.page_types[0].size = getpagesize();
+      obj->memory.page_types[0].size = hwloc_getpagesize();
 #ifdef HAVE__SC_LARGE_PAGESIZE
       obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
 #endif
diff --git a/src/topology-solaris.c b/src/topology-solaris.c
index a65a5c4..37bc4c0 100644
--- a/src/topology-solaris.c
+++ b/src/topology-solaris.c
@@ -374,7 +374,7 @@ browse(struct hwloc_topology *topology, lgrp_cookie_t cookie, lgrp_id_t lgrp, hw
     obj->memory.page_types_len = 2;
     obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
     memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
-    obj->memory.page_types[0].size = getpagesize();
+    obj->memory.page_types[0].size = hwloc_getpagesize();
 #ifdef HAVE__SC_LARGE_PAGESIZE
     obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
 #endif

Reply via email to