All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] ktest: console pty support
@ 2015-01-28 19:38 Josh Poimboeuf
  2015-01-28 19:38 ` [PATCH v2 1/2] ktest: give console process a dedicated tty Josh Poimboeuf
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2015-01-28 19:38 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Satoru Takeuchi, linux-kernel

These patches can be applied on top of yesterday's "ktest: restore tty settings
after closing console" patch.  They create a pty pair for the console to
prevent the console child process from messing up ktest's tty settings.

v2 changes:
- rebased onto the stty save/restore patch
- added a patch to enable user input to the console

Josh Poimboeuf (2):
  ktest: give console process a dedicated tty
  ktest: enable user input to the console

 tools/testing/ktest/ktest.pl | 117 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 93 insertions(+), 24 deletions(-)

-- 
2.1.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/2] ktest: give console process a dedicated tty
  2015-01-28 19:38 [PATCH v2 0/2] ktest: console pty support Josh Poimboeuf
@ 2015-01-28 19:38 ` Josh Poimboeuf
  2015-01-28 19:38 ` [PATCH v2 2/2] ktest: enable user input to the console Josh Poimboeuf
  2015-01-29 20:44 ` [PATCH v2 0/2] ktest: console pty support Steven Rostedt
  2 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2015-01-28 19:38 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Satoru Takeuchi, linux-kernel

Create a pseudoterminal (pty pair) to give the console a dedicated tty
so it doesn't mess with ktest's terminal settings.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 tools/testing/ktest/ktest.pl | 66 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 57 insertions(+), 9 deletions(-)

diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index ba20f89..10b8825 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -1345,23 +1345,71 @@ sub dodie {
     die @_, "\n";
 }
 
-sub open_console {
-    my ($fp) = @_;
+sub create_pty {
+    my ($ptm, $pts) = @_;
+    my $tmp;
+    my $TIOCSPTLCK = 0x40045431;
+    my $TIOCGPTN = 0x80045430;
+
+    sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
+	dodie "Cant open /dev/ptmx";
+
+    # unlockpt()
+    $tmp = pack("i", 0);
+    ioctl($ptm, $TIOCSPTLCK, $tmp) or
+	dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";
+
+    # ptsname()
+    ioctl($ptm, $TIOCGPTN, $tmp) or
+	dodie "ioctl TIOCGPTN for /dev/ptmx failed";
+    $tmp = unpack("i", $tmp);
+
+    sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
+	dodie "Can't open /dev/pts/$tmp";
+}
+
+sub exec_console {
+    my ($ptm, $pts) = @_;
+
+    close($ptm);
+
+    close(\*STDIN);
+    close(\*STDOUT);
+    close(\*STDERR);
 
-    my $flags;
+    open(\*STDIN, '<&', $pts);
+    open(\*STDOUT, '>&', $pts);
+    open(\*STDERR, '>&', $pts);
+
+    close($pts);
+
+    exec $console or
+	dodie "Can't open console $console";
+}
+
+sub open_console {
+    my ($ptm) = @_;
+    my $pts = \*PTSFD;
+    my $pid;
 
     # save terminal settings
     $stty = `stty -g`;
 
-    my $pid = open($fp, "$console|") or
-	dodie "Can't open console $console";
+    create_pty($ptm, $pts);
 
-    $flags = fcntl($fp, F_GETFL, 0) or
-	dodie "Can't get flags for the socket: $!";
-    $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
-	dodie "Can't set flags for the socket: $!";
+    $pid = fork;
+
+    if (!$pid) {
+	# child
+	exec_console($ptm, $pts)
+    }
+
+    # parent
+    close($pts);
 
     return $pid;
+
+    open(PTSFD, "Stop perl from warning about single use of PTSFD");
 }
 
 sub close_console {
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/2] ktest: enable user input to the console
  2015-01-28 19:38 [PATCH v2 0/2] ktest: console pty support Josh Poimboeuf
  2015-01-28 19:38 ` [PATCH v2 1/2] ktest: give console process a dedicated tty Josh Poimboeuf
@ 2015-01-28 19:38 ` Josh Poimboeuf
  2015-01-29 20:44 ` [PATCH v2 0/2] ktest: console pty support Steven Rostedt
  2 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2015-01-28 19:38 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Satoru Takeuchi, linux-kernel

Allow the user to send input to the console by putting the terminal in
cbreak mode (to allow reading stdin one character at a time) and copying
all stdin data to the console's pty.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 tools/testing/ktest/ktest.pl | 51 +++++++++++++++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 15 deletions(-)

diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index 10b8825..acaf05b 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -178,7 +178,7 @@ my $checkout;
 my $localversion;
 my $iteration = 0;
 my $successes = 0;
-my $stty;
+my $stty_orig;
 
 my $bisect_good;
 my $bisect_bad;
@@ -1393,7 +1393,11 @@ sub open_console {
     my $pid;
 
     # save terminal settings
-    $stty = `stty -g`;
+    $stty_orig = `stty -g`;
+
+    # place terminal in cbreak mode so that stdin can be read one character at
+    # a time without having to wait for a newline
+    system("stty -icanon -echo -icrnl");
 
     create_pty($ptm, $pts);
 
@@ -1422,7 +1426,7 @@ sub close_console {
     close($fp);
 
     # restore terminal settings
-    system("stty $stty");
+    system("stty $stty_orig");
 }
 
 sub start_monitor {
@@ -1749,7 +1753,9 @@ sub wait_for_input
 {
     my ($fp, $time) = @_;
     my $rin;
-    my $ready;
+    my $rout;
+    my $nr;
+    my $buf;
     my $line;
     my $ch;
 
@@ -1759,21 +1765,36 @@ sub wait_for_input
 
     $rin = '';
     vec($rin, fileno($fp), 1) = 1;
-    ($ready, $time) = select($rin, undef, undef, $time);
+    vec($rin, fileno(\*STDIN), 1) = 1;
 
-    $line = "";
+    while (1) {
+	$nr = select($rout=$rin, undef, undef, $time);
 
-    # try to read one char at a time
-    while (sysread $fp, $ch, 1) {
-	$line .= $ch;
-	last if ($ch eq "\n");
-    }
+	if ($nr <= 0) {
+	    return undef;
+	}
 
-    if (!length($line)) {
-	return undef;
-    }
+	# copy data from stdin to the console
+	if (vec($rout, fileno(\*STDIN), 1) == 1) {
+	    sysread(\*STDIN, $buf, 1000);
+	    syswrite($fp, $buf, 1000);
+	    next;
+	}
 
-    return $line;
+	$line = "";
+
+	# try to read one char at a time
+	while (sysread $fp, $ch, 1) {
+	    $line .= $ch;
+	    last if ($ch eq "\n");
+	}
+
+	if (!length($line)) {
+	    return undef;
+	}
+
+	return $line;
+    }
 }
 
 sub reboot_to {
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/2] ktest: console pty support
  2015-01-28 19:38 [PATCH v2 0/2] ktest: console pty support Josh Poimboeuf
  2015-01-28 19:38 ` [PATCH v2 1/2] ktest: give console process a dedicated tty Josh Poimboeuf
  2015-01-28 19:38 ` [PATCH v2 2/2] ktest: enable user input to the console Josh Poimboeuf
@ 2015-01-29 20:44 ` Steven Rostedt
  2015-01-29 21:39   ` Josh Poimboeuf
  2 siblings, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2015-01-29 20:44 UTC (permalink / raw)
  To: Josh Poimboeuf; +Cc: Satoru Takeuchi, linux-kernel

On Wed, 28 Jan 2015 13:38:37 -0600
Josh Poimboeuf <jpoimboe@redhat.com> wrote:

> These patches can be applied on top of yesterday's "ktest: restore tty settings
> after closing console" patch.  They create a pty pair for the console to
> prevent the console child process from messing up ktest's tty settings.
> 
> v2 changes:
> - rebased onto the stty save/restore patch
> - added a patch to enable user input to the console
> 
> Josh Poimboeuf (2):
>   ktest: give console process a dedicated tty
>   ktest: enable user input to the console
> 
>  tools/testing/ktest/ktest.pl | 117 ++++++++++++++++++++++++++++++++++---------
>  1 file changed, 93 insertions(+), 24 deletions(-)
> 

OK, I applied these and been using ktest since. But after one of my
tests failed (got a bug report), I had no console. I think there's a
die someplace that does not put everything back.

Think you could find out where?

-- Steve

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/2] ktest: console pty support
  2015-01-29 20:44 ` [PATCH v2 0/2] ktest: console pty support Steven Rostedt
@ 2015-01-29 21:39   ` Josh Poimboeuf
  2015-01-29 22:07     ` Steven Rostedt
  0 siblings, 1 reply; 7+ messages in thread
From: Josh Poimboeuf @ 2015-01-29 21:39 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Satoru Takeuchi, linux-kernel

On Thu, Jan 29, 2015 at 03:44:41PM -0500, Steven Rostedt wrote:
> On Wed, 28 Jan 2015 13:38:37 -0600
> Josh Poimboeuf <jpoimboe@redhat.com> wrote:
> 
> > These patches can be applied on top of yesterday's "ktest: restore tty settings
> > after closing console" patch.  They create a pty pair for the console to
> > prevent the console child process from messing up ktest's tty settings.
> > 
> > v2 changes:
> > - rebased onto the stty save/restore patch
> > - added a patch to enable user input to the console
> > 
> > Josh Poimboeuf (2):
> >   ktest: give console process a dedicated tty
> >   ktest: enable user input to the console
> > 
> >  tools/testing/ktest/ktest.pl | 117 ++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 93 insertions(+), 24 deletions(-)
> > 
> 
> OK, I applied these and been using ktest since. But after one of my
> tests failed (got a bug report), I had no console. I think there's a
> die someplace that does not put everything back.
> 
> Think you could find out where?

Can you tell if it died via dodie()?  Looks like that wouldn't clean up
the stty settings.

-- 
Josh

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/2] ktest: console pty support
  2015-01-29 21:39   ` Josh Poimboeuf
@ 2015-01-29 22:07     ` Steven Rostedt
  2015-01-30  2:54       ` [PATCH] ktest: cleanup terminal on dodie() failure Josh Poimboeuf
  0 siblings, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2015-01-29 22:07 UTC (permalink / raw)
  To: Josh Poimboeuf; +Cc: Satoru Takeuchi, linux-kernel

On Thu, 29 Jan 2015 15:39:39 -0600
Josh Poimboeuf <jpoimboe@redhat.com> wrote:


> Can you tell if it died via dodie()?  Looks like that wouldn't clean up
> the stty settings.
> 

Looks to have happen in monitor where it called:

	fail "failed - got a bug report" and return 0;

And must have had $die_on_failure set because it did not post a KTEST
RESULT message. That means yes, it would hit dodie() called by fail().

-- Steve

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] ktest: cleanup terminal on dodie() failure
  2015-01-29 22:07     ` Steven Rostedt
@ 2015-01-30  2:54       ` Josh Poimboeuf
  0 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2015-01-30  2:54 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Satoru Takeuchi, linux-kernel

On Thu, Jan 29, 2015 at 05:07:51PM -0500, Steven Rostedt wrote:
> On Thu, 29 Jan 2015 15:39:39 -0600
> Josh Poimboeuf <jpoimboe@redhat.com> wrote:
> 
> 
> > Can you tell if it died via dodie()?  Looks like that wouldn't clean up
> > the stty settings.
> > 
> 
> Looks to have happen in monitor where it called:
> 
> 	fail "failed - got a bug report" and return 0;
> 
> And must have had $die_on_failure set because it did not post a KTEST
> RESULT message. That means yes, it would hit dodie() called by fail().

This fixes it for me:

--8<--

Subject: [PATCH] ktest: cleanup terminal on dodie() failure

If dodie() is called with the console open, restore the terminal's
original settings before dying.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 tools/testing/ktest/ktest.pl | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index acaf05b..04e9391 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -1342,6 +1342,11 @@ sub dodie {
 	print " See $opt{LOG_FILE} for more info.\n";
     }
 
+    if ($monitor_cnt) {
+	    # restore terminal settings
+	    system("stty $stty_orig");
+    }
+
     die @_, "\n";
 }
 
@@ -1384,7 +1389,7 @@ sub exec_console {
     close($pts);
 
     exec $console or
-	dodie "Can't open console $console";
+	die "Can't open console $console";
 }
 
 sub open_console {
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-01-30  2:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-28 19:38 [PATCH v2 0/2] ktest: console pty support Josh Poimboeuf
2015-01-28 19:38 ` [PATCH v2 1/2] ktest: give console process a dedicated tty Josh Poimboeuf
2015-01-28 19:38 ` [PATCH v2 2/2] ktest: enable user input to the console Josh Poimboeuf
2015-01-29 20:44 ` [PATCH v2 0/2] ktest: console pty support Steven Rostedt
2015-01-29 21:39   ` Josh Poimboeuf
2015-01-29 22:07     ` Steven Rostedt
2015-01-30  2:54       ` [PATCH] ktest: cleanup terminal on dodie() failure Josh Poimboeuf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.