Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 Dec 1995 18:31:34 +1100
From:      Bruce Evans <bde@zeta.org.au>
To:        hackers@freebsd.org, imb@scgt.oz.au
Subject:   Re: 2.1 instabilities
Message-ID:  <199512310731.SAA22598@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>As a consequence of (not unexpected) instabilities in -current, I reverted
>four of my machines back to -stable but I have a few niggling problems.

>Two of them occasionally stop dead whilst under heavy ppp load. Both are
>using kernel-based ppp. One of them simply stops blinking his cursor and
>simply goes to sleep. No keyboard response, nothing :-(. Very rarely, it
>will just spontaneously reboot (which I'd actually prefer as it's 4km away).

Try the following fix from -current:
---
[part of] diff -c -2 -r1.8.4.1 -r1.12
*** spl.h	1995/08/23 09:43:11	1.8.4.1
--- spl.h	1995/10/30 17:01:37	1.12
***************
*** 63,69 ****
   * run while other swi handlers are running and timeout routines can call
   * swi handlers.  Everything includes SWI_AST_MASK so that AST's are masked
!  * until just before return to user mode.
   */
! #define	SWI_TTY_MASK	(SWI_TTY_PENDING | SWI_CLOCK_MASK)
  #define	SWI_NET_MASK	(SWI_NET_PENDING | SWI_CLOCK_MASK)
  #define	SWI_CLOCK_MASK	(SWI_CLOCK_PENDING | SWI_AST_MASK)
--- 63,73 ----
   * run while other swi handlers are running and timeout routines can call
   * swi handlers.  Everything includes SWI_AST_MASK so that AST's are masked
!  * until just before return to user mode.  SWI_TTY_MASK includes SWI_NET_MASK
!  * in case tty interrupts are processed at splsofttty() for a tty that is in
!  * SLIP or PPP line discipline (this is weaker than merging net_imask with
!  * tty_imask in isa.c - splimp() must mask hard and soft tty interrupts, but
!  * spltty() apparently only needs to mask soft net interrupts).
   */
! #define	SWI_TTY_MASK	(SWI_TTY_PENDING | SWI_CLOCK_MASK | SWI_NET_MASK)
  #define	SWI_NET_MASK	(SWI_NET_PENDING | SWI_CLOCK_MASK)
  #define	SWI_CLOCK_MASK	(SWI_CLOCK_PENDING | SWI_AST_MASK)
---

>The other, the only other under such a heavy load, stops forwarding IP
>packets and a ping (from the host itself) to any one of the remote users
>returns a "cannot write, no buffers available" error. The mbuf cluster count
>is <100 although there are usually somewhere around 100-300 mbufs allocated
>to data (load dependent). Killing any pppd will solve the problem until the
>next recurrence.

The fix is less likely to help here.

>...
>Switching to user-mode PPP is not an option .. each link is sufficiently
>saturated so as to cause echo packets to be lost (or delayed beyond its
>tolerance). Using it, none of them will stay connected for >15 minutes with
>the end-user's current data rates (bulk NNTP traffic yielding averages above
>3000cps).

3000 cps/line (8 lines?).  That is possible but perhaps not easy for the
486DX33.  These changes from -current and hsu's changes for increasing
the buffer sizes might help.  These changes only affect termios mode, not
slip or ppp.
---
[part of] diff -c -2 -r1.46.2.2 -r1.78
*** tty.c	1995/11/03 08:01:04	1.46.2.2
--- tty.c	1995/12/16 21:45:02	1.78
***************
*** 216,220 ****
  	 */
  	clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
! 	clist_alloc_cblocks(&tp->t_outq, TTMAXHIWAT + 200, 512);
  	clist_alloc_cblocks(&tp->t_rawq, TTYHOG, TTYHOG);
  
--- 222,227 ----
  	 */
  	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);
  
***************
*** 1161,1165 ****
--- 1168,1185 ----
  		ttwakeup(tp);
  		if (ISSET(tp->t_state, TS_TBLOCK)) {
+ 			if (rw & FWRITE)
+ 				FLUSHQ(&tp->t_outq);
  			ttyunblock(tp);
+ 
+ 			/*
+ 			 * Don't let leave any state that might clobber the
+ 			 * next line discipline (although we should do more
+ 			 * to send the START char).  Not clearing the state
+ 			 * may have caused the "putc to a clist with no
+ 			 * reserved cblocks" panic/printf.
+ 			 */
+ 			CLR(tp->t_state, TS_TBLOCK);
+ 
+ #if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
  			if (ISSET(tp->t_iflag, IXOFF)) {
  				/*
***************
*** 1181,1184 ****
--- 1201,1205 ----
  				goto again;
  			}
+ #endif
  		}
  	}
***************
*** 1672,1676 ****
  	s = spltty();
  	oldsig = wait ? curproc->p_siglist : 0;
! 	if (tp->t_outq.c_cc > hiwat + 200)
  		while (tp->t_outq.c_cc > hiwat) {
  			ttstart(tp);
--- 1699,1703 ----
  	s = spltty();
  	oldsig = wait ? curproc->p_siglist : 0;
! 	if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100)
  		while (tp->t_outq.c_cc > hiwat) {
  			ttstart(tp);
---

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512310731.SAA22598>