Date: Mon, 12 Mar 2001 15:20:54 +0000 From: Ian Dowse <iedowse@maths.tcd.ie> To: j mckitrick <jcm@FreeBSD-uk.eu.org> Cc: Alfred Perlstein <bright@wintelcom.net>, freebsd-stable@freebsd.org, iedowse@maths.tcd.ie Subject: Re: suspend/restore with ppp connections Message-ID: <200103121520.aa08765@salmon.maths.tcd.ie> In-Reply-To: Your message of "Mon, 12 Mar 2001 14:56:22 GMT." <20010312145622.A87895@dogma.freebsd-uk.eu.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message <20010312145622.A87895@dogma.freebsd-uk.eu.org>, j mckitrick writes:
>
>Now this is the kind of thing I would be interested in helping fix. But if
>you say sio has bigger problems, I might be in over my head. What would
>happen if I just added those tests for NULL?
You could try something like the patch below - I'm sure this isn't
the right way to fix this - the struct tty leaks will still happen
here. However it may be enough to avoids the page faults and make
suspend/resume while a pccard serial port is open a bit more
reliable.
Someone who knows the tty code better than I do might be able to
explain how to deal with a tty going away while it is open. It
seems that the `t_gen' field should help with that, so the sio
driver certainly shouldn't be mallocing a new tty every time a card
is reattached.
Ian
Index: sio.c
===================================================================
RCS file: /dump/FreeBSD-CVS/src/sys/isa/sio.c,v
retrieving revision 1.291.2.15
diff -u -r1.291.2.15 sio.c
--- sio.c 2001/02/26 04:23:14 1.291.2.15
+++ sio.c 2001/03/12 15:10:02
@@ -560,6 +560,7 @@
if (com->tp && (com->tp->t_state & TS_ISOPEN)) {
device_printf(dev, "still open, forcing close\n");
com->tp->t_gen++;
+ (*linesw[com->tp->t_line].l_close)(com->tp, 0);
ttyclose(com->tp);
ttwakeup(com->tp);
ttwwakeup(com->tp);
@@ -1386,7 +1387,7 @@
error = tsleep(&com->dtr_wait, TTIPRI | PCATCH, "siodtr", 0);
if (com_addr(unit) == NULL)
return (ENXIO);
- if (error != 0 || com->gone)
+ if (error != 0 || com->gone || com->tp == NULL)
goto out;
}
if (tp->t_state & TS_ISOPEN) {
@@ -1409,7 +1410,7 @@
TTIPRI | PCATCH, "siobi", 0);
if (com_addr(unit) == NULL)
return (ENXIO);
- if (error != 0 || com->gone)
+ if (error != 0 || com->gone || com->tp == NULL)
goto out;
goto open_top;
}
@@ -1518,7 +1519,7 @@
if (com_addr(unit) == NULL)
return (ENXIO);
--com->wopeners;
- if (error != 0 || com->gone)
+ if (error != 0 || com->gone || com->tp == NULL)
goto out;
goto open_top;
}
@@ -1550,7 +1551,7 @@
if (mynor & CONTROL_MASK)
return (0);
com = com_addr(MINOR_TO_UNIT(mynor));
- if (com == NULL)
+ if (com == NULL || com->tp == NULL)
return (ENODEV);
tp = com->tp;
s = spltty();
@@ -1637,7 +1638,7 @@
if (mynor & CONTROL_MASK)
return (ENODEV);
com = com_addr(MINOR_TO_UNIT(mynor));
- if (com == NULL || com->gone)
+ if (com == NULL || com->gone || com->tp == NULL)
return (ENODEV);
return ((*linesw[com->tp->t_line].l_read)(com->tp, uio, flag));
}
@@ -1658,7 +1659,7 @@
unit = MINOR_TO_UNIT(mynor);
com = com_addr(unit);
- if (com == NULL || com->gone)
+ if (com == NULL || com->gone || com->tp == NULL)
return (ENODEV);
/*
* (XXX) We disallow virtual consoles if the physical console is
@@ -2076,7 +2077,7 @@
mynor = minor(dev);
com = com_addr(MINOR_TO_UNIT(mynor));
- if (com == NULL || com->gone)
+ if (com == NULL || com->gone || com->tp == NULL)
return (ENODEV);
if (mynor & CONTROL_MASK) {
struct termios *ct;
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103121520.aa08765>
