summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/tty.c110
-rw-r--r--sys/sys/tty.h11
-rw-r--r--usr.sbin/pstat/pstat.c10
-rw-r--r--usr.sbin/sicontrol/sicontrol.c8
4 files changed, 90 insertions, 49 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index bac398b..64dcf31 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1,3 +1,5 @@
+static volatile int ttyverbose = 0;
+
/*-
* Copyright (c) 1982, 1986, 1990, 1991, 1993
* The Regents of the University of California. All rights reserved.
@@ -36,7 +38,7 @@
* SUCH DAMAGE.
*
* @(#)tty.c 8.8 (Berkeley) 1/21/94
- * $Id: tty.c,v 1.99 1997/12/06 13:23:52 bde Exp $
+ * $Id: tty.c,v 1.100 1997/12/16 17:40:24 eivind Exp $
*/
/*-
@@ -190,16 +192,8 @@ static u_char const char_type[] = {
#define CLR(t, f) (t) &= ~(f)
#define ISSET(t, f) ((t) & (f))
-/*
- * Input control starts when we would not be able to fit the maximum
- * contents of the ping-pong buffers and finishes when we would be able
- * to fit that much plus 1/8 more.
- */
-#define I_HIGH_WATER (TTYHOG - 2 * 256) /* XXX */
-#define I_LOW_WATER ((TTYHOG - 2 * 256) * 7 / 8) /* XXX */
-
#undef MAX_INPUT /* XXX wrong in <sys/syslimits.h> */
-#define MAX_INPUT TTYHOG
+#define MAX_INPUT TTYHOG /* XXX limit is usually larger for !ICANON */
/*
* Initial open of tty, or (re)entry to standard tty line discipline.
@@ -219,16 +213,7 @@ ttyopen(device, tp)
SET(tp->t_state, TS_CONNECTED);
bzero(&tp->t_winsize, sizeof(tp->t_winsize));
}
-
- /*
- * Initialize or restore a cblock allocation policy suitable for
- * the standard line discipline.
- */
- clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
- clist_alloc_cblocks(&tp->t_outq, TTMAXHIWAT + OBUFSIZ + 100,
- TTMAXHIWAT + OBUFSIZ + 100);
- clist_alloc_cblocks(&tp->t_rawq, TTYHOG, TTYHOG);
-
+ ttsetwater(tp);
splx(s);
return (0);
}
@@ -318,7 +303,7 @@ ttyinput(c, tp)
* The 3 is slop for PARMRK.
*/
iflag = tp->t_iflag;
- if (tp->t_rawq.c_cc + tp->t_canq.c_cc > I_HIGH_WATER - 3 &&
+ if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 &&
(!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) &&
(ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) &&
!ISSET(tp->t_state, TS_TBLOCK))
@@ -556,7 +541,7 @@ parmrk:
if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) {
input_overflow:
if (ISSET(iflag, IMAXBEL)) {
- if (tp->t_outq.c_cc < tp->t_hiwat)
+ if (tp->t_outq.c_cc < tp->t_ohiwat)
(void)ttyoutput(CTRL('g'), tp);
}
goto endcase;
@@ -1055,7 +1040,7 @@ ttypoll(tp, events, p)
selrecord(p, &tp->t_rsel);
if (events & (POLLOUT | POLLWRNORM))
- if ((tp->t_outq.c_cc <= tp->t_lowat &&
+ if ((tp->t_outq.c_cc <= tp->t_olowat &&
ISSET(tp->t_state, TS_CONNECTED))
|| ISSET(tp->t_state, TS_ZOMBIE))
revents |= events & (POLLOUT | POLLWRNORM);
@@ -1681,7 +1666,7 @@ out:
*/
s = spltty();
if (ISSET(tp->t_state, TS_TBLOCK) &&
- tp->t_rawq.c_cc + tp->t_canq.c_cc <= I_LOW_WATER)
+ tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat)
ttyunblock(tp);
splx(s);
@@ -1702,7 +1687,7 @@ ttycheckoutq(tp, wait)
{
int hiwat, s, oldsig;
- hiwat = tp->t_hiwat;
+ hiwat = tp->t_ohiwat;
s = spltty();
oldsig = wait ? curproc->p_siglist : 0;
if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100)
@@ -1736,7 +1721,7 @@ ttwrite(tp, uio, flag)
int i, hiwat, cnt, error, s;
char obuf[OBUFSIZ];
- hiwat = tp->t_hiwat;
+ hiwat = tp->t_ohiwat;
cnt = uio->uio_resid;
error = 0;
cc = 0;
@@ -2111,7 +2096,7 @@ ttwwakeup(tp)
register struct tty *tp;
{
- if (tp->t_wsel.si_pid != 0 && tp->t_outq.c_cc <= tp->t_lowat)
+ if (tp->t_wsel.si_pid != 0 && tp->t_outq.c_cc <= tp->t_olowat)
selwakeup(&tp->t_wsel);
if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
@@ -2119,7 +2104,7 @@ ttwwakeup(tp)
wakeup(TSA_OCOMPLETE(tp));
}
if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
- tp->t_outq.c_cc <= tp->t_lowat) {
+ tp->t_outq.c_cc <= tp->t_olowat) {
CLR(tp->t_state, TS_SO_OLOWAT);
wakeup(TSA_OLOWAT(tp));
}
@@ -2142,25 +2127,72 @@ ttspeedtab(speed, table)
}
/*
- * Set tty hi and low water marks.
- *
- * Try to arrange the dynamics so there's about one second
- * from hi to low water.
- *
+ * Set input and output watermarks and buffer sizes. For input, the
+ * high watermark is about one second's worth of input above empty, the
+ * low watermark is slightly below high water, and the buffer size is a
+ * driver-dependent amount above high water. For output, the watermarks
+ * are near the ends of the buffer, with about 1 second's worth of input
+ * between them. All this only applies to the standard line discipline.
*/
void
ttsetwater(tp)
struct tty *tp;
{
- register int cps, x;
+ register int cps, ttmaxhiwat, x;
+ /* Input. */
+ clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
+ if (ttyverbose)
+ printf("ttsetwater: can: %d, ", TTYHOG);
+ switch (tp->t_ispeedwat) {
+ case (speed_t)-1:
+ cps = tp->t_ispeed / 10;
+ break;
+ case 0:
+ /*
+ * This case is for old drivers that don't know about
+ * t_ispeedwat. Arrange for them to get the old buffer
+ * sizes and watermarks.
+ */
+ cps = TTYHOG - 2 * 256;
+ tp->t_ififosize = 2 * 256;
+ break;
+ default:
+ cps = tp->t_ispeedwat / 10;
+ break;
+ }
+ tp->t_ihiwat = cps;
+ tp->t_ilowat = 7 * cps / 8;
+ x = cps + tp->t_ififosize;
+ clist_alloc_cblocks(&tp->t_rawq, x, x);
+ if (ttyverbose)
+ printf("raw: %d, ", x);
+
+ /* Output. */
+ switch (tp->t_ospeedwat) {
+ case (speed_t)-1:
+ cps = tp->t_ospeed / 10;
+ ttmaxhiwat = 200000;
+ break;
+ case 0:
+ cps = tp->t_ospeed / 10;
+ ttmaxhiwat = TTMAXHIWAT;
+ break;
+ default:
+ cps = tp->t_ospeedwat / 10;
+ ttmaxhiwat = 200000;
+ break;
+ }
#define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
-
- cps = tp->t_ospeed / 10;
- tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
+ tp->t_olowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
x += cps;
- x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
- tp->t_hiwat = roundup(x, CBSIZE);
+ x = CLAMP(x, ttmaxhiwat, TTMINHIWAT); /* XXX clamps are too magic */
+ tp->t_ohiwat = roundup(x, CBSIZE); /* XXX for compat */
+ x = imax(tp->t_ohiwat, TTMAXHIWAT); /* XXX for compat/safety */
+ x += OBUFSIZ + 100;
+ clist_alloc_cblocks(&tp->t_outq, x, x);
+ if (ttyverbose)
+ printf("out: %d\n", x);
#undef CLAMP
}
diff --git a/sys/sys/tty.h b/sys/sys/tty.h
index bf0ec88..b7a59e8 100644
--- a/sys/sys/tty.h
+++ b/sys/sys/tty.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)tty.h 8.6 (Berkeley) 1/21/94
- * $Id: tty.h,v 1.39 1997/09/14 02:25:41 peter Exp $
+ * $Id: tty.h,v 1.40 1997/10/12 20:26:06 phk Exp $
*/
#ifndef _SYS_TTY_H_
@@ -92,8 +92,13 @@ struct tty {
void *t_sc; /* XXX: net/if_sl.c:sl_softc. */
int t_column; /* Tty output column. */
int t_rocount, t_rocol; /* Tty. */
- int t_hiwat; /* High water mark. */
- int t_lowat; /* Low water mark. */
+ int t_ififosize; /* Total size of upstream fifos. */
+ int t_ihiwat; /* High water mark for input. */
+ int t_ilowat; /* Low water mark for input. */
+ speed_t t_ispeedwat; /* t_ispeed override for watermarks. */
+ int t_ohiwat; /* High water mark for output. */
+ int t_olowat; /* Low water mark for output. */
+ speed_t t_ospeedwat; /* t_ospeed override for watermarks. */
int t_gen; /* Generation number. */
};
diff --git a/usr.sbin/pstat/pstat.c b/usr.sbin/pstat/pstat.c
index 7fc3f08..d5a26a6 100644
--- a/usr.sbin/pstat/pstat.c
+++ b/usr.sbin/pstat/pstat.c
@@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)pstat.c 8.16 (Berkeley) 5/9/95";
#endif
static const char rcsid[] =
- "$Id: pstat.c,v 1.33 1997/11/12 05:42:33 julian Exp $";
+ "$Id: pstat.c,v 1.34 1998/01/06 05:33:28 dyson Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -727,7 +727,8 @@ kinfo_vnodes(avnodes)
return ((struct e_vnode *)vbuf);
}
-char hdr[]=" LINE RAW CAN OUT HWT LWT COL STATE SESS PGID DISC\n";
+char hdr[] =
+" LINE RAW CAN OUT IHWT LWT OHWT LWT COL STATE SESS PGID DISC\n";
int ttyspace = 128;
void
@@ -894,8 +895,9 @@ ttyprt(tp, line)
else
(void)printf("%7s ", name);
(void)printf("%2d %3d ", tp->t_rawq.c_cc, tp->t_canq.c_cc);
- (void)printf("%3d %4d %3d %7d ", tp->t_outq.c_cc,
- tp->t_hiwat, tp->t_lowat, tp->t_column);
+ (void)printf("%3d %4d %3d %4d %3d %7d ", tp->t_outq.c_cc,
+ tp->t_ihiwat, tp->t_ilowat, tp->t_ohiwat, tp->t_olowat,
+ tp->t_column);
for (i = j = 0; ttystates[i].flag; i++)
if (tp->t_state&ttystates[i].flag)
state[j++] = ttystates[i].val;
diff --git a/usr.sbin/sicontrol/sicontrol.c b/usr.sbin/sicontrol/sicontrol.c
index eb93819..cda0346 100644
--- a/usr.sbin/sicontrol/sicontrol.c
+++ b/usr.sbin/sicontrol/sicontrol.c
@@ -33,7 +33,7 @@
#ifndef lint
static const char rcsid[] =
- "$Id$";
+ "$Id: sicontrol.c,v 1.7 1997/10/15 06:43:54 charnier Exp $";
#endif /* not lint */
#include <ctype.h>
@@ -488,8 +488,10 @@ char **av;
printf("\tt_dev 0x%x\n", TTY.t_dev); /* dev_t t_dev */
printf("\tt_flags 0x%x\n", TTY.t_flags); /* int t_flags */
printf("\tt_state 0x%x\n", TTY.t_state); /* int t_state */
- printf("\tt_hiwat %d.\n", TTY.t_hiwat); /* short t_hiwat */
- printf("\tt_lowat %d.\n", TTY.t_lowat); /* short t_lowat */
+ printf("\tt_ihiwat %d.\n", TTY.t_ihiwat); /* int t_ihiwat */
+ printf("\tt_ilowat %d.\n", TTY.t_ilowat); /* int t_ilowat */
+ printf("\tt_ohiwat %d.\n", TTY.t_ohiwat); /* int t_ohiwat */
+ printf("\tt_olowat %d.\n", TTY.t_olowat); /* int t_olowat */
printf("\tt_iflag 0x%x\n", TTY.t_iflag); /* t_iflag */
printf("\tt_oflag 0x%x\n", TTY.t_oflag); /* t_oflag */
printf("\tt_cflag 0x%x\n", TTY.t_cflag); /* t_cflag */
OpenPOWER on IntegriCloud