xref: /freebsd/tools/test/stress2/misc/syzkaller21.sh (revision 8a272653d9fbd9fc37691c9aad6a05089b4ecb4d)
1*8a272653SPeter Holm#!/bin/sh
2*8a272653SPeter Holm
3*8a272653SPeter Holm# $ pgrep syzkaller21 | xargs ps -lHp
4*8a272653SPeter Holm# UID  PID PPID CPU PRI NI   VSZ  RSS MWCHAN STAT TT     TIME COMMAND
5*8a272653SPeter Holm#   0 3891    1   0  20  0 29828 2852 -      T     0  0:00,14 ./syzkaller21
6*8a272653SPeter Holm#   0 3891    1   0  52  0 29828 2852 ufs    T     0  0:00,00 ./syzkaller21
7*8a272653SPeter Holm#   0 3891    1   0  52  0 29828 2852 ufs    T     0  0:00,00 ./syzkaller21
8*8a272653SPeter Holm# $ pgrep syzkaller21 | xargs procstat -k
9*8a272653SPeter Holm#   PID    TID COMM                TDNAME              KSTACK
10*8a272653SPeter Holm#  3891 100250 syzkaller21         -                   mi_switch thread_suspend_switch thread_single exit1 sys_sys_exit amd64_syscall fast_syscall_common
11*8a272653SPeter Holm#  3891 100777 syzkaller21         -                   mi_switch sleepq_switch sleeplk lockmgr_xlock_hard ffs_lock VOP_LOCK1_APV _vn_lock vget_finish vfs_hash_get ffs_vgetf softdep_sync_buf ffs_syncvnode ffs_fsync VOP_FSYNC_APV kern_fsync amd64_syscall fast_syscall_common
12*8a272653SPeter Holm#  3891 100778 syzkaller21         -                   mi_switch sleepq_switch sleeplk lockmgr_slock_hard ffs_lock VOP_LOCK1_APV _vn_lock vget_finish cache_lookup vfs_cache_lookup VOP_LOOKUP_APV lookup namei kern_chdir amd64_syscall fast_syscall_common
13*8a272653SPeter Holm# $ uname -a
14*8a272653SPeter Holm# FreeBSD t2.osted.lan 13.0-CURRENT FreeBSD 13.0-CURRENT #5 r363786M: Tue Aug  4 16:51:52 CEST 2020
15*8a272653SPeter Holm# pho@t2.osted.lan:/usr/src/sys/amd64/compile/PHO  amd64
16*8a272653SPeter Holm# $
17*8a272653SPeter Holm
18*8a272653SPeter Holm[ `uname -p` != "amd64" ] && exit 0
19*8a272653SPeter Holm
20*8a272653SPeter Holm. ../default.cfg
21*8a272653SPeter Holmcat > /tmp/syzkaller21.c <<EOF
22*8a272653SPeter Holm// autogenerated by syzkaller (https://github.com/google/syzkaller)
23*8a272653SPeter Holm
24*8a272653SPeter Holm#define _GNU_SOURCE
25*8a272653SPeter Holm
26*8a272653SPeter Holm#include <sys/types.h>
27*8a272653SPeter Holm
28*8a272653SPeter Holm#include <dirent.h>
29*8a272653SPeter Holm#include <errno.h>
30*8a272653SPeter Holm#include <pthread.h>
31*8a272653SPeter Holm#include <pwd.h>
32*8a272653SPeter Holm#include <setjmp.h>
33*8a272653SPeter Holm#include <signal.h>
34*8a272653SPeter Holm#include <stdarg.h>
35*8a272653SPeter Holm#include <stdbool.h>
36*8a272653SPeter Holm#include <stdint.h>
37*8a272653SPeter Holm#include <stdio.h>
38*8a272653SPeter Holm#include <stdlib.h>
39*8a272653SPeter Holm#include <string.h>
40*8a272653SPeter Holm#include <sys/endian.h>
41*8a272653SPeter Holm#include <sys/stat.h>
42*8a272653SPeter Holm#include <sys/syscall.h>
43*8a272653SPeter Holm#include <sys/wait.h>
44*8a272653SPeter Holm#include <time.h>
45*8a272653SPeter Holm#include <unistd.h>
46*8a272653SPeter Holm
47*8a272653SPeter Holmstatic __thread int skip_segv;
48*8a272653SPeter Holmstatic __thread jmp_buf segv_env;
49*8a272653SPeter Holm
50*8a272653SPeter Holmstatic void segv_handler(int sig, siginfo_t* info, void* ctx __unused)
51*8a272653SPeter Holm{
52*8a272653SPeter Holm  uintptr_t addr = (uintptr_t)info->si_addr;
53*8a272653SPeter Holm  const uintptr_t prog_start = 1 << 20;
54*8a272653SPeter Holm  const uintptr_t prog_end = 100 << 20;
55*8a272653SPeter Holm  if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) &&
56*8a272653SPeter Holm      (addr < prog_start || addr > prog_end)) {
57*8a272653SPeter Holm    _longjmp(segv_env, 1);
58*8a272653SPeter Holm  }
59*8a272653SPeter Holm  exit(sig);
60*8a272653SPeter Holm}
61*8a272653SPeter Holm
62*8a272653SPeter Holmstatic void install_segv_handler(void)
63*8a272653SPeter Holm{
64*8a272653SPeter Holm  struct sigaction sa;
65*8a272653SPeter Holm  memset(&sa, 0, sizeof(sa));
66*8a272653SPeter Holm  sa.sa_sigaction = segv_handler;
67*8a272653SPeter Holm  sa.sa_flags = SA_NODEFER | SA_SIGINFO;
68*8a272653SPeter Holm  sigaction(SIGSEGV, &sa, NULL);
69*8a272653SPeter Holm  sigaction(SIGBUS, &sa, NULL);
70*8a272653SPeter Holm}
71*8a272653SPeter Holm
72*8a272653SPeter Holm#define NONFAILING(...)                                                        \
73*8a272653SPeter Holm  {                                                                            \
74*8a272653SPeter Holm    __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
75*8a272653SPeter Holm    if (_setjmp(segv_env) == 0) {                                              \
76*8a272653SPeter Holm      __VA_ARGS__;                                                             \
77*8a272653SPeter Holm    }                                                                          \
78*8a272653SPeter Holm    __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
79*8a272653SPeter Holm  }
80*8a272653SPeter Holm
81*8a272653SPeter Holmstatic void kill_and_wait(int pid, int* status)
82*8a272653SPeter Holm{
83*8a272653SPeter Holm  kill(pid, SIGKILL);
84*8a272653SPeter Holm  while (waitpid(-1, status, 0) != pid) {
85*8a272653SPeter Holm  }
86*8a272653SPeter Holm}
87*8a272653SPeter Holm
88*8a272653SPeter Holmstatic void sleep_ms(uint64_t ms)
89*8a272653SPeter Holm{
90*8a272653SPeter Holm  usleep(ms * 1000);
91*8a272653SPeter Holm}
92*8a272653SPeter Holm
93*8a272653SPeter Holmstatic uint64_t current_time_ms(void)
94*8a272653SPeter Holm{
95*8a272653SPeter Holm  struct timespec ts;
96*8a272653SPeter Holm  if (clock_gettime(CLOCK_MONOTONIC, &ts))
97*8a272653SPeter Holm    exit(1);
98*8a272653SPeter Holm  return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
99*8a272653SPeter Holm}
100*8a272653SPeter Holm
101*8a272653SPeter Holmstatic void use_temporary_dir(void)
102*8a272653SPeter Holm{
103*8a272653SPeter Holm  char tmpdir_template[] = "./syzkaller.XXXXXX";
104*8a272653SPeter Holm  char* tmpdir = mkdtemp(tmpdir_template);
105*8a272653SPeter Holm  if (!tmpdir)
106*8a272653SPeter Holm    exit(1);
107*8a272653SPeter Holm  if (chmod(tmpdir, 0777))
108*8a272653SPeter Holm    exit(1);
109*8a272653SPeter Holm  if (chdir(tmpdir))
110*8a272653SPeter Holm    exit(1);
111*8a272653SPeter Holm}
112*8a272653SPeter Holm
113*8a272653SPeter Holmstatic void remove_dir(const char* dir)
114*8a272653SPeter Holm{
115*8a272653SPeter Holm  DIR* dp;
116*8a272653SPeter Holm  struct dirent* ep;
117*8a272653SPeter Holm  dp = opendir(dir);
118*8a272653SPeter Holm  if (dp == NULL)
119*8a272653SPeter Holm    exit(1);
120*8a272653SPeter Holm  while ((ep = readdir(dp))) {
121*8a272653SPeter Holm    if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
122*8a272653SPeter Holm      continue;
123*8a272653SPeter Holm    char filename[FILENAME_MAX];
124*8a272653SPeter Holm    snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name);
125*8a272653SPeter Holm    struct stat st;
126*8a272653SPeter Holm    if (lstat(filename, &st))
127*8a272653SPeter Holm      exit(1);
128*8a272653SPeter Holm    if (S_ISDIR(st.st_mode)) {
129*8a272653SPeter Holm      remove_dir(filename);
130*8a272653SPeter Holm      continue;
131*8a272653SPeter Holm    }
132*8a272653SPeter Holm    if (unlink(filename))
133*8a272653SPeter Holm      exit(1);
134*8a272653SPeter Holm  }
135*8a272653SPeter Holm  closedir(dp);
136*8a272653SPeter Holm  if (rmdir(dir))
137*8a272653SPeter Holm    exit(1);
138*8a272653SPeter Holm}
139*8a272653SPeter Holm
140*8a272653SPeter Holmstatic void thread_start(void* (*fn)(void*), void* arg)
141*8a272653SPeter Holm{
142*8a272653SPeter Holm  pthread_t th;
143*8a272653SPeter Holm  pthread_attr_t attr;
144*8a272653SPeter Holm  pthread_attr_init(&attr);
145*8a272653SPeter Holm  pthread_attr_setstacksize(&attr, 128 << 10);
146*8a272653SPeter Holm  int i;
147*8a272653SPeter Holm  for (i = 0; i < 100; i++) {
148*8a272653SPeter Holm    if (pthread_create(&th, &attr, fn, arg) == 0) {
149*8a272653SPeter Holm      pthread_attr_destroy(&attr);
150*8a272653SPeter Holm      return;
151*8a272653SPeter Holm    }
152*8a272653SPeter Holm    if (errno == EAGAIN) {
153*8a272653SPeter Holm      usleep(50);
154*8a272653SPeter Holm      continue;
155*8a272653SPeter Holm    }
156*8a272653SPeter Holm    break;
157*8a272653SPeter Holm  }
158*8a272653SPeter Holm  exit(1);
159*8a272653SPeter Holm}
160*8a272653SPeter Holm
161*8a272653SPeter Holmtypedef struct {
162*8a272653SPeter Holm  pthread_mutex_t mu;
163*8a272653SPeter Holm  pthread_cond_t cv;
164*8a272653SPeter Holm  int state;
165*8a272653SPeter Holm} event_t;
166*8a272653SPeter Holm
167*8a272653SPeter Holmstatic void event_init(event_t* ev)
168*8a272653SPeter Holm{
169*8a272653SPeter Holm  if (pthread_mutex_init(&ev->mu, 0))
170*8a272653SPeter Holm    exit(1);
171*8a272653SPeter Holm  if (pthread_cond_init(&ev->cv, 0))
172*8a272653SPeter Holm    exit(1);
173*8a272653SPeter Holm  ev->state = 0;
174*8a272653SPeter Holm}
175*8a272653SPeter Holm
176*8a272653SPeter Holmstatic void event_reset(event_t* ev)
177*8a272653SPeter Holm{
178*8a272653SPeter Holm  ev->state = 0;
179*8a272653SPeter Holm}
180*8a272653SPeter Holm
181*8a272653SPeter Holmstatic void event_set(event_t* ev)
182*8a272653SPeter Holm{
183*8a272653SPeter Holm  pthread_mutex_lock(&ev->mu);
184*8a272653SPeter Holm  if (ev->state)
185*8a272653SPeter Holm    exit(1);
186*8a272653SPeter Holm  ev->state = 1;
187*8a272653SPeter Holm  pthread_mutex_unlock(&ev->mu);
188*8a272653SPeter Holm  pthread_cond_broadcast(&ev->cv);
189*8a272653SPeter Holm}
190*8a272653SPeter Holm
191*8a272653SPeter Holmstatic void event_wait(event_t* ev)
192*8a272653SPeter Holm{
193*8a272653SPeter Holm  pthread_mutex_lock(&ev->mu);
194*8a272653SPeter Holm  while (!ev->state)
195*8a272653SPeter Holm    pthread_cond_wait(&ev->cv, &ev->mu);
196*8a272653SPeter Holm  pthread_mutex_unlock(&ev->mu);
197*8a272653SPeter Holm}
198*8a272653SPeter Holm
199*8a272653SPeter Holmstatic int event_isset(event_t* ev)
200*8a272653SPeter Holm{
201*8a272653SPeter Holm  pthread_mutex_lock(&ev->mu);
202*8a272653SPeter Holm  int res = ev->state;
203*8a272653SPeter Holm  pthread_mutex_unlock(&ev->mu);
204*8a272653SPeter Holm  return res;
205*8a272653SPeter Holm}
206*8a272653SPeter Holm
207*8a272653SPeter Holmstatic int event_timedwait(event_t* ev, uint64_t timeout)
208*8a272653SPeter Holm{
209*8a272653SPeter Holm  uint64_t start = current_time_ms();
210*8a272653SPeter Holm  uint64_t now = start;
211*8a272653SPeter Holm  pthread_mutex_lock(&ev->mu);
212*8a272653SPeter Holm  for (;;) {
213*8a272653SPeter Holm    if (ev->state)
214*8a272653SPeter Holm      break;
215*8a272653SPeter Holm    uint64_t remain = timeout - (now - start);
216*8a272653SPeter Holm    struct timespec ts;
217*8a272653SPeter Holm    ts.tv_sec = remain / 1000;
218*8a272653SPeter Holm    ts.tv_nsec = (remain % 1000) * 1000 * 1000;
219*8a272653SPeter Holm    pthread_cond_timedwait(&ev->cv, &ev->mu, &ts);
220*8a272653SPeter Holm    now = current_time_ms();
221*8a272653SPeter Holm    if (now - start > timeout)
222*8a272653SPeter Holm      break;
223*8a272653SPeter Holm  }
224*8a272653SPeter Holm  int res = ev->state;
225*8a272653SPeter Holm  pthread_mutex_unlock(&ev->mu);
226*8a272653SPeter Holm  return res;
227*8a272653SPeter Holm}
228*8a272653SPeter Holm
229*8a272653SPeter Holmstruct thread_t {
230*8a272653SPeter Holm  int created, call;
231*8a272653SPeter Holm  event_t ready, done;
232*8a272653SPeter Holm};
233*8a272653SPeter Holm
234*8a272653SPeter Holmstatic struct thread_t threads[16];
235*8a272653SPeter Holmstatic void execute_call(int call);
236*8a272653SPeter Holmstatic int running;
237*8a272653SPeter Holm
238*8a272653SPeter Holmstatic void* thr(void* arg)
239*8a272653SPeter Holm{
240*8a272653SPeter Holm  struct thread_t* th = (struct thread_t*)arg;
241*8a272653SPeter Holm  for (;;) {
242*8a272653SPeter Holm    event_wait(&th->ready);
243*8a272653SPeter Holm    event_reset(&th->ready);
244*8a272653SPeter Holm    execute_call(th->call);
245*8a272653SPeter Holm    __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
246*8a272653SPeter Holm    event_set(&th->done);
247*8a272653SPeter Holm  }
248*8a272653SPeter Holm  return 0;
249*8a272653SPeter Holm}
250*8a272653SPeter Holm
251*8a272653SPeter Holmstatic void execute_one(void)
252*8a272653SPeter Holm{
253*8a272653SPeter Holm  int i, call, thread;
254*8a272653SPeter Holm  int collide = 0;
255*8a272653SPeter Holmagain:
256*8a272653SPeter Holm  for (call = 0; call < 9; call++) {
257*8a272653SPeter Holm    for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
258*8a272653SPeter Holm         thread++) {
259*8a272653SPeter Holm      struct thread_t* th = &threads[thread];
260*8a272653SPeter Holm      if (!th->created) {
261*8a272653SPeter Holm        th->created = 1;
262*8a272653SPeter Holm        event_init(&th->ready);
263*8a272653SPeter Holm        event_init(&th->done);
264*8a272653SPeter Holm        event_set(&th->done);
265*8a272653SPeter Holm        thread_start(thr, th);
266*8a272653SPeter Holm      }
267*8a272653SPeter Holm      if (!event_isset(&th->done))
268*8a272653SPeter Holm        continue;
269*8a272653SPeter Holm      event_reset(&th->done);
270*8a272653SPeter Holm      th->call = call;
271*8a272653SPeter Holm      __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
272*8a272653SPeter Holm      event_set(&th->ready);
273*8a272653SPeter Holm      if (collide && (call % 2) == 0)
274*8a272653SPeter Holm        break;
275*8a272653SPeter Holm      event_timedwait(&th->done, 45);
276*8a272653SPeter Holm      break;
277*8a272653SPeter Holm    }
278*8a272653SPeter Holm  }
279*8a272653SPeter Holm  for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
280*8a272653SPeter Holm    sleep_ms(1);
281*8a272653SPeter Holm  if (!collide) {
282*8a272653SPeter Holm    collide = 1;
283*8a272653SPeter Holm    goto again;
284*8a272653SPeter Holm  }
285*8a272653SPeter Holm}
286*8a272653SPeter Holm
287*8a272653SPeter Holmstatic void execute_one(void);
288*8a272653SPeter Holm
289*8a272653SPeter Holm#define WAIT_FLAGS 0
290*8a272653SPeter Holm
291*8a272653SPeter Holmstatic void loop(void)
292*8a272653SPeter Holm{
293*8a272653SPeter Holm  int iter;
294*8a272653SPeter Holm  for (iter = 0;; iter++) {
295*8a272653SPeter Holm    char cwdbuf[32];
296*8a272653SPeter Holm    sprintf(cwdbuf, "./%d", iter);
297*8a272653SPeter Holm    if (mkdir(cwdbuf, 0777))
298*8a272653SPeter Holm      exit(1);
299*8a272653SPeter Holm    int pid = fork();
300*8a272653SPeter Holm    if (pid < 0)
301*8a272653SPeter Holm      exit(1);
302*8a272653SPeter Holm    if (pid == 0) {
303*8a272653SPeter Holm      if (chdir(cwdbuf))
304*8a272653SPeter Holm        exit(1);
305*8a272653SPeter Holm      execute_one();
306*8a272653SPeter Holm      exit(0);
307*8a272653SPeter Holm    }
308*8a272653SPeter Holm    int status = 0;
309*8a272653SPeter Holm    uint64_t start = current_time_ms();
310*8a272653SPeter Holm    for (;;) {
311*8a272653SPeter Holm      if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
312*8a272653SPeter Holm        break;
313*8a272653SPeter Holm      sleep_ms(1);
314*8a272653SPeter Holm      if (current_time_ms() - start < 5 * 1000)
315*8a272653SPeter Holm        continue;
316*8a272653SPeter Holm      kill_and_wait(pid, &status);
317*8a272653SPeter Holm      break;
318*8a272653SPeter Holm    }
319*8a272653SPeter Holm    remove_dir(cwdbuf);
320*8a272653SPeter Holm  }
321*8a272653SPeter Holm}
322*8a272653SPeter Holm
323*8a272653SPeter Holmuint64_t r[4] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
324*8a272653SPeter Holm                 0xffffffffffffffff};
325*8a272653SPeter Holm
326*8a272653SPeter Holmvoid execute_call(int call)
327*8a272653SPeter Holm{
328*8a272653SPeter Holm  intptr_t res = 0;
329*8a272653SPeter Holm  switch (call) {
330*8a272653SPeter Holm  case 0:
331*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000000, ".\000", 2));
332*8a272653SPeter Holm    res = syscall(SYS_open, 0x20000000ul, 0ul, 0ul);
333*8a272653SPeter Holm    if (res != -1)
334*8a272653SPeter Holm      r[0] = res;
335*8a272653SPeter Holm    break;
336*8a272653SPeter Holm  case 1:
337*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000040, "./file0\000", 8));
338*8a272653SPeter Holm    syscall(SYS_mkdirat, r[0], 0x20000040ul, 0ul);
339*8a272653SPeter Holm    break;
340*8a272653SPeter Holm  case 2:
341*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000000, ".\000", 2));
342*8a272653SPeter Holm    res = syscall(SYS_open, 0x20000000ul, 0ul, 0ul);
343*8a272653SPeter Holm    if (res != -1)
344*8a272653SPeter Holm      r[1] = res;
345*8a272653SPeter Holm    break;
346*8a272653SPeter Holm  case 3:
347*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000040, "./file1\000", 8));
348*8a272653SPeter Holm    syscall(SYS_mkdirat, r[1], 0x20000040ul, 0ul);
349*8a272653SPeter Holm    break;
350*8a272653SPeter Holm  case 4:
351*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000000, ".\000", 2));
352*8a272653SPeter Holm    res = syscall(SYS_open, 0x20000000ul, 0ul, 0ul);
353*8a272653SPeter Holm    if (res != -1)
354*8a272653SPeter Holm      r[2] = res;
355*8a272653SPeter Holm    break;
356*8a272653SPeter Holm  case 5:
357*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000080, "./file1\000", 8));
358*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x200000c0, "./file0/file0\000", 14));
359*8a272653SPeter Holm    syscall(SYS_renameat, r[1], 0x20000080ul, r[2], 0x200000c0ul);
360*8a272653SPeter Holm    break;
361*8a272653SPeter Holm  case 6:
362*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000100, "./file0/file0\000", 14));
363*8a272653SPeter Holm    res = syscall(SYS_open, 0x20000100ul, 0ul, 0ul);
364*8a272653SPeter Holm    if (res != -1)
365*8a272653SPeter Holm      r[3] = res;
366*8a272653SPeter Holm    break;
367*8a272653SPeter Holm  case 7:
368*8a272653SPeter Holm    syscall(SYS_fsync, r[3]);
369*8a272653SPeter Holm    break;
370*8a272653SPeter Holm  case 8:
371*8a272653SPeter Holm    NONFAILING(memcpy((void*)0x20000140, "./file0/file0\000", 14));
372*8a272653SPeter Holm    syscall(SYS_chdir, 0x20000140ul);
373*8a272653SPeter Holm    break;
374*8a272653SPeter Holm  }
375*8a272653SPeter Holm}
376*8a272653SPeter Holmint main(void)
377*8a272653SPeter Holm{
378*8a272653SPeter Holm  syscall(SYS_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x1012ul, -1, 0ul);
379*8a272653SPeter Holm  install_segv_handler();
380*8a272653SPeter Holm  use_temporary_dir();
381*8a272653SPeter Holm  loop();
382*8a272653SPeter Holm  return 0;
383*8a272653SPeter Holm}
384*8a272653SPeter HolmEOF
385*8a272653SPeter Holmmycc -o /tmp/syzkaller21 -Wall -Wextra -O2 /tmp/syzkaller21.c -lpthread ||
386*8a272653SPeter Holm    exit 1
387*8a272653SPeter Holm
388*8a272653SPeter Holm(cd ../testcases/swap; ./swap -t 1m -i 20 -h > /dev/null 2>&1) &
389*8a272653SPeter Holm(cd /tmp; ./syzkaller21) &
390*8a272653SPeter Holmsleep 60
391*8a272653SPeter Holmwhile pkill swap; do sleep .2; done
392*8a272653SPeter Holmpkill -9 syzkaller21
393*8a272653SPeter Holmsleep .5
394*8a272653SPeter Holmif pgrep -q syzkaller21; then
395*8a272653SPeter Holm	pgrep syzkaller21 | xargs ps -lHp
396*8a272653SPeter Holm	pgrep syzkaller21 | xargs procstat -k
397*8a272653SPeter Holm	exit 1
398*8a272653SPeter Holmfi
399*8a272653SPeter Holmwait
400*8a272653SPeter Holm
401*8a272653SPeter Holmrm -rf /tmp/syzkaller21.*
402*8a272653SPeter Holmrm -f /tmp/syzkaller21
403*8a272653SPeter Holmexit 0
404