22 Nov, 2014

1 commit


19 Oct, 2014

2 commits

  • 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: Takashi Iwai

    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: Adam Goode
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

15 Oct, 2014

1 commit


23 Jun, 2014

1 commit


04 Jun, 2014

2 commits

  • Sometimes PORT_EXIT messages are lost when a process is exiting.
    This happens if you subscribe to the announce port with client A,
    then subscribe to the announce port with client B, then kill client A.
    Client B will not see the PORT_EXIT message because client A's port is
    closing and is earlier in the announce port subscription list. The
    for each loop will try to send the announcement to client A and fail,
    then will stop trying to broadcast to other ports. Killing B works fine
    since the announcement will already have gone to A. The CLIENT_EXIT
    message does not get lost.

    How to reproduce problem:

    *** termA
    $ aseqdump -p 0:1
    0:1 Port subscribed 0:1 -> 128:0

    *** termB
    $ aseqdump -p 0:1

    *** termA
    0:1 Client start client 129
    0:1 Port start 129:0
    0:1 Port subscribed 0:1 -> 129:0

    *** termB
    0:1 Port subscribed 0:1 -> 129:0

    *** termA
    ^C

    *** termB
    0:1 Client exit client 128

    Signed-off-by: Takashi Iwai

    Adam Goode
     
  • snd_seq_event_dup returns -ENOMEM in some buffer-full conditions,
    but usually returns -EAGAIN. Make -EAGAIN trigger the overflow
    condition in snd_seq_fifo_event_in so that the fifo is cleared
    and -ENOSPC is returned to userspace as stated in the alsa-lib docs.

    Signed-off-by: Adam Goode
    Signed-off-by: Takashi Iwai

    Adam Goode
     

28 Apr, 2014

1 commit


14 Feb, 2014

4 commits


12 Feb, 2014

1 commit


17 Jul, 2013

1 commit

  • We've got bug reports that the module loading stuck on Debian system
    with 3.10 kernel. The debugging session revealed that the initial
    registration of OSS sequencer clients stuck at module loading time,
    which involves again with request_module() at the init phase. This is
    triggered only by special --install stuff Debian is using, but it's
    still not good to have such loops.

    As a workaround, call the registration part asynchronously. This is a
    better approach irrespective of the hang fix, in anyway.

    Reported-and-tested-by: Philipp Matthias Hahn
    Cc:
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

11 Mar, 2013

1 commit

  • snd_seq_timer_open() didn't catch the whole error path but let through
    if the timer id is a slave. This may lead to Oops by accessing the
    uninitialized pointer.

    BUG: unable to handle kernel NULL pointer dereference at 00000000000002ae
    IP: [] snd_seq_timer_open+0xe7/0x130
    PGD 785cd067 PUD 76964067 PMD 0
    Oops: 0002 [#4] SMP
    CPU 0
    Pid: 4288, comm: trinity-child7 Tainted: G D W 3.9.0-rc1+ #100 Bochs Bochs
    RIP: 0010:[] [] snd_seq_timer_open+0xe7/0x130
    RSP: 0018:ffff88006ece7d38 EFLAGS: 00010246
    RAX: 0000000000000286 RBX: ffff88007851b400 RCX: 0000000000000000
    RDX: 000000000000ffff RSI: ffff88006ece7d58 RDI: ffff88006ece7d38
    RBP: ffff88006ece7d98 R08: 000000000000000a R09: 000000000000fffe
    R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
    R13: ffff8800792c5400 R14: 0000000000e8f000 R15: 0000000000000007
    FS: 00007f7aaa650700(0000) GS:ffff88007f800000(0000) GS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00000000000002ae CR3: 000000006efec000 CR4: 00000000000006f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process trinity-child7 (pid: 4288, threadinfo ffff88006ece6000, task ffff880076a8a290)
    Stack:
    0000000000000286 ffffffff828f2be0 ffff88006ece7d58 ffffffff810f354d
    65636e6575716573 2065756575712072 ffff8800792c0030 0000000000000000
    ffff88006ece7d98 ffff8800792c5400 ffff88007851b400 ffff8800792c5520
    Call Trace:
    [] ? trace_hardirqs_on+0xd/0x10
    [] snd_seq_queue_timer_open+0x29/0x70
    [] snd_seq_ioctl_set_queue_timer+0xda/0x120
    [] snd_seq_do_ioctl+0x9b/0xd0
    [] snd_seq_ioctl+0x10/0x20
    [] do_vfs_ioctl+0x522/0x570
    [] ? file_has_perm+0x83/0xa0
    [] ? trace_hardirqs_on+0xd/0x10
    [] sys_ioctl+0x5d/0xa0
    [] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [] system_call_fastpath+0x16/0x1b

    Reported-and-tested-by: Tommi Rantala
    Cc:
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

04 Mar, 2013

1 commit

  • The "dev" variable could be out of bounds. Calling
    snd_seq_oss_synth_is_valid() checks that it is is a valid device
    which has been opened. We check this inside set_note_event() so
    this function can't succeed without a valid "dev". But we need to
    do the check earlier to prevent invalid dereferences and memory
    corruption.

    One call tree where "dev" could be out of bounds is:
    -> snd_seq_oss_oob_user()
    -> snd_seq_oss_process_event()
    -> extended_event()
    -> note_on_event()

    Signed-off-by: Dan Carpenter
    Signed-off-by: Takashi Iwai

    Dan Carpenter
     

19 Nov, 2012

1 commit


20 Aug, 2012

1 commit


31 Mar, 2012

1 commit

  • Usage of /etc/modprobe.conf file was deprecated by module-init-tools and
    is no longer parsed by new kmod tool. References to this file are
    replaced in Documentation, comments and Kconfig according to the
    context.

    There are also some references to the old /etc/modules.conf from 2.4
    kernels that are being removed.

    Signed-off-by: Lucas De Marchi
    Acked-by: Takashi Iwai
    Acked-by: Mauro Carvalho Chehab
    Signed-off-by: Randy Dunlap
    Signed-off-by: Linus Torvalds

    Lucas De Marchi
     

12 Mar, 2012

1 commit

  • For files that are actively using linux/device.h, make sure
    that they call it out. This will allow us to clean up some
    of the implicit uses of linux/device.h within include/*
    without introducing build regressions.

    Yes, this was created by "cheating" -- i.e. the headers were
    cleaned up, and then the fallout was found and fixed, and then
    the two commits were reordered. This ensures we don't introduce
    build regressions into the git history.

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

19 Dec, 2011

1 commit

  • module_param(bool) used to counter-intuitively take an int. In
    fddd5201 (mid-2009) we allowed bool or int/unsigned int using a messy
    trick.

    It's time to remove the int/unsigned int option. For this version
    it'll simply give a warning, but it'll break next kernel version.

    Signed-off-by: Rusty Russell
    Signed-off-by: Takashi Iwai

    Rusty Russell
     

01 Nov, 2011

3 commits


26 May, 2011

1 commit


31 Mar, 2011

1 commit


27 Feb, 2011

1 commit


15 Feb, 2011

1 commit

  • Change the core code where sparse complains. In most cases, this means
    just adding annotations to confirm that we indeed want to do the dirty
    things we're doing.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Clemens Ladisch
     

24 Nov, 2010

1 commit

  • If CONFIG_SND_DYNAMIC_MINORS is used, assign /dev/snd/seq and
    /dev/snd/timer the usual static minors, and export specific
    module aliases to generate udev module on-demand loading
    instructions:

    $ cat /lib/modules/2.6.33.4-smp/modules.devname
    # Device nodes to trigger on-demand module loading.
    microcode cpu/microcode c10:184
    fuse fuse c10:229
    ppp_generic ppp c108:0
    tun net/tun c10:200
    uinput uinput c10:223
    dm_mod mapper/control c10:236
    snd_timer snd/timer c116:33
    snd_seq snd/seq c116:1

    The last two lines instruct udev to create device nodes, even
    when the modules are not loaded at that time.

    As soon as userspace accesses any of these nodes, the in-kernel
    module-loader will load the module, and the device can be used.

    The header file minor calculation needed to be simplified to
    make __stringify() (supports only two indirections) in
    the MODULE_ALIAS macro work.

    This is part of systemd's effort to get rid of unconditional
    module load instructions and needless init scripts.

    Cc: Lennart Poettering
    Signed-off-by: Kay Sievers
    Signed-off-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Kay Sievers
     

15 Oct, 2010

1 commit

  • All file_operations should get a .llseek operation so we can make
    nonseekable_open the default for future file operations without a
    .llseek pointer.

    The three cases that we can automatically detect are no_llseek, seq_lseek
    and default_llseek. For cases where we can we can automatically prove that
    the file offset is always ignored, we use noop_llseek, which maintains
    the current behavior of not returning an error from a seek.

    New drivers should normally not use noop_llseek but instead use no_llseek
    and call nonseekable_open at open time. Existing drivers can be converted
    to do the same when the maintainer knows for certain that no user code
    relies on calling seek on the device file.

    The generated code is often incorrectly indented and right now contains
    comments that clarify for each added line why a specific variant was
    chosen. In the version that gets submitted upstream, the comments will
    be gone and I will manually fix the indentation, because there does not
    seem to be a way to do that using coccinelle.

    Some amount of new code is currently sitting in linux-next that should get
    the same modifications, which I will do at the end of the merge window.

    Many thanks to Julia Lawall for helping me learn to write a semantic
    patch that does all this.

    ===== begin semantic patch =====
    // This adds an llseek= method to all file operations,
    // as a preparation for making no_llseek the default.
    //
    // The rules are
    // - use no_llseek explicitly if we do nonseekable_open
    // - use seq_lseek for sequential files
    // - use default_llseek if we know we access f_pos
    // - use noop_llseek if we know we don't access f_pos,
    // but we still want to allow users to call lseek
    //
    @ open1 exists @
    identifier nested_open;
    @@
    nested_open(...)
    {

    }

    @ open exists@
    identifier open_f;
    identifier i, f;
    identifier open1.nested_open;
    @@
    int open_f(struct inode *i, struct file *f)
    {

    }

    @ read disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {

    }

    @ read_no_fpos disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ write @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {

    }

    @ write_no_fpos @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ fops0 @
    identifier fops;
    @@
    struct file_operations fops = {
    ...
    };

    @ has_llseek depends on fops0 @
    identifier fops0.fops;
    identifier llseek_f;
    @@
    struct file_operations fops = {
    ...
    .llseek = llseek_f,
    ...
    };

    @ has_read depends on fops0 @
    identifier fops0.fops;
    identifier read_f;
    @@
    struct file_operations fops = {
    ...
    .read = read_f,
    ...
    };

    @ has_write depends on fops0 @
    identifier fops0.fops;
    identifier write_f;
    @@
    struct file_operations fops = {
    ...
    .write = write_f,
    ...
    };

    @ has_open depends on fops0 @
    identifier fops0.fops;
    identifier open_f;
    @@
    struct file_operations fops = {
    ...
    .open = open_f,
    ...
    };

    // use no_llseek if we call nonseekable_open
    ////////////////////////////////////////////
    @ nonseekable1 depends on !has_llseek && has_open @
    identifier fops0.fops;
    identifier nso ~= "nonseekable_open";
    @@
    struct file_operations fops = {
    ... .open = nso, ...
    +.llseek = no_llseek, /* nonseekable */
    };

    @ nonseekable2 depends on !has_llseek @
    identifier fops0.fops;
    identifier open.open_f;
    @@
    struct file_operations fops = {
    ... .open = open_f, ...
    +.llseek = no_llseek, /* open uses nonseekable */
    };

    // use seq_lseek for sequential files
    /////////////////////////////////////
    @ seq depends on !has_llseek @
    identifier fops0.fops;
    identifier sr ~= "seq_read";
    @@
    struct file_operations fops = {
    ... .read = sr, ...
    +.llseek = seq_lseek, /* we have seq_read */
    };

    // use default_llseek if there is a readdir
    ///////////////////////////////////////////
    @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier readdir_e;
    @@
    // any other fop is used that changes pos
    struct file_operations fops = {
    ... .readdir = readdir_e, ...
    +.llseek = default_llseek, /* readdir is present */
    };

    // use default_llseek if at least one of read/write touches f_pos
    /////////////////////////////////////////////////////////////////
    @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read.read_f;
    @@
    // read fops use offset
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = default_llseek, /* read accesses f_pos */
    };

    @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ... .write = write_f, ...
    + .llseek = default_llseek, /* write accesses f_pos */
    };

    // Use noop_llseek if neither read nor write accesses f_pos
    ///////////////////////////////////////////////////////////

    @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    identifier write_no_fpos.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ...
    .write = write_f,
    .read = read_f,
    ...
    +.llseek = noop_llseek, /* read and write both use no f_pos */
    };

    @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write_no_fpos.write_f;
    @@
    struct file_operations fops = {
    ... .write = write_f, ...
    +.llseek = noop_llseek, /* write uses no f_pos */
    };

    @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    @@
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = noop_llseek, /* read uses no f_pos */
    };

    @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    @@
    struct file_operations fops = {
    ...
    +.llseek = noop_llseek, /* no read or write fn */
    };
    ===== End semantic patch =====

    Signed-off-by: Arnd Bergmann
    Cc: Julia Lawall
    Cc: Christoph Hellwig

    Arnd Bergmann
     

08 Sep, 2010

1 commit

  • The error handling in snd_seq_oss_open() has several bad codes that
    do dereferecing released pointers and double-free of kmalloc'ed data.
    The object dp is release in free_devinfo() that is called via
    private_free callback. The rest shouldn't touch this object any more.

    The patch changes delete_port() to call kfree() in any case, and gets
    rid of unnecessary calls of destructors in snd_seq_oss_open().

    Fixes CVE-2010-3080.

    Reported-and-tested-by: Tavis Ormandy
    Cc:
    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

13 Apr, 2010

1 commit

  • Set no_llseek to llseek file ops of each sound component (but for hwdep).
    This avoids the implicit BKL invocation via generic_file_llseek() used
    as default when fops.llseek is NULL.

    Also call nonseekable_open() at each open ops to ensure the file flags
    have no seek bit.

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

02 Feb, 2010

1 commit


18 Jan, 2010

1 commit


10 Sep, 2009

1 commit


20 Jul, 2009

1 commit

  • When build SND_SEQUENCER in kernel then OSS sequencer(alsa_seq_oss_init)
    is initialized before System (snd_seq_system_client_init) which leads to
    memory leak :

    unreferenced object 0xf6b0e680 (size 256):
    comm "swapper", pid 1, jiffies 4294670753
    backtrace:
    [] create_object+0x135/0x204
    [] kmemleak_alloc+0x26/0x4c
    [] kmem_cache_alloc+0x72/0xff
    [] seq_create_client1+0x22/0x160
    [] snd_seq_create_kernel_client+0x72/0xef
    [] snd_seq_oss_create_client+0x86/0x142
    [] alsa_seq_oss_init+0xf6/0x155
    [] do_one_initcall+0x4f/0x111
    [] kernel_init+0x115/0x166
    [] kernel_thread_helper+0x7/0x10
    [] 0xffffffff
    unreferenced object 0xf688a580 (size 64):
    comm "swapper", pid 1, jiffies 4294670753
    backtrace:
    [] create_object+0x135/0x204
    [] kmemleak_alloc+0x26/0x4c
    [] kmem_cache_alloc+0x72/0xff
    [] snd_seq_pool_new+0x1c/0xb8
    [] seq_create_client1+0x87/0x160
    [] snd_seq_create_kernel_client+0x72/0xef
    [] snd_seq_oss_create_client+0x86/0x142
    [] alsa_seq_oss_init+0xf6/0x155
    [] do_one_initcall+0x4f/0x111
    [] kernel_init+0x115/0x166
    [] kernel_thread_helper+0x7/0x10
    [] 0xffffffff
    unreferenced object 0xf6b0e480 (size 256):
    comm "swapper", pid 1, jiffies 4294670754
    backtrace:
    [] create_object+0x135/0x204
    [] kmemleak_alloc+0x26/0x4c
    [] kmem_cache_alloc+0x72/0xff
    [] snd_seq_create_port+0x51/0x21c
    [] snd_seq_ioctl_create_port+0x57/0x13c
    [] snd_seq_do_ioctl+0x4a/0x69
    [] snd_seq_kernel_client_ctl+0x33/0x49
    [] snd_seq_oss_create_client+0xf5/0x142
    [] alsa_seq_oss_init+0xf6/0x155
    [] do_one_initcall+0x4f/0x111
    [] kernel_init+0x115/0x166
    [] kernel_thread_helper+0x7/0x10
    [] 0xffffffff

    The correct order should be :

    System (snd_seq_system_client_init) should be initialized before
    OSS sequencer(alsa_seq_oss_init) which is equivalent to :

    1. insmod sound/core/seq/snd-seq-device.ko
    2. insmod sound/core/seq/snd-seq.ko
    3. insmod sound/core/seq/snd-seq-midi-event.ko
    4. insmod sound/core/seq/oss/snd-seq-oss.ko

    Including sound/core/seq/oss/Makefile after other seq modules
    fixes the ordering and memory leak.

    Signed-off-by: Jaswinder Singh Rajput
    Signed-off-by: Takashi Iwai

    Jaswinder Singh Rajput
     

15 Jul, 2009

3 commits