Commit e05a1c63 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ktest-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest

Pull ktest update from Steven Rostedt:
 "fixes and updated for new boot loaders"

* tag 'ktest-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
  ktest: Test if target machine is up before install
  ktest: Fix breakage from change of oldnoconfig to olddefconfig
  ktest: Add native support for syslinux boot loader
  ktest: Sync before reboot
  ktest: Add support for grub2
parents 66cdd0ce e1a6c3d7
...@@ -53,6 +53,9 @@ my %default = ( ...@@ -53,6 +53,9 @@ my %default = (
"STOP_AFTER_FAILURE" => 60, "STOP_AFTER_FAILURE" => 60,
"STOP_TEST_AFTER" => 600, "STOP_TEST_AFTER" => 600,
"MAX_MONITOR_WAIT" => 1800, "MAX_MONITOR_WAIT" => 1800,
"GRUB_REBOOT" => "grub2-reboot",
"SYSLINUX" => "extlinux",
"SYSLINUX_PATH" => "/boot/extlinux",
# required, and we will ask users if they don't have them but we keep the default # required, and we will ask users if they don't have them but we keep the default
# value something that is common. # value something that is common.
...@@ -105,7 +108,12 @@ my $scp_to_target; ...@@ -105,7 +108,12 @@ my $scp_to_target;
my $scp_to_target_install; my $scp_to_target_install;
my $power_off; my $power_off;
my $grub_menu; my $grub_menu;
my $grub_file;
my $grub_number; my $grub_number;
my $grub_reboot;
my $syslinux;
my $syslinux_path;
my $syslinux_label;
my $target; my $target;
my $make; my $make;
my $pre_install; my $pre_install;
...@@ -232,6 +240,11 @@ my %option_map = ( ...@@ -232,6 +240,11 @@ my %option_map = (
"ADD_CONFIG" => \$addconfig, "ADD_CONFIG" => \$addconfig,
"REBOOT_TYPE" => \$reboot_type, "REBOOT_TYPE" => \$reboot_type,
"GRUB_MENU" => \$grub_menu, "GRUB_MENU" => \$grub_menu,
"GRUB_FILE" => \$grub_file,
"GRUB_REBOOT" => \$grub_reboot,
"SYSLINUX" => \$syslinux,
"SYSLINUX_PATH" => \$syslinux_path,
"SYSLINUX_LABEL" => \$syslinux_label,
"PRE_INSTALL" => \$pre_install, "PRE_INSTALL" => \$pre_install,
"POST_INSTALL" => \$post_install, "POST_INSTALL" => \$post_install,
"NO_INSTALL" => \$no_install, "NO_INSTALL" => \$no_install,
...@@ -368,7 +381,7 @@ EOF ...@@ -368,7 +381,7 @@ EOF
; ;
$config_help{"REBOOT_TYPE"} = << "EOF" $config_help{"REBOOT_TYPE"} = << "EOF"
Way to reboot the box to the test kernel. Way to reboot the box to the test kernel.
Only valid options so far are "grub" and "script". Only valid options so far are "grub", "grub2", "syslinux", and "script".
If you specify grub, it will assume grub version 1 If you specify grub, it will assume grub version 1
and will search in /boot/grub/menu.lst for the title \$GRUB_MENU and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
...@@ -378,11 +391,19 @@ $config_help{"REBOOT_TYPE"} = << "EOF" ...@@ -378,11 +391,19 @@ $config_help{"REBOOT_TYPE"} = << "EOF"
The entry in /boot/grub/menu.lst must be entered in manually. The entry in /boot/grub/menu.lst must be entered in manually.
The test will not modify that file. The test will not modify that file.
If you specify grub2, then you also need to specify both \$GRUB_MENU
and \$GRUB_FILE.
If you specify syslinux, then you may use SYSLINUX to define the syslinux
command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
the syslinux install (defaults to /boot/extlinux). But you have to specify
SYSLINUX_LABEL to define the label to boot to for the test kernel.
EOF EOF
; ;
$config_help{"GRUB_MENU"} = << "EOF" $config_help{"GRUB_MENU"} = << "EOF"
The grub title name for the test kernel to boot The grub title name for the test kernel to boot
(Only mandatory if REBOOT_TYPE = grub) (Only mandatory if REBOOT_TYPE = grub or grub2)
Note, ktest.pl will not update the grub menu.lst, you need to Note, ktest.pl will not update the grub menu.lst, you need to
manually add an option for the test. ktest.pl will search manually add an option for the test. ktest.pl will search
...@@ -393,6 +414,22 @@ $config_help{"GRUB_MENU"} = << "EOF" ...@@ -393,6 +414,22 @@ $config_help{"GRUB_MENU"} = << "EOF"
title Test Kernel title Test Kernel
kernel vmlinuz-test kernel vmlinuz-test
GRUB_MENU = Test Kernel GRUB_MENU = Test Kernel
For grub2, a search of \$GRUB_FILE is performed for the lines
that begin with "menuentry". It will not detect submenus. The
menu must be a non-nested menu. Add the quotes used in the menu
to guarantee your selection, as the first menuentry with the content
of \$GRUB_MENU that is found will be used.
EOF
;
$config_help{"GRUB_FILE"} = << "EOF"
If grub2 is used, the full path for the grub.cfg file is placed
here. Use something like /boot/grub2/grub.cfg to search.
EOF
;
$config_help{"SYSLINUX_LABEL"} = << "EOF"
If syslinux is used, the label that boots the target kernel must
be specified with SYSLINUX_LABEL.
EOF EOF
; ;
$config_help{"REBOOT_SCRIPT"} = << "EOF" $config_help{"REBOOT_SCRIPT"} = << "EOF"
...@@ -521,6 +558,15 @@ sub get_ktest_configs { ...@@ -521,6 +558,15 @@ sub get_ktest_configs {
if ($rtype eq "grub") { if ($rtype eq "grub") {
get_ktest_config("GRUB_MENU"); get_ktest_config("GRUB_MENU");
} }
if ($rtype eq "grub2") {
get_ktest_config("GRUB_MENU");
get_ktest_config("GRUB_FILE");
}
if ($rtype eq "syslinux") {
get_ktest_config("SYSLINUX_LABEL");
}
} }
sub process_variables { sub process_variables {
...@@ -1123,6 +1169,9 @@ sub wait_for_monitor; ...@@ -1123,6 +1169,9 @@ sub wait_for_monitor;
sub reboot { sub reboot {
my ($time) = @_; my ($time) = @_;
# Make sure everything has been written to disk
run_ssh("sync");
if (defined($time)) { if (defined($time)) {
start_monitor; start_monitor;
# flush out current monitor # flush out current monitor
...@@ -1452,8 +1501,44 @@ sub run_scp_mod { ...@@ -1452,8 +1501,44 @@ sub run_scp_mod {
return run_scp($src, $dst, $cp_scp); return run_scp($src, $dst, $cp_scp);
} }
sub get_grub2_index {
return if (defined($grub_number));
doprint "Find grub2 menu ... ";
$grub_number = -1;
my $ssh_grub = $ssh_exec;
$ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
open(IN, "$ssh_grub |")
or die "unable to get $grub_file";
my $found = 0;
while (<IN>) {
if (/^menuentry.*$grub_menu/) {
$grub_number++;
$found = 1;
last;
} elsif (/^menuentry\s/) {
$grub_number++;
}
}
close(IN);
die "Could not find '$grub_menu' in $grub_file on $machine"
if (!$found);
doprint "$grub_number\n";
}
sub get_grub_index { sub get_grub_index {
if ($reboot_type eq "grub2") {
get_grub2_index;
return;
}
if ($reboot_type ne "grub") { if ($reboot_type ne "grub") {
return; return;
} }
...@@ -1524,6 +1609,10 @@ sub reboot_to { ...@@ -1524,6 +1609,10 @@ sub reboot_to {
if ($reboot_type eq "grub") { if ($reboot_type eq "grub") {
run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'"; run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
} elsif ($reboot_type eq "grub2") {
run_ssh "$grub_reboot $grub_number";
} elsif ($reboot_type eq "syslinux") {
run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
} elsif (defined $reboot_script) { } elsif (defined $reboot_script) {
run_command "$reboot_script"; run_command "$reboot_script";
} }
...@@ -1718,6 +1807,14 @@ sub do_post_install { ...@@ -1718,6 +1807,14 @@ sub do_post_install {
dodie "Failed to run post install"; dodie "Failed to run post install";
} }
# Sometimes the reboot fails, and will hang. We try to ssh to the box
# and if we fail, we force another reboot, that should powercycle it.
sub test_booted {
if (!run_ssh "echo testing connection") {
reboot $sleep_time;
}
}
sub install { sub install {
return if ($no_install); return if ($no_install);
...@@ -1730,6 +1827,8 @@ sub install { ...@@ -1730,6 +1827,8 @@ sub install {
my $cp_target = eval_kernel_version $target_image; my $cp_target = eval_kernel_version $target_image;
test_booted;
run_scp_install "$outputdir/$build_target", "$cp_target" or run_scp_install "$outputdir/$build_target", "$cp_target" or
dodie "failed to copy image"; dodie "failed to copy image";
...@@ -1877,11 +1976,15 @@ sub make_oldconfig { ...@@ -1877,11 +1976,15 @@ sub make_oldconfig {
if (!run_command "$make olddefconfig") { if (!run_command "$make olddefconfig") {
# Perhaps olddefconfig doesn't exist in this version of the kernel # Perhaps olddefconfig doesn't exist in this version of the kernel
# try oldnoconfig
doprint "olddefconfig failed, trying make oldnoconfig\n";
if (!run_command "$make oldnoconfig") {
doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
# try a yes '' | oldconfig # try a yes '' | oldconfig
doprint "olddefconfig failed, trying yes '' | make oldconfig\n";
run_command "yes '' | $make oldconfig" or run_command "yes '' | $make oldconfig" or
dodie "failed make config oldconfig"; dodie "failed make config oldconfig";
} }
}
} }
# read a config file and use this to force new configs. # read a config file and use this to force new configs.
...@@ -3700,6 +3803,11 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { ...@@ -3700,6 +3803,11 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
$target = "$ssh_user\@$machine"; $target = "$ssh_user\@$machine";
if ($reboot_type eq "grub") { if ($reboot_type eq "grub") {
dodie "GRUB_MENU not defined" if (!defined($grub_menu)); dodie "GRUB_MENU not defined" if (!defined($grub_menu));
} elsif ($reboot_type eq "grub2") {
dodie "GRUB_MENU not defined" if (!defined($grub_menu));
dodie "GRUB_FILE not defined" if (!defined($grub_file));
} elsif ($reboot_type eq "syslinux") {
dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
} }
} }
......
...@@ -332,8 +332,18 @@ ...@@ -332,8 +332,18 @@
# from other linux builds on the system. # from other linux builds on the system.
#LOCALVERSION = -test #LOCALVERSION = -test
# For REBOOT_TYPE = grub2, you must specify where the grub.cfg
# file is. This is the file that is searched to find the menu
# option to boot to with GRUB_REBOOT
#GRUB_FILE = /boot/grub2/grub.cfg
# The tool for REBOOT_TYPE = grub2 to set the next reboot kernel
# to boot into (one shot mode).
# (default grub2_reboot)
#GRUB_REBOOT = grub2_reboot
# The grub title name for the test kernel to boot # The grub title name for the test kernel to boot
# (Only mandatory if REBOOT_TYPE = grub) # (Only mandatory if REBOOT_TYPE = grub or grub2)
# #
# Note, ktest.pl will not update the grub menu.lst, you need to # Note, ktest.pl will not update the grub menu.lst, you need to
# manually add an option for the test. ktest.pl will search # manually add an option for the test. ktest.pl will search
...@@ -343,8 +353,33 @@ ...@@ -343,8 +353,33 @@
# For example, if in the /boot/grub/menu.lst the test kernel title has: # For example, if in the /boot/grub/menu.lst the test kernel title has:
# title Test Kernel # title Test Kernel
# kernel vmlinuz-test # kernel vmlinuz-test
#
# For grub2, a search of top level "menuentry"s are done. No
# submenu is searched. The menu is found by searching for the
# contents of GRUB_MENU in the line that starts with "menuentry".
# You may want to include the quotes around the option. For example:
# for: menuentry 'Test Kernel'
# do a: GRUB_MENU = 'Test Kernel'
# For customizing, add your entry in /etc/grub.d/40_custom.
#
#GRUB_MENU = Test Kernel #GRUB_MENU = Test Kernel
# For REBOOT_TYPE = syslinux, the name of the syslinux executable
# (on the target) to use to set up the next reboot to boot the
# test kernel.
# (default extlinux)
#SYSLINUX = syslinux
# For REBOOT_TYPE = syslinux, the path that is passed to to the
# syslinux command where syslinux is installed.
# (default /boot/extlinux)
#SYSLINUX_PATH = /boot/syslinux
# For REBOOT_TYPE = syslinux, the syslinux label that references the
# test kernel in the syslinux config file.
# (default undefined)
#SYSLINUX_LABEL = "test-kernel"
# A script to reboot the target into the test kernel # A script to reboot the target into the test kernel
# This and SWITCH_TO_TEST are about the same, except # This and SWITCH_TO_TEST are about the same, except
# SWITCH_TO_TEST is run even for REBOOT_TYPE = grub. # SWITCH_TO_TEST is run even for REBOOT_TYPE = grub.
...@@ -497,7 +532,7 @@ ...@@ -497,7 +532,7 @@
#POST_BUILD_DIE = 1 #POST_BUILD_DIE = 1
# Way to reboot the box to the test kernel. # Way to reboot the box to the test kernel.
# Only valid options so far are "grub" and "script" # Only valid options so far are "grub", "grub2", "syslinux" and "script"
# (default grub) # (default grub)
# If you specify grub, it will assume grub version 1 # If you specify grub, it will assume grub version 1
# and will search in /boot/grub/menu.lst for the title $GRUB_MENU # and will search in /boot/grub/menu.lst for the title $GRUB_MENU
...@@ -505,6 +540,13 @@ ...@@ -505,6 +540,13 @@
# your setup, then specify "script" and have a command or script # your setup, then specify "script" and have a command or script
# specified in REBOOT_SCRIPT to boot to the target. # specified in REBOOT_SCRIPT to boot to the target.
# #
# For REBOOT_TYPE = grub2, you must define both GRUB_MENU and
# GRUB_FILE.
#
# For REBOOT_TYPE = syslinux, you must define SYSLINUX_LABEL, and
# perhaps modify SYSLINUX (default extlinux) and SYSLINUX_PATH
# (default /boot/extlinux)
#
# The entry in /boot/grub/menu.lst must be entered in manually. # The entry in /boot/grub/menu.lst must be entered in manually.
# The test will not modify that file. # The test will not modify that file.
#REBOOT_TYPE = grub #REBOOT_TYPE = grub
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment