svn commit: r225585 - in stable/8: share/man/man9 sys/i386/acpica sys/kern sys/net sys/security/audit sys/sys

Attilio Rao attilio at FreeBSD.org
Thu Sep 15 12:27:27 UTC 2011


Author: attilio
Date: Thu Sep 15 12:27:26 2011
New Revision: 225585
URL: http://svn.freebsd.org/changeset/base/225585

Log:
  MFC r225177,225181:
  Introduce and use seldrain() function for dealing with fast
  selrecord/selinfo destruction.
  
  Sponsored by:	Sandvine Incorporated

Modified:
  stable/8/share/man/man9/Makefile
  stable/8/share/man/man9/selrecord.9
  stable/8/sys/i386/acpica/acpi_machdep.c
  stable/8/sys/kern/kern_event.c
  stable/8/sys/kern/sys_generic.c
  stable/8/sys/kern/sys_pipe.c
  stable/8/sys/kern/tty.c
  stable/8/sys/kern/tty_pts.c
  stable/8/sys/kern/uipc_mqueue.c
  stable/8/sys/kern/uipc_socket.c
  stable/8/sys/kern/vfs_subr.c
  stable/8/sys/net/bpf.c
  stable/8/sys/net/if_tap.c
  stable/8/sys/net/if_tun.c
  stable/8/sys/security/audit/audit_pipe.c
  stable/8/sys/sys/selinfo.h
Directory Properties:
  stable/8/share/man/man9/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/share/man/man9/Makefile
==============================================================================
--- stable/8/share/man/man9/Makefile	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/share/man/man9/Makefile	Thu Sep 15 12:27:26 2011	(r225585)
@@ -1050,7 +1050,8 @@ MLINKS+=scheduler.9 curpriority_cmp.9 \
 	scheduler.9 setrunnable.9 \
 	scheduler.9 updatepri.9
 MLINKS+=securelevel_gt.9 securelevel_ge.9
-MLINKS+=selrecord.9 selwakeup.9
+MLINKS+=selrecord.9 seldrain.9 \
+	selrecord.9 selwakeup.9
 MLINKS+=sema.9 sema_destroy.9 \
 	sema.9 sema_init.9 \
 	sema.9 sema_post.9 \

Modified: stable/8/share/man/man9/selrecord.9
==============================================================================
--- stable/8/share/man/man9/selrecord.9	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/share/man/man9/selrecord.9	Thu Sep 15 12:27:26 2011	(r225585)
@@ -26,10 +26,11 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd June 13, 2007
+.Dd August 25, 2011
 .Dt SELRECORD 9
 .Os
 .Sh NAME
+.Nm seldrain ,
 .Nm selrecord ,
 .Nm selwakeup
 .Nd "record and wakeup select requests"
@@ -37,14 +38,17 @@
 .In sys/param.h
 .In sys/selinfo.h
 .Ft void
+.Fn seldrain "struct selinfo *sip"
+.Ft void
 .Fn selrecord "struct thread *td" "struct selinfo *sip"
 .Ft void
 .Fn selwakeup "struct selinfo *sip"
 .Sh DESCRIPTION
+.Fn seldrain ,
 .Fn selrecord
 and
 .Fn selwakeup
-are the two central functions used by
+are the three central functions used by
 .Xr select 2 ,
 .Xr poll 2
 and the objects that are being selected on.
@@ -86,6 +90,15 @@ and
 .Xr poll 2
 when they wake up.
 .Pp
+.Fn seldrain
+will flush the waiters queue on a specified object before its
+destruction.
+The object handling code must ensure that
+.Fa *sip
+cannot be used once
+.Fn seldrain
+has been called.
+.Pp
 The contents of
 .Fa *sip
 must be zeroed, such as by softc initialization, before any call to
@@ -98,6 +111,10 @@ acquires and releases
 .Va sellock
 and may acquire and release
 .Va sched_lock .
+.Fn seldrain
+could usually be just a wrapper for
+.Fn selwakeup ,
+but consumers should not generally rely on this feature.
 .Sh SEE ALSO
 .Xr poll 2 ,
 .Xr select 2

Modified: stable/8/sys/i386/acpica/acpi_machdep.c
==============================================================================
--- stable/8/sys/i386/acpica/acpi_machdep.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/i386/acpica/acpi_machdep.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -313,6 +313,7 @@ apmclose(struct cdev *dev, int flag, int
 	/* Remove this clone's data from the list and free it. */
 	ACPI_LOCK(acpi);
 	STAILQ_REMOVE(&acpi_sc->apm_cdevs, clone, apm_clone_data, entries);
+	seldrain(&clone->sel_read);
 	knlist_destroy(&clone->sel_read.si_note);
 	ACPI_UNLOCK(acpi);
 	free(clone, M_APMDEV);

Modified: stable/8/sys/kern/kern_event.c
==============================================================================
--- stable/8/sys/kern/kern_event.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/kern_event.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -1686,6 +1686,7 @@ kqueue_close(struct file *fp, struct thr
 	SLIST_REMOVE(&fdp->fd_kqlist, kq, kqueue, kq_list);
 	FILEDESC_XUNLOCK(fdp);
 
+	seldrain(&kq->kq_sel);
 	knlist_destroy(&kq->kq_sel.si_note);
 	mtx_destroy(&kq->kq_lock);
 	kq->kq_fdp = NULL;

Modified: stable/8/sys/kern/sys_generic.c
==============================================================================
--- stable/8/sys/kern/sys_generic.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/sys_generic.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -1442,6 +1442,23 @@ selfdfree(struct seltd *stp, struct self
 	uma_zfree(selfd_zone, sfp);
 }
 
+/* Drain the waiters tied to all the selfd belonging the specified selinfo. */
+void
+seldrain(sip)
+        struct selinfo *sip;
+{
+
+	/*
+	 * This feature is already provided by doselwakeup(), thus it is
+	 * enough to go for it.
+	 * Eventually, the context, should take care to avoid races
+	 * between thread calling select()/poll() and file descriptor
+	 * detaching, but, again, the races are just the same as
+	 * selwakeup().
+	 */
+        doselwakeup(sip, -1);
+}
+
 /*
  * Record a select request.
  */

Modified: stable/8/sys/kern/sys_pipe.c
==============================================================================
--- stable/8/sys/kern/sys_pipe.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/sys_pipe.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -1536,6 +1536,7 @@ pipeclose(cpipe)
 	 */
 	knlist_clear(&cpipe->pipe_sel.si_note, 1);
 	cpipe->pipe_present = PIPE_FINALIZED;
+	seldrain(&cpipe->pipe_sel);
 	knlist_destroy(&cpipe->pipe_sel.si_note);
 
 	/*

Modified: stable/8/sys/kern/tty.c
==============================================================================
--- stable/8/sys/kern/tty.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/tty.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -986,6 +986,8 @@ tty_dealloc(void *arg)
 	MPASS(ttyinq_getsize(&tp->t_inq) == 0);
 	MPASS(ttyoutq_getsize(&tp->t_outq) == 0);
 
+	seldrain(&tp->t_inpoll);
+	seldrain(&tp->t_outpoll);
 	knlist_destroy(&tp->t_inpoll.si_note);
 	knlist_destroy(&tp->t_outpoll.si_note);
 

Modified: stable/8/sys/kern/tty_pts.c
==============================================================================
--- stable/8/sys/kern/tty_pts.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/tty_pts.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -698,6 +698,8 @@ ptsdrv_free(void *softc)
 	chgptscnt(psc->pts_uidinfo, -1, 0);
 	uifree(psc->pts_uidinfo);
 
+	seldrain(&psc->pts_inpoll);
+	seldrain(&psc->pts_outpoll);
 	knlist_destroy(&psc->pts_inpoll.si_note);
 	knlist_destroy(&psc->pts_outpoll.si_note);
 

Modified: stable/8/sys/kern/uipc_mqueue.c
==============================================================================
--- stable/8/sys/kern/uipc_mqueue.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/uipc_mqueue.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -1553,6 +1553,8 @@ mqueue_free(struct mqueue *mq)
 	}
 
 	mtx_destroy(&mq->mq_mutex);
+	seldrain(&mq->mq_rsel);
+	seldrain(&mq->mq_wsel);
 	knlist_destroy(&mq->mq_rsel.si_note);
 	knlist_destroy(&mq->mq_wsel.si_note);
 	uma_zfree(mqueue_zone, mq);

Modified: stable/8/sys/kern/uipc_socket.c
==============================================================================
--- stable/8/sys/kern/uipc_socket.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/uipc_socket.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -652,6 +652,8 @@ sofree(struct socket *so)
 	 */
 	sbdestroy(&so->so_snd, so);
 	sbdestroy(&so->so_rcv, so);
+	seldrain(&so->so_snd.sb_sel);
+	seldrain(&so->so_rcv.sb_sel);
 	knlist_destroy(&so->so_rcv.sb_sel.si_note);
 	knlist_destroy(&so->so_snd.sb_sel.si_note);
 	sodealloc(so);

Modified: stable/8/sys/kern/vfs_subr.c
==============================================================================
--- stable/8/sys/kern/vfs_subr.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/kern/vfs_subr.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -3311,6 +3311,7 @@ vbusy(struct vnode *vp)
 static void
 destroy_vpollinfo(struct vpollinfo *vi)
 {
+	seldrain(&vi->vpi_selinfo);
 	knlist_destroy(&vi->vpi_selinfo.si_note);
 	mtx_destroy(&vi->vpi_lock);
 	uma_zfree(vnodepoll_zone, vi);

Modified: stable/8/sys/net/bpf.c
==============================================================================
--- stable/8/sys/net/bpf.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/net/bpf.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -644,10 +644,10 @@ bpf_dtor(void *data)
 	if (d->bd_bif)
 		bpf_detachd(d);
 	mtx_unlock(&bpf_mtx);
-	selwakeuppri(&d->bd_sel, PRINET);
 #ifdef MAC
 	mac_bpfdesc_destroy(d);
 #endif /* MAC */
+	seldrain(&d->bd_sel);
 	knlist_destroy(&d->bd_sel.si_note);
 	callout_drain(&d->bd_callout);
 	bpf_freed(d);

Modified: stable/8/sys/net/if_tap.c
==============================================================================
--- stable/8/sys/net/if_tap.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/net/if_tap.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -214,6 +214,7 @@ tap_destroy(struct tap_softc *tp)
 	KASSERT(!(tp->tap_flags & TAP_OPEN),
 		("%s flags is out of sync", ifp->if_xname));
 
+	seldrain(&tp->tap_rsel);
 	knlist_destroy(&tp->tap_rsel.si_note);
 	destroy_dev(tp->tap_dev);
 	ether_ifdetach(ifp);

Modified: stable/8/sys/net/if_tun.c
==============================================================================
--- stable/8/sys/net/if_tun.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/net/if_tun.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -259,6 +259,7 @@ tun_destroy(struct tun_softc *tp)
 	if_detach(TUN2IFP(tp));
 	if_free(TUN2IFP(tp));
 	destroy_dev(dev);
+	seldrain(&tp->tun_rsel);
 	knlist_destroy(&tp->tun_rsel.si_note);
 	mtx_destroy(&tp->tun_mtx);
 	cv_destroy(&tp->tun_cv);

Modified: stable/8/sys/security/audit/audit_pipe.c
==============================================================================
--- stable/8/sys/security/audit/audit_pipe.c	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/security/audit/audit_pipe.c	Thu Sep 15 12:27:26 2011	(r225585)
@@ -646,6 +646,7 @@ audit_pipe_free(struct audit_pipe *ap)
 	cv_destroy(&ap->ap_cv);
 	AUDIT_PIPE_SX_LOCK_DESTROY(ap);
 	AUDIT_PIPE_LOCK_DESTROY(ap);
+	seldrain(&ap->ap_selinfo);
 	knlist_destroy(&ap->ap_selinfo.si_note);
 	TAILQ_REMOVE(&audit_pipe_list, ap, ap_list);
 	free(ap, M_AUDIT_PIPE);

Modified: stable/8/sys/sys/selinfo.h
==============================================================================
--- stable/8/sys/sys/selinfo.h	Thu Sep 15 12:20:52 2011	(r225584)
+++ stable/8/sys/sys/selinfo.h	Thu Sep 15 12:27:26 2011	(r225585)
@@ -51,6 +51,7 @@ struct selinfo {
 #define	SEL_WAITING(si)		(!TAILQ_EMPTY(&(si)->si_tdlist))
 
 #ifdef _KERNEL
+void	seldrain(struct selinfo *sip);
 void	selrecord(struct thread *selector, struct selinfo *sip);
 void	selwakeup(struct selinfo *sip);
 void	selwakeuppri(struct selinfo *sip, int pri);


More information about the svn-src-all mailing list