On Thu, Aug 23, 2007 at 09:36:42AM -0700, Mark wrote:
> Sorry about the HTML email, I think it is disabled now.

Yup, thanks.

> The ioctl calls that returned -1 from the strace are:
> ioctl (4, TIOCGSERIAL)
> ioctl (3, TIOCMGET,[0])
> ioctl (4, SNDCTL_TMR_START or TCSETS, {B230400 -opost -isig -icanon
> -echo ...})

See if the patch below makes any difference.  I pass TIOCGSERIAL
through to the host since the serial drivers seem to handle it.
TIOCMGET and TCSETS seem to be handled within the kernel without
looking at hardware.

> The problem seems (to me) to be that the buffer in the host is not
> getting flushed to the client (or guest to host) correctly or something
> similar.  I also suspect this is the same reason ssh and sftp are slow
> to get the login prompt.   Not a big problem though.

You might debug this by running strace simultaneously, with
timestamps, on UML on the host and on wvdial inside UML and merging
the output.

                                Jeff

-- 
Work email - jdike at linux dot intel dot com

Index: linux-2.6.22/arch/um/drivers/chan_kern.c
===================================================================
--- linux-2.6.22.orig/arch/um/drivers/chan_kern.c       2007-08-24 
12:45:06.000000000 -0400
+++ linux-2.6.22/arch/um/drivers/chan_kern.c    2007-08-24 12:45:29.000000000 
-0400
@@ -309,6 +309,21 @@ int write_chan(struct list_head *chans, 
        return ret;
 }
 
+int ioctl_chan(struct list_head *chans, unsigned int cmd, unsigned long arg)
+{
+       struct list_head *ele;
+       struct chan *chan;
+
+       list_for_each(ele, chans) {
+               chan = list_entry(ele, struct chan, list);
+               if (chan->primary)
+                       return os_ioctl_generic(chan->fd, cmd, arg);
+       }
+
+       /* Shouldn't get here */
+       return -ENODEV;
+}
+
 int console_write_chan(struct list_head *chans, const char *buf, int len)
 {
        struct list_head *ele;
Index: linux-2.6.22/arch/um/drivers/line.c
===================================================================
--- linux-2.6.22.orig/arch/um/drivers/line.c    2007-08-24 12:45:06.000000000 
-0400
+++ linux-2.6.22/arch/um/drivers/line.c 2007-08-24 12:58:50.000000000 -0400
@@ -5,6 +5,8 @@
 
 #include "linux/irqreturn.h"
 #include "linux/kd.h"
+#include <linux/serial.h>
+#include <asm/uaccess.h>
 #include "chan_kern.h"
 #include "irq_kern.h"
 #include "irq_user.h"
@@ -242,37 +244,11 @@ void line_set_termios(struct tty_struct 
        /* nothing */
 }
 
-static const struct {
-       int  cmd;
-       char *level;
-       char *name;
-} tty_ioctls[] = {
-       /* don't print these, they flood the log ... */
-       { TCGETS,      NULL,       "TCGETS"      },
-       { TCSETS,      NULL,       "TCSETS"      },
-       { TCSETSW,     NULL,       "TCSETSW"     },
-       { TCFLSH,      NULL,       "TCFLSH"      },
-       { TCSBRK,      NULL,       "TCSBRK"      },
-
-       /* general tty stuff */
-       { TCSETSF,     KERN_DEBUG, "TCSETSF"     },
-       { TCGETA,      KERN_DEBUG, "TCGETA"      },
-       { TIOCMGET,    KERN_DEBUG, "TIOCMGET"    },
-       { TCSBRKP,     KERN_DEBUG, "TCSBRKP"     },
-       { TIOCMSET,    KERN_DEBUG, "TIOCMSET"    },
-
-       /* linux-specific ones */
-       { TIOCLINUX,   KERN_INFO,  "TIOCLINUX"   },
-       { KDGKBMODE,   KERN_INFO,  "KDGKBMODE"   },
-       { KDGKBTYPE,   KERN_INFO,  "KDGKBTYPE"   },
-       { KDSIGACCEPT, KERN_INFO,  "KDSIGACCEPT" },
-};
-
 int line_ioctl(struct tty_struct *tty, struct file * file,
               unsigned int cmd, unsigned long arg)
 {
+       struct line *line = tty->driver_data;
        int ret;
-       int i;
 
        ret = 0;
        switch(cmd) {
@@ -294,6 +270,9 @@ int line_ioctl(struct tty_struct *tty, s
        case TCSETSW:
        case TCSETS:
        case TCGETA:
+       case TIOCMGET:
+       case TIOCMSET:
+       case TCSBRKP:
        case TCSETAF:
        case TCSETAW:
        case TCSETA:
@@ -306,20 +285,29 @@ int line_ioctl(struct tty_struct *tty, s
        case TIOCPKT:
        case TIOCGSOFTCAR:
        case TIOCSSOFTCAR:
+       case TIOCLINUX:
+       case KDGKBMODE:
+       case KDGKBTYPE:
+       case KDSIGACCEPT:
                return -ENOIOCTLCMD;
+       case TIOCGSERIAL: {
+               struct serial_struct tmp;
+
+               ret = ioctl_chan(&line->chan_list, TIOCGSERIAL, (int) &tmp);
+               if (ret)
+                       break;
+
+               if (copy_to_user((void __user *) arg, &tmp, sizeof(tmp)))
+                       ret = -EFAULT;
+       }
 #if 0
        case TCwhatever:
                /* do something */
                break;
 #endif
        default:
-               for (i = 0; i < ARRAY_SIZE(tty_ioctls); i++)
-                       if (cmd == tty_ioctls[i].cmd)
-                               break;
-               if (i == ARRAY_SIZE(tty_ioctls)) {
-                       printk(KERN_ERR "%s: %s: unknown ioctl: 0x%x\n",
-                              __FUNCTION__, tty->name, cmd);
-               }
+               printk(KERN_ERR "line_ioctl : %s: unknown ioctl: 0x%x\n",
+                      tty->name, cmd);
                ret = -ENOIOCTLCMD;
                break;
        }
Index: linux-2.6.22/arch/um/include/chan_kern.h
===================================================================
--- linux-2.6.22.orig/arch/um/include/chan_kern.h       2007-08-24 
12:45:06.000000000 -0400
+++ linux-2.6.22/arch/um/include/chan_kern.h    2007-08-24 12:45:29.000000000 
-0400
@@ -34,6 +34,8 @@ extern int parse_chan_pair(char *str, st
 extern int open_chan(struct list_head *chans);
 extern int write_chan(struct list_head *chans, const char *buf, int len,
                             int write_irq);
+extern int ioctl_chan(struct list_head *chans, unsigned int cmd,
+                     unsigned long arg);
 extern int console_write_chan(struct list_head *chans, const char *buf, 
                              int len);
 extern int console_open_chan(struct line *line, struct console *co);

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
User-mode-linux-user mailing list
User-mode-linux-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user

Reply via email to