xref: /freebsd/tools/test/stress2/misc/signal0.sh (revision 8a272653d9fbd9fc37691c9aad6a05089b4ecb4d)
1*8a272653SPeter Holm#!/bin/sh
2*8a272653SPeter Holm
3*8a272653SPeter Holm#
4*8a272653SPeter Holm# Copyright (c) 2013 EMC Corp.
5*8a272653SPeter Holm# All rights reserved.
6*8a272653SPeter Holm#
7*8a272653SPeter Holm# Redistribution and use in source and binary forms, with or without
8*8a272653SPeter Holm# modification, are permitted provided that the following conditions
9*8a272653SPeter Holm# are met:
10*8a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright
11*8a272653SPeter Holm#    notice, this list of conditions and the following disclaimer.
12*8a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
13*8a272653SPeter Holm#    notice, this list of conditions and the following disclaimer in the
14*8a272653SPeter Holm#    documentation and/or other materials provided with the distribution.
15*8a272653SPeter Holm#
16*8a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*8a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*8a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*8a272653SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*8a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*8a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*8a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*8a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*8a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*8a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8a272653SPeter Holm# SUCH DAMAGE.
27*8a272653SPeter Holm#
28*8a272653SPeter Holm
29*8a272653SPeter Holm# Zero signal number seen.
30*8a272653SPeter Holm# Test scenario by Vitaly Magerya <vmagerya gmail com>
31*8a272653SPeter Holm# http://people.freebsd.org/~pho/stress/log/kostik646.txt
32*8a272653SPeter Holm# Panic fixed in r258497
33*8a272653SPeter Holm# Signal number fixed in r258499
34*8a272653SPeter Holm
35*8a272653SPeter Holm# panic: vm_fault: fault on nofault entry, addr: cdbbe000
36*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/kostik838.txt
37*8a272653SPeter Holm# Fixed by r289661.
38*8a272653SPeter Holm
39*8a272653SPeter Holmdir=/tmp
40*8a272653SPeter Holmodir=`pwd`
41*8a272653SPeter Holmcd $dir
42*8a272653SPeter Holmsed '1,/^EOF/d' < $odir/$0 > $dir/signal0.c
43*8a272653SPeter Holmc99 -o signal0  signal0.c -lpthread || exit 1
44*8a272653SPeter Holmrm -f signal0.c
45*8a272653SPeter Holmcd $odir
46*8a272653SPeter Holm
47*8a272653SPeter Holm(cd ../testcases/swap; ./swap -t 5m -i 20 -h -v) > /dev/null 2>&1 &
48*8a272653SPeter Holms=0
49*8a272653SPeter Holm# The timeout was added after r345702, due to a longer runtime for
50*8a272653SPeter Holm# an INVARIANTS kernel
51*8a272653SPeter Holmstart=`date +%s`
52*8a272653SPeter Holmfor i in `jot 500`; do
53*8a272653SPeter Holm	/tmp/signal0 || { s=1; break; }
54*8a272653SPeter Holm	[ $((`date +%s` - start)) -gt 900 ] &&
55*8a272653SPeter Holm	    { echo "Timeout @ loop $i/500"; s=1; break; }
56*8a272653SPeter Holmdone
57*8a272653SPeter Holmwhile pkill -9 swap; do :; done
58*8a272653SPeter Holmwait
59*8a272653SPeter Holm
60*8a272653SPeter Holmrm -f /tmp/signal0
61*8a272653SPeter Holmexit $s
62*8a272653SPeter Holm
63*8a272653SPeter HolmEOF
64*8a272653SPeter Holm#include <pthread.h>
65*8a272653SPeter Holm#include <signal.h>
66*8a272653SPeter Holm#include <stdio.h>
67*8a272653SPeter Holm#include <stdlib.h>
68*8a272653SPeter Holm
69*8a272653SPeter Holm#define N 3000
70*8a272653SPeter Holm
71*8a272653SPeter Holmstatic void
72*8a272653SPeter Holmsignal_handler(int signum, siginfo_t *si, void *context) {
73*8a272653SPeter Holm	if (signum != SIGUSR1) {
74*8a272653SPeter Holm		printf("FAIL bad signal, signum=%d\n", signum);
75*8a272653SPeter Holm		exit(1);
76*8a272653SPeter Holm	}
77*8a272653SPeter Holm}
78*8a272653SPeter Holm
79*8a272653SPeter Holmstatic void
80*8a272653SPeter Holm*thread_func(void *arg) {
81*8a272653SPeter Holm	return arg;
82*8a272653SPeter Holm}
83*8a272653SPeter Holm
84*8a272653SPeter Holmint
85*8a272653SPeter Holmmain(void)
86*8a272653SPeter Holm{
87*8a272653SPeter Holm	struct sigaction sa = { 0 };
88*8a272653SPeter Holm
89*8a272653SPeter Holm	sa.sa_flags = SA_SIGINFO;
90*8a272653SPeter Holm	sa.sa_sigaction = signal_handler;
91*8a272653SPeter Holm	if (sigfillset(&sa.sa_mask) != 0) abort();
92*8a272653SPeter Holm	if (sigaction(SIGUSR1, &sa, NULL) != 0) abort();
93*8a272653SPeter Holm	for (int i = 0; i < N; i++) {
94*8a272653SPeter Holm		pthread_t t;
95*8a272653SPeter Holm
96*8a272653SPeter Holm		if (pthread_create(&t, NULL, thread_func, NULL) == 0)
97*8a272653SPeter Holm			pthread_kill(t, SIGUSR1);
98*8a272653SPeter Holm
99*8a272653SPeter Holm	}
100*8a272653SPeter Holm
101*8a272653SPeter Holm	return (0);
102*8a272653SPeter Holm}
103