Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Apr 2018 18:45:04 +0000 (UTC)
From:      Stephen Hurd <shurd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r332734 - in stable/11/sys: kern net
Message-ID:  <201804181845.w3IIj4fL037185@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <mmacy@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
  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804181845.w3IIj4fL037185>