Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Feb 2006 14:19:09 +0200
From:      Giorgos Keramidas <keramida@ceid.upatras.gr>
To:        Robert Watson <rwatson@freebsd.org>
Cc:        freebsd-current@freebsd.org, Steve Kargl <sgk@troutmask.apl.washington.edu>, Olivier Houchard <cognet@freebsd.org>, freebsd-amd64@freebsd.org
Subject:   Re: HEADSUP: New pts code triggers panics on amd64 systems.
Message-ID:  <20060208121909.GA795@flame.pc>
In-Reply-To: <20060208110655.GC1181@flame.pc>
References:  <20060201235556.GA708@troutmask.apl.washington.edu> <20060207104411.GA1067@flame.pc> <20060207132335.W37594@fledge.watson.org> <20060208105613.GA1181@flame.pc> <20060208110655.GC1181@flame.pc>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2006-02-08 13:06, Giorgos Keramidas <keramida@ceid.upatras.gr> wrote:
> On 2006-02-08 12:56, Giorgos Keramidas <keramida@ceid.upatras.gr> wrote:
> >On 2006-02-07 13:26, Robert Watson <rwatson@FreeBSD.org> wrote:
> >> Does the instability occur if kern.pts.enable=0, or only when
> >> kern.pts.enable=1?
> >
> > Both.  I rebuilt a kernel & userland from today's HEAD, and installed it
> > on a clean partition.  Both a GENERIC kernel and my own FLAME kernel
> > config (attached) were tested with kern.pts.enable=0 and kern.pts.enable=1.
>
> Attachment forgotten... naturally :)

I updated to HEAD and then reverted the tty_pts changes from src/sys
only, using the attached patch, but the problems of syscons are still
there :-/

%%%
Index: conf/files
===================================================================
--- conf/files	(revision 10)
+++ conf/files	(revision 11)
@@ -1347,7 +1347,6 @@
 kern/tty_conf.c			standard
 kern/tty_cons.c			standard
 kern/tty_pty.c			optional pty
-kern/tty_pts.c			optional pty
 kern/tty_subr.c			standard
 kern/tty_tty.c			standard
 kern/uipc_accf.c		optional inet
Index: kern/tty_pty.c
===================================================================
--- kern/tty_pty.c	(revision 10)
+++ kern/tty_pty.c	(revision 11)
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/tty_pty.c,v 1.145 2006/02/02 20:35:45 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/tty_pty.c,v 1.141 2006/01/10 09:19:09 phk Exp $");
 
 /*
  * Pseudo-teletype Driver
@@ -107,7 +107,6 @@
 	u_char	pt_ucntl;
 	struct tty *pt_tty;
 	struct cdev *devs, *devc;
-	int	pt_devs_open, pt_devc_open;
 	struct	prison *pt_prison;
 };
 
@@ -133,6 +132,7 @@
 static struct cdev *
 ptyinit(struct cdev *devc, struct thread *td)
 {
+	struct cdev *devs;
 	struct ptsc *pt;
 	int n;
 
@@ -143,47 +143,19 @@
 
 	devc->si_flags &= ~SI_CHEAPCLONE;
 
-	/*
-	 * Initially do not create a slave endpoint.
-	 */
 	pt = malloc(sizeof(*pt), M_PTY, M_WAITOK | M_ZERO);
+	pt->devs = devs = make_dev_cred(&pts_cdevsw, n, td->td_ucred,
+	    UID_ROOT, GID_WHEEL, 0666, "tty%c%r", names[n / 32], n % 32);
 	pt->devc = devc;
 
 	pt->pt_tty = ttyalloc();
 	pt->pt_tty->t_sc = pt;
-	devc->si_drv1 = pt;
-	devc->si_tty = pt->pt_tty;
+	devs->si_drv1 = devc->si_drv1 = pt;
+	devs->si_tty = devc->si_tty = pt->pt_tty;
+	pt->pt_tty->t_dev = devs;
 	return (devc);
 }
 
-static void
-pty_create_slave(struct ucred *cred, struct ptsc *pt, int n)
-{
-
-	pt->devs = make_dev_cred(&pts_cdevsw, n, cred, UID_ROOT, GID_WHEEL,
-	    0666, "tty%c%r", names[n / 32], n % 32);
-	pt->devs->si_drv1 = pt;
-	pt->devs->si_tty = pt->pt_tty;
-	pt->pt_tty->t_dev = pt->devs;
-}
-
-static void
-pty_destroy_slave(struct ptsc *pt)
-{
-
-	pt->pt_tty->t_dev = NULL;
-	destroy_dev(pt->devs);
-	pt->devs = NULL;
-}
-
-static void
-pty_maybe_destroy_slave(struct ptsc *pt)
-{
-
-	if (0 && pt->pt_devc_open == 0 && pt->pt_devs_open == 0)
-		pty_destroy_slave(pt);
-}
-
 /*ARGSUSED*/
 static	int
 ptsopen(struct cdev *dev, int flag, int devtype, struct thread *td)
@@ -200,7 +172,7 @@
 		ttyinitmode(tp, 1, 0);
 	} else if (tp->t_state & TS_XCLUDE && suser(td))
 		return (EBUSY);
-	else if (pt->pt_prison != td->td_ucred->cr_prison && suser(td))
+	else if (pt->pt_prison != td->td_ucred->cr_prison)
 		return (EBUSY);
 	if (tp->t_oproc)			/* Ctrlr still around. */
 		(void)ttyld_modem(tp, 1);
@@ -213,32 +185,20 @@
 			return (error);
 	}
 	error = ttyld_open(tp, dev);
-	if (error == 0) {
+	if (error == 0)
 		ptcwakeup(tp, FREAD|FWRITE);
-		pt->pt_devs_open = 1;
-	} else
-		pty_maybe_destroy_slave(pt);
 	return (error);
 }
 
 static	int
 ptsclose(struct cdev *dev, int flag, int mode, struct thread *td)
 {
-	struct ptsc *pti;
 	struct tty *tp;
 	int err;
 
 	tp = dev->si_tty;
-	pti = dev->si_drv1;
-
-	KASSERT(dev == pti->devs, ("ptsclose: dev != pti->devs"));
-
 	err = ttyld_close(tp, flag);
 	(void) tty_close(tp);
-
-	pti->pt_devs_open = 0;
-	pty_maybe_destroy_slave(pti);
-
 	return (err);
 }
 
@@ -326,18 +286,12 @@
 	pt->pt_flags = 0;
 	pt->pt_send = 0;
 	pt->pt_ucntl = 0;
-
-	if (!pt->devs)
-		pty_create_slave(td->td_ucred, pt, minor(dev));
-	pt->pt_devc_open = 1;
-
 	return (0);
 }
 
 static	int
 ptcclose(struct cdev *dev, int flags, int fmt, struct thread *td)
 {
-	struct ptsc *pti = dev->si_drv1;
 	struct tty *tp;
 
 	tp = dev->si_tty;
@@ -358,8 +312,6 @@
 	}
 
 	tp->t_oproc = 0;		/* mark closed */
-	pti->pt_devc_open = 0;
-	pty_maybe_destroy_slave(pti);
 	return (0);
 }
 
%%%



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