summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2013-01-29 10:35:02 -0800
committerBrian Behlendorf <[email protected]>2013-01-29 10:58:20 -0800
commit79c6e4c44538414340a43c065f850d11cb0203af (patch)
tree70dcd0d08eea41a74954534c519f42b165f32f83
parent9759c60f1a1503e48dc5c45a209c3edd5758319f (diff)
Remove NPTL_GUARD_WITHIN_STACK
Commit 4b2f65b253952c5103311cc8bb4b8cdc6836fd7e increased the user space stack by 4x to resolve certain stack overflows. As such it no longer makes sense to worry about a single extra page which might or might not be part of the process stack. There is now ample headroom for normal usage. By eliminating this configure check we are also resolving the following segfault which intentionally occurs at configure time and may be logged in dmesg. conftest[22156]: segfault at 7fbf18a47e48 ip 00000000004007fe sp 00007fbf18a4be50 error 6 in conftest[400000+1000] Signed-off-by: Brian Behlendorf <[email protected]>
-rw-r--r--config/user-nptl_guard_within_stack.m456
-rw-r--r--config/user.m41
-rw-r--r--include/sys/zfs_context.h6
-rw-r--r--lib/libzpool/kernel.c3
4 files changed, 1 insertions, 65 deletions
diff --git a/config/user-nptl_guard_within_stack.m4 b/config/user-nptl_guard_within_stack.m4
deleted file mode 100644
index 421eb1c05..000000000
--- a/config/user-nptl_guard_within_stack.m4
+++ /dev/null
@@ -1,56 +0,0 @@
-dnl #
-dnl # Check if the glibc NPTL threading implementation includes the guard area
-dnl # within the stack size allocation, rather than allocating extra space at
-dnl # the end of the stack, as POSIX.1 requires.
-dnl #
-AC_DEFUN([ZFS_AC_CONFIG_USER_STACK_GUARD], [
-
- AC_MSG_CHECKING([whether pthread stack includes guard])
-
- saved_CFLAGS="$CFLAGS"
- CFLAGS="-fstack-check"
- saved_LDFLAGS="$LDFLAGS"
- LDFLAGS="-lpthread"
-
- AC_RUN_IFELSE([AC_LANG_PROGRAM(
- [
- #include <pthread.h>
- #include <sys/resource.h>
- #include <unistd.h>
- #include <bits/local_lim.h>
-
- #define PAGESIZE (sysconf(_SC_PAGESIZE))
- #define STACK_SIZE 8192
- #define BUFSIZE 4096
-
- void * func(void *arg)
- {
- char buf[[BUFSIZE]];
- }
- ],
- [
- pthread_t tid;
- pthread_attr_t attr;
- struct rlimit l;
-
- l.rlim_cur = 0;
- l.rlim_max = 0;
- setrlimit(RLIMIT_CORE, &l);
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + STACK_SIZE);
- pthread_attr_setguardsize(&attr, PAGESIZE);
- pthread_create(&tid, &attr, func, NULL);
- pthread_join(tid, NULL);
- ])],
- [
- AC_MSG_RESULT([no])
- ],
- [
- AC_DEFINE([NPTL_GUARD_WITHIN_STACK], 1,
- [Define to 1 if NPTL threading implementation includes
- guard area in stack allocation])
- AC_MSG_RESULT([yes])
- ])
- CFLAGS="$saved_CFLAGS"
- LDFLAGS="$saved_LDFLAGS"
-])
diff --git a/config/user.m4 b/config/user.m4
index 4fcef3d5b..109ebd5f9 100644
--- a/config/user.m4
+++ b/config/user.m4
@@ -10,5 +10,4 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
ZFS_AC_CONFIG_USER_LIBBLKID
ZFS_AC_CONFIG_USER_LIBSELINUX
ZFS_AC_CONFIG_USER_FRAME_LARGER_THAN
- ZFS_AC_CONFIG_USER_STACK_GUARD
])
diff --git a/include/sys/zfs_context.h b/include/sys/zfs_context.h
index 6b00a5d5d..53080f382 100644
--- a/include/sys/zfs_context.h
+++ b/include/sys/zfs_context.h
@@ -190,12 +190,6 @@ extern void vpanic(const char *, __va_list);
#define STACK_SIZE 24576 /* Solaris */
#endif
-#ifdef NPTL_GUARD_WITHIN_STACK
-#define EXTRA_GUARD_BYTES PAGESIZE
-#else
-#define EXTRA_GUARD_BYTES 0
-#endif
-
/* in libzpool, p0 exists only to have its address taken */
typedef struct proc {
uintptr_t this_is_never_used_dont_dereference_it;
diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c
index 0e10c8951..c1ce82d1b 100644
--- a/lib/libzpool/kernel.c
+++ b/lib/libzpool/kernel.c
@@ -175,8 +175,7 @@ zk_thread_create(caddr_t stk, size_t stksize, thread_func_t func, void *arg,
* on Linux.
*/
- stack = PTHREAD_STACK_MIN + MAX(stksize, STACK_SIZE) * 4 +
- EXTRA_GUARD_BYTES;
+ stack = PTHREAD_STACK_MIN + MAX(stksize, STACK_SIZE) * 4;
VERIFY3S(pthread_attr_init(&attr), ==, 0);
VERIFY3S(pthread_attr_setstacksize(&attr, stack), ==, 0);