PERFORCE change 124298 for review
Peter Wemm
peter at FreeBSD.org
Sun Jul 29 06:26:28 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124298
Change 124298 by peter at peter_overcee on 2007/07/29 06:26:18
Cleanup various bits.
* Since we're giant locked, and will never do spl's again, toss the stupid
in_intr detection. It'll be mutex locked at some point if ttys ever
allow it.
* likewise, we don't need to detect the timeout is running. Giant means
it can't happen.
* assert &Giant to make sure this is the case.
* clean up some stuff that looks silly.
* remove some unused relics.
* turn off actual polling.
Affected files ...
.. //depot/projects/hammer/sys/dev/si/si.c#22 edit
.. //depot/projects/hammer/sys/dev/si/si.h#6 edit
Differences ...
==== //depot/projects/hammer/sys/dev/si/si.c#22 (text+ko) ====
@@ -83,7 +83,9 @@
*/
#define POLL /* turn on poller to scan for lost interrupts */
+#if 0
#define REALPOLL /* on each poll, scan for work regardless */
+#endif
#define POLLHZ (hz/10) /* 10 times per second */
#define SI_I_HIGH_WATER (TTYHOG - 2 * SI_BUFFERSIZE)
#define INT_COUNT 25000 /* max of 125 ints per second */
@@ -166,7 +168,6 @@
{ B115200, 11520, },
{ -1, -1 },
};
-static volatile int in_intr = 0; /* Inside interrupt handler? */
#ifdef POLL
static int si_pollrate; /* in addition to irq */
@@ -594,6 +595,7 @@
siopen(struct tty *tp, struct cdev *dev)
{
+ mtx_assert(&Giant, MA_OWNED);
#ifdef POLL
/*
* We've now got a device, so start the poller.
@@ -611,6 +613,7 @@
{
struct si_port *pp;
+ mtx_assert(&Giant, MA_OWNED);
pp = tp->t_sc;
(void) si_command(pp, FCLOSE, SI_NOWAIT);
}
@@ -620,6 +623,7 @@
{
struct si_port *pp;
+ mtx_assert(&Giant, MA_OWNED);
pp = tp->t_sc;
if (sig)
si_command(pp, SBREAK, SI_WAIT);
@@ -645,6 +649,7 @@
DPRINT((0, DBG_ENTRY|DBG_IOCTL, "si_Sioctl(%s,%lx,%x,%x)\n",
devtoname(dev), cmd, data, flag));
+ mtx_assert(&Giant, MA_OWNED);
#if 1
DPRINT((0, DBG_IOCTL, "TCSI_PORT=%x\n", TCSI_PORT));
@@ -786,6 +791,7 @@
BYTE val;
DPRINT((pp, DBG_ENTRY|DBG_PARAM, "siparam(%x,%x)\n", tp, t));
+ mtx_assert(&Giant, MA_OWNED);
cflag = t->c_cflag;
iflag = t->c_iflag;
oflag = t->c_oflag;
@@ -954,6 +960,7 @@
pp = tp->t_sc;
DPRINT((pp, DBG_ENTRY|DBG_MODEM, "simodem(%x,%x)\n", sigon, sigoff));
+ mtx_assert(&Giant, MA_OWNED);
ccbp = pp->sp_ccb; /* Find channel address */
if (sigon == 0 && sigoff == 0) {
x = ccbp->hi_ip;
@@ -988,6 +995,7 @@
si_modem_state(struct si_port *pp, struct tty *tp, int hi_ip)
{
/* if a modem dev */
+ mtx_assert(&Giant, MA_OWNED);
if (hi_ip & IP_DCD) {
if (!(pp->sp_last_hi_ip & IP_DCD)) {
DPRINT((pp, DBG_INTR, "modem carr on t_line %d\n",
@@ -1023,8 +1031,7 @@
DPRINT((0, DBG_POLL, "si_poll()\n"));
oldspl = spltty();
- if (in_intr)
- goto out;
+ mtx_assert(&Giant, MA_OWNED);
lost = 0;
for (i = 0; i < si_numunits; i++) {
sc = devclass_get_softc(si_devclass, i);
@@ -1061,7 +1068,6 @@
}
if (lost || si_realpoll)
si_intr(NULL); /* call intr with fake vector */
-out:
splx(oldspl);
timeout(si_poll, (caddr_t)0L, si_pollrate);
@@ -1090,11 +1096,9 @@
BYTE c;
sc = arg;
+ mtx_assert(&Giant, MA_OWNED);
DPRINT((0, arg == NULL ? DBG_POLL:DBG_INTR, "si_intr\n"));
- if (in_intr)
- return;
- in_intr = 1;
/*
* When we get an int we poll all the channels and do ALL pending
@@ -1184,9 +1188,8 @@
/*
* Continue on if it's closed
*/
- if (ccbp->hi_stat == IDLE_CLOSE) {
+ if (ccbp->hi_stat == IDLE_CLOSE)
continue;
- }
/*
* Do modem state change if not a local device
@@ -1206,9 +1209,8 @@
* Do input break processing
*/
if (ccbp->hi_state & ST_BREAK) {
- if (isopen) {
+ if (isopen)
ttyld_rint(tp, TTY_BI);
- }
ccbp->hi_state &= ~ST_BREAK; /* A Bit iffy this */
DPRINT((pp, DBG_INTR, "si_intr break\n"));
}
@@ -1222,7 +1224,7 @@
* if the user cannot get an interrupt signal through.
*/
- more_rx: /* XXX Sorry. the nesting was driving me bats! :-( */
+ more_rx:
if (!isopen) {
ccbp->hi_rxopos = ccbp->hi_rxipos;
@@ -1234,9 +1236,8 @@
* the incoming buffers and let the auto flow control
* assert..
*/
- if (tp->t_state & TS_TBLOCK) {
+ if (tp->t_state & TS_TBLOCK)
goto end_rx;
- }
/*
* Process read characters if not skipped above
@@ -1244,9 +1245,8 @@
op = ccbp->hi_rxopos;
ip = ccbp->hi_rxipos;
c = ip - op;
- if (c == 0) {
+ if (c == 0)
goto end_rx;
- }
n = c & 0xff;
if (n > 250)
@@ -1336,15 +1336,13 @@
*/
for(x = 0; x < n; x++) {
i = si_rxbuf[x];
- if (ttyld_rint(tp, i)
- == -1) {
+ if (ttyld_rint(tp, i) == -1)
pp->sp_delta_overflows++;
- }
}
}
goto more_rx; /* try for more until RXbuf is empty */
- end_rx: /* XXX: Again, sorry about the gotos.. :-) */
+ end_rx:
/*
* Do TX stuff
@@ -1354,7 +1352,6 @@
} /* end of for (all ports on this controller) */
} /* end of for (all controllers) */
- in_intr = 0;
DPRINT((0, arg == NULL ? DBG_POLL:DBG_INTR, "end si_intr\n"));
}
@@ -1376,9 +1373,10 @@
struct clist *qp;
BYTE ipos;
int nchar;
- int oldspl, count, n, amount, buffer_full;
+ int oldspl, count, n, amount;
oldspl = spltty();
+ mtx_assert(&Giant, MA_OWNED);
qp = &tp->t_outq;
pp = tp->t_sc;
@@ -1390,17 +1388,14 @@
if (tp->t_state & (TS_TIMEOUT|TS_TTSTOP))
goto out;
- buffer_full = 0;
ccbp = pp->sp_ccb;
count = (int)ccbp->hi_txipos - (int)ccbp->hi_txopos;
DPRINT((pp, DBG_START, "count %d\n", (BYTE)count));
while ((nchar = qp->c_cc) > 0) {
- if ((BYTE)count >= 255) {
- buffer_full++;
+ if ((BYTE)count >= 255)
break;
- }
amount = min(nchar, (255 - (BYTE)count));
ipos = (unsigned int)ccbp->hi_txipos;
n = q_to_b(&tp->t_outq, si_txbuf, amount);
@@ -1417,11 +1412,10 @@
count = (int)ccbp->hi_txipos - (int)ccbp->hi_txopos;
}
- if (count != 0 && nchar == 0) {
+ if (count != 0 && nchar == 0)
tp->t_state |= TS_BUSY;
- } else {
+ else
tp->t_state &= ~TS_BUSY;
- }
/* wakeup time? */
ttwwakeup(tp);
@@ -1429,8 +1423,7 @@
DPRINT((pp, DBG_START, "count %d, nchar %d, tp->t_state 0x%x\n",
(BYTE)count, nchar, tp->t_state));
- if (tp->t_state & TS_BUSY)
- {
+ if (tp->t_state & TS_BUSY) {
int time;
time = ttspeedtab(tp->t_ospeed, chartimes);
@@ -1446,12 +1439,10 @@
time = hz/10;
}
- if ((pp->sp_state & (SS_LSTART|SS_INLSTART)) == SS_LSTART) {
+ if ((pp->sp_state & SS_LSTART) != 0)
untimeout(si_lstart, (caddr_t)pp, pp->lstart_ch);
- } else {
- pp->sp_state |= SS_LSTART;
- }
DPRINT((pp, DBG_START, "arming lstart, time=%d\n", time));
+ pp->sp_state |= SS_LSTART;
pp->lstart_ch = timeout(si_lstart, (caddr_t)pp, time);
}
@@ -1477,16 +1468,14 @@
pp, pp->sp_state));
oldspl = spltty();
+ mtx_assert(&Giant, MA_OWNED);
+ pp->sp_state &= ~SS_LSTART;
tp = pp->sp_tty;
- if ((tp->t_state & TS_ISOPEN) == 0 ||
- (pp->sp_state & SS_LSTART) == 0) {
+ if ((tp->t_state & TS_ISOPEN) == 0) {
splx(oldspl);
return;
}
- pp->sp_state &= ~SS_LSTART;
- pp->sp_state |= SS_INLSTART;
-
/* deal with the process exit case */
ttwwakeup(tp);
@@ -1494,7 +1483,6 @@
/* nudge protocols - eg: ppp */
ttyld_start(tp);
- pp->sp_state &= ~SS_INLSTART;
splx(oldspl);
}
@@ -1507,6 +1495,7 @@
volatile struct si_channel *ccbp;
struct si_port *pp;
+ mtx_assert(&Giant, MA_OWNED);
pp = tp->t_sc;
ccbp = pp->sp_ccb;
@@ -1548,6 +1537,7 @@
pp, cmd, waitflag, ccbp->hi_stat));
oldspl = spltty(); /* Keep others out */
+ mtx_assert(&Giant, MA_OWNED);
/* wait until it's finished what it was doing.. */
/* XXX: sits in IDLE_BREAK until something disturbs it or break
@@ -1556,13 +1546,7 @@
x != IDLE_CLOSE &&
x != IDLE_BREAK &&
x != cmd) {
- if (in_intr) { /* Prevent sleep in intr */
- DPRINT((pp, DBG_PARAM,
- "cmd intr collision - completing %d\trequested %d\n",
- x, cmd));
- splx(oldspl);
- return;
- } else if (ttysleep(pp->sp_tty, (caddr_t)&pp->sp_state, TTIPRI|PCATCH,
+ if (ttysleep(pp->sp_tty, (caddr_t)&pp->sp_state, TTIPRI|PCATCH,
"sicmd1", 1)) {
splx(oldspl);
return;
@@ -1588,13 +1572,7 @@
ccbp->hi_stat = cmd; /* Post it */
if (waitflag) {
- if (in_intr) { /* If in interrupt handler */
- DPRINT((pp, DBG_PARAM,
- "attempt to sleep in si_intr - cmd req %d\n",
- cmd));
- splx(oldspl);
- return;
- } else while(ccbp->hi_stat != IDLE_OPEN &&
+ while(ccbp->hi_stat != IDLE_OPEN &&
ccbp->hi_stat != IDLE_BREAK) {
if (ttysleep(pp->sp_tty, (caddr_t)&pp->sp_state, TTIPRI|PCATCH,
"sicmd2", 0))
==== //depot/projects/hammer/sys/dev/si/si.h#6 (text+ko) ====
@@ -302,7 +302,7 @@
/* 0x0040 -- */
/* 0x0080 -- */
#define SS_LSTART 0x0100 /* lstart timeout pending */
-#define SS_INLSTART 0x0200 /* running an lstart induced t_oproc */
+/* 0x0200 -- */
/* 0x0400 -- */
/* 0x0800 -- */
More information about the p4-projects
mailing list