Skip to content

Commit

Permalink
Merge tag 'ktest-v4.11-rc1' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/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
  • Loading branch information
torvalds committed Mar 8, 2017
2 parents 04bb94b + f7c6401 commit 8557b8e
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -1880,6 +1880,7 @@ sub get_grub_index {
sub wait_for_input
{
my ($fp, $time) = @_;
my $start_time;
my $rin;
my $rout;
my $nr;
Expand All @@ -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;
}

Expand All @@ -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 {
Expand Down

0 comments on commit 8557b8e

Please sign in to comment.