From 869d88787db303d581fd6cee5d066d12f3cc9871 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 30 Dec 2016 14:47:46 +0000 Subject: [PATCH] [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 Reviewed by: jhb --- sys/dev/netmap/netmap_freebsd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/dev/netmap/netmap_freebsd.c b/sys/dev/netmap/netmap_freebsd.c index fd4592b7b5a..dd41c85965e 100644 --- a/sys/dev/netmap/netmap_freebsd.c +++ b/sys/dev/netmap/netmap_freebsd.c @@ -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_cfg *cfg, unsigned int cfgtype, 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;