All of lore.kernel.org
 help / color / mirror / Atom feed
* RFC: snd_card_create() function
@ 2009-01-12 14:35 Takashi Iwai
  2009-01-12 14:42 ` James Courtier-Dutton
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Takashi Iwai @ 2009-01-12 14:35 UTC (permalink / raw)
  To: alsa-devel

Hi,

so far, we use snd_card_new() function to create a card instance.
A known problem regarding this API is that it doesn't return a proper
error code, thus the probe callback always returns -ENOMEM (or
whatever the driver defines) no matter which error occurred actually.
A typical case is the card slot conflict.  Even in such a case, it
returns -ENOMEM, which may mislead the user.

For fixing this situation, I'd like to convert from snd_card_new() to
a new function, snd_card_create():

int snd_card_create(int idx, const char *id,
		    struct module *module, int extra_size,
		    struct snd_card **card_ret);

and provides snd_card_new() as a wrapper with deprecated flag:

static inline __deprecated
struct snd_card *snd_card_new(int idx, const char *id,
			      struct module *module, int extra_size)
{
	struct snd_card *card;
	if (snd_card_create(idx, id, module, extra_size, &card) < 0)
		return NULL;
	return card;
}

The merit of creating a new function is that the older and out-of-tree
codes (like xfi) work without modification.  There is alternative
option, namely to use PTR_ERR() and keep the function as is.
But this has no advantage in practice -- it can't detect the old API
at build time, and it may Oops.

The preliminary patches are found in test/snd_card_new-err branch
of sound git tree:
  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git test/snd_card_new-err

If anyone finds problems with this, please let me know.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 14:35 RFC: snd_card_create() function Takashi Iwai
@ 2009-01-12 14:42 ` James Courtier-Dutton
  2009-01-12 14:47   ` Takashi Iwai
  2009-01-12 16:08 ` Krzysztof Helt
  2009-01-15 13:05 ` Takashi Iwai
  2 siblings, 1 reply; 10+ messages in thread
From: James Courtier-Dutton @ 2009-01-12 14:42 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

Sounds good to me.
One can keep the wrapper outside of the kernel, and only available in
alsa-driver for those out of tree people.

Kind Regards

James




2009/1/12 Takashi Iwai <tiwai@suse.de>:
> Hi,
>
> so far, we use snd_card_new() function to create a card instance.
> A known problem regarding this API is that it doesn't return a proper
> error code, thus the probe callback always returns -ENOMEM (or
> whatever the driver defines) no matter which error occurred actually.
> A typical case is the card slot conflict.  Even in such a case, it
> returns -ENOMEM, which may mislead the user.
>
> For fixing this situation, I'd like to convert from snd_card_new() to
> a new function, snd_card_create():
>
> int snd_card_create(int idx, const char *id,
>                    struct module *module, int extra_size,
>                    struct snd_card **card_ret);
>
> and provides snd_card_new() as a wrapper with deprecated flag:
>
> static inline __deprecated
> struct snd_card *snd_card_new(int idx, const char *id,
>                              struct module *module, int extra_size)
> {
>        struct snd_card *card;
>        if (snd_card_create(idx, id, module, extra_size, &card) < 0)
>                return NULL;
>        return card;
> }
>
> The merit of creating a new function is that the older and out-of-tree
> codes (like xfi) work without modification.  There is alternative
> option, namely to use PTR_ERR() and keep the function as is.
> But this has no advantage in practice -- it can't detect the old API
> at build time, and it may Oops.
>
> The preliminary patches are found in test/snd_card_new-err branch
> of sound git tree:
>  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git test/snd_card_new-err
>
> If anyone finds problems with this, please let me know.
>
>
> thanks,
>
> Takashi
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 14:42 ` James Courtier-Dutton
@ 2009-01-12 14:47   ` Takashi Iwai
  2009-01-12 15:06     ` James Courtier-Dutton
  0 siblings, 1 reply; 10+ messages in thread
From: Takashi Iwai @ 2009-01-12 14:47 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: alsa-devel

At Mon, 12 Jan 2009 14:42:06 +0000,
James Courtier-Dutton wrote:
> 
> Sounds good to me.
> One can keep the wrapper outside of the kernel, and only available in
> alsa-driver for those out of tree people.

Yes, that's good.
I think it'd be better to do that after one kernel-cycle later for a
softer landing, though.


thanks,

Takashi


> Kind Regards
> 
> James
> 
> 
> 
> 
> 2009/1/12 Takashi Iwai <tiwai@suse.de>:
> > Hi,
> >
> > so far, we use snd_card_new() function to create a card instance.
> > A known problem regarding this API is that it doesn't return a proper
> > error code, thus the probe callback always returns -ENOMEM (or
> > whatever the driver defines) no matter which error occurred actually.
> > A typical case is the card slot conflict.  Even in such a case, it
> > returns -ENOMEM, which may mislead the user.
> >
> > For fixing this situation, I'd like to convert from snd_card_new() to
> > a new function, snd_card_create():
> >
> > int snd_card_create(int idx, const char *id,
> >                    struct module *module, int extra_size,
> >                    struct snd_card **card_ret);
> >
> > and provides snd_card_new() as a wrapper with deprecated flag:
> >
> > static inline __deprecated
> > struct snd_card *snd_card_new(int idx, const char *id,
> >                              struct module *module, int extra_size)
> > {
> >        struct snd_card *card;
> >        if (snd_card_create(idx, id, module, extra_size, &card) < 0)
> >                return NULL;
> >        return card;
> > }
> >
> > The merit of creating a new function is that the older and out-of-tree
> > codes (like xfi) work without modification.  There is alternative
> > option, namely to use PTR_ERR() and keep the function as is.
> > But this has no advantage in practice -- it can't detect the old API
> > at build time, and it may Oops.
> >
> > The preliminary patches are found in test/snd_card_new-err branch
> > of sound git tree:
> >  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git test/snd_card_new-err
> >
> > If anyone finds problems with this, please let me know.
> >
> >
> > thanks,
> >
> > Takashi
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel@alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> >
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 14:47   ` Takashi Iwai
@ 2009-01-12 15:06     ` James Courtier-Dutton
  2009-01-12 15:25       ` Takashi Iwai
  0 siblings, 1 reply; 10+ messages in thread
From: James Courtier-Dutton @ 2009-01-12 15:06 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

2009/1/12 Takashi Iwai <tiwai@suse.de>:
> At Mon, 12 Jan 2009 14:42:06 +0000,
> James Courtier-Dutton wrote:
>>
>> Sounds good to me.
>> One can keep the wrapper outside of the kernel, and only available in
>> alsa-driver for those out of tree people.
>
> Yes, that's good.
> I think it'd be better to do that after one kernel-cycle later for a
> softer landing, though.
>

How soft do we need this?
The change is probably max of 3 lines of code per sound card that has
an out of tree driver.
The only one I am aware of is the xfi one. With the wrapper being more
than 3 lines of code being put into the kernel only to be removed
again seems a little un-necessary to me.
For internal kernel changes, I don't think we should care about out of
kernel drivers. None of the rest of the kernel developers go out of
their way for anything out-of-mainline.

Kind Regards

James

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 15:06     ` James Courtier-Dutton
@ 2009-01-12 15:25       ` Takashi Iwai
  2009-01-14 15:14         ` James Courtier-Dutton
  0 siblings, 1 reply; 10+ messages in thread
From: Takashi Iwai @ 2009-01-12 15:25 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: alsa-devel

At Mon, 12 Jan 2009 15:06:51 +0000,
James Courtier-Dutton wrote:
> 
> 2009/1/12 Takashi Iwai <tiwai@suse.de>:
> > At Mon, 12 Jan 2009 14:42:06 +0000,
> > James Courtier-Dutton wrote:
> >>
> >> Sounds good to me.
> >> One can keep the wrapper outside of the kernel, and only available in
> >> alsa-driver for those out of tree people.
> >
> > Yes, that's good.
> > I think it'd be better to do that after one kernel-cycle later for a
> > softer landing, though.
> >
> 
> How soft do we need this?

One kernel cycle is enough.

> The change is probably max of 3 lines of code per sound card that has
> an out of tree driver.
> The only one I am aware of is the xfi one. With the wrapper being more
> than 3 lines of code being put into the kernel only to be removed
> again seems a little un-necessary to me.
> For internal kernel changes, I don't think we should care about out of
> kernel drivers. None of the rest of the kernel developers go out of
> their way for anything out-of-mainline.

Well, my main concern isn't about out-of-kernel drivers like xfi, but
the drivers that will come from other trees.  The codes outside ALSA
tree, for example, V4L, can't be always controlled by us (suppose a
new V4L driver comes in for the next kernel).  And these are more or
less "mainline" development.

If you see the linux-next development, you'll find how the internal
API can be a pain among several tree merges.  A typical API change
(that has been often seen in driver-core area) introduces first a
wrapper while converting all in the present kernel, then kill it at
the next cycle.


Takashi

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 14:35 RFC: snd_card_create() function Takashi Iwai
  2009-01-12 14:42 ` James Courtier-Dutton
@ 2009-01-12 16:08 ` Krzysztof Helt
  2009-01-12 16:12   ` Takashi Iwai
  2009-01-15 13:05 ` Takashi Iwai
  2 siblings, 1 reply; 10+ messages in thread
From: Krzysztof Helt @ 2009-01-12 16:08 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

On Mon, 12 Jan 2009 15:35:19 +0100
Takashi Iwai <tiwai@suse.de> wrote:

> Hi,
> 
> so far, we use snd_card_new() function to create a card instance.
> A known problem regarding this API is that it doesn't return a proper
> error code, thus the probe callback always returns -ENOMEM (or
> whatever the driver defines) no matter which error occurred actually.
> A typical case is the card slot conflict.  Even in such a case, it
> returns -ENOMEM, which may mislead the user.

Another approach is PTR_ERR macro used already in the kernel
(see include/linux/err.h).
It encodes the error code in the returned pointer value. There
are already hndy macros/inlines to get this code, test error, etc.

Regards,
Krzysztof

----------------------------------------------------------------------
Speak Up. Angielski szybko i skutecznie. 3 miesiace nauki gratis.
Sprawdz. >> http://link.interia.pl/f2019

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 16:08 ` Krzysztof Helt
@ 2009-01-12 16:12   ` Takashi Iwai
  0 siblings, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2009-01-12 16:12 UTC (permalink / raw)
  To: Krzysztof Helt; +Cc: alsa-devel

At Mon, 12 Jan 2009 17:08:28 +0100,
Krzysztof Helt wrote:
> 
> On Mon, 12 Jan 2009 15:35:19 +0100
> Takashi Iwai <tiwai@suse.de> wrote:
> 
> > Hi,
> > 
> > so far, we use snd_card_new() function to create a card instance.
> > A known problem regarding this API is that it doesn't return a proper
> > error code, thus the probe callback always returns -ENOMEM (or
> > whatever the driver defines) no matter which error occurred actually.
> > A typical case is the card slot conflict.  Even in such a case, it
> > returns -ENOMEM, which may mislead the user.
> 
> Another approach is PTR_ERR macro used already in the kernel
> (see include/linux/err.h).
> It encodes the error code in the returned pointer value. There
> are already hndy macros/inlines to get this code, test error, etc.

Yep.  However, as I mentioned in the paragraph after the text above,
it gives you little advantage in this case.

If an error occurs, the new function returns a non-NULL value.  Since
the old caller side does only a NULL-check, it would accept the error
pointer as is, ended up an Oops.

More badly, this old-style return-value check can't be detected at the
compile time because the API (at least the function calling) is
unchanged.

So, PTR_ERR() is nice to be introduced at the first place but pretty
bad as a transition from a NULL/non-NULL API.


Takashi

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 15:25       ` Takashi Iwai
@ 2009-01-14 15:14         ` James Courtier-Dutton
  2009-01-14 15:31           ` Takashi Iwai
  0 siblings, 1 reply; 10+ messages in thread
From: James Courtier-Dutton @ 2009-01-14 15:14 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel, James Courtier-Dutton

Takashi Iwai wrote:
> At Mon, 12 Jan 2009 15:06:51 +0000,
> James Courtier-Dutton wrote:
>> 2009/1/12 Takashi Iwai <tiwai@suse.de>:
>>> At Mon, 12 Jan 2009 14:42:06 +0000,
>>> James Courtier-Dutton wrote:
>>>> Sounds good to me.
>>>> One can keep the wrapper outside of the kernel, and only available in
>>>> alsa-driver for those out of tree people.
>>> Yes, that's good.
>>> I think it'd be better to do that after one kernel-cycle later for a
>>> softer landing, though.
>>>
>> How soft do we need this?
> 
> One kernel cycle is enough.
> 
>> The change is probably max of 3 lines of code per sound card that has
>> an out of tree driver.
>> The only one I am aware of is the xfi one. With the wrapper being more
>> than 3 lines of code being put into the kernel only to be removed
>> again seems a little un-necessary to me.
>> For internal kernel changes, I don't think we should care about out of
>> kernel drivers. None of the rest of the kernel developers go out of
>> their way for anything out-of-mainline.
> 
> Well, my main concern isn't about out-of-kernel drivers like xfi, but
> the drivers that will come from other trees.  The codes outside ALSA
> tree, for example, V4L, can't be always controlled by us (suppose a
> new V4L driver comes in for the next kernel).  And these are more or
> less "mainline" development.
> 
> If you see the linux-next development, you'll find how the internal
> API can be a pain among several tree merges.  A typical API change
> (that has been often seen in driver-core area) introduces first a
> wrapper while converting all in the present kernel, then kill it at
> the next cycle.
> 

Ah! I did not think of V4L. Once cycle seems OK to me. I hope it creates
a warning message to the V4L developers, although, I don't see why you
cannot include a patch to V4L together with all the other alsa cards
drivers that would get into linux-next.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-14 15:14         ` James Courtier-Dutton
@ 2009-01-14 15:31           ` Takashi Iwai
  0 siblings, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2009-01-14 15:31 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: alsa-devel, James Courtier-Dutton

At Wed, 14 Jan 2009 15:14:54 +0000,
James Courtier-Dutton wrote:
> 
> Takashi Iwai wrote:
> > At Mon, 12 Jan 2009 15:06:51 +0000,
> > James Courtier-Dutton wrote:
> >> 2009/1/12 Takashi Iwai <tiwai@suse.de>:
> >>> At Mon, 12 Jan 2009 14:42:06 +0000,
> >>> James Courtier-Dutton wrote:
> >>>> Sounds good to me.
> >>>> One can keep the wrapper outside of the kernel, and only available in
> >>>> alsa-driver for those out of tree people.
> >>> Yes, that's good.
> >>> I think it'd be better to do that after one kernel-cycle later for a
> >>> softer landing, though.
> >>>
> >> How soft do we need this?
> > 
> > One kernel cycle is enough.
> > 
> >> The change is probably max of 3 lines of code per sound card that has
> >> an out of tree driver.
> >> The only one I am aware of is the xfi one. With the wrapper being more
> >> than 3 lines of code being put into the kernel only to be removed
> >> again seems a little un-necessary to me.
> >> For internal kernel changes, I don't think we should care about out of
> >> kernel drivers. None of the rest of the kernel developers go out of
> >> their way for anything out-of-mainline.
> > 
> > Well, my main concern isn't about out-of-kernel drivers like xfi, but
> > the drivers that will come from other trees.  The codes outside ALSA
> > tree, for example, V4L, can't be always controlled by us (suppose a
> > new V4L driver comes in for the next kernel).  And these are more or
> > less "mainline" development.
> > 
> > If you see the linux-next development, you'll find how the internal
> > API can be a pain among several tree merges.  A typical API change
> > (that has been often seen in driver-core area) introduces first a
> > wrapper while converting all in the present kernel, then kill it at
> > the next cycle.
> > 
> 
> Ah! I did not think of V4L. Once cycle seems OK to me. I hope it creates
> a warning message to the V4L developers, although, I don't see why you
> cannot include a patch to V4L together with all the other alsa cards
> drivers that would get into linux-next.

It's possible, but often not too easy if a new V4L driver is
introduced in their tree.  In that case, either we or they import
their/out patch.  This can be a mess once if the tree gets rebased or
a similar thing happens.

Of course,  I already patched the existing drivers (also found in usb 
gadget).  But any upcoming stuff can be hard to expect...


thanks,

Takashi

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: RFC: snd_card_create() function
  2009-01-12 14:35 RFC: snd_card_create() function Takashi Iwai
  2009-01-12 14:42 ` James Courtier-Dutton
  2009-01-12 16:08 ` Krzysztof Helt
@ 2009-01-15 13:05 ` Takashi Iwai
  2 siblings, 0 replies; 10+ messages in thread
From: Takashi Iwai @ 2009-01-15 13:05 UTC (permalink / raw)
  To: alsa-devel

At Mon, 12 Jan 2009 15:35:19 +0100,
I wrote:
> 
> Hi,
> 
> so far, we use snd_card_new() function to create a card instance.
> A known problem regarding this API is that it doesn't return a proper
> error code, thus the probe callback always returns -ENOMEM (or
> whatever the driver defines) no matter which error occurred actually.
> A typical case is the card slot conflict.  Even in such a case, it
> returns -ENOMEM, which may mislead the user.
> 
> For fixing this situation, I'd like to convert from snd_card_new() to
> a new function, snd_card_create():
> 
> int snd_card_create(int idx, const char *id,
> 		    struct module *module, int extra_size,
> 		    struct snd_card **card_ret);
> 
> and provides snd_card_new() as a wrapper with deprecated flag:
> 
> static inline __deprecated
> struct snd_card *snd_card_new(int idx, const char *id,
> 			      struct module *module, int extra_size)
> {
> 	struct snd_card *card;
> 	if (snd_card_create(idx, id, module, extra_size, &card) < 0)
> 		return NULL;
> 	return card;
> }
> 
> The merit of creating a new function is that the older and out-of-tree
> codes (like xfi) work without modification.  There is alternative
> option, namely to use PTR_ERR() and keep the function as is.
> But this has no advantage in practice -- it can't detect the old API
> at build time, and it may Oops.
> 
> The preliminary patches are found in test/snd_card_new-err branch
> of sound git tree:
>   git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git test/snd_card_new-err
> 
> If anyone finds problems with this, please let me know.

Since no big issues came up, I merged that branch to master branch.
Thanks for all your comments.


Takashi

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2009-01-15 13:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-12 14:35 RFC: snd_card_create() function Takashi Iwai
2009-01-12 14:42 ` James Courtier-Dutton
2009-01-12 14:47   ` Takashi Iwai
2009-01-12 15:06     ` James Courtier-Dutton
2009-01-12 15:25       ` Takashi Iwai
2009-01-14 15:14         ` James Courtier-Dutton
2009-01-14 15:31           ` Takashi Iwai
2009-01-12 16:08 ` Krzysztof Helt
2009-01-12 16:12   ` Takashi Iwai
2009-01-15 13:05 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.