Hello community, here is the log from the commit of package stress-ng for openSUSE:Factory checked in at 2018-01-01 22:36:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/stress-ng (Old) and /work/SRC/openSUSE:Factory/.stress-ng.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "stress-ng" Mon Jan 1 22:36:06 2018 rev:25 rq:560979 version:0.09.08 Changes: -------- --- /work/SRC/openSUSE:Factory/stress-ng/stress-ng.changes 2017-12-19 10:58:14.594057817 +0100 +++ /work/SRC/openSUSE:Factory/.stress-ng.new/stress-ng.changes 2018-01-01 22:36:23.196836697 +0100 @@ -1,0 +2,22 @@ +Mon Jan 1 10:41:32 UTC 2018 - mar...@gmx.de + +- Update to version 0.09.08 + * Makefile: bump version + * Makefile.config: remove need for LIBBSD for wchar.h path detection + * stress-rawdev: fix linking failure on non linux systems + * Add wchar.h and bsd/wchar.h path detection, makes stress-ng.h cleaner + * Add rawdev raw device read stressor + * stress-vecmath: use uint128_put for 128 bit integer + * Move ALIGNED and SECTION macros to stress-ng.h + * Add OPTIMIZE0 level zero optimization hint macro + * stress-socket-diag: remove some consts, cleans up clang warnings + * Use the FORMAT macro for some printf style functions + * stress-vm: fix warning when building with PEDANTIC=1 + * stress-tlb-shootdown: fix unterminated comment + * stress-timer: fix warning when building with PEDANTIC=1 + * stress-itimer: fix warning when building with PEDANTIC=1 + * stress-funccall: clean up warnings when building with PEDANTIC=1 + * stress-physpage: only close an opened fd_pc file descriptor + * stress-tlb: fix incorrect affinity on cores + +------------------------------------------------------------------- Old: ---- stress-ng-0.09.07.tar.xz New: ---- stress-ng-0.09.08.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ stress-ng.spec ++++++ --- /var/tmp/diff_new_pack.pekXTd/_old 2018-01-01 22:36:24.620361421 +0100 +++ /var/tmp/diff_new_pack.pekXTd/_new 2018-01-01 22:36:24.624360086 +0100 @@ -1,7 +1,7 @@ # # spec file for package stress-ng # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2015, Martin Hauke <mar...@gmx.de> # # All modifications and additions to the file contributed by third parties @@ -18,7 +18,7 @@ Name: stress-ng -Version: 0.09.07 +Version: 0.09.08 Release: 0 Summary: Tool to load and stress a computer License: GPL-2.0 ++++++ stress-ng-0.09.07.tar.xz -> stress-ng-0.09.08.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/Makefile new/stress-ng-0.09.08/Makefile --- old/stress-ng-0.09.07/Makefile 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/Makefile 2017-12-31 18:18:59.000000000 +0100 @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -VERSION=0.09.07 +VERSION=0.09.08 # # Codename "portable pressure producer" # @@ -168,6 +168,7 @@ stress-quota.c \ stress-qsort.c \ stress-radixsort.c \ + stress-rawdev.c \ stress-rdrand.c \ stress-readahead.c \ stress-remap-file-pages.c \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/Makefile.config new/stress-ng-0.09.08/Makefile.config --- old/stress-ng-0.09.07/Makefile.config 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/Makefile.config 2017-12-31 18:18:59.000000000 +0100 @@ -75,6 +75,22 @@ endif endif +ifndef $(HAVE_BSD_WCHAR) +HAVE_BSD_WCHAR = $(shell $(MAKE) -f Makefile.config --no-print-directory $(HAVE_NOT) have_bsd_wchar) +ifeq ($(HAVE_BSD_WCHAR),1) + CONFIG_CFLAGS += -DHAVE_BSD_WCHAR +$(info autoconfig: using bsd/wchar.h) +endif +endif + +ifndef $(HAVE_WCHAR) +HAVE_WCHAR = $(shell $(MAKE) -f Makefile.config --no-print-directory $(HAVE_NOT) have_wchar) +ifeq ($(HAVE_WCHAR),1) + CONFIG_CFLAGS += -DHAVE_WCHAR +$(info autoconfig: using wchar.h) +endif +endif + ifndef $(HAVE_LIB_Z) HAVE_LIB_Z = $(shell $(MAKE) -f Makefile.config --no-print-directory $(HAVE_NOT) have_lib_z) ifeq ($(HAVE_LIB_Z),1) @@ -792,6 +808,32 @@ @rm -f $(DIR)/test-libbsd # +# check if we can include bsd/wchar.h +# +.PHONY: have_bsd_wchar +have_bsd_wchar: $(DIR)/test-bsd-wchar.c + @$(CC) $(CFLAGS) $(CPPFLAGS) $(DIR)/test-bsd-wchar.c -o $(DIR)/test-bsd-wchar 2> /dev/null || true + @if [ -f $(DIR)/test-bsd-wchar ]; then \ + echo 1 ;\ + else \ + echo 0 ;\ + fi + @rm -f $(DIR)/test-bsd-wchar + +# +# check if we can include wchar.h +# +.PHONY: have_wchar +have_wchar: $(DIR)/test-wchar.c + @$(CC) $(CFLAGS) $(CPPFLAGS) $(DIR)/test-wchar.c -o $(DIR)/test-wchar 2> /dev/null || true + @if [ -f $(DIR)/test-wchar ]; then \ + echo 1 ;\ + else \ + echo 0 ;\ + fi + @rm -f $(DIR)/test-wchar + +# # check if we can build against libz # .PHONY: have_lib_z diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/log.c new/stress-ng-0.09.08/log.c --- old/stress-ng-0.09.07/log.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/log.c 2017-12-31 18:18:59.000000000 +0100 @@ -144,6 +144,8 @@ * __pr_msg_fail() * wrapper helper for pr_msg_fail */ +static inline void __pr_msg_fail(const uint64_t flag, char *fmt, ...) FORMAT(printf, 2, 0); + static inline void __pr_msg_fail(const uint64_t flag, char *fmt, ...) { va_list ap; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-cpu.c new/stress-ng-0.09.08/stress-cpu.c --- old/stress-ng-0.09.07/stress-cpu.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-cpu.c 2017-12-31 18:18:59.000000000 +0100 @@ -154,17 +154,10 @@ } /* - * We need to stop gcc optimising out the loop additions.. sigh - */ -#if __GNUC__ && NEED_GNUC(4, 4, 0) && !defined(__clang__) -static void stress_cpu_loop(const char *) __attribute__((optimize("-O0"))); -#endif - -/* * stress_cpu_loop() * simple CPU busy loop */ -static void stress_cpu_loop(const char *name) +static void OPTIMIZE0 stress_cpu_loop(const char *name) { uint32_t i, i_sum = 0; const uint32_t sum = 134209536UL; @@ -1283,13 +1276,6 @@ } /* - * Undocumented gcc-ism, force -O0 optimisation - */ -#if __GNUC__ && NEED_GNUC(4, 4, 0) && !defined(__clang__) -static void stress_cpu_jmp(const char *name) __attribute__((optimize("-O0"))); -#endif - -/* * This could be a ternary operator, v = (v op val) ? a : b * but it may be optimised down, so force a compare and jmp * with -O0 and a if/else construct @@ -1305,7 +1291,7 @@ * stress_cpu_jmp * jmp conditionals */ -static void HOT stress_cpu_jmp(const char *name) +static void HOT OPTIMIZE0 stress_cpu_jmp(const char *name) { register int i, next = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-funccall.c new/stress-ng-0.09.08/stress-funccall.c --- old/stress-ng-0.09.07/stress-funccall.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-funccall.c 2017-12-31 18:19:00.000000000 +0100 @@ -43,14 +43,21 @@ typedef long double long_double_t; #define stress_funccall_1(type) \ -extern void stress_funccall_ ## type ## _1( \ +void NOINLINE stress_funccall_ ## type ## _1( \ + const type a); \ + \ +void NOINLINE stress_funccall_ ## type ## _1( \ const type a) \ { \ type ## _put(a); \ } \ #define stress_funccall_2(type) \ -extern void stress_funccall_ ## type ## _2( \ +void NOINLINE stress_funccall_ ## type ## _2( \ + const type a, \ + const type b); \ + \ +void NOINLINE stress_funccall_ ## type ## _2( \ const type a, \ const type b) \ { \ @@ -59,7 +66,12 @@ } \ #define stress_funccall_3(type) \ -extern void stress_funccall_ ## type ## _3( \ +void NOINLINE stress_funccall_ ## type ## _3( \ + const type a, \ + const type b, \ + const type c); \ + \ +void NOINLINE stress_funccall_ ## type ## _3( \ const type a, \ const type b, \ const type c) \ @@ -70,7 +82,13 @@ } \ #define stress_funccall_4(type) \ -extern void stress_funccall_ ## type ## _4( \ +void NOINLINE stress_funccall_ ## type ## _4( \ + const type a, \ + const type b, \ + const type c, \ + const type d); \ + \ +void NOINLINE stress_funccall_ ## type ## _4( \ const type a, \ const type b, \ const type c, \ @@ -83,7 +101,14 @@ } \ #define stress_funccall_5(type) \ -extern void stress_funccall_ ## type ## _5( \ +void NOINLINE stress_funccall_ ## type ## _5( \ + const type a, \ + const type b, \ + const type c, \ + const type d, \ + const type e); \ + \ +void NOINLINE stress_funccall_ ## type ## _5( \ const type a, \ const type b, \ const type c, \ @@ -98,7 +123,15 @@ } \ #define stress_funccall_6(type) \ -extern void stress_funccall_ ## type ## _6( \ +void NOINLINE stress_funccall_ ## type ## _6( \ + const type a, \ + const type b, \ + const type c, \ + const type d, \ + const type e, \ + const type f); \ + \ +void NOINLINE stress_funccall_ ## type ## _6( \ const type a, \ const type b, \ const type c, \ @@ -115,7 +148,16 @@ } \ #define stress_funccall_7(type) \ -extern void stress_funccall_ ## type ## _7( \ +void NOINLINE stress_funccall_ ## type ## _7( \ + const type a, \ + const type b, \ + const type c, \ + const type d, \ + const type e, \ + const type f, \ + const type g); \ + \ +void NOINLINE stress_funccall_ ## type ## _7( \ const type a, \ const type b, \ const type c, \ @@ -134,7 +176,17 @@ } \ #define stress_funccall_8(type) \ -extern void stress_funccall_ ## type ## _8( \ +void NOINLINE stress_funccall_ ## type ## _8( \ + const type a, \ + const type b, \ + const type c, \ + const type d, \ + const type e, \ + const type f, \ + const type g, \ + const type h); \ + \ +void NOINLINE stress_funccall_ ## type ## _8( \ const type a, \ const type b, \ const type c, \ @@ -155,7 +207,18 @@ } \ #define stress_funccall_9(type) \ -extern void stress_funccall_ ## type ## _9( \ +void NOINLINE stress_funccall_ ## type ## _9( \ + const type a, \ + const type b, \ + const type c, \ + const type d, \ + const type e, \ + const type f, \ + const type g, \ + const type h, \ + const type i); \ + \ +void NOINLINE stress_funccall_ ## type ## _9( \ const type a, \ const type b, \ const type c, \ @@ -260,7 +323,7 @@ stress_funccall_9(long_double_t) #define stress_funcall_type(type, rndfunc) \ -static void stress_funccall_ ## type(const args_t *args) \ +static void NOINLINE stress_funccall_ ## type(const args_t *args)\ { \ register int ii; \ type a, b, c, d, e, f, g, h, i; \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-icache.c new/stress-ng-0.09.08/stress-icache.c --- old/stress-ng-0.09.07/stress-icache.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-icache.c 2017-12-31 18:19:00.000000000 +0100 @@ -34,11 +34,6 @@ #define SIZE_16K (16 * SIZE_1K) #define SIZE_64K (64 * SIZE_1K) -#if defined(__GNUC__) && NEED_GNUC(4,6,0) -#define SECTION(s) __attribute__((__section__(# s))) -#define ALIGNED(a) __attribute__((aligned(a))) -#endif - /* * STRESS_ICACHE_FUNC() * generates a simple function that is page aligned in its own diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-itimer.c new/stress-ng-0.09.08/stress-itimer.c --- old/stress-ng-0.09.07/stress-itimer.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-itimer.c 2017-12-31 18:19:00.000000000 +0100 @@ -73,7 +73,7 @@ * stress_itimer_keep_stressing() * returns true if we can keep on running a stressor */ -bool HOT OPTIMIZE3 stress_itimer_keep_stressing(void) +static bool HOT OPTIMIZE3 stress_itimer_keep_stressing(void) { return (LIKELY(g_keep_stressing_flag) && LIKELY(!max_ops || (itimer_counter < max_ops))); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-ng.1 new/stress-ng-0.09.08/stress-ng.1 --- old/stress-ng-0.09.07/stress-ng.1 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-ng.1 2017-12-31 18:19:00.000000000 +0100 @@ -2284,6 +2284,47 @@ .B \-\-radixsort\-size N specify number of strings to sort, default is 262144 (256 \(mu 1024). .TP +.B \-\-rawdev N +start N workers that read the underlying raw drive device using direct +IO reads. The device (with minor number 0) that stores the current working +directory is the raw device to be read by the stressor. The read size is +exactly the size of the underlying device block size. By default, this +stressor will exercise all the of the rawdev methods (see the +\-\-rawdev\-method option). This is a Linux only stressor and requires +root privilege to be able to read the raw device. +.TP +.B \-\-rawdev\-ops N +stop the rawdev stress workers after N raw device read bogo operations. +.TP +.B \-\-rawdev\-method M +Available rawdev stress methods are described as follows: +.TS +expand; +lBw(10n)2 lBw(\n[SZ]n) +l l. +Method Description +all T{ +iterate over all the rawdev stress methods as listed below: +T} +sweep T{ +repeatedy read across the raw device from the 0th block to the end block in steps +of the number of blocks on the device / 128 and back to the start again. +T} +wiggle T{ +repeatedy read across the raw device in 128 evenly steps with each step reading +1024 blocks backwards from each step. +ends T{ +repeatedy read the first and last 128 start and end blocks of the raw device +alternating from start of the device to the end of the device. +T} +random T{ +repeatedy read 256 random blocks +T} +burst T{ +repeatedly read 256 sequential blocks starting from a random block on the raw device. +T} +.TE +.TP .B \-\-rdrand N start N workers that read the Intel hardware random number generator (Intel Ivybridge processors upwards). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-ng.c new/stress-ng-0.09.08/stress-ng.c --- old/stress-ng-0.09.07/stress-ng.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-ng.c 2017-12-31 18:19:00.000000000 +0100 @@ -97,6 +97,7 @@ { STRESS_IOPORT, stress_ioport_supported }, { STRESS_NETLINK_PROC, stress_netlink_proc_supported }, { STRESS_PHYSPAGE, stress_physpage_supported }, + { STRESS_RAWDEV, stress_rawdev_supported }, { STRESS_RDRAND, stress_rdrand_supported }, { STRESS_SOFTLOCKUP, stress_softlockup_supported }, { STRESS_SWAP, stress_swap_supported }, @@ -326,6 +327,7 @@ STRESSOR(qsort, QSORT, CLASS_CPU_CACHE | CLASS_CPU | CLASS_MEMORY), STRESSOR(quota, QUOTA, CLASS_OS), STRESSOR(radixsort, RADIXSORT, CLASS_CPU_CACHE | CLASS_CPU | CLASS_MEMORY), + STRESSOR(rawdev, RAWDEV, CLASS_IO), STRESSOR(rdrand, RDRAND, CLASS_CPU), STRESSOR(readahead, READAHEAD, CLASS_IO | CLASS_OS), STRESSOR(remap, REMAP_FILE_PAGES, CLASS_MEMORY | CLASS_OS), @@ -765,6 +767,9 @@ { "radixsort", 1, 0, OPT_RADIXSORT }, { "radixsort-ops",1, 0, OPT_RADIXSORT_OPS }, { "radixsort-size",1, 0, OPT_RADIXSORT_SIZE }, + { "rawdev", 1, 0, OPT_RAWDEV }, + { "rawdev-ops",1, 0, OPT_RAWDEV_OPS }, + { "rawdev-method",1, 0, OPT_RAWDEV_METHOD }, { "random", 1, 0, OPT_RANDOM }, { "rdrand", 1, 0, OPT_RDRAND }, { "rdrand-ops", 1, 0, OPT_RDRAND_OPS }, @@ -1346,6 +1351,9 @@ { NULL, "radixsort N", "start N workers radix sorting random strings" }, { NULL, "radixsort-ops N", "stop after N radixsort bogo operations" }, { NULL, "radixsort-size N", "number of strings to sort" }, + { NULL, "rawdev N", "start N workers that read a raw device" }, + { NULL, "rawdev-ops N", "stop after N rawdev read operations" }, + { NULL, "rawdev-method M", "specify the rawdev reead method to use" }, { NULL, "rdrand N", "start N workers exercising rdrand (x86 only)" }, { NULL, "rdrand-ops N", "stop after N rdrand bogo operations" }, { NULL, "readahead N", "start N workers exercising file readahead" }, @@ -3260,6 +3268,10 @@ stress_get_processors(&i32); set_setting("random", TYPE_ID_INT32, &i32); break; + case OPT_RAWDEV_METHOD: + if (stress_set_rawdev_method(optarg) < 0) + return EXIT_FAILURE; + break; case OPT_READAHEAD_BYTES: stress_set_readahead_bytes(optarg); break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-ng.h new/stress-ng-0.09.08/stress-ng.h --- old/stress-ng-0.09.07/stress-ng.h 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-ng.h 2017-12-31 18:19:00.000000000 +0100 @@ -59,13 +59,19 @@ #include <pthread.h> #endif +#if defined(HAVE_BSD_WCHAR) +#include <bsd/wchar.h> +#endif +#if defined(HAVE_WCHAR) +#include <wchar.h> +#endif + #if defined(HAVE_LIB_BSD) #if defined(__APPLE__) || \ defined(__DragonFly__) || \ defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) -#include <wchar.h> #if !defined(__APPLE__) #include <sys/tree.h> #endif @@ -73,10 +79,6 @@ #include <bsd/stdlib.h> #include <bsd/string.h> #include <bsd/sys/tree.h> -#if !defined(__FreeBSD_kernel__) -/* GNU/kFreeBSD does not support this */ -#include <bsd/wchar.h> -#endif #endif #endif @@ -455,6 +457,13 @@ #define OPTIMIZE1 #endif +/* -O0 attribute support */ +#if defined(__GNUC__) && !defined(__clang__) && NEED_GNUC(4,6,0) +#define OPTIMIZE0 __attribute__((optimize("-O0"))) +#else +#define OPTIMIZE0 +#endif + /* warn unused attribute */ #if defined(__GNUC__) && NEED_GNUC(4,2,0) #define WARN_UNUSED __attribute__((warn_unused_result)) @@ -462,20 +471,28 @@ #define WARN_UNUSED #endif +#if defined(__GNUC__) && NEED_GNUC(3,3,0) +#define ALIGNED(a) __attribute__((aligned(a))) +#endif + /* Force aligment to nearest 128 bytes */ #if defined(__GNUC__) && NEED_GNUC(3,3,0) && defined(HAVE_ALIGNED_128) -#define ALIGN128 __attribute__ ((aligned(128))) +#define ALIGN128 ALIGNED(128) #else #define ALIGN128 #endif /* Force aligment to nearest 64 bytes */ #if defined(__GNUC__) && NEED_GNUC(3,3,0) && defined(HAVE_ALIGNED_64) -#define ALIGN64 __attribute__ ((aligned(64))) +#define ALIGN64 ALIGNED(64) #else #define ALIGN64 #endif +#if defined(__GNUC__) && NEED_GNUC(4,6,0) +#define SECTION(s) __attribute__((__section__(# s))) +#endif + /* Choose cacheline alignment */ #if defined(ALIGN128) #define ALIGN_CACHELINE ALIGN128 @@ -534,9 +551,9 @@ /* Logging helpers */ extern int pr_msg(FILE *fp, const uint64_t flag, - const char *const fmt, va_list va); + const char *const fmt, va_list va) FORMAT(printf, 3, 0); extern void pr_msg_fail(const uint64_t flag, const char *name, const char *what, const int err); -extern int pr_yaml(FILE *fp, const char *const fmt, ...) __attribute__((format(printf, 2, 3))); +extern int pr_yaml(FILE *fp, const char *const fmt, ...) FORMAT(printf, 2, 3); extern void pr_yaml_runinfo(FILE *fp); extern void pr_openlog(const char *filename); extern void pr_closelog(void); @@ -1294,6 +1311,7 @@ STRESS_QSORT, STRESS_QUOTA, STRESS_RADIXSORT, + STRESS_RAWDEV, STRESS_RDRAND, STRESS_READAHEAD, STRESS_REMAP_FILE_PAGES, @@ -1863,6 +1881,10 @@ OPT_RADIXSORT_OPS, OPT_RADIXSORT_SIZE, + OPT_RAWDEV, + OPT_RAWDEV_METHOD, + OPT_RAWDEV_OPS, + OPT_RDRAND, OPT_RDRAND_OPS, @@ -2563,6 +2585,7 @@ extern int stress_ioport_supported(void); extern int stress_netlink_proc_supported(void); extern int stress_physpage_supported(void); +extern int stress_rawdev_supported(void); extern int stress_rdrand_supported(void); extern int stress_softlockup_supported(void); extern int stress_swap_supported(void); @@ -2637,6 +2660,7 @@ extern void stress_set_pty_max(const char *opt); extern void stress_set_qsort_size(const char *opt); extern void stress_set_radixsort_size(const char *opt); +extern int stress_set_rawdev_method(const char *name); extern void stress_set_readahead_bytes(const char *opt); extern int stress_set_sctp_domain(const char *opt); extern void stress_set_sctp_port(const char *opt); @@ -2949,6 +2973,7 @@ STRESS(stress_qsort); STRESS(stress_quota); STRESS(stress_radixsort); +STRESS(stress_rawdev); STRESS(stress_rdrand); STRESS(stress_readahead); STRESS(stress_remap); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-physpage.c new/stress-ng-0.09.08/stress-physpage.c --- old/stress-ng-0.09.07/stress-physpage.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-physpage.c 2017-12-31 18:19:00.000000000 +0100 @@ -148,8 +148,9 @@ inc_counter(args); } while (keep_stressing()); + if (fd_pc > 0) + (void)close(fd_pc); (void)close(fd_pm); - (void)close(fd_pc); return EXIT_SUCCESS; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-rawdev.c new/stress-ng-0.09.08/stress-rawdev.c --- old/stress-ng-0.09.07/stress-rawdev.c 1970-01-01 01:00:00.000000000 +0100 +++ new/stress-ng-0.09.08/stress-rawdev.c 2017-12-31 18:19:00.000000000 +0100 @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2013-2017 Canonical, Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * This code is a complete clean re-write of the stress tool by + * Colin Ian King <colin.k...@canonical.com> and attempts to be + * backwardly compatible with the stress tool by Amos Waterland + * <a...@rossby.metr.ou.edu> but has more stress tests and more + * functionality. + * + */ +#include "stress-ng.h" + +#if defined(__linux__) +#include <sys/types.h> +#include <sys/sysmacros.h> +#include <dirent.h> +#endif + +typedef void (*rawdev_func)(const args_t *args, const int fd, + unsigned long blks, unsigned long blksz); + +typedef struct { + const char *name; + const rawdev_func func; +} stress_rawdev_method_info_t; + +/* + * stress_rawdev_supported() + * check if we can run this as root + */ +int stress_rawdev_supported(void) +{ + if (geteuid() != 0) { + pr_inf("rawdev flood stressor will be skipped, " + "need to be running as root for this stressor\n"); + return -1; + } + return 0; +} + +#if defined(__linux__) +char *stress_rawdev_path(const dev_t dev) +{ + static char path[PATH_MAX]; + DIR *dir; + struct dirent *d; + const dev_t majdev = makedev(major(dev), 0); + + dir = opendir("/dev"); + if (!dir) + return NULL; + + while ((d = readdir(dir)) != NULL) { + int ret; + struct stat stat_buf; + + snprintf(path, sizeof(path), "/dev/%s", d->d_name); + ret = stat(path, &stat_buf); + if ((ret == 0) && + (S_ISBLK(stat_buf.st_mode)) && + (stat_buf.st_rdev == majdev)) { + (void)closedir(dir); + return path; + } + } + (void)closedir(dir); + + return NULL; +} + +void stress_rawdev_sweep( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + unsigned long i; + int ret; + char buf[blksz << 1]; + char *aligned = align_address(buf, blksz); + off_t offset; + + for (i = 0; i < blks && keep_stressing(); i += blks >> 8) { + offset = (off_t)i * (off_t)blksz; + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + } + for (; i > 0 && keep_stressing(); i -= blks >> 8) { + offset = (off_t)i * (off_t)blksz; + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + } +} + +void stress_rawdev_wiggle( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + unsigned long i; + int ret; + char buf[blksz << 1]; + char *aligned = align_address(buf, blksz); + off_t offset; + + for (i = blks >> 8; i < blks && keep_stressing(); i += blks >> 8) { + unsigned long j; + + for (j = 0; j < blks >> 8; j += blks >> 10) { + offset = (off_t)(i - j) * (off_t)blksz; + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + } + } +} + +void stress_rawdev_ends( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + unsigned long i; + int ret; + char buf[blksz << 1]; + char *aligned = align_address(buf, blksz); + off_t offset; + + for (i = 0; i < 128; i++) { + offset = (off_t)i * (off_t)blksz; + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + + offset = (off_t)(blks - (i + 1)) * (off_t)blksz; + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + } +} + +void stress_rawdev_random( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + int i; + char buf[blksz << 1]; + char *aligned = align_address(buf, blksz); + + for (i = 0; i < 256 && keep_stressing(); i++) { + int ret; + off_t offset = (off_t)blksz * (mwc64() % blks); + + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + inc_counter(args); + } +} + +void stress_rawdev_burst( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + int i; + char buf[blksz << 1]; + char *aligned = align_address(buf, blksz); + off_t blk = (mwc64() % blks); + + for (i = 0; i < 256 && keep_stressing(); i++) { + int ret; + off_t offset = blk * blksz; + + ret = pread(fd, aligned, (size_t)blksz, offset); + if (ret < 0) { + pr_err("%s: pread at %ju failed, errno=%d (%s)\n", + args->name, (intmax_t)offset, errno, strerror(errno)); + } + blk++; + blk %= blks; + inc_counter(args); + } +} + +static const stress_rawdev_method_info_t rawdev_methods[]; + +/* + * stress_rawdev_all() + * iterate over all rawdev methods + */ +static void stress_rawdev_all( + const args_t *args, + const int fd, + unsigned long blks, + unsigned long blksz) +{ + static int i = 1; /* Skip over stress_rawdev_all */ + + rawdev_methods[i++].func(args, fd, blks, blksz); + if (!rawdev_methods[i].func) + i = 1; +} + + +/* + * rawdev methods + */ +static const stress_rawdev_method_info_t rawdev_methods[] = { + { "all", stress_rawdev_all }, + { "sweep", stress_rawdev_sweep }, + { "wiggle", stress_rawdev_wiggle }, + { "ends", stress_rawdev_ends }, + { "random", stress_rawdev_random }, + { "burst", stress_rawdev_burst }, + { NULL, NULL } +}; + +#endif + +#if defined(__linux__) +/* + * stress_set_rawdev_method() + * set the default rawdev method + */ +int stress_set_rawdev_method(const char *name) +{ + stress_rawdev_method_info_t const *info; + + for (info = rawdev_methods; info->func; info++) { + if (!strcmp(info->name, name)) { + set_setting("rawdev-method", TYPE_ID_UINTPTR_T, &info); + return 0; + } + } + + (void)fprintf(stderr, "rawdev-method must be one of:"); + for (info = rawdev_methods; info->func; info++) { + (void)fprintf(stderr, " %s", info->name); + } + (void)fprintf(stderr, "\n"); + + return -1; +} +#else +/* + * stress_set_rawdev_method() + * set the default rawdev method + */ +int stress_set_rawdev_method(const char *name) +{ + fprintf(stderr, "option --rawdev-method not supported\n"); + return -1; +} +#endif + +#if defined(__linux__) + +int stress_rawdev(const args_t *args) +{ + int ret; + char path[PATH_MAX], *devpath; + struct stat stat_buf; + int fd; + unsigned long blks = 0, blksz = 0; + const stress_rawdev_method_info_t *rawdev_method = &rawdev_methods[0]; + rawdev_func func; + + stress_temp_dir_args(args, path, sizeof(path)); + + (void)get_setting("rawdev-method", &rawdev_method); + func = rawdev_method->func; + + fd = open(path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (fd < 0) { + ret = exit_status(errno); + pr_err("%s: open failed: %d (%s)\n", + args->name, errno, strerror(errno)); + return ret; + } + + ret = fstat(fd, &stat_buf); + if (ret < 0) { + pr_err("%s: cannot stat %s: errno=%d (%s)\n", + args->name, path, errno, strerror(errno)); + (void)unlink(path); + (void)close(fd); + return EXIT_FAILURE; + } + (void)unlink(path); + (void)close(fd); + + devpath = stress_rawdev_path(stat_buf.st_dev); + if (!devpath) { + pr_inf("%s: cannot determine raw block device\n", + args->name); + return EXIT_NO_RESOURCE; + } + + fd = open(devpath, O_RDONLY | O_NONBLOCK); + if (fd < 0) { + pr_inf("%s: cannot open raw block device: errno=%d (%s)\n", + args->name, errno, strerror(errno)); + return EXIT_NO_RESOURCE; + } + ret = ioctl(fd, BLKGETSIZE, &blks); + if (ret < 0) { + pr_inf("%s: cannot get block size: errno=%d (%s)\n", + args->name, errno, strerror(errno)); + (void)close(fd); + return EXIT_NO_RESOURCE; + } + ret = ioctl(fd, BLKSSZGET, &blksz); + if (ret < 0) { + pr_inf("%s: cannot get block size: errno=%d (%s)\n", + args->name, errno, strerror(errno)); + (void)close(fd); + return EXIT_NO_RESOURCE; + } + (void)close(fd); + fd = open(devpath, O_RDONLY | O_DIRECT); + if (fd < 0) { + pr_inf("%s: cannot open raw block device: errno=%d (%s)\n", + args->name, errno, strerror(errno)); + return EXIT_NO_RESOURCE; + } + + if (args->instance == 0) + pr_dbg("%s: exercising %s (%lu blocks of size %lu bytes)\n", + args->name, devpath, blks, blksz); + + do { + func(args, fd, blks, blksz); + } while (keep_stressing()); + + (void)close(fd); + + return EXIT_SUCCESS; +} +#else +int stress_rawdev(const args_t *args) +{ + return stress_not_implemented(args); +} +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-socket-diag.c new/stress-ng-0.09.08/stress-socket-diag.c --- old/stress-ng-0.09.07/stress-socket-diag.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-socket-diag.c 2017-12-31 18:19:00.000000000 +0100 @@ -94,10 +94,10 @@ static int stress_sockdiag_parse( const args_t *args, - const struct unix_diag_msg *diag, + struct unix_diag_msg *diag, unsigned int len) { - const struct rtattr *attr; + struct rtattr *attr; unsigned int rta_len; if (len < NLMSG_LENGTH(sizeof(*diag))) { @@ -111,7 +111,7 @@ } rta_len = len - NLMSG_LENGTH(sizeof(*diag)); - for (attr = (const struct rtattr *) (diag + 1); + for (attr = (struct rtattr *) (diag + 1); RTA_OK(attr, rta_len) && keep_stressing(); attr = RTA_NEXT(attr, rta_len)) { switch (attr->rta_type) { @@ -151,7 +151,7 @@ .msg_iov = &iov, .msg_iovlen = 1 }; - const struct nlmsghdr *h = (struct nlmsghdr *)buf; + struct nlmsghdr *h = (struct nlmsghdr *)buf; ret = recvmsg(fd, &msg, flags); if (ret == 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-timer.c new/stress-ng-0.09.08/stress-timer.c --- old/stress-ng-0.09.07/stress-timer.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-timer.c 2017-12-31 18:19:00.000000000 +0100 @@ -79,7 +79,7 @@ * stress_timer_keep_stressing() * returns true if we can keep on running a stressor */ -bool HOT OPTIMIZE3 stress_timer_keep_stressing(void) +static bool HOT OPTIMIZE3 stress_timer_keep_stressing(void) { return (LIKELY(g_keep_stressing_flag) && LIKELY(!max_ops || (timer_counter < max_ops))); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-tlb-shootdown.c new/stress-ng-0.09.08/stress-tlb-shootdown.c --- old/stress-ng-0.09.07/stress-tlb-shootdown.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-tlb-shootdown.c 2017-12-31 18:19:00.000000000 +0100 @@ -39,6 +39,12 @@ const size_t page_size = args->page_size; const size_t mmap_size = page_size * MMAP_PAGES; pid_t pids[MAX_TLB_PROCS]; + cpu_set_t proc_mask_initial; + + if (sched_getaffinity(0, sizeof(proc_mask_initial), &proc_mask_initial) < 0) { + pr_fail_err("could not get CPU affinity"); + return EXIT_FAILURE; + } do { uint8_t *mem, *ptr; @@ -47,10 +53,7 @@ int32_t tlb_procs, i; const int32_t max_cpus = stress_get_processors_configured(); - if (sched_getaffinity(0, sizeof(proc_mask), &proc_mask) < 0) { - pr_fail_err("could not get CPU affinity"); - return EXIT_FAILURE; - } + CPU_OR(&proc_mask, &proc_mask_initial, &proc_mask); tlb_procs = max_cpus; if (tlb_procs > MAX_TLB_PROCS) @@ -113,13 +116,29 @@ for (i = 0; i < tlb_procs; i++) { if (pids[i] != -1) { - int status; + int status, ret; + + ret = waitpid(pids[i], &status, 0); + if ((ret < 0) && (errno == EINTR)) { + int j; + + /* + * We got interrupted, so assume + * it was the alarm (timedout) or + * SIGINT so force terminate + */ + for (j = i; j < tlb_procs; j++) + (void)kill(pids[j], SIGKILL); - (void)kill(pids[i], SIGKILL); - (void)waitpid(pids[i], &status, 0); + /* re-wait on the failed wait */ + (void)waitpid(pids[i], &status, 0); + + /* and continue waitpid on the pids */ + } } } (void)munmap(mem, mmap_size); + (void)sched_setaffinity(0, sizeof(proc_mask_initial), &proc_mask_initial); inc_counter(args); } while (keep_stressing()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-vecmath.c new/stress-ng-0.09.08/stress-vecmath.c --- old/stress-ng-0.09.07/stress-vecmath.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-vecmath.c 2017-12-31 18:19:00.000000000 +0100 @@ -174,7 +174,7 @@ uint64_put(a64[0] + a64[1]); #if defined(STRESS_INT128) - uint64_put((a128[0] >> 64) || (a128[0] & 0xffffffffffffULL)); + uint128_put(a128[0]); #endif return EXIT_SUCCESS; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-vm.c new/stress-ng-0.09.08/stress-vm.c --- old/stress-ng-0.09.07/stress-vm.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-vm.c 2017-12-31 18:19:00.000000000 +0100 @@ -92,7 +92,7 @@ * keep_stressing() * returns true if we can keep on running a stressor */ -bool HOT OPTIMIZE3 keep_stressing_vm(const args_t *args) +static bool HOT OPTIMIZE3 keep_stressing_vm(const args_t *args) { return (LIKELY(g_keep_stressing_flag) && LIKELY(!args->max_ops || ((*args->counter >> VM_BOGO_SHIFT) < args->max_ops))); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/stress-wcstr.c new/stress-ng-0.09.08/stress-wcstr.c --- old/stress-ng-0.09.07/stress-wcstr.c 2017-12-14 19:17:52.000000000 +0100 +++ new/stress-ng-0.09.08/stress-wcstr.c 2017-12-31 18:19:00.000000000 +0100 @@ -25,8 +25,6 @@ */ #include "stress-ng.h" -#include <wchar.h> - #define STR1LEN 256 #define STR2LEN 128 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/test/test-bsd-wchar.c new/stress-ng-0.09.08/test/test-bsd-wchar.c --- old/stress-ng-0.09.07/test/test-bsd-wchar.c 1970-01-01 01:00:00.000000000 +0100 +++ new/stress-ng-0.09.08/test/test-bsd-wchar.c 2017-12-31 18:19:00.000000000 +0100 @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016-2017 Canonical, Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * This code is a complete clean re-write of the stress tool by + * Colin Ian King <colin.k...@canonical.com> and attempts to be + * backwardly compatible with the stress tool by Amos Waterland + * <a...@rossby.metr.ou.edu> but has more stress tests and more + * functionality. + * + */ +#include <bsd/wchar.h> + +int main(void) +{ + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/stress-ng-0.09.07/test/test-wchar.c new/stress-ng-0.09.08/test/test-wchar.c --- old/stress-ng-0.09.07/test/test-wchar.c 1970-01-01 01:00:00.000000000 +0100 +++ new/stress-ng-0.09.08/test/test-wchar.c 2017-12-31 18:19:00.000000000 +0100 @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016-2017 Canonical, Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * This code is a complete clean re-write of the stress tool by + * Colin Ian King <colin.k...@canonical.com> and attempts to be + * backwardly compatible with the stress tool by Amos Waterland + * <a...@rossby.metr.ou.edu> but has more stress tests and more + * functionality. + * + */ +#include <wchar.h> + +int main(void) +{ + return 0; +}