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

Reply via email to