Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 14:49:04 +0200,
Thierry Reding wrote:
> 
> On Thu, Aug 09, 2012 at 02:32:38PM +0200, Takashi Iwai wrote:
> > At Thu, 9 Aug 2012 12:34:30 +0200,
> > Thierry Reding wrote:
> > > 
> > > On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
> > > > At Thu, 9 Aug 2012 10:07:13 +0200,
> > > > Thierry Reding wrote:
> > > > > 
> > > > > On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > > > > > At Thu, 9 Aug 2012 09:36:42 +0200,
> > > > > > Thierry Reding wrote:
> > > > > > > 
> > > > > > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > > > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > > > > > Thierry Reding wrote:
> > > > > > > > > 
> > > > > > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > > > > > Thierry Reding wrote:
> > > > > > > > > > > 
> > > > > > > > > > > Recent changes to the firmware loading helpers cause 
> > > > > > > > > > > drivers to stall
> > > > > > > > > > > when firmware is loaded during the module_init() call. 
> > > > > > > > > > > The snd-hda-intel
> > > > > > > > > > > module requests firmware if the patch= parameter is used 
> > > > > > > > > > > to load a patch
> > > > > > > > > > > file. This patch works around the problem by deferring 
> > > > > > > > > > > the probe in such
> > > > > > > > > > > cases, which will cause the module to load successfully 
> > > > > > > > > > > and the driver
> > > > > > > > > > > binding to the device outside the module_init() call.
> > > > > > > > > > 
> > > > > > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > > > > > 
> > > > > > > > > > In anyway, I don't understand why such a change was 
> > > > > > > > > > allowed.  Most
> > > > > > > > > > drivers do call request_firmware() at the device probing 
> > > > > > > > > > time.
> > > > > > > > > > If this really has to be resolved in the driver side, it 
> > > > > > > > > > must be a bug
> > > > > > > > > > in the firmware loader core code.
> > > > > > > > > 
> > > > > > > > > A good explanation of the problem and subsequent discussion 
> > > > > > > > > can be found
> > > > > > > > > here:
> > > > > > > > > 
> > > > > > > > >   
> > > > > > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > > > > > 
> > > > > > > > Yeah, but it doesn't justify this ugly module option.
> > > > > > > > It's a simple bug.  Papering over it with this option doesn't 
> > > > > > > > fix
> > > > > > > > anything.
> > > > > > > 
> > > > > > > It's not an option, all it does is defer probing if and only if 
> > > > > > > the
> > > > > > > patch parameter was specified to make sure the firmware load won't
> > > > > > > stall. I realize that this may not be an optimal solution, but at 
> > > > > > > least
> > > > > > > it fixes the problem with no fallout.
> > > > > > 
> > > > > > Ah sorry, I misread the patch.
> > > > > > 
> > > > > > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > > > > > probing code was already split for vga_switcheroo support.
> > > > > 
> > > > > Yes, I saw that. But unless you actually use vga_switcheroo, the 
> > > > > second
> > > > > stage, azx_probe_continue(), will still be called from azx_probe() and
> > > > > therefore ultimately from module_init().
> > > > 
> > > > Yeah, but this could be easily delayed.  The split was already done,
> > > > so the next step would be to return after the first half at probe,
> > > > then call the second half later.
> > > > 
> > > > > Before coming up with this patch I actually did play around a bit with
> > > > > using the asynchronous firmware load functions but it turned out to be
> > > > > rather difficult to do so I opted for the easy way. The biggest 
> > > > > problem
> > > > > I faced was that since patch loading needs to be done very early on, a
> > > > > lot of the initialization would need to be done after .probe() and 
> > > > > many
> > > > > things could still fail, so cleaning up after errors would become
> > > > > increasingly difficult.
> > > > 
> > > > async probe is also on my TODO list, but it's deferred ;)
> > > > 
> > > > > > The point you added is the second stage.
> > > > > 
> > > > > I don't understand this sentence.
> > > > 
> > > > I meant that your patch added the check at the second-half probing
> > > > function (azx_probe_contine()).  That is, it could be already the
> > > > point triggered by vga_switcheroo handler, not via module_init any
> > > > longer.
> > > > 
> > > > So, after rethinking what you suggested, I wrote a quick patch below.
> > > > Could you check whether this works?
> > > 
> > > It oopses, though I can't quite tell where. I need to test some more
> > > later to see where it goes wrong.
> > 
> > Yeah, I tested it here and noticed, too.  As mentioned, the behavior
> > of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
> > modules, the deferred probe will 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 02:32:38PM +0200, Takashi Iwai wrote:
> At Thu, 9 Aug 2012 12:34:30 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
> > > At Thu, 9 Aug 2012 10:07:13 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > > > > At Thu, 9 Aug 2012 09:36:42 +0200,
> > > > > Thierry Reding wrote:
> > > > > > 
> > > > > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > > > > Thierry Reding wrote:
> > > > > > > > 
> > > > > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > > > > Thierry Reding wrote:
> > > > > > > > > > 
> > > > > > > > > > Recent changes to the firmware loading helpers cause 
> > > > > > > > > > drivers to stall
> > > > > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > > > > snd-hda-intel
> > > > > > > > > > module requests firmware if the patch= parameter is used to 
> > > > > > > > > > load a patch
> > > > > > > > > > file. This patch works around the problem by deferring the 
> > > > > > > > > > probe in such
> > > > > > > > > > cases, which will cause the module to load successfully and 
> > > > > > > > > > the driver
> > > > > > > > > > binding to the device outside the module_init() call.
> > > > > > > > > 
> > > > > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > > > > 
> > > > > > > > > In anyway, I don't understand why such a change was allowed.  
> > > > > > > > > Most
> > > > > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > > > > If this really has to be resolved in the driver side, it must 
> > > > > > > > > be a bug
> > > > > > > > > in the firmware loader core code.
> > > > > > > > 
> > > > > > > > A good explanation of the problem and subsequent discussion can 
> > > > > > > > be found
> > > > > > > > here:
> > > > > > > > 
> > > > > > > > 
> > > > > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > > > > 
> > > > > > > Yeah, but it doesn't justify this ugly module option.
> > > > > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > > > > anything.
> > > > > > 
> > > > > > It's not an option, all it does is defer probing if and only if the
> > > > > > patch parameter was specified to make sure the firmware load won't
> > > > > > stall. I realize that this may not be an optimal solution, but at 
> > > > > > least
> > > > > > it fixes the problem with no fallout.
> > > > > 
> > > > > Ah sorry, I misread the patch.
> > > > > 
> > > > > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > > > > probing code was already split for vga_switcheroo support.
> > > > 
> > > > Yes, I saw that. But unless you actually use vga_switcheroo, the second
> > > > stage, azx_probe_continue(), will still be called from azx_probe() and
> > > > therefore ultimately from module_init().
> > > 
> > > Yeah, but this could be easily delayed.  The split was already done,
> > > so the next step would be to return after the first half at probe,
> > > then call the second half later.
> > > 
> > > > Before coming up with this patch I actually did play around a bit with
> > > > using the asynchronous firmware load functions but it turned out to be
> > > > rather difficult to do so I opted for the easy way. The biggest problem
> > > > I faced was that since patch loading needs to be done very early on, a
> > > > lot of the initialization would need to be done after .probe() and many
> > > > things could still fail, so cleaning up after errors would become
> > > > increasingly difficult.
> > > 
> > > async probe is also on my TODO list, but it's deferred ;)
> > > 
> > > > > The point you added is the second stage.
> > > > 
> > > > I don't understand this sentence.
> > > 
> > > I meant that your patch added the check at the second-half probing
> > > function (azx_probe_contine()).  That is, it could be already the
> > > point triggered by vga_switcheroo handler, not via module_init any
> > > longer.
> > > 
> > > So, after rethinking what you suggested, I wrote a quick patch below.
> > > Could you check whether this works?
> > 
> > It oopses, though I can't quite tell where. I need to test some more
> > later to see where it goes wrong.
> 
> Yeah, I tested it here and noticed, too.  As mentioned, the behavior
> of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
> modules, the deferred probe will be never triggered (unless a new
> device is bound).

Yes, the idea is that probing is only retried after other drivers have
bound to other devices because otherwise nothing about any missing
resources can have changed. This however would indicate that deferred
probing is not the right solution here, after all we're not waiting for
another 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 12:34:30 +0200,
Thierry Reding wrote:
> 
> On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
> > At Thu, 9 Aug 2012 10:07:13 +0200,
> > Thierry Reding wrote:
> > > 
> > > On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > > > At Thu, 9 Aug 2012 09:36:42 +0200,
> > > > Thierry Reding wrote:
> > > > > 
> > > > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > > > Thierry Reding wrote:
> > > > > > > 
> > > > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > > > Thierry Reding wrote:
> > > > > > > > > 
> > > > > > > > > Recent changes to the firmware loading helpers cause drivers 
> > > > > > > > > to stall
> > > > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > > > snd-hda-intel
> > > > > > > > > module requests firmware if the patch= parameter is used to 
> > > > > > > > > load a patch
> > > > > > > > > file. This patch works around the problem by deferring the 
> > > > > > > > > probe in such
> > > > > > > > > cases, which will cause the module to load successfully and 
> > > > > > > > > the driver
> > > > > > > > > binding to the device outside the module_init() call.
> > > > > > > > 
> > > > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > > > 
> > > > > > > > In anyway, I don't understand why such a change was allowed.  
> > > > > > > > Most
> > > > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > > > If this really has to be resolved in the driver side, it must 
> > > > > > > > be a bug
> > > > > > > > in the firmware loader core code.
> > > > > > > 
> > > > > > > A good explanation of the problem and subsequent discussion can 
> > > > > > > be found
> > > > > > > here:
> > > > > > > 
> > > > > > >   
> > > > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > > > 
> > > > > > Yeah, but it doesn't justify this ugly module option.
> > > > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > > > anything.
> > > > > 
> > > > > It's not an option, all it does is defer probing if and only if the
> > > > > patch parameter was specified to make sure the firmware load won't
> > > > > stall. I realize that this may not be an optimal solution, but at 
> > > > > least
> > > > > it fixes the problem with no fallout.
> > > > 
> > > > Ah sorry, I misread the patch.
> > > > 
> > > > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > > > probing code was already split for vga_switcheroo support.
> > > 
> > > Yes, I saw that. But unless you actually use vga_switcheroo, the second
> > > stage, azx_probe_continue(), will still be called from azx_probe() and
> > > therefore ultimately from module_init().
> > 
> > Yeah, but this could be easily delayed.  The split was already done,
> > so the next step would be to return after the first half at probe,
> > then call the second half later.
> > 
> > > Before coming up with this patch I actually did play around a bit with
> > > using the asynchronous firmware load functions but it turned out to be
> > > rather difficult to do so I opted for the easy way. The biggest problem
> > > I faced was that since patch loading needs to be done very early on, a
> > > lot of the initialization would need to be done after .probe() and many
> > > things could still fail, so cleaning up after errors would become
> > > increasingly difficult.
> > 
> > async probe is also on my TODO list, but it's deferred ;)
> > 
> > > > The point you added is the second stage.
> > > 
> > > I don't understand this sentence.
> > 
> > I meant that your patch added the check at the second-half probing
> > function (azx_probe_contine()).  That is, it could be already the
> > point triggered by vga_switcheroo handler, not via module_init any
> > longer.
> > 
> > So, after rethinking what you suggested, I wrote a quick patch below.
> > Could you check whether this works?
> 
> It oopses, though I can't quite tell where. I need to test some more
> later to see where it goes wrong.

Yeah, I tested it here and noticed, too.  As mentioned, the behavior
of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
modules, the deferred probe will be never triggered (unless a new
device is bound).

Considering the problem again, it's currently an issue only for the
built-in sound driver, right?  AFAIK, request_firmware() works fine
for modules.  If so, a simple "fix" to avoid the unexpected behavior
is to make CONFIG_SND_HDA_PATCH_LOADER depending on CONFIG_SND_HDA=m.
It'd be simple enough for merging 3.6 kernel.

I almost finished writing the patch to use request_firmware_nowait()
version, but I'm afraid it's too intrusive for 3.6.  If disabling the
patch loader for the built-in driver is OK, I'd queue the
request_firmware_nowait() patches 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
> At Thu, 9 Aug 2012 10:07:13 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > > At Thu, 9 Aug 2012 09:36:42 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > > Thierry Reding wrote:
> > > > > > 
> > > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > > Thierry Reding wrote:
> > > > > > > > 
> > > > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > > > stall
> > > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > > snd-hda-intel
> > > > > > > > module requests firmware if the patch= parameter is used to 
> > > > > > > > load a patch
> > > > > > > > file. This patch works around the problem by deferring the 
> > > > > > > > probe in such
> > > > > > > > cases, which will cause the module to load successfully and the 
> > > > > > > > driver
> > > > > > > > binding to the device outside the module_init() call.
> > > > > > > 
> > > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > > 
> > > > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > > If this really has to be resolved in the driver side, it must be 
> > > > > > > a bug
> > > > > > > in the firmware loader core code.
> > > > > > 
> > > > > > A good explanation of the problem and subsequent discussion can be 
> > > > > > found
> > > > > > here:
> > > > > > 
> > > > > > 
> > > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > > 
> > > > > Yeah, but it doesn't justify this ugly module option.
> > > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > > anything.
> > > > 
> > > > It's not an option, all it does is defer probing if and only if the
> > > > patch parameter was specified to make sure the firmware load won't
> > > > stall. I realize that this may not be an optimal solution, but at least
> > > > it fixes the problem with no fallout.
> > > 
> > > Ah sorry, I misread the patch.
> > > 
> > > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > > probing code was already split for vga_switcheroo support.
> > 
> > Yes, I saw that. But unless you actually use vga_switcheroo, the second
> > stage, azx_probe_continue(), will still be called from azx_probe() and
> > therefore ultimately from module_init().
> 
> Yeah, but this could be easily delayed.  The split was already done,
> so the next step would be to return after the first half at probe,
> then call the second half later.
> 
> > Before coming up with this patch I actually did play around a bit with
> > using the asynchronous firmware load functions but it turned out to be
> > rather difficult to do so I opted for the easy way. The biggest problem
> > I faced was that since patch loading needs to be done very early on, a
> > lot of the initialization would need to be done after .probe() and many
> > things could still fail, so cleaning up after errors would become
> > increasingly difficult.
> 
> async probe is also on my TODO list, but it's deferred ;)
> 
> > > The point you added is the second stage.
> > 
> > I don't understand this sentence.
> 
> I meant that your patch added the check at the second-half probing
> function (azx_probe_contine()).  That is, it could be already the
> point triggered by vga_switcheroo handler, not via module_init any
> longer.
> 
> So, after rethinking what you suggested, I wrote a quick patch below.
> Could you check whether this works?

It oopses, though I can't quite tell where. I need to test some more
later to see where it goes wrong.

Thierry

> 
> 
> Takashi
> 
> ---
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index c8aced1..4e5839a 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -559,13 +559,17 @@ enum {
>   * VGA-switcher support
>   */
>  #ifdef SUPPORT_VGA_SWITCHEROO
> +#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
> +#else
> +#define use_vga_switcheroo(chip) 0
> +#endif
> +
> +#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
>  #define DELAYED_INIT_MARK
>  #define DELAYED_INITDATA_MARK
> -#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
>  #else
>  #define DELAYED_INIT_MARK__devinit
>  #define DELAYED_INITDATA_MARK__devinitdata
> -#define use_vga_switcheroo(chip) 0
>  #endif
>  
>  static char *driver_short_names[] DELAYED_INITDATA_MARK = {
> @@ -3154,6 +3158,20 @@ static int __devinit azx_probe(struct pci_dev *pci,
>   struct azx *chip;
>   int err;
>  
> +#ifdef CONFIG_SND_HDA_PATCH_LOADER
> + 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 09 Aug 2012 10:21:15 +0200,
Takashi Iwai wrote:
> 
> At Thu, 9 Aug 2012 10:07:13 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > > At Thu, 9 Aug 2012 09:36:42 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > > Thierry Reding wrote:
> > > > > > 
> > > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > > Thierry Reding wrote:
> > > > > > > > 
> > > > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > > > stall
> > > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > > snd-hda-intel
> > > > > > > > module requests firmware if the patch= parameter is used to 
> > > > > > > > load a patch
> > > > > > > > file. This patch works around the problem by deferring the 
> > > > > > > > probe in such
> > > > > > > > cases, which will cause the module to load successfully and the 
> > > > > > > > driver
> > > > > > > > binding to the device outside the module_init() call.
> > > > > > > 
> > > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > > 
> > > > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > > If this really has to be resolved in the driver side, it must be 
> > > > > > > a bug
> > > > > > > in the firmware loader core code.
> > > > > > 
> > > > > > A good explanation of the problem and subsequent discussion can be 
> > > > > > found
> > > > > > here:
> > > > > > 
> > > > > > 
> > > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > > 
> > > > > Yeah, but it doesn't justify this ugly module option.
> > > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > > anything.
> > > > 
> > > > It's not an option, all it does is defer probing if and only if the
> > > > patch parameter was specified to make sure the firmware load won't
> > > > stall. I realize that this may not be an optimal solution, but at least
> > > > it fixes the problem with no fallout.
> > > 
> > > Ah sorry, I misread the patch.
> > > 
> > > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > > probing code was already split for vga_switcheroo support.
> > 
> > Yes, I saw that. But unless you actually use vga_switcheroo, the second
> > stage, azx_probe_continue(), will still be called from azx_probe() and
> > therefore ultimately from module_init().
> 
> Yeah, but this could be easily delayed.  The split was already done,
> so the next step would be to return after the first half at probe,
> then call the second half later.
> 
> > Before coming up with this patch I actually did play around a bit with
> > using the asynchronous firmware load functions but it turned out to be
> > rather difficult to do so I opted for the easy way. The biggest problem
> > I faced was that since patch loading needs to be done very early on, a
> > lot of the initialization would need to be done after .probe() and many
> > things could still fail, so cleaning up after errors would become
> > increasingly difficult.
> 
> async probe is also on my TODO list, but it's deferred ;)
> 
> > > The point you added is the second stage.
> > 
> > I don't understand this sentence.
> 
> I meant that your patch added the check at the second-half probing
> function (azx_probe_contine()).  That is, it could be already the
> point triggered by vga_switcheroo handler, not via module_init any
> longer.
> 
> So, after rethinking what you suggested, I wrote a quick patch below.
> Could you check whether this works?

Obviously it won't work if the module is re-loaded manually.
The -EPROBE_DEFER would work only at boot time, as it seems.


Takashi
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 10:07:13 +0200,
Thierry Reding wrote:
> 
> On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> > At Thu, 9 Aug 2012 09:36:42 +0200,
> > Thierry Reding wrote:
> > > 
> > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > Thierry Reding wrote:
> > > > > 
> > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > Thierry Reding wrote:
> > > > > > > 
> > > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > > stall
> > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > snd-hda-intel
> > > > > > > module requests firmware if the patch= parameter is used to load 
> > > > > > > a patch
> > > > > > > file. This patch works around the problem by deferring the probe 
> > > > > > > in such
> > > > > > > cases, which will cause the module to load successfully and the 
> > > > > > > driver
> > > > > > > binding to the device outside the module_init() call.
> > > > > > 
> > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > 
> > > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > If this really has to be resolved in the driver side, it must be a 
> > > > > > bug
> > > > > > in the firmware loader core code.
> > > > > 
> > > > > A good explanation of the problem and subsequent discussion can be 
> > > > > found
> > > > > here:
> > > > > 
> > > > >   
> > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > 
> > > > Yeah, but it doesn't justify this ugly module option.
> > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > anything.
> > > 
> > > It's not an option, all it does is defer probing if and only if the
> > > patch parameter was specified to make sure the firmware load won't
> > > stall. I realize that this may not be an optimal solution, but at least
> > > it fixes the problem with no fallout.
> > 
> > Ah sorry, I misread the patch.
> > 
> > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > probing code was already split for vga_switcheroo support.
> 
> Yes, I saw that. But unless you actually use vga_switcheroo, the second
> stage, azx_probe_continue(), will still be called from azx_probe() and
> therefore ultimately from module_init().

Yeah, but this could be easily delayed.  The split was already done,
so the next step would be to return after the first half at probe,
then call the second half later.

> Before coming up with this patch I actually did play around a bit with
> using the asynchronous firmware load functions but it turned out to be
> rather difficult to do so I opted for the easy way. The biggest problem
> I faced was that since patch loading needs to be done very early on, a
> lot of the initialization would need to be done after .probe() and many
> things could still fail, so cleaning up after errors would become
> increasingly difficult.

async probe is also on my TODO list, but it's deferred ;)

> > The point you added is the second stage.
> 
> I don't understand this sentence.

I meant that your patch added the check at the second-half probing
function (azx_probe_contine()).  That is, it could be already the
point triggered by vga_switcheroo handler, not via module_init any
longer.

So, after rethinking what you suggested, I wrote a quick patch below.
Could you check whether this works?


Takashi

---
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index c8aced1..4e5839a 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -559,13 +559,17 @@ enum {
  * VGA-switcher support
  */
 #ifdef SUPPORT_VGA_SWITCHEROO
+#define use_vga_switcheroo(chip)   ((chip)->use_vga_switcheroo)
+#else
+#define use_vga_switcheroo(chip)   0
+#endif
+
+#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
 #define DELAYED_INIT_MARK
 #define DELAYED_INITDATA_MARK
-#define use_vga_switcheroo(chip)   ((chip)->use_vga_switcheroo)
 #else
 #define DELAYED_INIT_MARK  __devinit
 #define DELAYED_INITDATA_MARK  __devinitdata
-#define use_vga_switcheroo(chip)   0
 #endif
 
 static char *driver_short_names[] DELAYED_INITDATA_MARK = {
@@ -3154,6 +3158,20 @@ static int __devinit azx_probe(struct pci_dev *pci,
struct azx *chip;
int err;
 
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
+   /* delayed probe */
+   card = pci_get_drvdata(pci);
+   if (card) {
+   struct azx *chip = card->private_data;
+   if (chip->disabled)
+   return 0; /* will be loaded via vga_switcheroo */
+   err = azx_probe_continue(chip);
+   if (err < 0)
+   goto out_free;
+   return 0;
+   }
+#endif
+
  

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
> At Thu, 9 Aug 2012 09:36:42 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > Thierry Reding wrote:
> > > > > > 
> > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > stall
> > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > snd-hda-intel
> > > > > > module requests firmware if the patch= parameter is used to load a 
> > > > > > patch
> > > > > > file. This patch works around the problem by deferring the probe in 
> > > > > > such
> > > > > > cases, which will cause the module to load successfully and the 
> > > > > > driver
> > > > > > binding to the device outside the module_init() call.
> > > > > 
> > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > 
> > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > drivers do call request_firmware() at the device probing time.
> > > > > If this really has to be resolved in the driver side, it must be a bug
> > > > > in the firmware loader core code.
> > > > 
> > > > A good explanation of the problem and subsequent discussion can be found
> > > > here:
> > > > 
> > > > 
> > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > 
> > > Yeah, but it doesn't justify this ugly module option.
> > > It's a simple bug.  Papering over it with this option doesn't fix
> > > anything.
> > 
> > It's not an option, all it does is defer probing if and only if the
> > patch parameter was specified to make sure the firmware load won't
> > stall. I realize that this may not be an optimal solution, but at least
> > it fixes the problem with no fallout.
> 
> Ah sorry, I misread the patch.
> 
> Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> probing code was already split for vga_switcheroo support.

Yes, I saw that. But unless you actually use vga_switcheroo, the second
stage, azx_probe_continue(), will still be called from azx_probe() and
therefore ultimately from module_init().

Before coming up with this patch I actually did play around a bit with
using the asynchronous firmware load functions but it turned out to be
rather difficult to do so I opted for the easy way. The biggest problem
I faced was that since patch loading needs to be done very early on, a
lot of the initialization would need to be done after .probe() and many
things could still fail, so cleaning up after errors would become
increasingly difficult.

> The point you added is the second stage.

I don't understand this sentence.

Thierry


pgp8EbInaoPo2.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:50:57AM +0200, Takashi Iwai wrote:
> At Thu, 09 Aug 2012 09:42:48 +0200,
> Takashi Iwai wrote:
> > 
> > At Thu, 9 Aug 2012 09:36:42 +0200,
> > Thierry Reding wrote:
> > > 
> > > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > > Thierry Reding wrote:
> > > > > 
> > > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > > Thierry Reding wrote:
> > > > > > > 
> > > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > > stall
> > > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > > snd-hda-intel
> > > > > > > module requests firmware if the patch= parameter is used to load 
> > > > > > > a patch
> > > > > > > file. This patch works around the problem by deferring the probe 
> > > > > > > in such
> > > > > > > cases, which will cause the module to load successfully and the 
> > > > > > > driver
> > > > > > > binding to the device outside the module_init() call.
> > > > > > 
> > > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > > 
> > > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > > drivers do call request_firmware() at the device probing time.
> > > > > > If this really has to be resolved in the driver side, it must be a 
> > > > > > bug
> > > > > > in the firmware loader core code.
> > > > > 
> > > > > A good explanation of the problem and subsequent discussion can be 
> > > > > found
> > > > > here:
> > > > > 
> > > > >   
> > > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > > 
> > > > Yeah, but it doesn't justify this ugly module option.
> > > > It's a simple bug.  Papering over it with this option doesn't fix
> > > > anything.
> > > 
> > > It's not an option, all it does is defer probing if and only if the
> > > patch parameter was specified to make sure the firmware load won't
> > > stall. I realize that this may not be an optimal solution, but at least
> > > it fixes the problem with no fallout.
> > 
> > Ah sorry, I misread the patch.
> > 
> > Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> > probing code was already split for vga_switcheroo support.  The point
> > you added is the second stage.
> 
> ... and the patch won't work properly if there are multiple HD-audio 
> controllers.  Hmm.

Right... the deferred probe would mess up the matching done by the
static dev variable. So maybe a proper implementation that uses
asynchronous firmware loading is inevitable.

Thierry


pgpk0jusaI1rK.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 09 Aug 2012 09:42:48 +0200,
Takashi Iwai wrote:
> 
> At Thu, 9 Aug 2012 09:36:42 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > > At Thu, 9 Aug 2012 09:08:13 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > > Thierry Reding wrote:
> > > > > > 
> > > > > > Recent changes to the firmware loading helpers cause drivers to 
> > > > > > stall
> > > > > > when firmware is loaded during the module_init() call. The 
> > > > > > snd-hda-intel
> > > > > > module requests firmware if the patch= parameter is used to load a 
> > > > > > patch
> > > > > > file. This patch works around the problem by deferring the probe in 
> > > > > > such
> > > > > > cases, which will cause the module to load successfully and the 
> > > > > > driver
> > > > > > binding to the device outside the module_init() call.
> > > > > 
> > > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > > 
> > > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > > drivers do call request_firmware() at the device probing time.
> > > > > If this really has to be resolved in the driver side, it must be a bug
> > > > > in the firmware loader core code.
> > > > 
> > > > A good explanation of the problem and subsequent discussion can be found
> > > > here:
> > > > 
> > > > 
> > > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > > 
> > > Yeah, but it doesn't justify this ugly module option.
> > > It's a simple bug.  Papering over it with this option doesn't fix
> > > anything.
> > 
> > It's not an option, all it does is defer probing if and only if the
> > patch parameter was specified to make sure the firmware load won't
> > stall. I realize that this may not be an optimal solution, but at least
> > it fixes the problem with no fallout.
> 
> Ah sorry, I misread the patch.
> 
> Then it shouldn't be checked at that point.  Since 3.5 kernel, the
> probing code was already split for vga_switcheroo support.  The point
> you added is the second stage.

... and the patch won't work properly if there are multiple HD-audio 
controllers.  Hmm.


Takashi

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 09:36:42 +0200,
Thierry Reding wrote:
> 
> On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> > At Thu, 9 Aug 2012 09:08:13 +0200,
> > Thierry Reding wrote:
> > > 
> > > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > > Thierry Reding wrote:
> > > > > 
> > > > > Recent changes to the firmware loading helpers cause drivers to stall
> > > > > when firmware is loaded during the module_init() call. The 
> > > > > snd-hda-intel
> > > > > module requests firmware if the patch= parameter is used to load a 
> > > > > patch
> > > > > file. This patch works around the problem by deferring the probe in 
> > > > > such
> > > > > cases, which will cause the module to load successfully and the driver
> > > > > binding to the device outside the module_init() call.
> > > > 
> > > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > > 
> > > > In anyway, I don't understand why such a change was allowed.  Most
> > > > drivers do call request_firmware() at the device probing time.
> > > > If this really has to be resolved in the driver side, it must be a bug
> > > > in the firmware loader core code.
> > > 
> > > A good explanation of the problem and subsequent discussion can be found
> > > here:
> > > 
> > >   
> > > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> > 
> > Yeah, but it doesn't justify this ugly module option.
> > It's a simple bug.  Papering over it with this option doesn't fix
> > anything.
> 
> It's not an option, all it does is defer probing if and only if the
> patch parameter was specified to make sure the firmware load won't
> stall. I realize that this may not be an optimal solution, but at least
> it fixes the problem with no fallout.

Ah sorry, I misread the patch.

Then it shouldn't be checked at that point.  Since 3.5 kernel, the
probing code was already split for vga_switcheroo support.  The point
you added is the second stage.


Takashi
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
> At Thu, 9 Aug 2012 09:08:13 +0200,
> Thierry Reding wrote:
> > 
> > On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > > At Thu,  9 Aug 2012 08:45:23 +0200,
> > > Thierry Reding wrote:
> > > > 
> > > > Recent changes to the firmware loading helpers cause drivers to stall
> > > > when firmware is loaded during the module_init() call. The snd-hda-intel
> > > > module requests firmware if the patch= parameter is used to load a patch
> > > > file. This patch works around the problem by deferring the probe in such
> > > > cases, which will cause the module to load successfully and the driver
> > > > binding to the device outside the module_init() call.
> > > 
> > > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > > 
> > > In anyway, I don't understand why such a change was allowed.  Most
> > > drivers do call request_firmware() at the device probing time.
> > > If this really has to be resolved in the driver side, it must be a bug
> > > in the firmware loader core code.
> > 
> > A good explanation of the problem and subsequent discussion can be found
> > here:
> > 
> > 
> > http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
> 
> Yeah, but it doesn't justify this ugly module option.
> It's a simple bug.  Papering over it with this option doesn't fix
> anything.

It's not an option, all it does is defer probing if and only if the
patch parameter was specified to make sure the firmware load won't
stall. I realize that this may not be an optimal solution, but at least
it fixes the problem with no fallout.

A proper fix would require a larger rewrite because it would entail
using the asynchronous firmware load operations. That in turn would
require the initialization to be split into several stages.

Thierry


pgpKBr6h5feRG.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 09:08:13 +0200,
Thierry Reding wrote:
> 
> On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> > At Thu,  9 Aug 2012 08:45:23 +0200,
> > Thierry Reding wrote:
> > > 
> > > Recent changes to the firmware loading helpers cause drivers to stall
> > > when firmware is loaded during the module_init() call. The snd-hda-intel
> > > module requests firmware if the patch= parameter is used to load a patch
> > > file. This patch works around the problem by deferring the probe in such
> > > cases, which will cause the module to load successfully and the driver
> > > binding to the device outside the module_init() call.
> > 
> > Is the "recent" change meant 3.6 kernel, or in linux-next?
> > 
> > In anyway, I don't understand why such a change was allowed.  Most
> > drivers do call request_firmware() at the device probing time.
> > If this really has to be resolved in the driver side, it must be a bug
> > in the firmware loader core code.
> 
> A good explanation of the problem and subsequent discussion can be found
> here:
> 
>   
> http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Yeah, but it doesn't justify this ugly module option.
It's a simple bug.  Papering over it with this option doesn't fix
anything.


Takashi
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
> At Thu,  9 Aug 2012 08:45:23 +0200,
> Thierry Reding wrote:
> > 
> > Recent changes to the firmware loading helpers cause drivers to stall
> > when firmware is loaded during the module_init() call. The snd-hda-intel
> > module requests firmware if the patch= parameter is used to load a patch
> > file. This patch works around the problem by deferring the probe in such
> > cases, which will cause the module to load successfully and the driver
> > binding to the device outside the module_init() call.
> 
> Is the "recent" change meant 3.6 kernel, or in linux-next?
> 
> In anyway, I don't understand why such a change was allowed.  Most
> drivers do call request_firmware() at the device probing time.
> If this really has to be resolved in the driver side, it must be a bug
> in the firmware loader core code.

A good explanation of the problem and subsequent discussion can be found
here:


http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Thierry


pgpjtEZRoIpvj.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu,  9 Aug 2012 08:45:23 +0200,
Thierry Reding wrote:
> 
> Recent changes to the firmware loading helpers cause drivers to stall
> when firmware is loaded during the module_init() call. The snd-hda-intel
> module requests firmware if the patch= parameter is used to load a patch
> file. This patch works around the problem by deferring the probe in such
> cases, which will cause the module to load successfully and the driver
> binding to the device outside the module_init() call.

Is the "recent" change meant 3.6 kernel, or in linux-next?

In anyway, I don't understand why such a change was allowed.  Most
drivers do call request_firmware() at the device probing time.
If this really has to be resolved in the driver side, it must be a bug
in the firmware loader core code.


thanks,

Takashi

> 
> Signed-off-by: Thierry Reding 
> ---
>  sound/pci/hda/hda_intel.c | 11 +++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index c8aced1..296616e 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -69,6 +69,7 @@ static int probe_only[SNDRV_CARDS];
>  static bool single_cmd;
>  static int enable_msi = -1;
>  #ifdef CONFIG_SND_HDA_PATCH_LOADER
> +static bool deferred[SNDRV_CARDS];
>  static char *patch[SNDRV_CARDS];
>  #endif
>  #ifdef CONFIG_SND_HDA_INPUT_BEEP
> @@ -3156,6 +3157,16 @@ static int __devinit azx_probe(struct pci_dev *pci,
>  
>   if (dev >= SNDRV_CARDS)
>   return -ENODEV;
> +
> +#ifdef CONFIG_SND_HDA_PATCH_LOADER
> + if (patch[dev] && *patch[dev] && !deferred[dev]) {
> + snd_printk(KERN_ERR SFX "deferring probe for patch %s\n",
> +patch[dev]);
> + deferred[dev] = true;
> + return -EPROBE_DEFER;
> + }
> +#endif
> +
>   if (!enable[dev]) {
>   dev++;
>   return -ENOENT;
> -- 
> 1.7.11.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu,  9 Aug 2012 08:45:23 +0200,
Thierry Reding wrote:
 
 Recent changes to the firmware loading helpers cause drivers to stall
 when firmware is loaded during the module_init() call. The snd-hda-intel
 module requests firmware if the patch= parameter is used to load a patch
 file. This patch works around the problem by deferring the probe in such
 cases, which will cause the module to load successfully and the driver
 binding to the device outside the module_init() call.

Is the recent change meant 3.6 kernel, or in linux-next?

In anyway, I don't understand why such a change was allowed.  Most
drivers do call request_firmware() at the device probing time.
If this really has to be resolved in the driver side, it must be a bug
in the firmware loader core code.


thanks,

Takashi

 
 Signed-off-by: Thierry Reding thierry.red...@avionic-design.de
 ---
  sound/pci/hda/hda_intel.c | 11 +++
  1 file changed, 11 insertions(+)
 
 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
 index c8aced1..296616e 100644
 --- a/sound/pci/hda/hda_intel.c
 +++ b/sound/pci/hda/hda_intel.c
 @@ -69,6 +69,7 @@ static int probe_only[SNDRV_CARDS];
  static bool single_cmd;
  static int enable_msi = -1;
  #ifdef CONFIG_SND_HDA_PATCH_LOADER
 +static bool deferred[SNDRV_CARDS];
  static char *patch[SNDRV_CARDS];
  #endif
  #ifdef CONFIG_SND_HDA_INPUT_BEEP
 @@ -3156,6 +3157,16 @@ static int __devinit azx_probe(struct pci_dev *pci,
  
   if (dev = SNDRV_CARDS)
   return -ENODEV;
 +
 +#ifdef CONFIG_SND_HDA_PATCH_LOADER
 + if (patch[dev]  *patch[dev]  !deferred[dev]) {
 + snd_printk(KERN_ERR SFX deferring probe for patch %s\n,
 +patch[dev]);
 + deferred[dev] = true;
 + return -EPROBE_DEFER;
 + }
 +#endif
 +
   if (!enable[dev]) {
   dev++;
   return -ENOENT;
 -- 
 1.7.11.4
 
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
 At Thu,  9 Aug 2012 08:45:23 +0200,
 Thierry Reding wrote:
  
  Recent changes to the firmware loading helpers cause drivers to stall
  when firmware is loaded during the module_init() call. The snd-hda-intel
  module requests firmware if the patch= parameter is used to load a patch
  file. This patch works around the problem by deferring the probe in such
  cases, which will cause the module to load successfully and the driver
  binding to the device outside the module_init() call.
 
 Is the recent change meant 3.6 kernel, or in linux-next?
 
 In anyway, I don't understand why such a change was allowed.  Most
 drivers do call request_firmware() at the device probing time.
 If this really has to be resolved in the driver side, it must be a bug
 in the firmware loader core code.

A good explanation of the problem and subsequent discussion can be found
here:


http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Thierry


pgpjtEZRoIpvj.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 09:08:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
  At Thu,  9 Aug 2012 08:45:23 +0200,
  Thierry Reding wrote:
   
   Recent changes to the firmware loading helpers cause drivers to stall
   when firmware is loaded during the module_init() call. The snd-hda-intel
   module requests firmware if the patch= parameter is used to load a patch
   file. This patch works around the problem by deferring the probe in such
   cases, which will cause the module to load successfully and the driver
   binding to the device outside the module_init() call.
  
  Is the recent change meant 3.6 kernel, or in linux-next?
  
  In anyway, I don't understand why such a change was allowed.  Most
  drivers do call request_firmware() at the device probing time.
  If this really has to be resolved in the driver side, it must be a bug
  in the firmware loader core code.
 
 A good explanation of the problem and subsequent discussion can be found
 here:
 
   
 http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Yeah, but it doesn't justify this ugly module option.
It's a simple bug.  Papering over it with this option doesn't fix
anything.


Takashi
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 09:08:13 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
   At Thu,  9 Aug 2012 08:45:23 +0200,
   Thierry Reding wrote:

Recent changes to the firmware loading helpers cause drivers to stall
when firmware is loaded during the module_init() call. The snd-hda-intel
module requests firmware if the patch= parameter is used to load a patch
file. This patch works around the problem by deferring the probe in such
cases, which will cause the module to load successfully and the driver
binding to the device outside the module_init() call.
   
   Is the recent change meant 3.6 kernel, or in linux-next?
   
   In anyway, I don't understand why such a change was allowed.  Most
   drivers do call request_firmware() at the device probing time.
   If this really has to be resolved in the driver side, it must be a bug
   in the firmware loader core code.
  
  A good explanation of the problem and subsequent discussion can be found
  here:
  
  
  http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
 
 Yeah, but it doesn't justify this ugly module option.
 It's a simple bug.  Papering over it with this option doesn't fix
 anything.

It's not an option, all it does is defer probing if and only if the
patch parameter was specified to make sure the firmware load won't
stall. I realize that this may not be an optimal solution, but at least
it fixes the problem with no fallout.

A proper fix would require a larger rewrite because it would entail
using the asynchronous firmware load operations. That in turn would
require the initialization to be split into several stages.

Thierry


pgpKBr6h5feRG.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 09:36:42 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 09:08:13 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
At Thu,  9 Aug 2012 08:45:23 +0200,
Thierry Reding wrote:
 
 Recent changes to the firmware loading helpers cause drivers to stall
 when firmware is loaded during the module_init() call. The 
 snd-hda-intel
 module requests firmware if the patch= parameter is used to load a 
 patch
 file. This patch works around the problem by deferring the probe in 
 such
 cases, which will cause the module to load successfully and the driver
 binding to the device outside the module_init() call.

Is the recent change meant 3.6 kernel, or in linux-next?

In anyway, I don't understand why such a change was allowed.  Most
drivers do call request_firmware() at the device probing time.
If this really has to be resolved in the driver side, it must be a bug
in the firmware loader core code.
   
   A good explanation of the problem and subsequent discussion can be found
   here:
   
 
   http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
  
  Yeah, but it doesn't justify this ugly module option.
  It's a simple bug.  Papering over it with this option doesn't fix
  anything.
 
 It's not an option, all it does is defer probing if and only if the
 patch parameter was specified to make sure the firmware load won't
 stall. I realize that this may not be an optimal solution, but at least
 it fixes the problem with no fallout.

Ah sorry, I misread the patch.

Then it shouldn't be checked at that point.  Since 3.5 kernel, the
probing code was already split for vga_switcheroo support.  The point
you added is the second stage.


Takashi
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 09 Aug 2012 09:42:48 +0200,
Takashi Iwai wrote:
 
 At Thu, 9 Aug 2012 09:36:42 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 09:08:13 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
 At Thu,  9 Aug 2012 08:45:23 +0200,
 Thierry Reding wrote:
  
  Recent changes to the firmware loading helpers cause drivers to 
  stall
  when firmware is loaded during the module_init() call. The 
  snd-hda-intel
  module requests firmware if the patch= parameter is used to load a 
  patch
  file. This patch works around the problem by deferring the probe in 
  such
  cases, which will cause the module to load successfully and the 
  driver
  binding to the device outside the module_init() call.
 
 Is the recent change meant 3.6 kernel, or in linux-next?
 
 In anyway, I don't understand why such a change was allowed.  Most
 drivers do call request_firmware() at the device probing time.
 If this really has to be resolved in the driver side, it must be a bug
 in the firmware loader core code.

A good explanation of the problem and subsequent discussion can be found
here:


http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
   
   Yeah, but it doesn't justify this ugly module option.
   It's a simple bug.  Papering over it with this option doesn't fix
   anything.
  
  It's not an option, all it does is defer probing if and only if the
  patch parameter was specified to make sure the firmware load won't
  stall. I realize that this may not be an optimal solution, but at least
  it fixes the problem with no fallout.
 
 Ah sorry, I misread the patch.
 
 Then it shouldn't be checked at that point.  Since 3.5 kernel, the
 probing code was already split for vga_switcheroo support.  The point
 you added is the second stage.

... and the patch won't work properly if there are multiple HD-audio 
controllers.  Hmm.


Takashi

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:50:57AM +0200, Takashi Iwai wrote:
 At Thu, 09 Aug 2012 09:42:48 +0200,
 Takashi Iwai wrote:
  
  At Thu, 9 Aug 2012 09:36:42 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
At Thu, 9 Aug 2012 09:08:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
  At Thu,  9 Aug 2012 08:45:23 +0200,
  Thierry Reding wrote:
   
   Recent changes to the firmware loading helpers cause drivers to 
   stall
   when firmware is loaded during the module_init() call. The 
   snd-hda-intel
   module requests firmware if the patch= parameter is used to load 
   a patch
   file. This patch works around the problem by deferring the probe 
   in such
   cases, which will cause the module to load successfully and the 
   driver
   binding to the device outside the module_init() call.
  
  Is the recent change meant 3.6 kernel, or in linux-next?
  
  In anyway, I don't understand why such a change was allowed.  Most
  drivers do call request_firmware() at the device probing time.
  If this really has to be resolved in the driver side, it must be a 
  bug
  in the firmware loader core code.
 
 A good explanation of the problem and subsequent discussion can be 
 found
 here:
 
   
 http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Yeah, but it doesn't justify this ugly module option.
It's a simple bug.  Papering over it with this option doesn't fix
anything.
   
   It's not an option, all it does is defer probing if and only if the
   patch parameter was specified to make sure the firmware load won't
   stall. I realize that this may not be an optimal solution, but at least
   it fixes the problem with no fallout.
  
  Ah sorry, I misread the patch.
  
  Then it shouldn't be checked at that point.  Since 3.5 kernel, the
  probing code was already split for vga_switcheroo support.  The point
  you added is the second stage.
 
 ... and the patch won't work properly if there are multiple HD-audio 
 controllers.  Hmm.

Right... the deferred probe would mess up the matching done by the
static dev variable. So maybe a proper implementation that uses
asynchronous firmware loading is inevitable.

Thierry


pgpk0jusaI1rK.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 09:36:42 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 09:08:13 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
 At Thu,  9 Aug 2012 08:45:23 +0200,
 Thierry Reding wrote:
  
  Recent changes to the firmware loading helpers cause drivers to 
  stall
  when firmware is loaded during the module_init() call. The 
  snd-hda-intel
  module requests firmware if the patch= parameter is used to load a 
  patch
  file. This patch works around the problem by deferring the probe in 
  such
  cases, which will cause the module to load successfully and the 
  driver
  binding to the device outside the module_init() call.
 
 Is the recent change meant 3.6 kernel, or in linux-next?
 
 In anyway, I don't understand why such a change was allowed.  Most
 drivers do call request_firmware() at the device probing time.
 If this really has to be resolved in the driver side, it must be a bug
 in the firmware loader core code.

A good explanation of the problem and subsequent discussion can be found
here:


http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
   
   Yeah, but it doesn't justify this ugly module option.
   It's a simple bug.  Papering over it with this option doesn't fix
   anything.
  
  It's not an option, all it does is defer probing if and only if the
  patch parameter was specified to make sure the firmware load won't
  stall. I realize that this may not be an optimal solution, but at least
  it fixes the problem with no fallout.
 
 Ah sorry, I misread the patch.
 
 Then it shouldn't be checked at that point.  Since 3.5 kernel, the
 probing code was already split for vga_switcheroo support.

Yes, I saw that. But unless you actually use vga_switcheroo, the second
stage, azx_probe_continue(), will still be called from azx_probe() and
therefore ultimately from module_init().

Before coming up with this patch I actually did play around a bit with
using the asynchronous firmware load functions but it turned out to be
rather difficult to do so I opted for the easy way. The biggest problem
I faced was that since patch loading needs to be done very early on, a
lot of the initialization would need to be done after .probe() and many
things could still fail, so cleaning up after errors would become
increasingly difficult.

 The point you added is the second stage.

I don't understand this sentence.

Thierry


pgp8EbInaoPo2.pgp
Description: PGP signature


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 10:07:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 09:36:42 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
At Thu, 9 Aug 2012 09:08:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
  At Thu,  9 Aug 2012 08:45:23 +0200,
  Thierry Reding wrote:
   
   Recent changes to the firmware loading helpers cause drivers to 
   stall
   when firmware is loaded during the module_init() call. The 
   snd-hda-intel
   module requests firmware if the patch= parameter is used to load 
   a patch
   file. This patch works around the problem by deferring the probe 
   in such
   cases, which will cause the module to load successfully and the 
   driver
   binding to the device outside the module_init() call.
  
  Is the recent change meant 3.6 kernel, or in linux-next?
  
  In anyway, I don't understand why such a change was allowed.  Most
  drivers do call request_firmware() at the device probing time.
  If this really has to be resolved in the driver side, it must be a 
  bug
  in the firmware loader core code.
 
 A good explanation of the problem and subsequent discussion can be 
 found
 here:
 
   
 http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Yeah, but it doesn't justify this ugly module option.
It's a simple bug.  Papering over it with this option doesn't fix
anything.
   
   It's not an option, all it does is defer probing if and only if the
   patch parameter was specified to make sure the firmware load won't
   stall. I realize that this may not be an optimal solution, but at least
   it fixes the problem with no fallout.
  
  Ah sorry, I misread the patch.
  
  Then it shouldn't be checked at that point.  Since 3.5 kernel, the
  probing code was already split for vga_switcheroo support.
 
 Yes, I saw that. But unless you actually use vga_switcheroo, the second
 stage, azx_probe_continue(), will still be called from azx_probe() and
 therefore ultimately from module_init().

Yeah, but this could be easily delayed.  The split was already done,
so the next step would be to return after the first half at probe,
then call the second half later.

 Before coming up with this patch I actually did play around a bit with
 using the asynchronous firmware load functions but it turned out to be
 rather difficult to do so I opted for the easy way. The biggest problem
 I faced was that since patch loading needs to be done very early on, a
 lot of the initialization would need to be done after .probe() and many
 things could still fail, so cleaning up after errors would become
 increasingly difficult.

async probe is also on my TODO list, but it's deferred ;)

  The point you added is the second stage.
 
 I don't understand this sentence.

I meant that your patch added the check at the second-half probing
function (azx_probe_contine()).  That is, it could be already the
point triggered by vga_switcheroo handler, not via module_init any
longer.

So, after rethinking what you suggested, I wrote a quick patch below.
Could you check whether this works?


Takashi

---
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index c8aced1..4e5839a 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -559,13 +559,17 @@ enum {
  * VGA-switcher support
  */
 #ifdef SUPPORT_VGA_SWITCHEROO
+#define use_vga_switcheroo(chip)   ((chip)-use_vga_switcheroo)
+#else
+#define use_vga_switcheroo(chip)   0
+#endif
+
+#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
 #define DELAYED_INIT_MARK
 #define DELAYED_INITDATA_MARK
-#define use_vga_switcheroo(chip)   ((chip)-use_vga_switcheroo)
 #else
 #define DELAYED_INIT_MARK  __devinit
 #define DELAYED_INITDATA_MARK  __devinitdata
-#define use_vga_switcheroo(chip)   0
 #endif
 
 static char *driver_short_names[] DELAYED_INITDATA_MARK = {
@@ -3154,6 +3158,20 @@ static int __devinit azx_probe(struct pci_dev *pci,
struct azx *chip;
int err;
 
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
+   /* delayed probe */
+   card = pci_get_drvdata(pci);
+   if (card) {
+   struct azx *chip = card-private_data;
+   if (chip-disabled)
+   return 0; /* will be loaded via vga_switcheroo */
+   err = azx_probe_continue(chip);
+   if (err  0)
+   goto out_free;
+   return 0;
+   }
+#endif
+
if (dev = SNDRV_CARDS)
return -ENODEV;
if (!enable[dev]) {
@@ -3175,19 +3193,28 @@ static int __devinit azx_probe(struct pci_dev *pci,
goto out_free;
card-private_data = chip;
 
+#ifndef CONFIG_SND_HDA_PATCH_LOADER
+  

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 09 Aug 2012 10:21:15 +0200,
Takashi Iwai wrote:
 
 At Thu, 9 Aug 2012 10:07:13 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 09:36:42 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 09:08:13 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
   At Thu,  9 Aug 2012 08:45:23 +0200,
   Thierry Reding wrote:

Recent changes to the firmware loading helpers cause drivers to 
stall
when firmware is loaded during the module_init() call. The 
snd-hda-intel
module requests firmware if the patch= parameter is used to 
load a patch
file. This patch works around the problem by deferring the 
probe in such
cases, which will cause the module to load successfully and the 
driver
binding to the device outside the module_init() call.
   
   Is the recent change meant 3.6 kernel, or in linux-next?
   
   In anyway, I don't understand why such a change was allowed.  Most
   drivers do call request_firmware() at the device probing time.
   If this really has to be resolved in the driver side, it must be 
   a bug
   in the firmware loader core code.
  
  A good explanation of the problem and subsequent discussion can be 
  found
  here:
  
  
  http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
 
 Yeah, but it doesn't justify this ugly module option.
 It's a simple bug.  Papering over it with this option doesn't fix
 anything.

It's not an option, all it does is defer probing if and only if the
patch parameter was specified to make sure the firmware load won't
stall. I realize that this may not be an optimal solution, but at least
it fixes the problem with no fallout.
   
   Ah sorry, I misread the patch.
   
   Then it shouldn't be checked at that point.  Since 3.5 kernel, the
   probing code was already split for vga_switcheroo support.
  
  Yes, I saw that. But unless you actually use vga_switcheroo, the second
  stage, azx_probe_continue(), will still be called from azx_probe() and
  therefore ultimately from module_init().
 
 Yeah, but this could be easily delayed.  The split was already done,
 so the next step would be to return after the first half at probe,
 then call the second half later.
 
  Before coming up with this patch I actually did play around a bit with
  using the asynchronous firmware load functions but it turned out to be
  rather difficult to do so I opted for the easy way. The biggest problem
  I faced was that since patch loading needs to be done very early on, a
  lot of the initialization would need to be done after .probe() and many
  things could still fail, so cleaning up after errors would become
  increasingly difficult.
 
 async probe is also on my TODO list, but it's deferred ;)
 
   The point you added is the second stage.
  
  I don't understand this sentence.
 
 I meant that your patch added the check at the second-half probing
 function (azx_probe_contine()).  That is, it could be already the
 point triggered by vga_switcheroo handler, not via module_init any
 longer.
 
 So, after rethinking what you suggested, I wrote a quick patch below.
 Could you check whether this works?

Obviously it won't work if the module is re-loaded manually.
The -EPROBE_DEFER would work only at boot time, as it seems.


Takashi
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 10:07:13 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 09:36:42 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 09:08:13 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
   At Thu,  9 Aug 2012 08:45:23 +0200,
   Thierry Reding wrote:

Recent changes to the firmware loading helpers cause drivers to 
stall
when firmware is loaded during the module_init() call. The 
snd-hda-intel
module requests firmware if the patch= parameter is used to 
load a patch
file. This patch works around the problem by deferring the 
probe in such
cases, which will cause the module to load successfully and the 
driver
binding to the device outside the module_init() call.
   
   Is the recent change meant 3.6 kernel, or in linux-next?
   
   In anyway, I don't understand why such a change was allowed.  Most
   drivers do call request_firmware() at the device probing time.
   If this really has to be resolved in the driver side, it must be 
   a bug
   in the firmware loader core code.
  
  A good explanation of the problem and subsequent discussion can be 
  found
  here:
  
  
  http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
 
 Yeah, but it doesn't justify this ugly module option.
 It's a simple bug.  Papering over it with this option doesn't fix
 anything.

It's not an option, all it does is defer probing if and only if the
patch parameter was specified to make sure the firmware load won't
stall. I realize that this may not be an optimal solution, but at least
it fixes the problem with no fallout.
   
   Ah sorry, I misread the patch.
   
   Then it shouldn't be checked at that point.  Since 3.5 kernel, the
   probing code was already split for vga_switcheroo support.
  
  Yes, I saw that. But unless you actually use vga_switcheroo, the second
  stage, azx_probe_continue(), will still be called from azx_probe() and
  therefore ultimately from module_init().
 
 Yeah, but this could be easily delayed.  The split was already done,
 so the next step would be to return after the first half at probe,
 then call the second half later.
 
  Before coming up with this patch I actually did play around a bit with
  using the asynchronous firmware load functions but it turned out to be
  rather difficult to do so I opted for the easy way. The biggest problem
  I faced was that since patch loading needs to be done very early on, a
  lot of the initialization would need to be done after .probe() and many
  things could still fail, so cleaning up after errors would become
  increasingly difficult.
 
 async probe is also on my TODO list, but it's deferred ;)
 
   The point you added is the second stage.
  
  I don't understand this sentence.
 
 I meant that your patch added the check at the second-half probing
 function (azx_probe_contine()).  That is, it could be already the
 point triggered by vga_switcheroo handler, not via module_init any
 longer.
 
 So, after rethinking what you suggested, I wrote a quick patch below.
 Could you check whether this works?

It oopses, though I can't quite tell where. I need to test some more
later to see where it goes wrong.

Thierry

 
 
 Takashi
 
 ---
 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
 index c8aced1..4e5839a 100644
 --- a/sound/pci/hda/hda_intel.c
 +++ b/sound/pci/hda/hda_intel.c
 @@ -559,13 +559,17 @@ enum {
   * VGA-switcher support
   */
  #ifdef SUPPORT_VGA_SWITCHEROO
 +#define use_vga_switcheroo(chip) ((chip)-use_vga_switcheroo)
 +#else
 +#define use_vga_switcheroo(chip) 0
 +#endif
 +
 +#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
  #define DELAYED_INIT_MARK
  #define DELAYED_INITDATA_MARK
 -#define use_vga_switcheroo(chip) ((chip)-use_vga_switcheroo)
  #else
  #define DELAYED_INIT_MARK__devinit
  #define DELAYED_INITDATA_MARK__devinitdata
 -#define use_vga_switcheroo(chip) 0
  #endif
  
  static char *driver_short_names[] DELAYED_INITDATA_MARK = {
 @@ -3154,6 +3158,20 @@ static int __devinit azx_probe(struct pci_dev *pci,
   struct azx *chip;
   int err;
  
 +#ifdef CONFIG_SND_HDA_PATCH_LOADER
 + /* delayed probe */
 + card = pci_get_drvdata(pci);
 + if (card) {
 + struct azx *chip = card-private_data;
 + if (chip-disabled)
 + return 0; /* will be loaded via vga_switcheroo */
 + err = azx_probe_continue(chip);
 + if (err  0)
 + goto out_free;
 + return 0;
 + }
 +#endif
 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 12:34:30 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 10:07:13 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
At Thu, 9 Aug 2012 09:36:42 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 09:08:13 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
At Thu,  9 Aug 2012 08:45:23 +0200,
Thierry Reding wrote:
 
 Recent changes to the firmware loading helpers cause drivers 
 to stall
 when firmware is loaded during the module_init() call. The 
 snd-hda-intel
 module requests firmware if the patch= parameter is used to 
 load a patch
 file. This patch works around the problem by deferring the 
 probe in such
 cases, which will cause the module to load successfully and 
 the driver
 binding to the device outside the module_init() call.

Is the recent change meant 3.6 kernel, or in linux-next?

In anyway, I don't understand why such a change was allowed.  
Most
drivers do call request_firmware() at the device probing time.
If this really has to be resolved in the driver side, it must 
be a bug
in the firmware loader core code.
   
   A good explanation of the problem and subsequent discussion can 
   be found
   here:
   
 
   http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
  
  Yeah, but it doesn't justify this ugly module option.
  It's a simple bug.  Papering over it with this option doesn't fix
  anything.
 
 It's not an option, all it does is defer probing if and only if the
 patch parameter was specified to make sure the firmware load won't
 stall. I realize that this may not be an optimal solution, but at 
 least
 it fixes the problem with no fallout.

Ah sorry, I misread the patch.

Then it shouldn't be checked at that point.  Since 3.5 kernel, the
probing code was already split for vga_switcheroo support.
   
   Yes, I saw that. But unless you actually use vga_switcheroo, the second
   stage, azx_probe_continue(), will still be called from azx_probe() and
   therefore ultimately from module_init().
  
  Yeah, but this could be easily delayed.  The split was already done,
  so the next step would be to return after the first half at probe,
  then call the second half later.
  
   Before coming up with this patch I actually did play around a bit with
   using the asynchronous firmware load functions but it turned out to be
   rather difficult to do so I opted for the easy way. The biggest problem
   I faced was that since patch loading needs to be done very early on, a
   lot of the initialization would need to be done after .probe() and many
   things could still fail, so cleaning up after errors would become
   increasingly difficult.
  
  async probe is also on my TODO list, but it's deferred ;)
  
The point you added is the second stage.
   
   I don't understand this sentence.
  
  I meant that your patch added the check at the second-half probing
  function (azx_probe_contine()).  That is, it could be already the
  point triggered by vga_switcheroo handler, not via module_init any
  longer.
  
  So, after rethinking what you suggested, I wrote a quick patch below.
  Could you check whether this works?
 
 It oopses, though I can't quite tell where. I need to test some more
 later to see where it goes wrong.

Yeah, I tested it here and noticed, too.  As mentioned, the behavior
of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
modules, the deferred probe will be never triggered (unless a new
device is bound).

Considering the problem again, it's currently an issue only for the
built-in sound driver, right?  AFAIK, request_firmware() works fine
for modules.  If so, a simple fix to avoid the unexpected behavior
is to make CONFIG_SND_HDA_PATCH_LOADER depending on CONFIG_SND_HDA=m.
It'd be simple enough for merging 3.6 kernel.

I almost finished writing the patch to use request_firmware_nowait()
version, but I'm afraid it's too intrusive for 3.6.  If disabling the
patch loader for the built-in driver is OK, I'd queue the
request_firmware_nowait() patches to 3.7 queue.


Takashi
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Thierry Reding
On Thu, Aug 09, 2012 at 02:32:38PM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 12:34:30 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 10:07:13 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
 At Thu, 9 Aug 2012 09:36:42 +0200,
 Thierry Reding wrote:
  
  On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
   At Thu, 9 Aug 2012 09:08:13 +0200,
   Thierry Reding wrote:

On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
 At Thu,  9 Aug 2012 08:45:23 +0200,
 Thierry Reding wrote:
  
  Recent changes to the firmware loading helpers cause 
  drivers to stall
  when firmware is loaded during the module_init() call. The 
  snd-hda-intel
  module requests firmware if the patch= parameter is used to 
  load a patch
  file. This patch works around the problem by deferring the 
  probe in such
  cases, which will cause the module to load successfully and 
  the driver
  binding to the device outside the module_init() call.
 
 Is the recent change meant 3.6 kernel, or in linux-next?
 
 In anyway, I don't understand why such a change was allowed.  
 Most
 drivers do call request_firmware() at the device probing time.
 If this really has to be resolved in the driver side, it must 
 be a bug
 in the firmware loader core code.

A good explanation of the problem and subsequent discussion can 
be found
here:


http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975
   
   Yeah, but it doesn't justify this ugly module option.
   It's a simple bug.  Papering over it with this option doesn't fix
   anything.
  
  It's not an option, all it does is defer probing if and only if the
  patch parameter was specified to make sure the firmware load won't
  stall. I realize that this may not be an optimal solution, but at 
  least
  it fixes the problem with no fallout.
 
 Ah sorry, I misread the patch.
 
 Then it shouldn't be checked at that point.  Since 3.5 kernel, the
 probing code was already split for vga_switcheroo support.

Yes, I saw that. But unless you actually use vga_switcheroo, the second
stage, azx_probe_continue(), will still be called from azx_probe() and
therefore ultimately from module_init().
   
   Yeah, but this could be easily delayed.  The split was already done,
   so the next step would be to return after the first half at probe,
   then call the second half later.
   
Before coming up with this patch I actually did play around a bit with
using the asynchronous firmware load functions but it turned out to be
rather difficult to do so I opted for the easy way. The biggest problem
I faced was that since patch loading needs to be done very early on, a
lot of the initialization would need to be done after .probe() and many
things could still fail, so cleaning up after errors would become
increasingly difficult.
   
   async probe is also on my TODO list, but it's deferred ;)
   
 The point you added is the second stage.

I don't understand this sentence.
   
   I meant that your patch added the check at the second-half probing
   function (azx_probe_contine()).  That is, it could be already the
   point triggered by vga_switcheroo handler, not via module_init any
   longer.
   
   So, after rethinking what you suggested, I wrote a quick patch below.
   Could you check whether this works?
  
  It oopses, though I can't quite tell where. I need to test some more
  later to see where it goes wrong.
 
 Yeah, I tested it here and noticed, too.  As mentioned, the behavior
 of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
 modules, the deferred probe will be never triggered (unless a new
 device is bound).

Yes, the idea is that probing is only retried after other drivers have
bound to other devices because otherwise nothing about any missing
resources can have changed. This however would indicate that deferred
probing is not the right solution here, after all we're not waiting for
another resource to become available. Something like delayed work might
be better suited.

Well, asynchronous firmware load is actually the right solution, delayed
work just might be a better workaround. =)

For completeness I should say that I've been using deferred probing with
modules quite successfully on another platform, so it is not a general
problem. Rather as you said, it is only triggered if another module is
loaded after the deferral.

 Considering the problem again, it's currently an issue only for the
 built-in sound driver, right?  AFAIK, 

Re: [PATCH] ALSA: hda - Defer probe when loading patch firmware

2012-08-09 Thread Takashi Iwai
At Thu, 9 Aug 2012 14:49:04 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 02:32:38PM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 12:34:30 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 10:21:15AM +0200, Takashi Iwai wrote:
At Thu, 9 Aug 2012 10:07:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 09:42:48AM +0200, Takashi Iwai wrote:
  At Thu, 9 Aug 2012 09:36:42 +0200,
  Thierry Reding wrote:
   
   On Thu, Aug 09, 2012 at 09:31:30AM +0200, Takashi Iwai wrote:
At Thu, 9 Aug 2012 09:08:13 +0200,
Thierry Reding wrote:
 
 On Thu, Aug 09, 2012 at 08:57:13AM +0200, Takashi Iwai wrote:
  At Thu,  9 Aug 2012 08:45:23 +0200,
  Thierry Reding wrote:
   
   Recent changes to the firmware loading helpers cause 
   drivers to stall
   when firmware is loaded during the module_init() call. 
   The snd-hda-intel
   module requests firmware if the patch= parameter is used 
   to load a patch
   file. This patch works around the problem by deferring 
   the probe in such
   cases, which will cause the module to load successfully 
   and the driver
   binding to the device outside the module_init() call.
  
  Is the recent change meant 3.6 kernel, or in linux-next?
  
  In anyway, I don't understand why such a change was 
  allowed.  Most
  drivers do call request_firmware() at the device probing 
  time.
  If this really has to be resolved in the driver side, it 
  must be a bug
  in the firmware loader core code.
 
 A good explanation of the problem and subsequent discussion 
 can be found
 here:
 
   
 http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/49975

Yeah, but it doesn't justify this ugly module option.
It's a simple bug.  Papering over it with this option doesn't 
fix
anything.
   
   It's not an option, all it does is defer probing if and only if 
   the
   patch parameter was specified to make sure the firmware load won't
   stall. I realize that this may not be an optimal solution, but at 
   least
   it fixes the problem with no fallout.
  
  Ah sorry, I misread the patch.
  
  Then it shouldn't be checked at that point.  Since 3.5 kernel, the
  probing code was already split for vga_switcheroo support.
 
 Yes, I saw that. But unless you actually use vga_switcheroo, the 
 second
 stage, azx_probe_continue(), will still be called from azx_probe() and
 therefore ultimately from module_init().

Yeah, but this could be easily delayed.  The split was already done,
so the next step would be to return after the first half at probe,
then call the second half later.

 Before coming up with this patch I actually did play around a bit with
 using the asynchronous firmware load functions but it turned out to be
 rather difficult to do so I opted for the easy way. The biggest 
 problem
 I faced was that since patch loading needs to be done very early on, a
 lot of the initialization would need to be done after .probe() and 
 many
 things could still fail, so cleaning up after errors would become
 increasingly difficult.

async probe is also on my TODO list, but it's deferred ;)

  The point you added is the second stage.
 
 I don't understand this sentence.

I meant that your patch added the check at the second-half probing
function (azx_probe_contine()).  That is, it could be already the
point triggered by vga_switcheroo handler, not via module_init any
longer.

So, after rethinking what you suggested, I wrote a quick patch below.
Could you check whether this works?
   
   It oopses, though I can't quite tell where. I need to test some more
   later to see where it goes wrong.
  
  Yeah, I tested it here and noticed, too.  As mentioned, the behavior
  of -EPROBE_DEFER is somehow flaky.  For example, when it's used for
  modules, the deferred probe will be never triggered (unless a new
  device is bound).
 
 Yes, the idea is that probing is only retried after other drivers have
 bound to other devices because otherwise nothing about any missing
 resources can have changed. This however would indicate that deferred
 probing is not the right solution here, after all we're not waiting for
 another resource to become available. Something like delayed work might
 be better suited.
 
 Well, asynchronous firmware load is actually the right solution, delayed
 work just might be a better workaround. =)
 
 For completeness I should say that I've been using deferred probing with
 modules quite successfully on another platform, so it is not a