1. 16 2月, 2016 1 次提交
  2. 15 2月, 2016 1 次提交
  3. 03 2月, 2016 2 次提交
    • T
      ALSA: seq: Fix lockdep warnings due to double mutex locks · 7f0973e9
      Takashi Iwai 提交于
      The port subscription code uses double mutex locks for source and
      destination ports, and this may become racy once when wrongly set up.
      It leads to lockdep warning splat, typically triggered by fuzzer like
      syzkaller, although the actual deadlock hasn't been seen, so far.
      
      This patch simplifies the handling by reducing to two single locks, so
      that no lockdep warning will be trigger any longer.
      
      By splitting to two actions, a still-in-progress element shall be
      added in one list while handling another.  For ignoring this element,
      a new check is added in deliver_to_subscribers().
      
      Along with it, the code to add/remove the subscribers list element was
      cleaned up and refactored.
      
      BugLink: http://lkml.kernel.org/r/CACT4Y+aKQXV7xkBW9hpQbzaDO7LrUvohxWh-UwMxXjDy-yBD=A@mail.gmail.comReported-by: NDmitry Vyukov <dvyukov@google.com>
      Tested-by: NDmitry Vyukov <dvyukov@google.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      7f0973e9
    • T
      ALSA: rawmidi: Make snd_rawmidi_transmit() race-free · 06ab3003
      Takashi Iwai 提交于
      A kernel WARNING in snd_rawmidi_transmit_ack() is triggered by
      syzkaller fuzzer:
        WARNING: CPU: 1 PID: 20739 at sound/core/rawmidi.c:1136
      Call Trace:
       [<     inline     >] __dump_stack lib/dump_stack.c:15
       [<ffffffff82999e2d>] dump_stack+0x6f/0xa2 lib/dump_stack.c:50
       [<ffffffff81352089>] warn_slowpath_common+0xd9/0x140 kernel/panic.c:482
       [<ffffffff813522b9>] warn_slowpath_null+0x29/0x30 kernel/panic.c:515
       [<ffffffff84f80bd5>] snd_rawmidi_transmit_ack+0x275/0x400 sound/core/rawmidi.c:1136
       [<ffffffff84fdb3c1>] snd_virmidi_output_trigger+0x4b1/0x5a0 sound/core/seq/seq_virmidi.c:163
       [<     inline     >] snd_rawmidi_output_trigger sound/core/rawmidi.c:150
       [<ffffffff84f87ed9>] snd_rawmidi_kernel_write1+0x549/0x780 sound/core/rawmidi.c:1223
       [<ffffffff84f89fd3>] snd_rawmidi_write+0x543/0xb30 sound/core/rawmidi.c:1273
       [<ffffffff817b0323>] __vfs_write+0x113/0x480 fs/read_write.c:528
       [<ffffffff817b1db7>] vfs_write+0x167/0x4a0 fs/read_write.c:577
       [<     inline     >] SYSC_write fs/read_write.c:624
       [<ffffffff817b50a1>] SyS_write+0x111/0x220 fs/read_write.c:616
       [<ffffffff86336c36>] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185
      
      Also a similar warning is found but in another path:
      Call Trace:
       [<     inline     >] __dump_stack lib/dump_stack.c:15
       [<ffffffff82be2c0d>] dump_stack+0x6f/0xa2 lib/dump_stack.c:50
       [<ffffffff81355139>] warn_slowpath_common+0xd9/0x140 kernel/panic.c:482
       [<ffffffff81355369>] warn_slowpath_null+0x29/0x30 kernel/panic.c:515
       [<ffffffff8527e69a>] rawmidi_transmit_ack+0x24a/0x3b0 sound/core/rawmidi.c:1133
       [<ffffffff8527e851>] snd_rawmidi_transmit_ack+0x51/0x80 sound/core/rawmidi.c:1163
       [<ffffffff852d9046>] snd_virmidi_output_trigger+0x2b6/0x570 sound/core/seq/seq_virmidi.c:185
       [<     inline     >] snd_rawmidi_output_trigger sound/core/rawmidi.c:150
       [<ffffffff85285a0b>] snd_rawmidi_kernel_write1+0x4bb/0x760 sound/core/rawmidi.c:1252
       [<ffffffff85287b73>] snd_rawmidi_write+0x543/0xb30 sound/core/rawmidi.c:1302
       [<ffffffff817ba5f3>] __vfs_write+0x113/0x480 fs/read_write.c:528
       [<ffffffff817bc087>] vfs_write+0x167/0x4a0 fs/read_write.c:577
       [<     inline     >] SYSC_write fs/read_write.c:624
       [<ffffffff817bf371>] SyS_write+0x111/0x220 fs/read_write.c:616
       [<ffffffff86660276>] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185
      
      In the former case, the reason is that virmidi has an open code
      calling snd_rawmidi_transmit_ack() with the value calculated outside
      the spinlock.   We may use snd_rawmidi_transmit() in a loop just for
      consuming the input data, but even there, there is a race between
      snd_rawmidi_transmit_peek() and snd_rawmidi_tranmit_ack().
      
      Similarly in the latter case, it calls snd_rawmidi_transmit_peek() and
      snd_rawmidi_tranmit_ack() separately without protection, so they are
      racy as well.
      
      The patch tries to address these issues by the following ways:
      - Introduce the unlocked versions of snd_rawmidi_transmit_peek() and
        snd_rawmidi_transmit_ack() to be called inside the explicit lock.
      - Rewrite snd_rawmidi_transmit() to be race-free (the former case).
      - Make the split calls (the latter case) protected in the rawmidi spin
        lock.
      
      BugLink: http://lkml.kernel.org/r/CACT4Y+YPq1+cYLkadwjWa5XjzF1_Vki1eHnVn-Lm0hzhSpu5PA@mail.gmail.com
      BugLink: http://lkml.kernel.org/r/CACT4Y+acG4iyphdOZx47Nyq_VHGbpJQK-6xNpiqUjaZYqsXOGw@mail.gmail.comReported-by: NDmitry Vyukov <dvyukov@google.com>
      Tested-by: NDmitry Vyukov <dvyukov@google.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      06ab3003
  4. 01 2月, 2016 2 次提交
  5. 25 1月, 2016 2 次提交
  6. 18 1月, 2016 1 次提交
  7. 13 1月, 2016 2 次提交
  8. 04 12月, 2015 1 次提交
    • T
      ALSA: Fix compat_ioctl handling for OSS emulations · 83266b6b
      Takashi Iwai 提交于
      The ALSA PCM, mixer and sequencer OSS emulations provide the 32bit
      compatible ioctl, but they just call the 64bit native ioctl as is.
      Although this works in most cases, passing the argument value as-is
      isn't guaranteed to work on all architectures.  We need to convert it
      via compat_ptr() instead.
      
      This patch addresses the missing conversions.  Since all relevant
      ioctls in these functions take the argument as a pointer, we do the
      pointer conversion in each compat_ioctl and pass it as a 64bit value
      to the native ioctl.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      83266b6b
  9. 22 11月, 2015 1 次提交
  10. 09 10月, 2015 1 次提交
    • K
      ALSA: seq_oss: fix waitqueue_active without memory barrier in snd-seq-oss · 69447027
      Kosuke Tatsukawa 提交于
      snd_seq_oss_readq_put_event() seems to be missing a memory barrier which
      might cause the waker to not notice the waiter and miss sending a
      wake_up as in the following figure.
      
          snd_seq_oss_readq_put_event		    snd_seq_oss_readq_wait
      ------------------------------------------------------------------------
      					/* wait_event_interruptible_timeout */
      					 /* __wait_event_interruptible_timeout */
      					  /* ___wait_event */
      					  for (;;) {									 prepare_to_wait_event(&wq, &__wait,
      					    state);
      spin_lock_irqsave(&q->lock, flags);
      if (waitqueue_active(&q->midi_sleep))
      /* The CPU might reorder the test for
         the waitqueue up here, before
         prior writes complete */
      					  if ((q->qlen>0 || q->head==q->tail)
      					  ...
      					  __ret = schedule_timeout(__ret)
      if (q->qlen >= q->maxlen - 1) {
      memcpy(&q->q[q->tail], ev, sizeof(*ev));
      q->tail = (q->tail + 1) % q->maxlen;
      q->qlen++;
      ------------------------------------------------------------------------
      
      There are two other place in sound/core/seq/oss/ which have similar
      code.  The attached patch removes the call to waitqueue_active() leaving
      just wake_up() behind.  This fixes the problem because the call to
      spin_lock_irqsave() in wake_up() will be an ACQUIRE operation.
      
      I found this issue when I was looking through the linux source code
      for places calling waitqueue_active() before wake_up*(), but without
      preceding memory barriers, after sending a patch to fix a similar
      issue in drivers/tty/n_tty.c  (Details about the original issue can be
      found here: https://lkml.org/lkml/2015/9/28/849).
      Signed-off-by: NKosuke Tatsukawa <tatsu@ab.jp.nec.com>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      69447027
  11. 29 5月, 2015 1 次提交
  12. 28 5月, 2015 1 次提交
  13. 24 4月, 2015 2 次提交
  14. 11 4月, 2015 1 次提交
  15. 11 3月, 2015 1 次提交
  16. 10 3月, 2015 2 次提交
  17. 12 2月, 2015 7 次提交
  18. 03 2月, 2015 1 次提交
    • T
      ALSA: Simplify snd_device_register() variants · 40a4b263
      Takashi Iwai 提交于
      Now that all callers have been replaced with
      snd_device_register_for_dev(), let's drop the obsolete device
      registration code and concentrate only on the code handling struct
      device directly.  That said,
      
      - remove the old snd_device_register(),
      - rename snd_device_register_for_dev() with snd_device_register(),
      - drop superfluous arguments from snd_device_register(),
      - change snd_unregister_device() to pass the device pointer directly
      Reviewed-by: NJaroslav Kysela <perex@perex.cz>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      40a4b263
  19. 02 2月, 2015 1 次提交
  20. 26 1月, 2015 4 次提交
  21. 04 1月, 2015 1 次提交
  22. 22 11月, 2014 1 次提交
  23. 19 10月, 2014 2 次提交
    • T
      Subject: ALSA: seq: Remove autoload locks in driver registration · d5129f33
      Takashi Iwai 提交于
      Since we're calling request_module() asynchronously now, we can get
      rid of the autoload lock in snd_seq_device_register_driver(), as well
      as in the snd-seq driver registration itself.  This enables the
      automatic loading of dependent sequencer modules, such as
      snd-seq-virmidi from snd-emu10k1-synth.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      d5129f33
    • T
      ALSA: seq: bind seq driver automatically · 68ab6108
      Takashi Iwai 提交于
      Currently the sequencer module binding is performed independently from
      the card module itself.  The reason behind it is to keep the sequencer
      stuff optional and allow the system running without it (e.g. for using
      PCM or rawmidi only).  This works in most cases, but a remaining
      problem is that the binding isn't done automatically when a new driver
      module is probed.  Typically this becomes visible when a hotplug
      driver like usb audio is used.
      
      This patch tries to address this and other potential issues.  First,
      the seq-binder (seq_device.c) tries to load a missing driver module at
      creating a new device object.  This is done asynchronously in a workq
      for avoiding the deadlock (modprobe call in module init path).
      
      This action, however, should be enabled only when the sequencer stuff
      was already initialized, i.e. snd-seq module was already loaded.  For
      that, a new function, snd_seq_autoload_init() is introduced here; this
      clears the blocking of autoloading, and also tries to load all pending
      driver modules.
      Reported-by: NAdam Goode <agoode@chromium.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      68ab6108
  24. 15 10月, 2014 1 次提交