* [PATCH 2/2] ALSA: pcmtest: Don't use static storage to track per device data
2023-07-07 7:50 [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Uwe Kleine-König
@ 2023-07-07 7:50 ` Uwe Kleine-König
2023-07-07 13:51 ` Ivan Orlov
2023-07-07 13:49 ` [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Ivan Orlov
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Uwe Kleine-König @ 2023-07-07 7:50 UTC (permalink / raw)
To: Ivan Orlov, Jaroslav Kysela, Takashi Iwai; +Cc: alsa-devel, kernel
While there is probably only ever a single instance of such a pcmtst
device, it's still bad style to use a static variable to store per
device data. Make use of platform_get_drvdata() and
platform_set_drvdata() which fixes a data corruption if there should be
two or more such devices (or this driver is used as a template for
another driver).
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
sound/drivers/pcmtest.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/sound/drivers/pcmtest.c b/sound/drivers/pcmtest.c
index 1fff85feaf82..291e7fe47893 100644
--- a/sound/drivers/pcmtest.c
+++ b/sound/drivers/pcmtest.c
@@ -110,8 +110,6 @@ struct pcmtst_buf_iter {
struct timer_list timer_instance;
};
-static struct pcmtst *pcmtst;
-
static struct snd_pcm_hardware snd_pcmtst_hw = {
.info = (SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@@ -552,6 +550,7 @@ static int snd_pcmtst_create(struct snd_card *card, struct platform_device *pdev
static int pcmtst_probe(struct platform_device *pdev)
{
struct snd_card *card;
+ struct pcmtst *pcmtst;
int err;
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
@@ -573,11 +572,15 @@ static int pcmtst_probe(struct platform_device *pdev)
if (err < 0)
return err;
+ platform_set_drvdata(pdev, pcmtst);
+
return 0;
}
-static void pdev_remove(struct platform_device *dev)
+static void pdev_remove(struct platform_device *pdev)
{
+ struct pcmtst *pcmtst = platform_get_drvdata(pdev);
+
snd_pcmtst_free(pcmtst);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 2/2] ALSA: pcmtest: Don't use static storage to track per device data
2023-07-07 7:50 ` [PATCH 2/2] ALSA: pcmtest: Don't use static storage to track per device data Uwe Kleine-König
@ 2023-07-07 13:51 ` Ivan Orlov
0 siblings, 0 replies; 6+ messages in thread
From: Ivan Orlov @ 2023-07-07 13:51 UTC (permalink / raw)
To: Uwe Kleine-König, Jaroslav Kysela, Takashi Iwai; +Cc: alsa-devel, kernel
On 7/7/23 11:50, Uwe Kleine-König wrote:
> While there is probably only ever a single instance of such a pcmtst
> device, it's still bad style to use a static variable to store per
> device data. Make use of platform_get_drvdata() and
> platform_set_drvdata() which fixes a data corruption if there should be
> two or more such devices (or this driver is used as a template for
> another driver).
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> sound/drivers/pcmtest.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/sound/drivers/pcmtest.c b/sound/drivers/pcmtest.c
> index 1fff85feaf82..291e7fe47893 100644
> --- a/sound/drivers/pcmtest.c
> +++ b/sound/drivers/pcmtest.c
> @@ -110,8 +110,6 @@ struct pcmtst_buf_iter {
> struct timer_list timer_instance;
> };
>
> -static struct pcmtst *pcmtst;
> -
> static struct snd_pcm_hardware snd_pcmtst_hw = {
> .info = (SNDRV_PCM_INFO_INTERLEAVED |
> SNDRV_PCM_INFO_BLOCK_TRANSFER |
> @@ -552,6 +550,7 @@ static int snd_pcmtst_create(struct snd_card *card, struct platform_device *pdev
> static int pcmtst_probe(struct platform_device *pdev)
> {
> struct snd_card *card;
> + struct pcmtst *pcmtst;
> int err;
>
> err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
> @@ -573,11 +572,15 @@ static int pcmtst_probe(struct platform_device *pdev)
> if (err < 0)
> return err;
>
> + platform_set_drvdata(pdev, pcmtst);
> +
> return 0;
> }
>
> -static void pdev_remove(struct platform_device *dev)
> +static void pdev_remove(struct platform_device *pdev)
> {
> + struct pcmtst *pcmtst = platform_get_drvdata(pdev);
> +
> snd_pcmtst_free(pcmtst);
> }
>
Also looks good.
Acked-by: Ivan Orlov <ivan.orlov0322@gmail.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void
2023-07-07 7:50 [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Uwe Kleine-König
2023-07-07 7:50 ` [PATCH 2/2] ALSA: pcmtest: Don't use static storage to track per device data Uwe Kleine-König
@ 2023-07-07 13:49 ` Ivan Orlov
2023-07-07 13:52 ` Ivan Orlov
2023-07-10 6:55 ` Takashi Iwai
3 siblings, 0 replies; 6+ messages in thread
From: Ivan Orlov @ 2023-07-07 13:49 UTC (permalink / raw)
To: Uwe Kleine-König, Jaroslav Kysela, Takashi Iwai; +Cc: alsa-devel, kernel
On 7/7/23 11:50, Uwe Kleine-König wrote:
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is ignored (apart
> from emitting a warning) and this typically results in resource leaks.
> To improve here there is a quest to make the remove callback return
> void. In the first step of this quest all drivers are converted to
> .remove_new() which already returns void. Eventually after all drivers
> are converted, .remove_new() is renamed to .remove().
>
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> sound/drivers/pcmtest.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/sound/drivers/pcmtest.c b/sound/drivers/pcmtest.c
> index 2ae912a64d16..1fff85feaf82 100644
> --- a/sound/drivers/pcmtest.c
> +++ b/sound/drivers/pcmtest.c
> @@ -576,10 +576,9 @@ static int pcmtst_probe(struct platform_device *pdev)
> return 0;
> }
>
> -static int pdev_remove(struct platform_device *dev)
> +static void pdev_remove(struct platform_device *dev)
> {
> snd_pcmtst_free(pcmtst);
> - return 0;
> }
>
> static struct platform_device pcmtst_pdev = {
> @@ -589,7 +588,7 @@ static struct platform_device pcmtst_pdev = {
>
> static struct platform_driver pcmtst_pdrv = {
> .probe = pcmtst_probe,
> - .remove = pdev_remove,
> + .remove_new = pdev_remove,
> .driver = {
> .name = "pcmtest",
> },
>
> base-commit: 5133c9e51de41bfa902153888e11add3342ede18
Looks good to me, thanks!
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void
2023-07-07 7:50 [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Uwe Kleine-König
2023-07-07 7:50 ` [PATCH 2/2] ALSA: pcmtest: Don't use static storage to track per device data Uwe Kleine-König
2023-07-07 13:49 ` [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Ivan Orlov
@ 2023-07-07 13:52 ` Ivan Orlov
2023-07-10 6:55 ` Takashi Iwai
3 siblings, 0 replies; 6+ messages in thread
From: Ivan Orlov @ 2023-07-07 13:52 UTC (permalink / raw)
To: Uwe Kleine-König, Jaroslav Kysela, Takashi Iwai; +Cc: alsa-devel, kernel
On 7/7/23 11:50, Uwe Kleine-König wrote:
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is ignored (apart
> from emitting a warning) and this typically results in resource leaks.
> To improve here there is a quest to make the remove callback return
> void. In the first step of this quest all drivers are converted to
> .remove_new() which already returns void. Eventually after all drivers
> are converted, .remove_new() is renamed to .remove().
>
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> sound/drivers/pcmtest.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/sound/drivers/pcmtest.c b/sound/drivers/pcmtest.c
> index 2ae912a64d16..1fff85feaf82 100644
> --- a/sound/drivers/pcmtest.c
> +++ b/sound/drivers/pcmtest.c
> @@ -576,10 +576,9 @@ static int pcmtst_probe(struct platform_device *pdev)
> return 0;
> }
>
> -static int pdev_remove(struct platform_device *dev)
> +static void pdev_remove(struct platform_device *dev)
> {
> snd_pcmtst_free(pcmtst);
> - return 0;
> }
>
> static struct platform_device pcmtst_pdev = {
> @@ -589,7 +588,7 @@ static struct platform_device pcmtst_pdev = {
>
> static struct platform_driver pcmtst_pdrv = {
> .probe = pcmtst_probe,
> - .remove = pdev_remove,
> + .remove_new = pdev_remove,
> .driver = {
> .name = "pcmtest",
> },
>
> base-commit: 5133c9e51de41bfa902153888e11add3342ede18
Acked-by: Ivan Orlov <ivan.orlov0322@gmail.com>
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void
2023-07-07 7:50 [PATCH 1/2] ALSA: pcmtest: Convert to platform remove callback returning void Uwe Kleine-König
` (2 preceding siblings ...)
2023-07-07 13:52 ` Ivan Orlov
@ 2023-07-10 6:55 ` Takashi Iwai
3 siblings, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2023-07-10 6:55 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Ivan Orlov, Jaroslav Kysela, Takashi Iwai, alsa-devel, kernel
On Fri, 07 Jul 2023 09:50:57 +0200,
Uwe Kleine-König wrote:
>
> The .remove() callback for a platform driver returns an int which makes
> many driver authors wrongly assume it's possible to do error handling by
> returning an error code. However the value returned is ignored (apart
> from emitting a warning) and this typically results in resource leaks.
> To improve here there is a quest to make the remove callback return
> void. In the first step of this quest all drivers are converted to
> .remove_new() which already returns void. Eventually after all drivers
> are converted, .remove_new() is renamed to .remove().
>
> Trivially convert this driver from always returning zero in the remove
> callback to the void returning variant.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Applied both patches now. Thanks!
Takashi
^ permalink raw reply [flat|nested] 6+ messages in thread