forked from Minki/linux
Greg Kroah-Hartman reported to me that the ktest of v4.10 locked up in an
infinite loop while doing the make mrproper. Looking into the cause I noticed that a recent update to the function run_command (used for running all shell commands, including "make mrproper") changed the internal loop to use the function wait_for_input. The wait_for_input uses select to look at two file descriptors. One is the file descriptor of the command it is running, the other is STDIN. The STDIN check was not checking the return status of the sysread call, and was also just writing a lot of data into syswrite without regard to the size of the data read. Changing the code to check the return status of sysread, and also to still process the passed in descriptor data without looping back to the select fixed Greg's problem. While looking at this code I also realized that the loop did not honor the timeout if STDIN always had input (or for some reason return error). this could prevent wait_for_input to timeout on the file descriptor it is suppose to be waiting for. That is fixed too. -----BEGIN PGP SIGNATURE----- iQExBAABCAAbBQJYwChiFBxyb3N0ZWR0QGdvb2RtaXMub3JnAAoJEMm5BfJq2Y3L 0vwH/0gxaT134N6lkZ5Bdv2RJNVUu8mvAbjnXNPpUz1XSBd4zUVpfKONhxc7O50V mNb9WfmJ4nhcjp4qeEIhdpJvO2Fjm1grIVWcvnT6FwNfvGG9S73OYyRdK0ggcYhE gFRsdXBipVNL0pNlJhl1//XHq644IMhqDGRBQmR+eKUym2iiJHYhgteeGOQ3PHg1 L5MW1zORbPzeuVPDKGBVA4LDqlu3/gwJSIGZyYivAJp7f5Q5+t+1FPfUMdhodvps XiNsgHkHSpjhcCKxbjgSFrIX52AyrciYt+ZlIDps97R+IRk671BFHoOEcSZDux9O Cm3L3eBA8zIJQn9yXjlVvHfbVxU= =sGdD -----END PGP SIGNATURE----- Merge tag 'ktest-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest Pull ktest fixes from Steven Rostedt: "Greg Kroah-Hartman reported to me that the ktest of v4.11-rc1 locked up in an infinite loop while doing the make mrproper. Looking into the cause I noticed that a recent update to the function run_command (used for running all shell commands, including "make mrproper") changed the internal loop to use the function wait_for_input. The wait_for_input function uses select to look at two file descriptors. One is the file descriptor of the command it is running, the other is STDIN. The STDIN check was not checking the return status of the sysread call, and was also just writing a lot of data into syswrite without regard to the size of the data read. Changing the code to check the return status of sysread, and also to still process the passed in descriptor data without looping back to the select fixed Greg's problem. While looking at this code I also realized that the loop did not honor the timeout if STDIN always had input (or for some reason return error). this could prevent wait_for_input to timeout on the file descriptor it is suppose to be waiting for. That is fixed too" * tag 'ktest-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest: ktest: Make sure wait_for_input does honor the timeout ktest: Fix while loop in wait_for_input
This commit is contained in:
commit
8557b8e43a
@ -1880,6 +1880,7 @@ sub get_grub_index {
|
||||
sub wait_for_input
|
||||
{
|
||||
my ($fp, $time) = @_;
|
||||
my $start_time;
|
||||
my $rin;
|
||||
my $rout;
|
||||
my $nr;
|
||||
@ -1895,17 +1896,22 @@ sub wait_for_input
|
||||
vec($rin, fileno($fp), 1) = 1;
|
||||
vec($rin, fileno(\*STDIN), 1) = 1;
|
||||
|
||||
$start_time = time;
|
||||
|
||||
while (1) {
|
||||
$nr = select($rout=$rin, undef, undef, $time);
|
||||
|
||||
if ($nr <= 0) {
|
||||
return undef;
|
||||
}
|
||||
last if ($nr <= 0);
|
||||
|
||||
# copy data from stdin to the console
|
||||
if (vec($rout, fileno(\*STDIN), 1) == 1) {
|
||||
sysread(\*STDIN, $buf, 1000);
|
||||
syswrite($fp, $buf, 1000);
|
||||
$nr = sysread(\*STDIN, $buf, 1000);
|
||||
syswrite($fp, $buf, $nr) if ($nr > 0);
|
||||
}
|
||||
|
||||
# The timeout is based on time waiting for the fp data
|
||||
if (vec($rout, fileno($fp), 1) != 1) {
|
||||
last if (defined($time) && (time - $start_time > $time));
|
||||
next;
|
||||
}
|
||||
|
||||
@ -1917,12 +1923,11 @@ sub wait_for_input
|
||||
last if ($ch eq "\n");
|
||||
}
|
||||
|
||||
if (!length($line)) {
|
||||
return undef;
|
||||
}
|
||||
last if (!length($line));
|
||||
|
||||
return $line;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub reboot_to {
|
||||
|
Loading…
Reference in New Issue
Block a user