From owner-svn-src-head@FreeBSD.ORG Wed Feb 6 15:36:16 2013 Return-Path: Delivered-To: svn-src-head@FreeBSD.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id A1FCD90D; Wed, 6 Feb 2013 15:36:16 +0000 (UTC) (envelope-from ian@FreeBSD.org) Received: from duck.symmetricom.us (duck.symmetricom.us [206.168.13.214]) by mx1.freebsd.org (Postfix) with ESMTP id 688A8308; Wed, 6 Feb 2013 15:36:16 +0000 (UTC) Received: from damnhippie.dyndns.org (daffy.symmetricom.us [206.168.13.218]) by duck.symmetricom.us (8.14.6/8.14.6) with ESMTP id r16FaFSa011707; Wed, 6 Feb 2013 08:36:15 -0700 (MST) (envelope-from ian@FreeBSD.org) Received: from [172.22.42.240] (revolution.hippie.lan [172.22.42.240]) by damnhippie.dyndns.org (8.14.3/8.14.3) with ESMTP id r16FaCeI033362; Wed, 6 Feb 2013 08:36:12 -0700 (MST) (envelope-from ian@FreeBSD.org) Subject: Re: svn commit: r246397 - head/sys/dev/syscons From: Ian Lepore To: Hans Petter Selasky In-Reply-To: <201302061116.r16BGJMJ091366@svn.freebsd.org> References: <201302061116.r16BGJMJ091366@svn.freebsd.org> Content-Type: text/plain; charset="us-ascii" Date: Wed, 06 Feb 2013 08:36:12 -0700 Message-ID: <1360164972.93359.606.camel@revolution.hippie.lan> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 FreeBSD GNOME Team Port Content-Transfer-Encoding: 7bit Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Feb 2013 15:36:16 -0000 On Wed, 2013-02-06 at 11:16 +0000, Hans Petter Selasky wrote: > Author: hselasky > Date: Wed Feb 6 11:16:18 2013 > New Revision: 246397 > URL: http://svnweb.freebsd.org/changeset/base/246397 > > Log: > Make sure that all mouse buttons are released when clients > using /dev/consolectl close. This fixes a problem where if > a USB mouse is detached while a button is pressed, that > button is never released. > > MFC after: 1 week > > Modified: > head/sys/dev/syscons/syscons.c > > Modified: head/sys/dev/syscons/syscons.c > ============================================================================== > --- head/sys/dev/syscons/syscons.c Wed Feb 6 11:10:41 2013 (r246396) > +++ head/sys/dev/syscons/syscons.c Wed Feb 6 11:16:18 2013 (r246397) > @@ -253,11 +253,13 @@ static struct ttydevsw sc_ttydevsw = { > }; > > static d_ioctl_t consolectl_ioctl; > +static d_close_t consolectl_close; > > static struct cdevsw consolectl_devsw = { > .d_version = D_VERSION, > - .d_flags = D_NEEDGIANT, > + .d_flags = D_NEEDGIANT | D_TRACKCLOSE, > .d_ioctl = consolectl_ioctl, > + .d_close = consolectl_close, > .d_name = "consolectl", > }; > > @@ -1561,6 +1563,23 @@ consolectl_ioctl(struct cdev *dev, u_lon > return sctty_ioctl(dev->si_drv1, cmd, data, td); > } > > +static int > +consolectl_close(struct cdev *dev, int flags, int mode, struct thread *td) > +{ > +#ifndef SC_NO_SYSMOUSE > + mouse_info_t info; > + memset(&info, 0, sizeof(info)); > + info.operation = MOUSE_ACTION; > + > + /* > + * Make sure all buttons are released when moused and other > + * console daemons exit, so that no buttons are left pressed. > + */ > + (void) sctty_ioctl(dev->si_drv1, CONS_MOUSECTL, (caddr_t)&info, td); > +#endif > + return (0); > +} > + > static void > sc_cnprobe(struct consdev *cp) > { I think the D_TRACKCLOSE flag is not what you want here. Based on my (admittedly still vague) understanding of it, that flag is almost never the right thing for a driver to use. If you need that action to be taken when the last open instance of the driver is closed, that's what you get without D_TRACKCLOSE. If you need it to be called as many times as the open routine was called... well, that's the the confusing thing. It's not clear to me that there's any way to get that effect, but the cdevpriv destructor may be the closest thing available. I think the essential problem is that open and close are not strictly paired. For example, a forked child inherits open descriptors without open() calls happening, and revoke() is a way to destroy references without a close() call. But the details of all this are murky to me, and the most-enlightening mailing list posts you can find on it are full of phrases like "vref counters for devfs nodes" and "vnode is reclaimed" that make the discussion difficult to follow if you're not intimate with the internals of the vm system. -- Ian