xf86OpenConsole: VT_WAITACTIVE failed: Interrupted system call
Keith Packard
keithp at keithp.com
Mon Oct 8 12:50:49 PDT 2007
On Mon, 2007-10-08 at 10:30 -0700, Linus Torvalds wrote:
>
> On Sun, 7 Oct 2007, Keith Packard wrote:
> I've dug some more, and my traces never show any "VT_RELDISP" happening,
> which is what I would expect if the old server was involved in this whole
> signalling thing and said "it's ok to switch now, I'm releasing my VT
> usage".
On exit, the server does:
ioctl (console_fd, VT_GETSTATE, &vts);
ioctl (console_fd, KDSETMODE, KD_TEXT);
ioctl (console_fd, VT_GETMODE, &VT);
VT.mode = VT_AUTO;
ioctl (console_fd, VT_SETMODE, &VT);
ioctl (console_fd, VT_ACTIVATE, activeVT);
ioctl (console_fd, VT_WAITACTIVE, activeVT);
close (console_fd);
Why it uses WAITACTIVE is beyond me, but there you go.
> However, I'd also expect the Fedora startup scripts to not even *start*up*
> the new X server until the old one has exited.
I'll bet it kills one and starts the new one without waiting.
> I'm wondering if perhaps there is some forking going on, where the X
> server has forked off another thing, and the original process exits before
> the VT has been fully released - causing the startup scripts to start the
> next X server even before the consoles are all sorted out?
Nope. The X server doesn't fork at startup (it does fork/exec a helper
program for XKB data, but the original process is the one which does all
of the X server work).
> I've got some more traces of a failing situation. The original X server
> was pid 1126, and the first X server startup looks like this:
>
> set_console (1126): want_console=7
> console_callback 1 (6): want_console=7
> 6: change_console
> 6 complete_change_console 1
> console_callback 2 (6): want_console=-1
>
> (The "6" above is the pid of the kernel event daemon - which does the
> actual switch itself for the simple reason that some switch requesters
> cannot do the switch on their own - namely the keyboard interrupt
> handler).
>
> However, the second (failing) X server (pid 1993) startup ends up having
> this trace:
>
> 1993 reset_vc
> set_console (1993): want_console=6
> console_callback 1 (6): want_console=6
> 6: change_console
> console_callback 2 (6): want_console=-1
> set_console (1126): want_console=0
> console_callback 1 (6): want_console=0
> 6: change_console
> 6 complete_change_console
> console_callback 2 (6): want_console=-1
>
> and here we see two thigns:
> - the second X invocation didn't use console 7, apparently because it was
> still in use
> - it actually *did* switch to console 6, but look who came in and did a
> "want_console=0" _afterwards_! Yeah, our old buddy pid 1126 - the OLD X
> server!
As I guessed, the old server switches back while the new server is
starting up. Because the old server isn't looking for VT switch requests
during shutdown, the window here is fairly long.
> So I think this does show:
>
> - it doesn't look like a kernel race. I think we do serialize things
> sufficiently in the kernel, but we cannot protect ourselves from
> processes then doing things in the wrong order.
Unless we believe that a pending VT_ACTIVATE/VT_WAITACTIVE should
somehow magically keep a subsequent VT_ACTIVATE from switching to the
'wrong' console. This doesn't seem practical though.
> - it doesn't *always* fail. The exact same kernel sometimes gets this
> trace for the second startup:
>
> set_console (1124): want_console=0
> console_callback 1 (6): want_console=0
> 6: change_console
> 6 complete_change_console
> console_callback 2 (6): want_console=-1
> 1994 reset_vc
> set_console (1994): want_console=6
> console_callback 1 (6): want_console=6
> 6: change_console
> 6 complete_change_console
> console_callback 2 (6): want_console=-1
>
> ie here the old server (1124 - don't ask me why the pid's sometimes
> change) got in earlier and did its want_console=0 before the new X
> server started up.
Yup, if the old server exits before the new server attempts to flip
consoles, things will 'just work'.
> In other words, I think the problem is somehow at *exit* time. The old
> server does its "I want to go back to the original console" (reasonable),
> but it does so after the new X server has already started up, and if the
> new X server is fast enough, it will have already picked its console and
> tried to switch to it - so the exit of the old one screws it up (because
> it did actually switch to it, but then switched back!)
So, do we just have the server poll at startup time instead of using
VT_WAITACTIVE? Alternatively, could the *old* server detect that the new
server had requested a VT switch and flip to that one instead of the
original?
VT_WAITACTIVE seems a lot less useful because of this behaviour.
--
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.x.org/archives/xorg/attachments/20071008/d1252163/attachment.pgp>
More information about the xorg
mailing list