aboutsummaryrefslogtreecommitdiff
path: root/spec2xxx-run.old
blob: ebdef210b3b09f160e9763cc621d2509fe841e7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash

set -e
set -x

${0%%-run}-check run

host=$HOST
target=$TARGET
spec=$SPEC
config=$CONFIG
opts="$@"

if [ "$host" != "$target" ]; then
    local=false
else
    local=true
fi

doservices=true
dofreqscaling=true
dotaskbind=true
donetwork=false

spec=$(cd $spec; pwd)

if ssh $target echo \$USER | grep root; then
    sudo=
else
    sudo=sudo
fi

if $doservices && \
    (ssh $target $sudo initctl list >/dev/null || ssh $target croutonversion >/dev/null 2>&1); then
    # Stop all but few services.  Note all stopped services in stopped-services
    # file to restart them after benchmarks.  Network and SSH server are
    # handled separately.

    sudo_old=$sudo
    if ssh $target croutonversion >/dev/null 2>&1; then
	# For Crouton chroot back into Chrome OS to stop services.
	sudo="$sudo chroot /proc/1/root sudo"
	keep="dbus\|boot-services\|shill\|wpasupplicant"
	keep="$keep\|tty2"
    else
	keep="dbus\|ssh\|network"
	keep="$keep\|tty1"
    fi

    rm -f $spec/stopped-services
    touch $spec/stopped-services
    for s in $(ssh $target $sudo initctl list | grep running | cut -f 1 -d " "); do
	echo $s | grep "$keep" && echo KEEPING $s && continue
	echo STOPPING $s && ssh $target $sudo stop $s || true
	echo $s >> $spec/stopped-services
    done

    sudo=$sudo_old
fi

# Disable frequency scaling
old_governor=""
if $dofreqscaling; then
    old_governor=$(ssh $target cpufreq-info -p | cut -f 3 -d " ")
    if [ "x$old_governor" = "x" ] || ! ssh $target $sudo cpufreq-set -g performance; then
	old_governor=""
	echo FREQUENCY SCALING NOT SUPPORTED
    fi
fi

# Bind all existing processes to CPU #0.  We then run benchmarks on CPU #1.
if $dotaskbind && \
    (ssh $target $sudo taskset -a -p 0x1 1); then
    ssh $target "for p in \$(ps ax --format='%p' | tail -n +2); do $sudo taskset -a -p 0x1 \$p 2>&1; done | wc"
else
    echo CPU BIND NOT SUPPORTED
fi

# Figure out how to stop/start network.
if $donetwork && \
    (ssh $target croutonversion >/dev/null 2>&1); then
    network_before="$sudo chroot /proc/1/root /bin/bash -c 'stop shill && stop wpasupplicant' && sleep 2"
    network_after="$sudo chroot /proc/1/root /bin/bash -c 'start wpasupplicant && start shill' && $sudo /sbin/iptables -P INPUT ACCEPT"
elif $donetwork && \
    (ssh $target "$sudo stop network-interface INTERFACE=lo && $sudo start network-interface INTERFACE=lo"); then
    network_before="$sudo stop network-interface INTERFACE=eth0 && sleep 2"
    network_after="$sudo start network-interface INTERFACE=eth0"
elif $donetwork && \
    (ssh $target "$sudo ifdown lo && $sudo ifup lo"); then
    network_before="$sudo ifdown eth0 && sleep 2"
    network_after="$sudo ifup eth0"
else
    network_before="echo NETWORK CONTROL NOT SUPPORTED"
    network_after="echo NETWORK CONTROL NOT SUPPORTED"
fi

if ssh $target "$sudo initctl status ssh" | grep process; then
    ssh_before="$sudo stop ssh"
    ssh_after="$sudo start ssh"
elif ssh $target croutonversion >/dev/null 2>&1; then
    ssh_before="$sudo /etc/init.d/ssh stop"
    ssh_after="$sudo /etc/init.d/ssh start"
else
    ssh_before="$sudo /etc/init.d/sshd stop"
    ssh_after="$sudo /etc/init.d/sshd start"
fi

cmd="true"
cmd="$cmd && $ssh_before"
cmd="$cmd && $network_before"
cmd="$cmd && ps auxf"
cmd="$cmd && (cd $spec && . shrc && runspec -c $config $opts) || true"
cmd="$cmd && $network_after"
cmd="$cmd && $ssh_after"

if $local; then
    runspec_log="$spec/runspec.$(date +%Y%m%dT%H%M%S)"
    touch $runspec_log
    tail -f $runspec_log &
    tail_pid=$!
    nohup env -i /bin/bash -l -c "$cmd" > $runspec_log 2>&1
    kill $tail_pid
else
    # Send /the/ command.
    ssh -fn $target "nohup /bin/bash -c \"$cmd\" 2>&1 > $spec/runspec.$(date +%Y%m%dT%H%M%S) 2>&1 &"

    # Sleep till SSH server on the board is back online.
    date
    sleep 10
    set +x
    while ! ssh $target true 2>/dev/null ; do sleep 10; done
    set -x
fi

# Undo benchmark environment preparations.

if $dotaskset && \
    (ssh $target $sudo taskset -a -p 0xFFFFFFFF 1); then
    ssh $target "for p in \$(ps ax --format='%p' | tail -n +2); do $sudo taskset -a -p 0xFFFFFFFF \$p 2>&1; done | wc"
else
    echo CPU BIND NOT SUPPORTED
fi

if [ "x$old_governor" != "x" ]; then
    ssh $target $sudo cpufreq-set -g $old_governor
fi

if $doservices && \
    (ssh $target $sudo initctl list >/dev/null || ssh $target croutonversion >/dev/null 2>&1); then
    sudo_old=$sudo
    if ssh $target croutonversion >/dev/null 2>&1; then
	sudo="$sudo chroot /proc/1/root sudo"
    fi

    for s in $(cat $spec/stopped-services); do
	echo STARTING $s && ssh $target $sudo start $s || true
    done
    rm -f $spec/stopped-services

    sudo=$sudo_old
fi