[ 3.8.y.z extended stable ] Patch "ALSA: seq-oss: Initialize MIDI clients asynchronously" has been added to staging queue
Takashi Iwai
tiwai at suse.de
Tue Jul 30 05:49:04 UTC 2013
At Mon, 29 Jul 2013 10:32:01 -0700,
Kamal Mostafa wrote:
>
> On Mon, 2013-07-29 at 16:21 +0200, Takashi Iwai wrote:
> > At Thu, 25 Jul 2013 12:29:00 -0700,
> > Kamal Mostafa wrote:
> > >
> > > This is a note to let you know that I have just added a patch titled
> > >
> > > ALSA: seq-oss: Initialize MIDI clients asynchronously
> > >
> > > to the linux-3.8.y-queue branch of the 3.8.y.z extended stable tree
> > > which can be found at:
> > >
> > > http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.8.y-queue
> > >
> > > This patch is scheduled to be released in version 3.8.13.6.
> > >
> > > If you, or anyone else, feels it should not be added to this tree, please
> > > reply to this email.
> >
> > This patch isn't needed for 3.8.x unless someone actually hits the
> > problem. The problem was reported first for 3.10 kernel.
>
>
> Hi Takashi-
>
> This one looks to me like a good fix for 3.8 anyway -- is there a reason
> why it specifically shouldn't go into 3.8.y-stable?
Because there is no problem to fix in 3.8 kernel :)
Takashi
> Per your request, I have dropped it from the linux-3.8.y-queue, but I'd
> be happy to re-apply it if you change your mind. :-)
>
> Thanks,
>
> -Kamal
>
>
>
> > > ------
> > >
> > > >From 2e602e4007d29e182ac090df7d0c9fb72018c35f Mon Sep 17 00:00:00 2001
> > > From: Takashi Iwai <tiwai at suse.de>
> > > Date: Tue, 16 Jul 2013 12:17:49 +0200
> > > Subject: ALSA: seq-oss: Initialize MIDI clients asynchronously
> > >
> > > commit 256ca9c3ad5013ff8a8f165e5a82fab437628c8e upstream.
> > >
> > > 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 <pmhahn at pmhahn.de>
> > > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > > Signed-off-by: Kamal Mostafa <kamal at canonical.com>
> > > ---
> > > sound/core/seq/oss/seq_oss_init.c | 16 +++++++++++++---
> > > sound/core/seq/oss/seq_oss_midi.c | 2 +-
> > > 2 files changed, 14 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c
> > > index e3cb46f..b3f39b5 100644
> > > --- a/sound/core/seq/oss/seq_oss_init.c
> > > +++ b/sound/core/seq/oss/seq_oss_init.c
> > > @@ -31,6 +31,7 @@
> > > #include <linux/export.h>
> > > #include <linux/moduleparam.h>
> > > #include <linux/slab.h>
> > > +#include <linux/workqueue.h>
> > >
> > > /*
> > > * common variables
> > > @@ -60,6 +61,14 @@ static void free_devinfo(void *private);
> > > #define call_ctl(type,rec) snd_seq_kernel_client_ctl(system_client, type, rec)
> > >
> > >
> > > +/* call snd_seq_oss_midi_lookup_ports() asynchronously */
> > > +static void async_call_lookup_ports(struct work_struct *work)
> > > +{
> > > + snd_seq_oss_midi_lookup_ports(system_client);
> > > +}
> > > +
> > > +static DECLARE_WORK(async_lookup_work, async_call_lookup_ports);
> > > +
> > > /*
> > > * create sequencer client for OSS sequencer
> > > */
> > > @@ -85,9 +94,6 @@ snd_seq_oss_create_client(void)
> > > system_client = rc;
> > > debug_printk(("new client = %d\n", rc));
> > >
> > > - /* look up midi devices */
> > > - snd_seq_oss_midi_lookup_ports(system_client);
> > > -
> > > /* create annoucement receiver port */
> > > memset(port, 0, sizeof(*port));
> > > strcpy(port->name, "Receiver");
> > > @@ -115,6 +121,9 @@ snd_seq_oss_create_client(void)
> > > }
> > > rc = 0;
> > >
> > > + /* look up midi devices */
> > > + schedule_work(&async_lookup_work);
> > > +
> > > __error:
> > > kfree(port);
> > > return rc;
> > > @@ -160,6 +169,7 @@ receive_announce(struct snd_seq_event *ev, int direct, void *private, int atomic
> > > int
> > > snd_seq_oss_delete_client(void)
> > > {
> > > + cancel_work_sync(&async_lookup_work);
> > > if (system_client >= 0)
> > > snd_seq_delete_kernel_client(system_client);
> > >
> > > diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c
> > > index 677dc84..862d8489 100644
> > > --- a/sound/core/seq/oss/seq_oss_midi.c
> > > +++ b/sound/core/seq/oss/seq_oss_midi.c
> > > @@ -72,7 +72,7 @@ static int send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev,
> > > * look up the existing ports
> > > * this looks a very exhausting job.
> > > */
> > > -int __init
> > > +int
> > > snd_seq_oss_midi_lookup_ports(int client)
> > > {
> > > struct snd_seq_client_info *clinfo;
> > > --
> > > 1.8.1.2
> > >
> >
>
More information about the kernel-team
mailing list