diff options
author | Navdeep Parhar <np@FreeBSD.org> | 2021-06-04 19:01:14 +0000 |
---|---|---|
committer | Navdeep Parhar <np@FreeBSD.org> | 2021-06-04 19:01:14 +0000 |
commit | bb877c0620347eb86f25f4382c42d58685c348d4 (patch) | |
tree | a812d52f7c18591df447acb8da5527572dc7e492 | |
parent | 2290dfb40fce0ab46d91244282014173c7316e42 (diff) | |
download | src-bb877c0620347eb86f25f4382c42d58685c348d4.tar.gz src-bb877c0620347eb86f25f4382c42d58685c348d4.zip |
cxgbe(4): Empty the clib_db before trying to destroy it.
This fixes a panic on driver unload.
Reported by: Jithesh Arakkan @ Chelsio
MFC after: 1 week
Sponsored by: Chelsio Communications
-rw-r--r-- | sys/dev/cxgbe/t4_clip.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/dev/cxgbe/t4_clip.c b/sys/dev/cxgbe/t4_clip.c index 98734d6d11ce..5f4fbd0f07a6 100644 --- a/sys/dev/cxgbe/t4_clip.c +++ b/sys/dev/cxgbe/t4_clip.c @@ -854,8 +854,21 @@ t4_clip_modload(void) void t4_clip_modunload(void) { + struct clip_db_entry *cde; + int i; + EVENTHANDLER_DEREGISTER(ifaddr_event_ext, ifaddr_evhandler); taskqueue_drain(taskqueue_thread, &clip_db_task); + mtx_lock(&clip_db_lock); + for (i = 0; i <= clip_db_mask; i++) { + while ((cde = LIST_FIRST(&clip_db[i])) != NULL) { + MPASS(cde->tmp_ref == 0); + MPASS(cde->adp_ref == 0); + LIST_REMOVE(cde, link); + free(cde, M_CXGBE); + } + } + mtx_unlock(&clip_db_lock); hashdestroy(clip_db, M_CXGBE, clip_db_mask); mtx_destroy(&clip_db_lock); } |