On Mon, Jul 10, 2023 at 05:05:06PM +0200, Takashi Iwai wrote:
On Mon, 10 Jul 2023 08:59:56 +0200,
Oswald Buddenhagen wrote:
+ // We consider this a mixer setting, so use the mixer's lock
+ down_write(&emu->card->controls_rwsem);
I really don't want to see the driver touching this lock. It's
basically an internal stuff of ALSA core code. And, as already
discussed, the controls_rwsem wasn't intended as a lock for the mixer
content protection originally. It took over the role partially, but
the drivers shouldn't rely on it.
i know that this is technically true, but i think that from a pragmatic
point of view it just makes no sense.
if we are pedantic about it, we need to revert my 06405d8ee8c (emu10k1:
remove now superfluous mixer locking) and do the opposite change, to add
the technically missing locks. that's several tens of irq-safe spinlock
operations in this driver alone. which are hundreds of bytes spent
entirely pointlessly, because we _know_ that the operation is already
locked, because it must be.
so i think the most sensible approach is to just make it official, which
is what my 37bb927d5bb (core: update comment on snd_card.controls_rwsem)
actually works towards. at least i can't think of a reason not to do
that, except for some puristic ideals.
if somebody actually finds a _good_ reason to change this and wants to
embark on the mammoth task of proving that everything is still safe
afterwards, they can just do so. adjusting this commit for the new
reality wouldn't be hard or laborious.
> + snd_emu1010_update_clock(emu);
> + downgrade_write(&emu->card->controls_rwsem);
> + snd_ctl_build_ioff(&id, emu->ctl_clock_source, 0);
> + snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE, &id);
> + up_read(&emu->card->controls_rwsem);
Err, too ugly and unnecessary change. snd_ctl_notify() doesn't take
the rwsem, and it can be called at any place without fiddling the
rwsem. It's snd_ctl_notify_one() that needs the downgrade to read
(and maybe we should rename the function to be clearer).
well, that lock is necessary exactly because we (ab-)use the rwsem as
the general mixer lock, so we basically need to emulate the ioctl entry
path, so a concurrent actual put ioctl doesn't blow up in our face. i
actually agree that it's kinda ugly, but the argument remains the same -
it just isn't worth doing it differently (we'd have to sprinkle around
quite some reg_lock operations instead).
regards