Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 09 Jan 2026 23:27:45 +0000
From:      Christos Margiolis <christos@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 99ed1fc93f44 - stable/15 - sound: Retire snd_midi->qlock
Message-ID:  <69618ef1.3266d.6634094@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=99ed1fc93f44be5eb935762e4fd1dd420200527a

commit 99ed1fc93f44be5eb935762e4fd1dd420200527a
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-01-02 16:56:12 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-01-09 23:27:23 +0000

    sound: Retire snd_midi->qlock
    
    snd_midi->qlock is used to protect snd_midi->{in,out}q. However, apart
    from the numerous LORs present already in the code, there is no reason
    not to use snd_midi->lock, as we do for the rest of the structure
    
    Started by:     https://github.com/freebsd/freebsd-src/pull/1902
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Reviewed by:    dev_nicolas-provost.fr
    Differential Revision:  https://reviews.freebsd.org/D54129
    
    (cherry picked from commit 4cc78f5dd7c2e82571ced6e23fa22d48c6cd1697)
---
 sys/dev/sound/midi/midi.c | 60 +++++++++++++++++------------------------------
 1 file changed, 22 insertions(+), 38 deletions(-)

diff --git a/sys/dev/sound/midi/midi.c b/sys/dev/sound/midi/midi.c
index 8a74732c8907..0ed03dbc898b 100644
--- a/sys/dev/sound/midi/midi.c
+++ b/sys/dev/sound/midi/midi.c
@@ -58,7 +58,7 @@ MALLOC_DEFINE(M_MIDI, "midi buffers", "Midi data allocation area");
 #define MIDI_NAMELEN   16
 struct snd_midi {
 	KOBJ_FIELDS;
-	struct mtx lock;		/* Protects all but queues */
+	struct mtx lock;
 	void   *cookie;
 
 	int	unit;
@@ -67,7 +67,6 @@ struct snd_midi {
 	int	busy;
 	int	flags;			/* File flags */
 	char	name[MIDI_NAMELEN];
-	struct mtx qlock;		/* Protects inq, outq and flags */
 	MIDIQ_HEAD(, char) inq, outq;
 	int	rchan, wchan;
 	struct selinfo rsel, wsel;
@@ -131,10 +130,8 @@ midi_init(kobj_class_t cls, void *cookie)
 		goto err1;
 
 	mtx_init(&m->lock, "raw midi", NULL, 0);
-	mtx_init(&m->qlock, "q raw midi", NULL, 0);
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	if (inqsize)
 		buf = malloc(sizeof(uint8_t) * inqsize, M_MIDI, M_NOWAIT);
@@ -165,7 +162,6 @@ midi_init(kobj_class_t cls, void *cookie)
 		goto err2;
 
 	mtx_unlock(&m->lock);
-	mtx_unlock(&m->qlock);
 
 	m->dev = make_dev(&midi_cdevsw, m->unit, UID_ROOT, GID_WHEEL, 0666,
 	    "midi%d.%d", m->unit, m->channel);
@@ -174,7 +170,6 @@ midi_init(kobj_class_t cls, void *cookie)
 	return m;
 
 err2:
-	mtx_destroy(&m->qlock);
 	mtx_destroy(&m->lock);
 
 	if (MIDIQ_BUF(m->inq))
@@ -246,17 +241,18 @@ midi_in(struct snd_midi *m, uint8_t *buf, int size)
 {
 	int used;
 
+	mtx_lock(&m->lock);
+
 	MIDI_DEBUG(5, printf("midi_in: m=%p size=%d\n", m, size));
 
-/*
- * XXX: locking flub
- */
-	if (!(m->flags & M_RX))
-		return size;
+	if (!(m->flags & M_RX)) {
+		/* We should return 0 but this may stop receiving/sending. */
+		mtx_unlock(&m->lock);
+		return (size);
+	}
 
 	used = 0;
 
-	mtx_lock(&m->qlock);
 	MIDI_DEBUG(6, printf("midi_in: len %jd avail %jd\n",
 	    (intmax_t)MIDIQ_LEN(m->inq),
 	    (intmax_t)MIDIQ_AVAIL(m->inq)));
@@ -265,7 +261,7 @@ midi_in(struct snd_midi *m, uint8_t *buf, int size)
 		MIDIQ_ENQ(m->inq, buf, size);
 	} else {
 		MIDI_DEBUG(4, printf("midi_in: Discarding data qu\n"));
-		mtx_unlock(&m->qlock);
+		mtx_unlock(&m->lock);
 		return 0;
 	}
 	if (m->rchan) {
@@ -273,7 +269,7 @@ midi_in(struct snd_midi *m, uint8_t *buf, int size)
 		m->rchan = 0;
 	}
 	selwakeup(&m->rsel);
-	mtx_unlock(&m->qlock);
+	mtx_unlock(&m->lock);
 	return used;
 }
 
@@ -285,14 +281,14 @@ midi_out(struct snd_midi *m, uint8_t *buf, int size)
 {
 	int used;
 
-/*
- * XXX: locking flub
- */
-	if (!(m->flags & M_TXEN))
-		return 0;
+	mtx_lock(&m->lock);
 
 	MIDI_DEBUG(2, printf("midi_out: %p\n", m));
-	mtx_lock(&m->qlock);
+	if (!(m->flags & M_TXEN)) {
+		mtx_unlock(&m->lock);
+		return (0);
+	}
+
 	used = MIN(size, MIDIQ_LEN(m->outq));
 	MIDI_DEBUG(3, printf("midi_out: used %d\n", used));
 	if (used)
@@ -308,7 +304,7 @@ midi_out(struct snd_midi *m, uint8_t *buf, int size)
 		}
 		selwakeup(&m->wsel);
 	}
-	mtx_unlock(&m->qlock);
+	mtx_unlock(&m->lock);
 	return used;
 }
 
@@ -324,7 +320,6 @@ midi_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
 		return ENXIO;
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	retval = 0;
 
@@ -365,7 +360,7 @@ midi_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
 
 	MIDI_DEBUG(2, printf("midi_open: opened.\n"));
 
-err:	mtx_unlock(&m->qlock);
+err:
 	mtx_unlock(&m->lock);
 	return retval;
 }
@@ -384,7 +379,6 @@ midi_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
 		return ENXIO;
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	if ((flags & FREAD && !(m->flags & M_RX)) ||
 	    (flags & FWRITE && !(m->flags & M_TX))) {
@@ -405,7 +399,6 @@ midi_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
 
 	MIDI_DEBUG(1, printf("midi_close: closed, busy = %d.\n", m->busy));
 
-	mtx_unlock(&m->qlock);
 	mtx_unlock(&m->lock);
 	retval = 0;
 err:	return retval;
@@ -433,7 +426,6 @@ midi_read(struct cdev *i_dev, struct uio *uio, int ioflag)
 		goto err0;
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	if (!(m->flags & M_RX))
 		goto err1;
@@ -443,9 +435,8 @@ midi_read(struct cdev *i_dev, struct uio *uio, int ioflag)
 			retval = EWOULDBLOCK;
 			if (ioflag & O_NONBLOCK)
 				goto err1;
-			mtx_unlock(&m->lock);
 			m->rchan = 1;
-			retval = msleep(&m->rchan, &m->qlock,
+			retval = msleep(&m->rchan, &m->lock,
 			    PCATCH | PDROP, "midi RX", 0);
 			/*
 			 * We slept, maybe things have changed since last
@@ -459,7 +450,6 @@ midi_read(struct cdev *i_dev, struct uio *uio, int ioflag)
 			if (retval)
 				goto err0;
 			mtx_lock(&m->lock);
-			mtx_lock(&m->qlock);
 			m->rchan = 0;
 			if (!m->busy)
 				goto err1;
@@ -483,7 +473,7 @@ midi_read(struct cdev *i_dev, struct uio *uio, int ioflag)
 	 * If we Made it here then transfer is good
 	 */
 	retval = 0;
-err1:	mtx_unlock(&m->qlock);
+err1:
 	mtx_unlock(&m->lock);
 err0:	MIDI_DEBUG(4, printf("midi_read: ret %d\n", retval));
 	return retval;
@@ -508,7 +498,6 @@ midi_write(struct cdev *i_dev, struct uio *uio, int ioflag)
 		goto err0;
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	if (!(m->flags & M_TX))
 		goto err1;
@@ -518,10 +507,9 @@ midi_write(struct cdev *i_dev, struct uio *uio, int ioflag)
 			retval = EWOULDBLOCK;
 			if (ioflag & O_NONBLOCK)
 				goto err1;
-			mtx_unlock(&m->lock);
 			m->wchan = 1;
 			MIDI_DEBUG(3, printf("midi_write msleep\n"));
-			retval = msleep(&m->wchan, &m->qlock,
+			retval = msleep(&m->wchan, &m->lock,
 			    PCATCH | PDROP, "midi TX", 0);
 			/*
 			 * We slept, maybe things have changed since last
@@ -534,7 +522,6 @@ midi_write(struct cdev *i_dev, struct uio *uio, int ioflag)
 			if (retval)
 				goto err0;
 			mtx_lock(&m->lock);
-			mtx_lock(&m->qlock);
 			m->wchan = 0;
 			if (!m->busy)
 				goto err1;
@@ -567,7 +554,7 @@ midi_write(struct cdev *i_dev, struct uio *uio, int ioflag)
 	 * If we Made it here then transfer is good
 	 */
 	retval = 0;
-err1:	mtx_unlock(&m->qlock);
+err1:
 	mtx_unlock(&m->lock);
 err0:	return retval;
 }
@@ -591,7 +578,6 @@ midi_poll(struct cdev *i_dev, int events, struct thread *td)
 	revents = 0;
 
 	mtx_lock(&m->lock);
-	mtx_lock(&m->qlock);
 
 	if (events & (POLLIN | POLLRDNORM)) {
 		if (!MIDIQ_EMPTY(m->inq))
@@ -607,7 +593,6 @@ midi_poll(struct cdev *i_dev, int events, struct thread *td)
 	}
 
 	mtx_unlock(&m->lock);
-	mtx_unlock(&m->qlock);
 
 	return (revents);
 }
@@ -631,7 +616,6 @@ midi_destroy(struct snd_midi *m, int midiuninit)
 	free_unr(chn_unr, m->channel);
 	free(MIDIQ_BUF(m->inq), M_MIDI);
 	free(MIDIQ_BUF(m->outq), M_MIDI);
-	mtx_destroy(&m->qlock);
 	mtx_destroy(&m->lock);
 	free(m, M_MIDI);
 	return 0;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69618ef1.3266d.6634094>