svn commit: r310822 - head/sys/dev/netmap

Adrian Chadd adrian at FreeBSD.org
Fri Dec 30 14:47:47 UTC 2016


Author: adrian
Date: Fri Dec 30 14:47:46 2016
New Revision: 310822
URL: https://svnweb.freebsd.org/changeset/base/310822

Log:
  [netmap] fix locking regressions
  
  * Firmware oriented NICs may need to sleep in their configuration paths.
    Use RLOCK instead of WLOCK to allow this to again occur.
  
    This fixes netmap on cxgbe.
  
  * Change the worker lock to a normal mutex rather than a spin lock.
    Drivers shouldn't be doing netmap work from the fast interrupt
    handlers, so it's not required to be a spinlock.
  
  Submitted by:	luigi, Vincenzo Maffione <v.maffione at gmail.com>
  Reviewed by:	jhb

Modified:
  head/sys/dev/netmap/netmap_freebsd.c

Modified: head/sys/dev/netmap/netmap_freebsd.c
==============================================================================
--- head/sys/dev/netmap/netmap_freebsd.c	Fri Dec 30 13:04:43 2016	(r310821)
+++ head/sys/dev/netmap/netmap_freebsd.c	Fri Dec 30 14:47:46 2016	(r310822)
@@ -92,7 +92,7 @@ nm_os_selinfo_uninit(NM_SELINFO_T *si)
 void
 nm_os_ifnet_lock(void)
 {
-	IFNET_WLOCK();
+	IFNET_RLOCK();
 }
 
 void
@@ -1090,8 +1090,8 @@ nm_kthread_worker(void *data)
 				continue;
 			} else if (nmk->run) {
 				/* wait on event with one second timeout */
-				msleep_spin((void *)(uintptr_t)ctx->cfg.wchan,
-				    &nmk->worker_lock, "nmk_ev", hz);
+				msleep((void *)(uintptr_t)ctx->cfg.wchan,
+					&nmk->worker_lock, 0, "nmk_ev", hz);
 				nmk->scheduled++;
 			}
 			mtx_unlock(&nmk->worker_lock);
@@ -1122,7 +1122,7 @@ nm_os_kthread_create(struct nm_kthread_c
 	if (!nmk)
 		return NULL;
 
-	mtx_init(&nmk->worker_lock, "nm_kthread lock", NULL, MTX_SPIN);
+	mtx_init(&nmk->worker_lock, "nm_kthread lock", NULL, MTX_DEF);
 	nmk->worker_ctx.worker_fn = cfg->worker_fn;
 	nmk->worker_ctx.worker_private = cfg->worker_private;
 	nmk->worker_ctx.type = cfg->type;


More information about the svn-src-head mailing list