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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to