As
97900ebf itself explains, this is a runtime tunable on FreeBSD
and DragonFlyBSD, so they need to check the sysctl on runtime.
Not sure if OpenBSD has any tunable for this as the original commit
only says about >=5.1, but afaik recent versions of OpenBSD can't
even compile fio anyway. Also not sure how it works on NetBSD, and
the original commit said nothing about it too. Also see below url.
http://www.spinics.net/lists/fio/msg05586.html
http://www.spinics.net/lists/fio/msg05588.html
--
# uname -r
11.0-RELEASE-p1
# cat ./test1.c
#include <stdio.h>
#include "./os/os-freebsd.h"
int main(void) {
printf("%d\n", shm_attach_to_open_removed());
return 0;
}
# clang -Wall -g ./test1.c
# sysctl kern.ipc.shm_allow_removed
kern.ipc.shm_allow_removed: 1
# ./a.out
1
# sysctl kern.ipc.shm_allow_removed=123
kern.ipc.shm_allow_removed: 1 -> 123
# ./a.out
1
# sysctl kern.ipc.shm_allow_removed=0
kern.ipc.shm_allow_removed: 123 -> 0
# ./a.out
0
Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
perror("shmat");
return 1;
}
-#ifdef FIO_HAVE_SHM_ATTACH_REMOVED
- shmctl(shm_id, IPC_RMID, NULL);
-#endif
+ if (shm_attach_to_open_removed())
+ shmctl(shm_id, IPC_RMID, NULL);
#endif
memset(threads, 0, max_jobs * sizeof(struct thread_data));
#define FIO_HAVE_GETTID
#define FIO_HAVE_CPU_AFFINITY
#define FIO_HAVE_IOPRIO
-/* Only have attach-to-open-removed when kern.ipc.shm_allow_removed is 1 */
-#undef FIO_HAVE_SHM_ATTACH_REMOVED
+#define FIO_HAVE_SHM_ATTACH_REMOVED
#define OS_MAP_ANON MAP_ANON
#define FIO_MADV_FREE MADV_FREE
#endif
+static inline int shm_attach_to_open_removed(void)
+{
+ int x;
+ size_t len = sizeof(x);
+
+ if (sysctlbyname("kern.ipc.shm_allow_removed", &x, &len, NULL, 0) < 0)
+ return 0;
+
+ return x > 0 ? 1 : 0;
+}
+
#endif
#define FIO_HAVE_TRIM
#define FIO_HAVE_GETTID
#define FIO_HAVE_CPU_AFFINITY
-/* Only have attach-to-open-removed when kern.ipc.shm_allow_removed is 1 */
-#undef FIO_HAVE_SHM_ATTACH_REMOVED
-
+#define FIO_HAVE_SHM_ATTACH_REMOVED
#define OS_MAP_ANON MAP_ANON
#define FIO_MADV_FREE MADV_FREE
#endif
+static inline int shm_attach_to_open_removed(void)
+{
+ int x;
+ size_t len = sizeof(x);
+
+ if (sysctlbyname("kern.ipc.shm_allow_removed", &x, &len, NULL, 0) < 0)
+ return 0;
+
+ return x > 0 ? 1 : 0;
+}
+
#endif
#endif /* __NR_preadv2 */
#endif /* CONFIG_PWRITEV2 */
+static inline int shm_attach_to_open_removed(void)
+{
+ return 1;
+}
+
#endif
#define FIO_USE_GENERIC_INIT_RANDOM_STATE
#define FIO_HAVE_FS_STAT
#define FIO_HAVE_GETTID
+#define FIO_HAVE_SHM_ATTACH_REMOVED
#undef FIO_HAVE_CPU_AFFINITY /* XXX notyet */
-/* Only OpenBSD 5.1 and above have attach-to-open-removed semantics */
-#undef FIO_HAVE_SHM_ATTACH_REMOVED
-
#define OS_MAP_ANON MAP_ANON
#ifndef PTHREAD_STACK_MIN
#define FIO_MADV_FREE MADV_FREE
#endif
+static inline int shm_attach_to_open_removed(void)
+{
+ /*
+ * XXX: Return 1 if >= OpenBSD 5.1 according to 97900ebf.
+ */
+ return 0;
+}
+
#endif
}
#endif
+#ifndef FIO_HAVE_SHM_ATTACH_REMOVED
+static inline int shm_attach_to_open_removed(void)
+{
+ return 0;
+}
+#endif
+
#endif