From nobody Fri Apr 24 16:24:46 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4g2JFp4RRRz6bY1V for ; Fri, 24 Apr 2026 16:24:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g2JFp1DxZz3bPP for ; Fri, 24 Apr 2026 16:24:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777047886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CkikIcKXY/5XBI8W6YWi4LFg9+4IwxFtEiOVmo6sW44=; b=m5o/iJhZnUqkDlt2VyZiMAPMWJ1xp4DOCjFORLld8pdj8vcDSAJ2WMGBuy8VUIH2B8uES8 ujZlMuShN01S0RQ0ANCQ8fqRIn3qwjLk4ELo0Me/MncAn3Qih41J9hTUG6uT2NSLY+31qm bJ+qCyjZNSYm/qBKxRDLD2HRC2OAK2mBWALNE21Pi8JUF6uhdwypTFWL62oxHC6+g61+KX yUIyYx6LyDfOJrQbCWeurEs8F58nNbOtEoVuYo9ke9AQXjUucU6vIXxxottAzwI5XFyYWx KbuQhQeuXuUnY1A1aQFHepas6Toq93susfLzgBknncA6Gt20dWt3k/PHiy+hHA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777047886; a=rsa-sha256; cv=none; b=Llv+BDHa45U4YhIZdrVEYzR6zW54lNRbJouyY4NgDGdgKQdxagabU1g6PK0AHhfdndZMiO ElJz5N4yXBI/HwqJ20pkK3LIkD9kWXOoAfm0I0K/Yl6g9mLppSqrF3xvD7muVBBxG9aP+V 507gV64e9fRyxWNV4hIOuMCN74cpJrcRwkBqXoCMOqtbgNI9V0VJ3lJdF/FNOkxxP/Kvwz PYEto2yg/RvdMmDQQjf+1Fw4oP3rF31OnsFcvllNhfH0jqLk5hPdgTqerzMAA7LQgpwxay Ut+wipZZmaF0Iw27f6nqJGqRHd4lr6Ltcy+bYWzwckp3U52AcFxMQXB4F8wLKg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777047886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CkikIcKXY/5XBI8W6YWi4LFg9+4IwxFtEiOVmo6sW44=; b=S7phiBy7f3x5jxAtYVhtwYsfPdlSqlIp9sbEtDBeexp40HBWbQwkYhlduEtRUwWTevhuWk qv5fU+YEwKSU5LSXceukSZRo7f6SCVvwitlRaX5bkF13OxbuzBt3YZSkVKca0XhMtRvu7N 9C9Zne4mBlKqnCqRau/4IE+GpaKDfTFkxIjBwwJT0PJUlmwrC4TmqpFefFQ1oUxEr0CuNw DQyWs2JfPvKrngMMXLQizzlbn4mDAl6k4bOudVSIteN5+GD1/9riDKUyOFgfawDkfowA4V 4BW5K/kL2jHNC3mclDSsOez13mLJQTjn7MrZOMfUX7BK2qs2MCjkUAu0b5dj9Q== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g2JFp0rDrz190W for ; Fri, 24 Apr 2026 16:24:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3ba9b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 24 Apr 2026 16:24:46 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Raphael 'kena' Poss From: Warner Losh Subject: git: e2199dc33f16 - main - speaker(4): one ioctl / write at a time List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: e2199dc33f16332b3e138da3059ba57c25ef713d Auto-Submitted: auto-generated Date: Fri, 24 Apr 2026 16:24:46 +0000 Message-Id: <69eb994e.3ba9b.43f166b0@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=e2199dc33f16332b3e138da3059ba57c25ef713d commit e2199dc33f16332b3e138da3059ba57c25ef713d Author: Raphael 'kena' Poss AuthorDate: 2026-01-01 16:45:45 +0000 Commit: Warner Losh CommitDate: 2026-04-24 16:23:06 +0000 speaker(4): one ioctl / write at a time If two processes are holding a spkr fd, we want orderly access to the allocated tone buffer and the speaker itself. Signed-off-by: Raphael Poss Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/1922 --- sys/dev/speaker/spkr.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/sys/dev/speaker/spkr.c b/sys/dev/speaker/spkr.c index 85a0c837f4b4..7aaebd225512 100644 --- a/sys/dev/speaker/spkr.c +++ b/sys/dev/speaker/spkr.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -394,9 +395,17 @@ playstring(char *cp, size_t slen) * endtone(), and rest() functions defined above. */ -static int spkr_active = 0; /* exclusion flag */ +static int spkr_dev_busy = 0; /* one open at a time */ static char *spkr_inbuf; /* incoming buf */ +/* + * we use a lock to serialize access to spkr_inbuf but also to prevent + * interleaving of melodies written concurrently from two different + * threads. + */ +static struct sx spkr_op_locked; + + static int spkropen(struct cdev *dev, int flags, int fmt, struct thread *td) { @@ -404,7 +413,7 @@ spkropen(struct cdev *dev, int flags, int fmt, struct thread *td) (void) printf("spkropen: entering with dev = %s\n", devtoname(dev)); #endif /* DEBUG */ - if (!atomic_cmpset_int(&spkr_active, 0, 1)) + if (!atomic_cmpset_int(&spkr_dev_busy, 0, 1)) return(EBUSY); else { #ifdef DEBUG @@ -431,6 +440,7 @@ spkrwrite(struct cdev *dev, struct uio *uio, int ioflag) char *cp; int error; + sx_xlock(&spkr_op_locked); n = uio->uio_resid; cp = spkr_inbuf; error = uiomove(cp, n, uio); @@ -438,7 +448,8 @@ spkrwrite(struct cdev *dev, struct uio *uio, int ioflag) cp[n] = '\0'; playstring(cp, n); } - return(error); + sx_xunlock(&spkr_op_locked); + return(error); } } @@ -452,7 +463,7 @@ spkrclose(struct cdev *dev, int flags, int fmt, struct thread *td) wakeup(&endtone); wakeup(&endrest); free(spkr_inbuf, M_SPKR); - (void) atomic_swap_int(&spkr_active, 0); + (void) atomic_swap_int(&spkr_dev_busy, 0); return(0); } @@ -468,20 +479,25 @@ spkrioctl(struct cdev *dev, unsigned long cmd, caddr_t cmdarg, int flags, if (cmd == SPKRTONE) { tone_t *tp = (tone_t *)cmdarg; + sx_xlock(&spkr_op_locked); if (tp->frequency == 0) rest(tp->duration); else tone(tp->frequency, tp->duration); + sx_xunlock(&spkr_op_locked); return 0; } else if (cmd == SPKRTUNE) { tone_t *tp = (tone_t *)(*(caddr_t *)cmdarg); tone_t ttp; int error; + sx_xlock(&spkr_op_locked); for (; ; tp++) { error = copyin(tp, &ttp, sizeof(tone_t)); - if (error) + if (error) { + sx_xunlock(&spkr_op_locked); return(error); + } if (ttp.duration == 0) break; @@ -491,6 +507,7 @@ spkrioctl(struct cdev *dev, unsigned long cmd, caddr_t cmdarg, int flags, else tone(ttp.frequency, ttp.duration); } + sx_xunlock(&spkr_op_locked); return(0); } return(EINVAL); @@ -507,13 +524,15 @@ speaker_modevent(module_t mod, int type, void *data) int error = 0; switch(type) { - case MOD_LOAD: + case MOD_LOAD: + sx_init(&spkr_op_locked, "spkr"); speaker_dev = make_dev(&spkr_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "speaker"); break; case MOD_SHUTDOWN: case MOD_UNLOAD: destroy_dev(speaker_dev); + sx_destroy(&spkr_op_locked); break; default: error = EOPNOTSUPP;