Initialize stack-based mutexed using mtx_init(). This removes the need of the NOWITNESS kludge and lets the lock checker do its job with these mutexes.
At the moment, static initialization of locks inside functions does not work correctly with WITNESS. A lock initializer sets up a struct that gets permanently referenced by the lock checker. Inside a function, the static initializers put these structs on the stack, which causes trouble when the function returns. In principle, this might be solvable by using a compile-time expression that chooses the correct way of initialization based on the scope of usage. Index: dev/ic/mfi.c =================================================================== RCS file: src/sys/dev/ic/mfi.c,v retrieving revision 1.189 diff -u -p -r1.189 mfi.c --- dev/ic/mfi.c 25 May 2023 19:35:58 -0000 1.189 +++ dev/ic/mfi.c 5 Jul 2023 02:56:57 -0000 @@ -925,8 +925,9 @@ mfi_poll(struct mfi_softc *sc, struct mf void mfi_exec(struct mfi_softc *sc, struct mfi_ccb *ccb) { - struct mutex m = MUTEX_INITIALIZER_FLAGS(IPL_BIO, __MTX_NAME, - MTX_NOWITNESS); + struct mutex m; + + mtx_init(&m, IPL_BIO); #ifdef DIAGNOSTIC if (ccb->ccb_cookie != NULL || ccb->ccb_done != NULL) Index: dev/ic/mpi.c =================================================================== RCS file: src/sys/dev/ic/mpi.c,v retrieving revision 1.225 diff -u -p -r1.225 mpi.c --- dev/ic/mpi.c 25 May 2023 19:35:58 -0000 1.225 +++ dev/ic/mpi.c 5 Jul 2023 02:56:57 -0000 @@ -1263,10 +1263,11 @@ mpi_poll_done(struct mpi_ccb *ccb) void mpi_wait(struct mpi_softc *sc, struct mpi_ccb *ccb) { - struct mutex cookie = MUTEX_INITIALIZER_FLAGS( - IPL_BIO, __MTX_NAME, MTX_NOWITNESS); + struct mutex cookie; void (*done)(struct mpi_ccb *); + mtx_init(&cookie, IPL_BIO); + done = ccb->ccb_done; ccb->ccb_done = mpi_wait_done; ccb->ccb_cookie = &cookie; Index: dev/pci/mfii.c =================================================================== RCS file: src/sys/dev/pci/mfii.c,v retrieving revision 1.88 diff -u -p -r1.88 mfii.c --- dev/pci/mfii.c 25 May 2023 19:35:58 -0000 1.88 +++ dev/pci/mfii.c 5 Jul 2023 02:56:57 -0000 @@ -1764,8 +1764,9 @@ mfii_poll_done(struct mfii_softc *sc, st int mfii_exec(struct mfii_softc *sc, struct mfii_ccb *ccb) { - struct mutex m = MUTEX_INITIALIZER_FLAGS(IPL_BIO, __MTX_NAME, - MTX_NOWITNESS); + struct mutex m; + + mtx_init(&m, IPL_BIO); #ifdef DIAGNOSTIC if (ccb->ccb_cookie != NULL || ccb->ccb_done != NULL) Index: dev/pci/mpii.c =================================================================== RCS file: src/sys/dev/pci/mpii.c,v retrieving revision 1.145 diff -u -p -r1.145 mpii.c --- dev/pci/mpii.c 25 May 2023 19:35:58 -0000 1.145 +++ dev/pci/mpii.c 5 Jul 2023 02:56:57 -0000 @@ -2857,11 +2857,12 @@ mpii_init_queues(struct mpii_softc *sc) void mpii_wait(struct mpii_softc *sc, struct mpii_ccb *ccb) { - struct mutex mtx = MUTEX_INITIALIZER_FLAGS(IPL_BIO, - __MTX_NAME, MTX_NOWITNESS); + struct mutex mtx; void (*done)(struct mpii_ccb *); void *cookie; + mtx_init(&mtx, IPL_BIO); + done = ccb->ccb_done; cookie = ccb->ccb_cookie; Index: scsi/scsi_base.c =================================================================== RCS file: src/sys/scsi/scsi_base.c,v retrieving revision 1.281 diff -u -p -r1.281 scsi_base.c --- scsi/scsi_base.c 25 May 2023 19:35:58 -0000 1.281 +++ scsi/scsi_base.c 5 Jul 2023 02:56:57 -0000 @@ -1497,10 +1497,11 @@ scsi_done(struct scsi_xfer *xs) int scsi_xs_sync(struct scsi_xfer *xs) { - struct mutex cookie = MUTEX_INITIALIZER_FLAGS(IPL_BIO, __MTX_NAME, - MTX_NOWITNESS); + struct mutex cookie; int error; + mtx_init(&cookie, IPL_BIO); + #ifdef DIAGNOSTIC if (xs->cookie != NULL) panic("xs->cookie != NULL in scsi_xs_sync");