Commit 8557b8e4 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 04bb94b1 f7c6401f
......@@ -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 {
......
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