[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH]fix VMX "xm console" issue



There's a problem with xm console and VMX guests, the handshaking isn't 
exactly right. I can run xm console on the VMX guest in one window - seeing 
the handshaking being off, run minicom on the /dev/pts/? in another window, 
and see the original xm console window correct itself so it's usable. Before 
minicom, you can't interact with the xm console - it doesn't seem to receive 
the input. 

I don't know about the patch here... but I've seen some odd things trying to 
discover what's wrong. I see where xenconsoled sets the cfmakeraw() - but 
it's like those settings aren't taking. I do an stty -f /dev/pts/? -a and the 
settings don't match. 

I've done a stty -f /dev/pts/? -a before and after minicom is invoked and seen 
the differences. I've tried changing some of the terminos settings to match 
minicom's in xenconsoled, but it doesn't seem to make a difference or even 
seem to be set at all.

I'm probably doing something wrong. 

I'll look at this more this week. I started on it last week and was off for 
the holiday. 

Thanks,

Dan



On Tuesday 29 November 2005 06:10, Anthony Liguori wrote:
> I'm not sure what this patch does.  cfmakeraw() will already set all of
> those flags.  You shouldn't have to set a baud rate on a PTY either.  Is
> the real bug that somehow init_term() wasn't being called when it should
> have been?
>
> What flag, in particular, did you need set that wasn't being set by
> cfmakeraw()?  xenconsoled sets it's end of the PTY with cfmakeraw() so
> if we modify the client to use different termios settings we probably
> need to update the server too.
>
> Regards,
>
> Anthony Liguori
>
> Ian Pratt wrote:
> >>>Please expand upon what this issue with the console client is. Why
> >>>hasn't the issue been seen with paravirtualized domains?
> >>
> >>"xm console" in VMX could not work well now, as we know. We
> >>can see the output of the console, but it keeps scrolling
> >>like hitting enter.
> >>When I investigate this bug, I found that the serial
> >>parameter has not been set anywhere, which might be the cause
> >>of this issue.
> >
> >I'd prefer to understand the issue a bit more first/
> >
> >>The VMX console model for VMX is somewhat different with
> >>domU's. When the serial port is redirect to pty, write the
> >>allocated device to xenstore, then xm console can get it,
> >>thus xenconsole is independent of xenconsoled in VMX.
> >
> >But xenconsole is used by paravirt guests too. What effect does this
> >patch have on them?
> >
> >Ian
> >
> >>>What behaviour does the tcsetattr alter, and why not just set that
> >>>particular bit?
> >>
> >>I found that Minicom can work well in "xm console" VMX, and
> >>borrow minicom's behavior to set some parameter for "xen
> >>console" and domU is working well too.
> >>
> >>>Thanks,
> >>>Ian
> >>>
> >>>># HG changeset patch
> >>>># User Ping Yu <ping.y.yu@xxxxxxxxx>
> >>>># Node ID 71111788840f0dd557d7cfc4e919beb511c0237c
> >>>># Parent  8451c65671238604e2678a1f44c2f582ec6ebf96
> >>>>Fix an issue for VMX console.
> >>>>Add a function to set serial parameter, thus make "xm
> >>
> >>console" work
> >>
> >>>>well both in domU and VMX
> >>>>
> >>>>Signed-off-by: Ping Yu <ping.y.yu@xxxxxxxxx>
> >>>>
> >>>>diff -r 8451c6567123 -r 71111788840f tools/console/client/main.c
> >>>>--- a/tools/console/client/main.c       Wed Nov 23 19:37:33 2005
> >>>>+++ b/tools/console/client/main.c       Mon Nov 28 15:53:17 2005
> >>>>@@ -87,6 +87,92 @@
> >>>>  tcsetattr(fd, TCSAFLUSH, &new_term);  }
> >>>>
> >>>>+/* Code borrowed from Minicom
> >>>>+ * Set baudrate, parity and number of bits  */ static void
> >>>>+set_serial_argument(int fd, char *baudr, char *par,
> >>>>+         char *bits, char *stopb, int hwf, int swf) {
> >>>>+ int spd = -1;
> >>>>+ int newbaud;
> >>>>+ int bit = bits[0];
> >>>>+
> >>>>+ struct termios tty;
> >>>>+
> >>>>+ tcgetattr(fd, &tty);
> >>>>+
> >>>>+   /* We generate mark and space parity ourself. */
> >>>>+ if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
> >>>>+         bit = '8';
> >>>>+
> >>>>+  /* Check if 'baudr' is really a number */
> >>>>+ if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0')
> >>>>+         newbaud = -1;
> >>>>+
> >>>>+ switch(newbaud) {
> >>>>+ case 0:
> >>>>+ case 3:         spd = B300;     break;
> >>>>+ case 6:         spd = B600;     break;
> >>>>+ case 12:        spd = B1200;    break;
> >>>>+ case 24:        spd = B2400;    break;
> >>>>+ case 48:        spd = B4800;    break;
> >>>>+ case 96:        spd = B9600;    break;
> >>>>+ case 192:       spd = B19200;   break;
> >>>>+ case 384:       spd = B38400;   break;
> >>>>+ case 576:       spd = B57600;   break;
> >>>>+ case 1152:      spd = B115200;  break;
> >>>>+ case 2304:      spd = B230400;  break;
> >>>>+ }
> >>>>+
> >>>>+ if (spd != -1) {
> >>>>+         cfsetospeed(&tty, (speed_t)spd);
> >>>>+         cfsetispeed(&tty, (speed_t)spd);
> >>>>+ }
> >>>>+
> >>>>+ switch (bit) {
> >>>>+ case '5':
> >>>>+         tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
> >>>>+         break;
> >>>>+ case '6':
> >>>>+         tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
> >>>>+         break;
> >>>>+ case '7':
> >>>>+         tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
> >>>>+         break;
> >>>>+ case '8':
> >>>>+ default:
> >>>>+         tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
> >>>>+         break;
> >>>>+ }
> >>>>+
> >>>>+   /* Set into raw, no echo mode */
> >>>>+ tty.c_iflag =  IGNBRK;
> >>>>+ tty.c_lflag = 0;
> >>>>+ tty.c_oflag = 0;
> >>>>+ tty.c_cflag |= CLOCAL | CREAD;
> >>>>+ tty.c_cc[VMIN] = 1;
> >>>>+ tty.c_cc[VTIME] = 5;
> >>>>+
> >>>>+ if (swf)
> >>>>+         tty.c_iflag |= IXON | IXOFF;
> >>>>+ else
> >>>>+         tty.c_iflag &= ~(IXON|IXOFF|IXANY);
> >>>>+
> >>>>+ tty.c_cflag &= ~(PARENB | PARODD);
> >>>>+ if (par[0] == 'E')
> >>>>+         tty.c_cflag |= PARENB;
> >>>>+ else if (par[0] == 'O')
> >>>>+         tty.c_cflag |= (PARENB | PARODD);
> >>>>+
> >>>>+ if (stopb[0] == '2')
> >>>>+         tty.c_cflag |= CSTOPB;
> >>>>+ else
> >>>>+         tty.c_cflag &= ~CSTOPB;
> >>>>+
> >>>>+ tcsetattr(fd, TCSANOW, &tty);
> >>>>+
> >>>>+}
> >>>>+
> >>>> static void restore_term(int fd, struct termios *old)  {
> >>>>  tcsetattr(fd, TCSAFLUSH, old);
> >>>>@@ -260,6 +346,7 @@
> >>>>  free(path);
> >>>>
> >>>>  init_term(STDIN_FILENO, &attr);
> >>>>+ set_serial_argument(spty, "115200", "N", "8", "1", 1, 0);
> >>>>  console_loop(xc_handle, domid, spty);
> >>>>  restore_term(STDIN_FILENO, &attr);
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>Sincerely Yours
> >>>>
> >>>>Yu Ping
> >
> >_______________________________________________
> >Xen-devel mailing list
> >Xen-devel@xxxxxxxxxxxxxxxxxxx
> >http://lists.xensource.com/xen-devel
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.