log_test "Device delete"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
 }
 
 trap cleanup EXIT
 
 
        log_test "Ingress RIF disabled"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        ip link set dev $rp1 nomaster
        __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
        ip link del dev br0 type bridge
 
        log_test "Egress RIF disabled"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
        ip link del dev br0 type bridge
        devlink_trap_action_set $trap_name "drop"
 
 
        mtu_restore $rp2
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
 }
 
 
        log_test "TTL value is too small: TTL=$ttl_val"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
 }
 
 
        log_test "Multicast reverse path forwarding: $desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower
 }
 
 
        log_test "Reject route: $desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        ip route del unreachable $unreachable
        tc filter del dev $h1 ingress protocol $proto pref 1 handle 101 flower
 }
 
        log_test "LPM miss: IPv4"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        vrf_without_routes_destroy
 }
 
 
        log_test "LPM miss: IPv6"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        vrf_without_routes_destroy
 }
 
 
 
        log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
 }
 
 
        log_test "$desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
 }
 
 
 
        log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
 }
 
 
        log_test "$desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
 }
 
 
 
        log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
 }
 
 
        log_test "$desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
 }
 
 
 
        log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
 }
 
 
        log_test "$desc"
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
 }
 
 
 
 psample_capture_stop()
 {
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
 }
 
 __tc_sample_rate_test()
        backlog=$(tc -j -p -s qdisc show dev $rp2 | jq '.[0]["backlog"]')
 
        # Kill mausezahn.
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
 
        psample_capture_stop
 
 
        sleep 1
        $IP route add $route dev dummy1
        sleep 1
-       kill %% && wait %% &> /dev/null
+       kill_process %%
 
        route_notify_check $outfile $expected_num_notifications $offload_failed
        rm -f $outfile
        sleep 1
        $IP route del $route dev dummy1
        sleep 1
-       kill %% && wait %% &> /dev/null
+       kill_process %%
 
        route_notify_check $outfile $expected_num_notifications
        rm -f $outfile
        sleep 1
        $IP route replace $route dev dummy2
        sleep 1
-       kill %% && wait %% &> /dev/null
+       kill_process %%
 
        route_notify_check $outfile $expected_num_notifications
        rm -f $outfile
 
 
        rm ${dir}/packets.pcap
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        timeout 5 dwdump -o sw -w ${dir}/packets.pcap
        (( $(tshark -r ${dir}/packets.pcap \
                -Y 'ip.dst == 192.0.2.10' 2> /dev/null | wc -l) == 0))
 
 
        log_test $ret 0 "ipv6 route add notify"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
 
        #rm errors.txt
 
 
        log_test $ret 0 "ipv4 route add notify"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
 
        rm  errors.txt
 
        $IP route del table 123 172.16.101.0/24 dev veth1
        $IP rule del pref 100
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        rm $tmp_file
 
        route_cleanup
        $IP -6 route del table 123 2001:db8:101::/64 dev veth1
        $IP -6 rule del pref 100
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        rm $tmp_file
 
        route_cleanup
 
        local pref=$1; shift
        local handle=$1; shift
 
-       kill $mz_pid && wait $mz_pid &> /dev/null
+       kill_process $mz_pid
        tc filter del dev $dev egress protocol $proto pref $pref handle $handle flower
 }
 
 
 {
        local pid=${1-%%}; shift
 
-       # Suppress noise from killing mausezahn.
-       { kill $pid && wait $pid; } 2>/dev/null
+       kill_process "$pid"
 }
 
 declare -A cappid
 
 
        log_test "$test_name"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
 }
 
 
        log_test "$test_name"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
 }
 
 police_shared_test()
 
        log_test "$test_name"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        tc filter del dev $pol_if $dir protocol ip pref 1 handle 101 flower
        tc filter del dev $h3 ingress protocol ip pref 1 handle 101 flower
        tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
 
        log_test "$test_name"
 
-       { kill %% && wait %%; } 2>/dev/null
+       kill_process %%
        tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
 }
 
 
                "$@"
        fi
 }
+
+kill_process()
+{
+       local pid=$1; shift
+
+       # Suppress noise from killing the process.
+       { kill $pid && wait $pid; } 2>/dev/null
+}