Author: shurd
Date: Wed Apr 18 18:45:04 2018
New Revision: 332734
URL: https://svnweb.freebsd.org/changeset/base/332734

Log:
  MFC r332388:
  
  Make BPF global lock an SX
  
  This allows NIC drivers to sleep on polling config operations.
  
  PR:           323477
  Submitted by: Matthew Macy <mm...@mattmacy.io>
  Reviewed by:  shurd
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D14982

Modified:
  stable/11/sys/kern/subr_witness.c
  stable/11/sys/net/bpf.c
  stable/11/sys/net/bpfdesc.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/kern/subr_witness.c
==============================================================================
--- stable/11/sys/kern/subr_witness.c   Wed Apr 18 18:36:26 2018        
(r332733)
+++ stable/11/sys/kern/subr_witness.c   Wed Apr 18 18:45:04 2018        
(r332734)
@@ -567,7 +567,7 @@ static struct witness_order_list_entry order_lists[] =
        /*
         * BPF
         */
-       { "bpf global lock", &lock_class_mtx_sleep },
+       { "bpf global lock", &lock_class_sx },
        { "bpf interface lock", &lock_class_rw },
        { "bpf cdev lock", &lock_class_mtx_sleep },
        { NULL, NULL },

Modified: stable/11/sys/net/bpf.c
==============================================================================
--- stable/11/sys/net/bpf.c     Wed Apr 18 18:36:26 2018        (r332733)
+++ stable/11/sys/net/bpf.c     Wed Apr 18 18:45:04 2018        (r332734)
@@ -157,6 +157,9 @@ struct bpf_dltlist32 {
 #define        BIOCSETFNR32    _IOW('B', 130, struct bpf_program32)
 #endif
 
+#define BPF_LOCK()        sx_xlock(&bpf_sx)
+#define BPF_UNLOCK()           sx_xunlock(&bpf_sx)
+#define BPF_LOCK_ASSERT()      sx_assert(&bpf_sx, SA_XLOCKED)
 /*
  * bpf_iflist is a list of BPF interface structures, each corresponding to a
  * specific DLT.  The same network interface might have several BPF interface
@@ -164,7 +167,7 @@ struct bpf_dltlist32 {
  * frames, ethernet frames, etc).
  */
 static LIST_HEAD(, bpf_if)     bpf_iflist, bpf_freelist;
-static struct mtx      bpf_mtx;                /* bpf global lock */
+static struct sx       bpf_sx;         /* bpf global lock */
 static int             bpf_bpfd_cnt;
 
 static void    bpf_attachd(struct bpf_d *, struct bpf_if *);
@@ -2800,7 +2803,7 @@ bpf_drvinit(void *unused)
 {
        struct cdev *dev;
 
-       mtx_init(&bpf_mtx, "bpf global lock", NULL, MTX_DEF);
+       sx_init(&bpf_sx, "bpf global lock");
        LIST_INIT(&bpf_iflist);
        LIST_INIT(&bpf_freelist);
 

Modified: stable/11/sys/net/bpfdesc.h
==============================================================================
--- stable/11/sys/net/bpfdesc.h Wed Apr 18 18:36:26 2018        (r332733)
+++ stable/11/sys/net/bpfdesc.h Wed Apr 18 18:45:04 2018        (r332734)
@@ -115,9 +115,6 @@ struct bpf_d {
 #define BPF_PID_REFRESH(bd, td)        (bd)->bd_pid = (td)->td_proc->p_pid
 #define BPF_PID_REFRESH_CUR(bd)        (bd)->bd_pid = curthread->td_proc->p_pid
 
-#define BPF_LOCK()             mtx_lock(&bpf_mtx)
-#define BPF_UNLOCK()           mtx_unlock(&bpf_mtx)
-#define BPF_LOCK_ASSERT()      mtx_assert(&bpf_mtx, MA_OWNED)
 /*
  * External representation of the bpf descriptor
  */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to