diff options
| author | martin <martin@NetBSD.org> | 2020-03-21 15:41:18 +0000 |
|---|---|---|
| committer | martin <martin@NetBSD.org> | 2020-03-21 15:41:18 +0000 |
| commit | 292c6e4f5b6f2b8cffe7affd4fbd52df8ad6d64b (patch) | |
| tree | b29fbb705ab6ff64ff6ff308ac74e25ca93e65a7 /sys/dev | |
| parent | 0a769b9591c7c735c0a1d20513934e012db4d18f (diff) | |
Pull up following revision(s) (requested by isaki in ticket #793):
sys/dev/audio/audio.c: revision 1.42
sys/dev/audio/audio.c: revision 1.47
sys/dev/audio/audiodef.h: revision 1.9
Remove incorrect KASSERT(!mutex_owned()).
Pointed out by riastradh@.
Improve KASSERT messages.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/audio/audio.c | 142 | ||||
| -rw-r--r-- | sys/dev/audio/audiodef.h | 15 |
2 files changed, 91 insertions, 66 deletions
diff --git a/sys/dev/audio/audio.c b/sys/dev/audio/audio.c index 8ad20631250..c73996d4503 100644 --- a/sys/dev/audio/audio.c +++ b/sys/dev/audio/audio.c @@ -1,4 +1,4 @@ -/* $NetBSD: audio.c,v 1.28.2.7 2020/01/21 11:19:19 martin Exp $ */ +/* $NetBSD: audio.c,v 1.28.2.8 2020/03/21 15:41:18 martin Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -142,7 +142,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.28.2.7 2020/01/21 11:19:19 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.28.2.8 2020/03/21 15:41:18 martin Exp $"); #ifdef _KERNEL_OPT #include "audio.h" @@ -1357,14 +1357,13 @@ audio_attach_mi(const struct audio_hw_if *ahwp, void *hdlp, device_t dev) /* * Acquire sc_lock and enter exlock critical section. * If successful, it returns 0. Otherwise returns errno. + * Must be called without sc_lock held. */ static int audio_enter_exclusive(struct audio_softc *sc) { int error; - KASSERT(!mutex_owned(sc->sc_lock)); - mutex_enter(sc->sc_lock); if (sc->sc_dying) { mutex_exit(sc->sc_lock); @@ -2062,7 +2061,7 @@ audio_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, *bellfile = af; } else { error = fd_clone(fp, fd, flags, &audio_fileops, af); - KASSERT(error == EMOVEFD); + KASSERTMSG(error == EMOVEFD, "error=%d", error); } TRACEF(3, af, "done"); @@ -2095,7 +2094,7 @@ bad1: } /* - * Must NOT called with sc_lock nor sc_exlock held. + * Must be called without sc_lock nor sc_exlock held. */ int audio_close(struct audio_softc *sc, audio_file_t *file) @@ -2103,8 +2102,6 @@ audio_close(struct audio_softc *sc, audio_file_t *file) audio_track_t *oldtrack; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - TRACEF(1, file, "%spid=%d.%d po=%d ro=%d", (audiodebug >= 3) ? "start " : "", (int)curproc->p_pid, (int)curlwp->l_lid, @@ -2205,6 +2202,9 @@ audio_close(struct audio_softc *sc, audio_file_t *file) return 0; } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_read(struct audio_softc *sc, struct uio *uio, int ioflag, audio_file_t *file) @@ -2214,8 +2214,6 @@ audio_read(struct audio_softc *sc, struct uio *uio, int ioflag, audio_ring_t *input; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - /* * On half-duplex hardware, O_RDWR is treated as O_WRONLY. * However read() system call itself can be called because it's @@ -2332,6 +2330,9 @@ audio_file_clear(struct audio_softc *sc, audio_file_t *file) audio_track_clear(sc, file->rtrack); } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_write(struct audio_softc *sc, struct uio *uio, int ioflag, audio_file_t *file) @@ -2341,8 +2342,6 @@ audio_write(struct audio_softc *sc, struct uio *uio, int ioflag, audio_ring_t *outbuf; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - track = file->ptrack; KASSERT(track); @@ -2454,6 +2453,9 @@ abort: return error; } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_ioctl(dev_t dev, struct audio_softc *sc, u_long cmd, void *addr, int flag, struct lwp *l, audio_file_t *file) @@ -2469,8 +2471,6 @@ audio_ioctl(dev_t dev, struct audio_softc *sc, u_long cmd, void *addr, int flag, int index; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - #if defined(AUDIO_DEBUG) const char *ioctlnames[] = { " AUDIO_GETINFO", /* 21 */ @@ -2762,6 +2762,9 @@ audio_track_readablebytes(const audio_track_t *track) return bytes; } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_poll(struct audio_softc *sc, int events, struct lwp *l, audio_file_t *file) @@ -2771,8 +2774,6 @@ audio_poll(struct audio_softc *sc, int events, struct lwp *l, bool in_is_valid; bool out_is_valid; - KASSERT(!mutex_owned(sc->sc_lock)); - #if defined(AUDIO_DEBUG) #define POLLEV_BITMAP "\177\020" \ "b\10WRBAND\0" \ @@ -2920,13 +2921,14 @@ filt_audiowrite_event(struct knote *kn, long hint) return (track->usrbuf.used < track->usrbuf_usedlow); } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_kqfilter(struct audio_softc *sc, audio_file_t *file, struct knote *kn) { struct klist *klist; - KASSERT(!mutex_owned(sc->sc_lock)); - TRACEF(3, file, "kn=%p kn_filter=%x", kn, (int)kn->kn_filter); switch (kn->kn_filter) { @@ -2953,6 +2955,9 @@ audio_kqfilter(struct audio_softc *sc, audio_file_t *file, struct knote *kn) return 0; } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int audio_mmap(struct audio_softc *sc, off_t *offp, size_t len, int prot, int *flagsp, int *advicep, struct uvm_object **uobjp, int *maxprotp, @@ -2962,8 +2967,6 @@ audio_mmap(struct audio_softc *sc, off_t *offp, size_t len, int prot, vsize_t vsize; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - TRACEF(2, file, "off=%lld, prot=%d", (long long)(*offp), prot); if (*offp < 0) @@ -3056,7 +3059,7 @@ audioctl_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, /* Not necessary to insert sc_files. */ error = fd_clone(fp, fd, flags, &audio_fileops, af); - KASSERT(error == EMOVEFD); + KASSERTMSG(error == EMOVEFD, "error=%d", error); return error; } @@ -3209,9 +3212,12 @@ audio_track_chvol(audio_filter_arg_t *arg) u_int channels; DIAGNOSTIC_filter_arg(arg); - KASSERT(arg->srcfmt->channels == arg->dstfmt->channels); + KASSERTMSG(arg->srcfmt->channels == arg->dstfmt->channels, + "arg->srcfmt->channels=%d, arg->dstfmt->channels=%d", + arg->srcfmt->channels, arg->dstfmt->channels); KASSERT(arg->context != NULL); - KASSERT(arg->srcfmt->channels <= AUDIO_MAX_CHANNELS); + KASSERTMSG(arg->srcfmt->channels <= AUDIO_MAX_CHANNELS, + "arg->srcfmt->channels=%d", arg->srcfmt->channels); s = arg->src; d = arg->dst; @@ -3369,8 +3375,12 @@ audio_track_freq_up(audio_filter_arg_t *arg) DIAGNOSTIC_ring(dst); DIAGNOSTIC_ring(src); KASSERT(src->used > 0); - KASSERT(src->fmt.channels == dst->fmt.channels); - KASSERT(src->head % track->mixer->frames_per_block == 0); + KASSERTMSG(src->fmt.channels == dst->fmt.channels, + "src->fmt.channels=%d dst->fmt.channels=%d", + src->fmt.channels, dst->fmt.channels); + KASSERTMSG(src->head % track->mixer->frames_per_block == 0, + "src->head=%d track->mixer->frames_per_block=%d", + src->head, track->mixer->frames_per_block); s = arg->src; d = arg->dst; @@ -3495,9 +3505,11 @@ audio_track_freq_down(audio_filter_arg_t *arg) DIAGNOSTIC_ring(dst); DIAGNOSTIC_ring(src); KASSERT(src->used > 0); - KASSERT(src->fmt.channels == dst->fmt.channels); + KASSERTMSG(src->fmt.channels == dst->fmt.channels, + "src->fmt.channels=%d dst->fmt.channels=%d", + src->fmt.channels, dst->fmt.channels); KASSERTMSG(src->head % track->mixer->frames_per_block == 0, - "src->head=%d fpb=%d", + "src->head=%d track->mixer->frames_per_block=%d", src->head, track->mixer->frames_per_block); s0 = arg->src; @@ -4188,7 +4200,9 @@ audio_append_silence(audio_track_t *track, audio_ring_t *ring) n = (ring->capacity - ring->used) % fpb; - KASSERT(auring_get_contig_free(ring) >= n); + KASSERTMSG(auring_get_contig_free(ring) >= n, + "auring_get_contig_free(ring)=%d n=%d", + auring_get_contig_free(ring), n); memset(auring_tailptr_aint(ring), 0, n * ring->fmt.channels * sizeof(aint_t)); @@ -4221,7 +4235,7 @@ audio_apply_stage(audio_track_t *track, audio_stage_t *stage, bool isfreq) dstcount = auring_get_contig_free(stage->dst); if (isfreq) { - KASSERTMSG(srccount > 0, "freq but srccount == %d", srccount); + KASSERTMSG(srccount > 0, "freq but srccount=%d", srccount); count = uimin(dstcount, track->mixer->frames_per_block); } else { count = uimin(srccount, dstcount); @@ -4306,7 +4320,8 @@ audio_track_play(audio_track_t *track) int bytes2; bytes1 = auring_get_contig_used(usrbuf); - KASSERT(bytes1 % framesize == 0); + KASSERTMSG(bytes1 % framesize == 0, + "bytes1=%d framesize=%d", bytes1, framesize); memcpy((uint8_t *)input->mem + auring_tail(input) * framesize, (uint8_t *)usrbuf->mem + usrbuf->head, bytes1); @@ -4469,7 +4484,8 @@ audio_track_record(audio_track_t *track) int bytes2; bytes1 = auring_get_contig_free(usrbuf); - KASSERT(bytes1 % framesize == 0); + KASSERTMSG(bytes1 % framesize == 0, + "bytes1=%d framesize=%d", bytes1, framesize); memcpy((uint8_t *)usrbuf->mem + auring_tail(usrbuf), (uint8_t *)outbuf->mem + outbuf->head * framesize, bytes1); @@ -4865,7 +4881,9 @@ audio_pmixer_process(struct audio_softc *sc) mixer = sc->sc_pmixer; frame_count = mixer->frames_per_block; - KASSERT(auring_get_contig_free(&mixer->hwbuf) >= frame_count); + KASSERTMSG(auring_get_contig_free(&mixer->hwbuf) >= frame_count, + "auring_get_contig_free()=%d frame_count=%d", + auring_get_contig_free(&mixer->hwbuf), frame_count); sample_count = frame_count * mixer->mixfmt.channels; mixer->mixseq++; @@ -5156,7 +5174,9 @@ audio_pmixer_output(struct audio_softc *sc) TRACE(4, "pbusy=%d hwbuf=%d/%d/%d", sc->sc_pbusy, mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity); - KASSERT(mixer->hwbuf.used >= mixer->frames_per_block); + KASSERTMSG(mixer->hwbuf.used >= mixer->frames_per_block, + "mixer->hwbuf.used=%d mixer->frames_per_block=%d", + mixer->hwbuf.used, mixer->frames_per_block); blksize = frametobyte(&mixer->hwbuf.fmt, mixer->frames_per_block); @@ -5399,7 +5419,9 @@ audio_rmixer_process(struct audio_softc *sc) input->head, input->used, input->capacity); auring_take(input, drops); } - KASSERT(input->used % mixer->frames_per_block == 0); + KASSERTMSG(input->used % mixer->frames_per_block == 0, + "input->used=%d mixer->frames_per_block=%d", + input->used, mixer->frames_per_block); memcpy(auring_tailptr_aint(input), auring_headptr_aint(mixersrc), @@ -6038,8 +6060,7 @@ audio_hw_probe(struct audio_softc *sc, int is_indep, int *modep, KASSERT(mutex_owned(sc->sc_lock)); mode = *modep; - KASSERTMSG((mode & (AUMODE_PLAY | AUMODE_RECORD)) != 0, - "invalid mode = %x", mode); + KASSERTMSG((mode & (AUMODE_PLAY | AUMODE_RECORD)) != 0, "mode=0x%x", mode); if (is_indep) { int errorp = 0, errorr = 0; @@ -7526,62 +7547,60 @@ audio_print_format2(const char *s, const audio_format2_t *fmt) #ifdef DIAGNOSTIC void -audio_diagnostic_format2(const char *func, const audio_format2_t *fmt) +audio_diagnostic_format2(const char *where, const audio_format2_t *fmt) { - KASSERTMSG(fmt, "%s: fmt == NULL", func); + KASSERTMSG(fmt, "called from %s", where); /* XXX MSM6258 vs(4) only has 4bit stride format. */ if (fmt->encoding == AUDIO_ENCODING_ADPCM) { KASSERTMSG(fmt->stride == 4 || fmt->stride == 8, - "%s: stride(%d) is invalid", func, fmt->stride); + "called from %s: fmt->stride=%d", where, fmt->stride); } else { KASSERTMSG(fmt->stride % NBBY == 0, - "%s: stride(%d) is invalid", func, fmt->stride); + "called from %s: fmt->stride=%d", where, fmt->stride); } KASSERTMSG(fmt->precision <= fmt->stride, - "%s: precision(%d) <= stride(%d)", - func, fmt->precision, fmt->stride); + "called from %s: fmt->precision=%d fmt->stride=%d", + where, fmt->precision, fmt->stride); KASSERTMSG(1 <= fmt->channels && fmt->channels <= AUDIO_MAX_CHANNELS, - "%s: channels(%d) is out of range", - func, fmt->channels); + "called from %s: fmt->channels=%d", where, fmt->channels); /* XXX No check for encodings? */ } void -audio_diagnostic_filter_arg(const char *func, const audio_filter_arg_t *arg) +audio_diagnostic_filter_arg(const char *where, const audio_filter_arg_t *arg) { KASSERT(arg != NULL); KASSERT(arg->src != NULL); KASSERT(arg->dst != NULL); - DIAGNOSTIC_format2(arg->srcfmt); - DIAGNOSTIC_format2(arg->dstfmt); - KASSERTMSG(arg->count > 0, - "%s: count(%d) is out of range", func, arg->count); + audio_diagnostic_format2(where, arg->srcfmt); + audio_diagnostic_format2(where, arg->dstfmt); + KASSERT(arg->count > 0); } void -audio_diagnostic_ring(const char *func, const audio_ring_t *ring) +audio_diagnostic_ring(const char *where, const audio_ring_t *ring) { - KASSERTMSG(ring, "%s: ring == NULL", func); - DIAGNOSTIC_format2(&ring->fmt); + KASSERTMSG(ring, "called from %s", where); + audio_diagnostic_format2(where, &ring->fmt); KASSERTMSG(0 <= ring->capacity && ring->capacity < INT_MAX / 2, - "%s: capacity(%d) is out of range", func, ring->capacity); + "called from %s: ring->capacity=%d", where, ring->capacity); KASSERTMSG(0 <= ring->used && ring->used <= ring->capacity, - "%s: used(%d) is out of range (capacity:%d)", - func, ring->used, ring->capacity); + "called from %s: ring->used=%d ring->capacity=%d", + where, ring->used, ring->capacity); if (ring->capacity == 0) { KASSERTMSG(ring->mem == NULL, - "%s: capacity == 0 but mem != NULL", func); + "called from %s: capacity == 0 but mem != NULL", where); } else { KASSERTMSG(ring->mem != NULL, - "%s: capacity != 0 but mem == NULL", func); + "called from %s: capacity != 0 but mem == NULL", where); KASSERTMSG(0 <= ring->head && ring->head < ring->capacity, - "%s: head(%d) is out of range (capacity:%d)", - func, ring->head, ring->capacity); + "called from %s: ring->head=%d ring->capacity=%d", + where, ring->head, ring->capacity); } } #endif /* DIAGNOSTIC */ @@ -7673,6 +7692,9 @@ mixer_close(struct audio_softc *sc, audio_file_t *file) return 0; } +/* + * Must be called without sc_lock nor sc_exlock held. + */ int mixer_ioctl(struct audio_softc *sc, u_long cmd, void *addr, int flag, struct lwp *l) @@ -7682,8 +7704,6 @@ mixer_ioctl(struct audio_softc *sc, u_long cmd, void *addr, int flag, mixer_ctrl_t *mc; int error; - KASSERT(!mutex_owned(sc->sc_lock)); - TRACE(2, "(%lu,'%c',%lu)", IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd & 0xff); error = EINVAL; diff --git a/sys/dev/audio/audiodef.h b/sys/dev/audio/audiodef.h index 04f7d1e6e8f..f08e044cc53 100644 --- a/sys/dev/audio/audiodef.h +++ b/sys/dev/audio/audiodef.h @@ -1,4 +1,4 @@ -/* $NetBSD: audiodef.h,v 1.7.2.1 2020/01/27 07:06:02 martin Exp $ */ +/* $NetBSD: audiodef.h,v 1.7.2.2 2020/03/21 15:41:18 martin Exp $ */ /* * Copyright (C) 2017 Tetsuya Isaki. All rights reserved. @@ -296,8 +296,9 @@ static __inline int auring_round(const audio_ring_t *ring, int idx) { DIAGNOSTIC_ring(ring); - KASSERT(idx >= 0); - KASSERT(idx < ring->capacity * 2); + KASSERTMSG(idx >= 0, "idx=%d", idx); + KASSERTMSG(idx < ring->capacity * 2, + "idx=%d ring->capacity=%d", idx, ring->capacity); if (idx < ring->capacity) { return idx; @@ -324,7 +325,9 @@ auring_tail(const audio_ring_t *ring) static __inline aint_t * auring_headptr_aint(const audio_ring_t *ring) { - KASSERT(ring->fmt.stride == sizeof(aint_t) * NBBY); + KASSERTMSG(ring->fmt.stride == sizeof(aint_t) * NBBY, + "ring->fmt.stride=%d sizeof(aint_t)*NBBY=%zd", + ring->fmt.stride, sizeof(aint_t) * NBBY); return (aint_t *)ring->mem + ring->head * ring->fmt.channels; } @@ -337,7 +340,9 @@ auring_headptr_aint(const audio_ring_t *ring) static __inline aint_t * auring_tailptr_aint(const audio_ring_t *ring) { - KASSERT(ring->fmt.stride == sizeof(aint_t) * NBBY); + KASSERTMSG(ring->fmt.stride == sizeof(aint_t) * NBBY, + "ring->fmt.stride=%d sizeof(aint_t)*NBBY=%zd", + ring->fmt.stride, sizeof(aint_t) * NBBY); return (aint_t *)ring->mem + auring_tail(ring) * ring->fmt.channels; } |
