From owner-svn-src-all@FreeBSD.ORG Thu Sep 15 12:27:27 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 271C71065675; Thu, 15 Sep 2011 12:27:27 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0D6448FC0A; Thu, 15 Sep 2011 12:27:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p8FCRQUM073559; Thu, 15 Sep 2011 12:27:26 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p8FCRQSF073542; Thu, 15 Sep 2011 12:27:26 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201109151227.p8FCRQSF073542@svn.freebsd.org> From: Attilio Rao Date: Thu, 15 Sep 2011 12:27:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r225585 - in stable/8: share/man/man9 sys/i386/acpica sys/kern sys/net sys/security/audit sys/sys X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Sep 2011 12:27:27 -0000 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);