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");

Reply via email to