* [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new
@ 2023-11-07 9:17 Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-07 9:17 UTC (permalink / raw)
To: Helge Deller
Cc: Rob Herring, linux-fbdev, Stephen Kitt, kernel, Alexandre Belloni,
Dmitry Torokhov, dri-devel, Claudiu Beznea, Thomas Zimmermann,
Atul Raut, Javier Martinez Canillas, Daniel Thompson, linux-omap,
Sam Ravnborg, linux-arm-kernel
Hello,
there are currently several platform drivers that have their .remove
callback defined in .exit.text. While this works fine, it comes with a
few downsides: Since commit f177cd0c15fc ("modpost: Don't let "driver"s
reference .exit.*") it triggers a modpost warning unless the driver
struct is marked with __refdata. None of the drivers in
drivers/video/fbdev get that right (which is understandable the warning
was added only recently). While it would be possible to add that marker,
that's also a bit ugly as this bypasses all other section checks that
modpost does. Having the remove callback in .exit.text also means that
the corresponding devices cannot be unbound at runtime which is
sometimes usefull for debugging purposes.
To fix the modpost warning I picked the progressive option and moved the
.remove() callbacks (and for two drivers also .probe()) into .text (i.e.
the default code section) and dropped .suppress_bind_attrs = true (which
is implicitly set for drivers using platform_driver_probe()). Note even
though these patches fix a warning, it currently only happens with W=1,
so this isn't urgent and there is no need to apply these before v6.7.
The next merge window is fine (although I wouldn't object an earlier
application of course :-) The alternative is to add the __refdata
marker, ideally with a comment describing the need. (See e.g. commit
141626dbc2e6 ("rtc: sh: Mark driver struct with __refdata to prevent
section mismatch warning") .)
As a follow-up I converted the affected drivers to .remove_new(). There
was already a series doing this for the other drivers in
drivers/video/fb, but my coccinelle script missed these drivers as it
didn't handle
.remove = __exit_p(removefunc),
. See commit 5c5a7680e67b ("platform: Provide a remove callback that
returns no value") for an extended explanation and the eventual goal. I
considered creating a second series for this conversion, but as the
patches conflict I put all patches in a single series to make it easier
to apply it.
Best regards
Uwe
Uwe Kleine-König (22):
fb: amifb: Stop using platform_driver_probe()
fb: atmel_lcdfb: Stop using platform_driver_probe()
fb: omapfb/analog-tv: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/dpi: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/dsi-cm: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/dvi: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/hdmi: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/opa362: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/sharp-ls037v7dw01: Don't put .remove() in .exit.text and
drop suppress_bind_attrs
fb: omapfb/tfp410: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: omapfb/tpd12s015: Don't put .remove() in .exit.text and drop
suppress_bind_attrs
fb: amifb: Convert to platform remove callback returning void
fb: atmel_lcdfb: Convert to platform remove callback returning void
fb: omapfb/analog-tv: Convert to platform remove callback returning
void
fb: omapfb/dpi: Convert to platform remove callback returning void
fb: omapfb/dsi-cm: Convert to platform remove callback returning void
fb: omapfb/dvi: Convert to platform remove callback returning void
fb: omapfb/hdmi: Convert to platform remove callback returning void
fb: omapfb/opa362: Convert to platform remove callback returning void
fb: omapfb/sharp-ls037v7dw01: Convert to platform remove callback
returning void
fb: omapfb/tfp410: Convert to platform remove callback returning void
fb: omapfb/tpd12s015: Convert to platform remove callback returning
void
drivers/video/fbdev/amifb.c | 13 ++++++-------
drivers/video/fbdev/atmel_lcdfb.c | 13 ++++++-------
.../omap2/omapfb/displays/connector-analog-tv.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/connector-dvi.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/connector-hdmi.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/encoder-opa362.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/encoder-tfp410.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/encoder-tpd12s015.c | 7 ++-----
.../video/fbdev/omap2/omapfb/displays/panel-dpi.c | 7 ++-----
.../fbdev/omap2/omapfb/displays/panel-dsi-cm.c | 7 ++-----
.../omap2/omapfb/displays/panel-sharp-ls037v7dw01.c | 7 ++-----
11 files changed, 30 insertions(+), 59 deletions(-)
base-commit: 3ff7a5781ceee3befb9224d29cef6e6a4766c5fe
--
2.42.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-07 9:17 [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Uwe Kleine-König
@ 2023-11-07 9:17 ` Uwe Kleine-König
2023-11-07 20:01 ` Uwe Kleine-König
2023-11-08 18:48 ` Nathan Chancellor
2023-11-07 9:17 ` [PATCH 13/22] fb: atmel_lcdfb: Convert to platform remove callback returning void Uwe Kleine-König
2023-11-07 13:57 ` [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Helge Deller
2 siblings, 2 replies; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-07 9:17 UTC (permalink / raw)
To: Helge Deller
Cc: Alexandre Belloni, kernel, dri-devel, Claudiu Beznea, linux-fbdev,
linux-arm-kernel
On today's platforms the benefit of platform_driver_probe() isn't that
relevant any more. It allows to drop some code after booting (or module
loading) for .probe() and discard the .remove() function completely if
the driver is built-in. This typically saves a few 100k.
The downside of platform_driver_probe() is that the driver cannot be
bound and unbound at runtime which is ancient and also slightly
complicates testing. There are also thoughts to deprecate
platform_driver_probe() because it adds some complexity in the driver
core for little gain. Also many drivers don't use it correctly. This
driver for example misses to mark the driver struct with __refdata which
is needed to suppress a (W=1) modpost warning:
WARNING: modpost: drivers/video/fbdev/atmel_lcdfb: section mismatch in reference: atmel_lcdfb_driver+0x4 (section: .data) -> atmel_lcdfb_remove (section: .exit.text)
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
drivers/video/fbdev/atmel_lcdfb.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
index a908db233409..b218731ef732 100644
--- a/drivers/video/fbdev/atmel_lcdfb.c
+++ b/drivers/video/fbdev/atmel_lcdfb.c
@@ -1017,7 +1017,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
return ret;
}
-static int __init atmel_lcdfb_probe(struct platform_device *pdev)
+static int atmel_lcdfb_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct fb_info *info;
@@ -1223,7 +1223,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
return ret;
}
-static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
+static int atmel_lcdfb_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct fb_info *info = dev_get_drvdata(dev);
@@ -1301,7 +1301,8 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
#endif
static struct platform_driver atmel_lcdfb_driver = {
- .remove = __exit_p(atmel_lcdfb_remove),
+ .probe = atmel_lcdfb_probe,
+ .remove = atmel_lcdfb_remove,
.suspend = atmel_lcdfb_suspend,
.resume = atmel_lcdfb_resume,
.driver = {
@@ -1310,7 +1311,7 @@ static struct platform_driver atmel_lcdfb_driver = {
},
};
-module_platform_driver_probe(atmel_lcdfb_driver, atmel_lcdfb_probe);
+module_platform_driver(atmel_lcdfb_driver, );
MODULE_DESCRIPTION("AT91 LCD Controller framebuffer driver");
MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre@atmel.com>");
--
2.42.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 13/22] fb: atmel_lcdfb: Convert to platform remove callback returning void
2023-11-07 9:17 [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
@ 2023-11-07 9:17 ` Uwe Kleine-König
2023-11-07 13:57 ` [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Helge Deller
2 siblings, 0 replies; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-07 9:17 UTC (permalink / raw)
To: Helge Deller
Cc: Alexandre Belloni, kernel, dri-devel, Claudiu Beznea, linux-fbdev,
linux-arm-kernel
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() will be 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>
---
drivers/video/fbdev/atmel_lcdfb.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
index b218731ef732..0531d6f6dcc5 100644
--- a/drivers/video/fbdev/atmel_lcdfb.c
+++ b/drivers/video/fbdev/atmel_lcdfb.c
@@ -1223,14 +1223,14 @@ static int atmel_lcdfb_probe(struct platform_device *pdev)
return ret;
}
-static int atmel_lcdfb_remove(struct platform_device *pdev)
+static void atmel_lcdfb_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct fb_info *info = dev_get_drvdata(dev);
struct atmel_lcdfb_info *sinfo;
if (!info || !info->par)
- return 0;
+ return;
sinfo = info->par;
cancel_work_sync(&sinfo->task);
@@ -1252,8 +1252,6 @@ static int atmel_lcdfb_remove(struct platform_device *pdev)
}
framebuffer_release(info);
-
- return 0;
}
#ifdef CONFIG_PM
@@ -1302,7 +1300,7 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
static struct platform_driver atmel_lcdfb_driver = {
.probe = atmel_lcdfb_probe,
- .remove = atmel_lcdfb_remove,
+ .remove_new = atmel_lcdfb_remove,
.suspend = atmel_lcdfb_suspend,
.resume = atmel_lcdfb_resume,
.driver = {
--
2.42.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new
2023-11-07 9:17 [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 13/22] fb: atmel_lcdfb: Convert to platform remove callback returning void Uwe Kleine-König
@ 2023-11-07 13:57 ` Helge Deller
2 siblings, 0 replies; 16+ messages in thread
From: Helge Deller @ 2023-11-07 13:57 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Rob Herring, linux-fbdev, Stephen Kitt, kernel, Alexandre Belloni,
Dmitry Torokhov, dri-devel, Claudiu Beznea, Thomas Zimmermann,
Atul Raut, Javier Martinez Canillas, Daniel Thompson, linux-omap,
Sam Ravnborg, linux-arm-kernel
On 11/7/23 10:17, Uwe Kleine-König wrote:
> there are currently several platform drivers that have their .remove
> callback defined in .exit.text. While this works fine, it comes with a
> few downsides: Since commit f177cd0c15fc ("modpost: Don't let "driver"s
> reference .exit.*") it triggers a modpost warning unless the driver
> struct is marked with __refdata. None of the drivers in
> drivers/video/fbdev get that right (which is understandable the warning
> was added only recently). While it would be possible to add that marker,
> that's also a bit ugly as this bypasses all other section checks that
> modpost does. Having the remove callback in .exit.text also means that
> the corresponding devices cannot be unbound at runtime which is
> sometimes usefull for debugging purposes.
>
> To fix the modpost warning I picked the progressive option and moved the
> .remove() callbacks (and for two drivers also .probe()) into .text (i.e.
> the default code section) and dropped .suppress_bind_attrs = true (which
> is implicitly set for drivers using platform_driver_probe()). Note even
> though these patches fix a warning, it currently only happens with W=1,
> so this isn't urgent and there is no need to apply these before v6.7.
> The next merge window is fine (although I wouldn't object an earlier
> application of course :-) The alternative is to add the __refdata
> marker, ideally with a comment describing the need. (See e.g. commit
> 141626dbc2e6 ("rtc: sh: Mark driver struct with __refdata to prevent
> section mismatch warning") .)
>
> As a follow-up I converted the affected drivers to .remove_new(). There
> was already a series doing this for the other drivers in
> drivers/video/fb, but my coccinelle script missed these drivers as it
> didn't handle
>
> .remove = __exit_p(removefunc),
>
> . See commit 5c5a7680e67b ("platform: Provide a remove callback that
> returns no value") for an extended explanation and the eventual goal. I
> considered creating a second series for this conversion, but as the
> patches conflict I put all patches in a single series to make it easier
> to apply it.
Thanks Uwe!
I've applied the series as-is to the fbdev for-next git tree.
The patches look ok, and if they survive the next few days they will go
upstream soon.
Helge
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
@ 2023-11-07 20:01 ` Uwe Kleine-König
2023-11-07 20:37 ` Helge Deller
2023-11-08 18:48 ` Nathan Chancellor
1 sibling, 1 reply; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-07 20:01 UTC (permalink / raw)
To: Helge Deller
Cc: Alexandre Belloni, linux-fbdev, dri-devel, kernel, Claudiu Beznea,
linux-arm-kernel
[-- Attachment #1.1: Type: text/plain, Size: 3553 bytes --]
On Tue, Nov 07, 2023 at 10:17:43AM +0100, Uwe Kleine-König wrote:
> On today's platforms the benefit of platform_driver_probe() isn't that
> relevant any more. It allows to drop some code after booting (or module
> loading) for .probe() and discard the .remove() function completely if
> the driver is built-in. This typically saves a few 100k.
>
> The downside of platform_driver_probe() is that the driver cannot be
> bound and unbound at runtime which is ancient and also slightly
> complicates testing. There are also thoughts to deprecate
> platform_driver_probe() because it adds some complexity in the driver
> core for little gain. Also many drivers don't use it correctly. This
> driver for example misses to mark the driver struct with __refdata which
> is needed to suppress a (W=1) modpost warning:
>
> WARNING: modpost: drivers/video/fbdev/atmel_lcdfb: section mismatch in reference: atmel_lcdfb_driver+0x4 (section: .data) -> atmel_lcdfb_remove (section: .exit.text)
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> drivers/video/fbdev/atmel_lcdfb.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> index a908db233409..b218731ef732 100644
> --- a/drivers/video/fbdev/atmel_lcdfb.c
> +++ b/drivers/video/fbdev/atmel_lcdfb.c
> @@ -1017,7 +1017,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
> return ret;
> }
>
> -static int __init atmel_lcdfb_probe(struct platform_device *pdev)
> +static int atmel_lcdfb_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> struct fb_info *info;
> @@ -1223,7 +1223,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
> return ret;
> }
>
> -static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
> +static int atmel_lcdfb_remove(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> struct fb_info *info = dev_get_drvdata(dev);
> @@ -1301,7 +1301,8 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
> #endif
>
> static struct platform_driver atmel_lcdfb_driver = {
> - .remove = __exit_p(atmel_lcdfb_remove),
> + .probe = atmel_lcdfb_probe,
> + .remove = atmel_lcdfb_remove,
> .suspend = atmel_lcdfb_suspend,
> .resume = atmel_lcdfb_resume,
> .driver = {
> @@ -1310,7 +1311,7 @@ static struct platform_driver atmel_lcdfb_driver = {
> },
> };
>
> -module_platform_driver_probe(atmel_lcdfb_driver, atmel_lcdfb_probe);
> +module_platform_driver(atmel_lcdfb_driver, );
Argh, the , must be removed. I had this in my working copy but forgot to
squash it into this commit. Sorry!
Can you squash in the following please?:
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
index 0531d6f6dcc5..88c75ae7d315 100644
--- a/drivers/video/fbdev/atmel_lcdfb.c
+++ b/drivers/video/fbdev/atmel_lcdfb.c
@@ -1308,8 +1308,7 @@ static struct platform_driver atmel_lcdfb_driver = {
.of_match_table = atmel_lcdfb_dt_ids,
},
};
-
-module_platform_driver(atmel_lcdfb_driver, );
+module_platform_driver(atmel_lcdfb_driver);
MODULE_DESCRIPTION("AT91 LCD Controller framebuffer driver");
MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre@atmel.com>");
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-07 20:01 ` Uwe Kleine-König
@ 2023-11-07 20:37 ` Helge Deller
0 siblings, 0 replies; 16+ messages in thread
From: Helge Deller @ 2023-11-07 20:37 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Alexandre Belloni, linux-fbdev, dri-devel, kernel, Claudiu Beznea,
linux-arm-kernel
On 11/7/23 21:01, Uwe Kleine-König wrote:
> On Tue, Nov 07, 2023 at 10:17:43AM +0100, Uwe Kleine-König wrote:
>> On today's platforms the benefit of platform_driver_probe() isn't that
>> relevant any more. It allows to drop some code after booting (or module
>> loading) for .probe() and discard the .remove() function completely if
>> the driver is built-in. This typically saves a few 100k.
>>
>> The downside of platform_driver_probe() is that the driver cannot be
>> bound and unbound at runtime which is ancient and also slightly
>> complicates testing. There are also thoughts to deprecate
>> platform_driver_probe() because it adds some complexity in the driver
>> core for little gain. Also many drivers don't use it correctly. This
>> driver for example misses to mark the driver struct with __refdata which
>> is needed to suppress a (W=1) modpost warning:
>>
>> WARNING: modpost: drivers/video/fbdev/atmel_lcdfb: section mismatch in reference: atmel_lcdfb_driver+0x4 (section: .data) -> atmel_lcdfb_remove (section: .exit.text)
>>
>> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>> ---
>> drivers/video/fbdev/atmel_lcdfb.c | 9 +++++----
>> 1 file changed, 5 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
>> index a908db233409..b218731ef732 100644
>> --- a/drivers/video/fbdev/atmel_lcdfb.c
>> +++ b/drivers/video/fbdev/atmel_lcdfb.c
>> @@ -1017,7 +1017,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
>> return ret;
>> }
>>
>> -static int __init atmel_lcdfb_probe(struct platform_device *pdev)
>> +static int atmel_lcdfb_probe(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> struct fb_info *info;
>> @@ -1223,7 +1223,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
>> return ret;
>> }
>>
>> -static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
>> +static int atmel_lcdfb_remove(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> struct fb_info *info = dev_get_drvdata(dev);
>> @@ -1301,7 +1301,8 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
>> #endif
>>
>> static struct platform_driver atmel_lcdfb_driver = {
>> - .remove = __exit_p(atmel_lcdfb_remove),
>> + .probe = atmel_lcdfb_probe,
>> + .remove = atmel_lcdfb_remove,
>> .suspend = atmel_lcdfb_suspend,
>> .resume = atmel_lcdfb_resume,
>> .driver = {
>> @@ -1310,7 +1311,7 @@ static struct platform_driver atmel_lcdfb_driver = {
>> },
>> };
>>
>> -module_platform_driver_probe(atmel_lcdfb_driver, atmel_lcdfb_probe);
>> +module_platform_driver(atmel_lcdfb_driver, );
>
> Argh, the , must be removed. I had this in my working copy but forgot to
> squash it into this commit. Sorry!
>
> Can you squash in the following please?:
Sure.
I fixed it up in the git tree.
Thanks!
Helge
> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> index 0531d6f6dcc5..88c75ae7d315 100644
> --- a/drivers/video/fbdev/atmel_lcdfb.c
> +++ b/drivers/video/fbdev/atmel_lcdfb.c
> @@ -1308,8 +1308,7 @@ static struct platform_driver atmel_lcdfb_driver = {
> .of_match_table = atmel_lcdfb_dt_ids,
> },
> };
> -
> -module_platform_driver(atmel_lcdfb_driver, );
> +module_platform_driver(atmel_lcdfb_driver);
>
> MODULE_DESCRIPTION("AT91 LCD Controller framebuffer driver");
> MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre@atmel.com>");
>
> Best regards
> Uwe
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
2023-11-07 20:01 ` Uwe Kleine-König
@ 2023-11-08 18:48 ` Nathan Chancellor
2023-11-08 20:27 ` Helge Deller
2023-11-08 21:00 ` Uwe Kleine-König
1 sibling, 2 replies; 16+ messages in thread
From: Nathan Chancellor @ 2023-11-08 18:48 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: linux-fbdev, Alexandre Belloni, Helge Deller, llvm, dri-devel,
Claudiu Beznea, kernel, linux-arm-kernel
On Tue, Nov 07, 2023 at 10:17:43AM +0100, Uwe Kleine-König wrote:
> On today's platforms the benefit of platform_driver_probe() isn't that
> relevant any more. It allows to drop some code after booting (or module
> loading) for .probe() and discard the .remove() function completely if
> the driver is built-in. This typically saves a few 100k.
>
> The downside of platform_driver_probe() is that the driver cannot be
> bound and unbound at runtime which is ancient and also slightly
> complicates testing. There are also thoughts to deprecate
> platform_driver_probe() because it adds some complexity in the driver
> core for little gain. Also many drivers don't use it correctly. This
> driver for example misses to mark the driver struct with __refdata which
> is needed to suppress a (W=1) modpost warning:
>
> WARNING: modpost: drivers/video/fbdev/atmel_lcdfb: section mismatch in reference: atmel_lcdfb_driver+0x4 (section: .data) -> atmel_lcdfb_remove (section: .exit.text)
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
> ---
> drivers/video/fbdev/atmel_lcdfb.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> index a908db233409..b218731ef732 100644
> --- a/drivers/video/fbdev/atmel_lcdfb.c
> +++ b/drivers/video/fbdev/atmel_lcdfb.c
> @@ -1017,7 +1017,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
> return ret;
> }
>
> -static int __init atmel_lcdfb_probe(struct platform_device *pdev)
> +static int atmel_lcdfb_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> struct fb_info *info;
> @@ -1223,7 +1223,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
> return ret;
> }
>
> -static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
> +static int atmel_lcdfb_remove(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> struct fb_info *info = dev_get_drvdata(dev);
> @@ -1301,7 +1301,8 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
> #endif
>
> static struct platform_driver atmel_lcdfb_driver = {
> - .remove = __exit_p(atmel_lcdfb_remove),
> + .probe = atmel_lcdfb_probe,
> + .remove = atmel_lcdfb_remove,
> .suspend = atmel_lcdfb_suspend,
> .resume = atmel_lcdfb_resume,
> .driver = {
> @@ -1310,7 +1311,7 @@ static struct platform_driver atmel_lcdfb_driver = {
> },
> };
>
> -module_platform_driver_probe(atmel_lcdfb_driver, atmel_lcdfb_probe);
> +module_platform_driver(atmel_lcdfb_driver, );
>
> MODULE_DESCRIPTION("AT91 LCD Controller framebuffer driver");
> MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre@atmel.com>");
> --
> 2.42.0
>
For what it's worth, this introduces a warning when building certain
configurations (such as ARCH=arm multi_v5_defconfig) with clang:
WARNING: modpost: vmlinux: section mismatch in reference: atmel_lcdfb_probe+0x6c4 (section: .text) -> atmel_lcdfb_init_fbinfo (section: .init.text)
WARNING: modpost: vmlinux: section mismatch in reference: atmel_lcdfb_probe+0x858 (section: .text) -> atmel_lcdfb_fix (section: .init.rodata)
This appears to be legitimate to me? GCC did not warn but I assume that
is due to differences in inlining. The following clears it up for me,
should I send a standalone patch or should this be squashed in?
Cheers,
Nathan
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
index 88c75ae7d315..9e391e5eaf9d 100644
--- a/drivers/video/fbdev/atmel_lcdfb.c
+++ b/drivers/video/fbdev/atmel_lcdfb.c
@@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
}
}
-static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
+static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
.xpanstep = 0,
@@ -841,7 +841,7 @@ static void atmel_lcdfb_task(struct work_struct *work)
atmel_lcdfb_reset(sinfo);
}
-static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
+static int atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
{
struct fb_info *info = sinfo->info;
int ret = 0;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 18:48 ` Nathan Chancellor
@ 2023-11-08 20:27 ` Helge Deller
2023-11-08 21:00 ` Uwe Kleine-König
1 sibling, 0 replies; 16+ messages in thread
From: Helge Deller @ 2023-11-08 20:27 UTC (permalink / raw)
To: Nathan Chancellor, Uwe Kleine-König
Cc: Alexandre Belloni, kernel, llvm, dri-devel, Claudiu Beznea,
linux-fbdev, linux-arm-kernel
On 11/8/23 19:48, Nathan Chancellor wrote:
> On Tue, Nov 07, 2023 at 10:17:43AM +0100, Uwe Kleine-König wrote:
>> On today's platforms the benefit of platform_driver_probe() isn't that
>> relevant any more. It allows to drop some code after booting (or module
>> loading) for .probe() and discard the .remove() function completely if
>> the driver is built-in. This typically saves a few 100k.
>>
>> The downside of platform_driver_probe() is that the driver cannot be
>> bound and unbound at runtime which is ancient and also slightly
>> complicates testing. There are also thoughts to deprecate
>> platform_driver_probe() because it adds some complexity in the driver
>> core for little gain. Also many drivers don't use it correctly. This
>> driver for example misses to mark the driver struct with __refdata which
>> is needed to suppress a (W=1) modpost warning:
>>
>> WARNING: modpost: drivers/video/fbdev/atmel_lcdfb: section mismatch in reference: atmel_lcdfb_driver+0x4 (section: .data) -> atmel_lcdfb_remove (section: .exit.text)
>>
>> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>> ---
>> drivers/video/fbdev/atmel_lcdfb.c | 9 +++++----
>> 1 file changed, 5 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
>> index a908db233409..b218731ef732 100644
>> --- a/drivers/video/fbdev/atmel_lcdfb.c
>> +++ b/drivers/video/fbdev/atmel_lcdfb.c
>> @@ -1017,7 +1017,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo)
>> return ret;
>> }
>>
>> -static int __init atmel_lcdfb_probe(struct platform_device *pdev)
>> +static int atmel_lcdfb_probe(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> struct fb_info *info;
>> @@ -1223,7 +1223,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
>> return ret;
>> }
>>
>> -static int __exit atmel_lcdfb_remove(struct platform_device *pdev)
>> +static int atmel_lcdfb_remove(struct platform_device *pdev)
>> {
>> struct device *dev = &pdev->dev;
>> struct fb_info *info = dev_get_drvdata(dev);
>> @@ -1301,7 +1301,8 @@ static int atmel_lcdfb_resume(struct platform_device *pdev)
>> #endif
>>
>> static struct platform_driver atmel_lcdfb_driver = {
>> - .remove = __exit_p(atmel_lcdfb_remove),
>> + .probe = atmel_lcdfb_probe,
>> + .remove = atmel_lcdfb_remove,
>> .suspend = atmel_lcdfb_suspend,
>> .resume = atmel_lcdfb_resume,
>> .driver = {
>> @@ -1310,7 +1311,7 @@ static struct platform_driver atmel_lcdfb_driver = {
>> },
>> };
>>
>> -module_platform_driver_probe(atmel_lcdfb_driver, atmel_lcdfb_probe);
>> +module_platform_driver(atmel_lcdfb_driver, );
>>
>> MODULE_DESCRIPTION("AT91 LCD Controller framebuffer driver");
>> MODULE_AUTHOR("Nicolas Ferre <nicolas.ferre@atmel.com>");
>> --
>> 2.42.0
>>
>
> For what it's worth, this introduces a warning when building certain
> configurations (such as ARCH=arm multi_v5_defconfig) with clang:
>
> WARNING: modpost: vmlinux: section mismatch in reference: atmel_lcdfb_probe+0x6c4 (section: .text) -> atmel_lcdfb_init_fbinfo (section: .init.text)
> WARNING: modpost: vmlinux: section mismatch in reference: atmel_lcdfb_probe+0x858 (section: .text) -> atmel_lcdfb_fix (section: .init.rodata)
>
> This appears to be legitimate to me? GCC did not warn but I assume that
> is due to differences in inlining. The following clears it up for me,
> should I send a standalone patch or should this be squashed in?
I've squashed it into the original patch.
Thank you!
Helge
> Cheers,
> Nathan
>
> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> index 88c75ae7d315..9e391e5eaf9d 100644
> --- a/drivers/video/fbdev/atmel_lcdfb.c
> +++ b/drivers/video/fbdev/atmel_lcdfb.c
> @@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
> }
> }
>
> -static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
> +static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
> .type = FB_TYPE_PACKED_PIXELS,
> .visual = FB_VISUAL_TRUECOLOR,
> .xpanstep = 0,
> @@ -841,7 +841,7 @@ static void atmel_lcdfb_task(struct work_struct *work)
> atmel_lcdfb_reset(sinfo);
> }
>
> -static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
> +static int atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
> {
> struct fb_info *info = sinfo->info;
> int ret = 0;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 18:48 ` Nathan Chancellor
2023-11-08 20:27 ` Helge Deller
@ 2023-11-08 21:00 ` Uwe Kleine-König
2023-11-08 21:24 ` Helge Deller
1 sibling, 1 reply; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-08 21:00 UTC (permalink / raw)
To: Nathan Chancellor
Cc: linux-fbdev, Alexandre Belloni, Helge Deller, llvm, dri-devel,
Claudiu Beznea, kernel, linux-arm-kernel
[-- Attachment #1.1: Type: text/plain, Size: 1705 bytes --]
Hello,
On Wed, Nov 08, 2023 at 11:48:05AM -0700, Nathan Chancellor wrote:
> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> index 88c75ae7d315..9e391e5eaf9d 100644
> --- a/drivers/video/fbdev/atmel_lcdfb.c
> +++ b/drivers/video/fbdev/atmel_lcdfb.c
> @@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
> }
> }
>
> -static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
> +static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
> .type = FB_TYPE_PACKED_PIXELS,
> .visual = FB_VISUAL_TRUECOLOR,
> .xpanstep = 0,
I wonder if this was broken already before my patch. atmel_lcdfb_probe()
does
info->fix = atmel_lcdfb_fix;
and unless I miss something (this is well possible) that is used e.g. in
atmel_lcdfb_set_par() -> atmel_lcdfb_update_dma(). So atmel_lcdfb_fix
should better not live in .init memory?! Someone with more knowledge
about fbdev might want to take a look and decide if this justifies a
separate fix that should then be backported to stable, too?!
> @@ -841,7 +841,7 @@ static void atmel_lcdfb_task(struct work_struct *work)
> atmel_lcdfb_reset(sinfo);
> }
>
> -static int __init atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
> +static int atmel_lcdfb_init_fbinfo(struct atmel_lcdfb_info *sinfo)
> {
> struct fb_info *info = sinfo->info;
> int ret = 0;
This is only a problem since my patch.
Thanks for your report and patch.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 21:00 ` Uwe Kleine-König
@ 2023-11-08 21:24 ` Helge Deller
2023-11-08 21:52 ` Uwe Kleine-König
0 siblings, 1 reply; 16+ messages in thread
From: Helge Deller @ 2023-11-08 21:24 UTC (permalink / raw)
To: Uwe Kleine-König, Nathan Chancellor
Cc: linux-fbdev, Alexandre Belloni, llvm, Claudiu Beznea, dri-devel,
kernel, linux-arm-kernel
On 11/8/23 22:00, Uwe Kleine-König wrote:
> On Wed, Nov 08, 2023 at 11:48:05AM -0700, Nathan Chancellor wrote:
>> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
>> index 88c75ae7d315..9e391e5eaf9d 100644
>> --- a/drivers/video/fbdev/atmel_lcdfb.c
>> +++ b/drivers/video/fbdev/atmel_lcdfb.c
>> @@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
>> }
>> }
>>
>> -static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
>> +static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
>> .type = FB_TYPE_PACKED_PIXELS,
>> .visual = FB_VISUAL_TRUECOLOR,
>> .xpanstep = 0,
>
> I wonder if this was broken already before my patch. atmel_lcdfb_probe()
> does
>
> info->fix = atmel_lcdfb_fix;
>
> and unless I miss something (this is well possible) that is used e.g. in
> atmel_lcdfb_set_par() -> atmel_lcdfb_update_dma(). So atmel_lcdfb_fix
> should better not live in .init memory?! Someone with more knowledge
> about fbdev might want to take a look and decide if this justifies a
> separate fix that should then be backported to stable, too?!
I don't think a backport this is necessary.
The "__initconst" atmel_lcdfb_fix struct was only copied in the
"__init" atmel_lcdfb_probe() function.
So, both were dropped at the same time in older kernels.
Since your patch dropped the "__init" from atmel_lcdfb_probe(),
the __initconst from atmel_lcdfb_fix has to be removed too.
So, I believe folding in Nathan's patch is OK and we don't need
a seperate (or backport) patch.
Helge
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 21:24 ` Helge Deller
@ 2023-11-08 21:52 ` Uwe Kleine-König
2023-11-08 21:57 ` Helge Deller
0 siblings, 1 reply; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-08 21:52 UTC (permalink / raw)
To: Helge Deller
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
Nathan Chancellor, kernel, linux-arm-kernel
[-- Attachment #1.1: Type: text/plain, Size: 1894 bytes --]
On Wed, Nov 08, 2023 at 10:24:09PM +0100, Helge Deller wrote:
> On 11/8/23 22:00, Uwe Kleine-König wrote:
> > On Wed, Nov 08, 2023 at 11:48:05AM -0700, Nathan Chancellor wrote:
> > > diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
> > > index 88c75ae7d315..9e391e5eaf9d 100644
> > > --- a/drivers/video/fbdev/atmel_lcdfb.c
> > > +++ b/drivers/video/fbdev/atmel_lcdfb.c
> > > @@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
> > > }
> > > }
> > >
> > > -static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
> > > +static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
> > > .type = FB_TYPE_PACKED_PIXELS,
> > > .visual = FB_VISUAL_TRUECOLOR,
> > > .xpanstep = 0,
> >
> > I wonder if this was broken already before my patch. atmel_lcdfb_probe()
> > does
> >
> > info->fix = atmel_lcdfb_fix;
> >
> > and unless I miss something (this is well possible) that is used e.g. in
> > atmel_lcdfb_set_par() -> atmel_lcdfb_update_dma(). So atmel_lcdfb_fix
> > should better not live in .init memory?! Someone with more knowledge
> > about fbdev might want to take a look and decide if this justifies a
> > separate fix that should then be backported to stable, too?!
>
> I don't think a backport this is necessary.
> The "__initconst" atmel_lcdfb_fix struct was only copied in the
> "__init" atmel_lcdfb_probe() function.
> So, both were dropped at the same time in older kernels.
But info and so info->fix live longer than the probe function, don't
they? So a call to atmel_lcdfb_update_dma() should better not happen
when .init is already discarded, right?
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 21:52 ` Uwe Kleine-König
@ 2023-11-08 21:57 ` Helge Deller
2023-11-09 6:24 ` Uwe Kleine-König
0 siblings, 1 reply; 16+ messages in thread
From: Helge Deller @ 2023-11-08 21:57 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
Nathan Chancellor, kernel, linux-arm-kernel
On 11/8/23 22:52, Uwe Kleine-König wrote:
> On Wed, Nov 08, 2023 at 10:24:09PM +0100, Helge Deller wrote:
>> On 11/8/23 22:00, Uwe Kleine-König wrote:
>>> On Wed, Nov 08, 2023 at 11:48:05AM -0700, Nathan Chancellor wrote:
>>>> diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c
>>>> index 88c75ae7d315..9e391e5eaf9d 100644
>>>> --- a/drivers/video/fbdev/atmel_lcdfb.c
>>>> +++ b/drivers/video/fbdev/atmel_lcdfb.c
>>>> @@ -220,7 +220,7 @@ static inline void atmel_lcdfb_power_control(struct atmel_lcdfb_info *sinfo, int
>>>> }
>>>> }
>>>>
>>>> -static const struct fb_fix_screeninfo atmel_lcdfb_fix __initconst = {
>>>> +static const struct fb_fix_screeninfo atmel_lcdfb_fix = {
>>>> .type = FB_TYPE_PACKED_PIXELS,
>>>> .visual = FB_VISUAL_TRUECOLOR,
>>>> .xpanstep = 0,
>>>
>>> I wonder if this was broken already before my patch. atmel_lcdfb_probe()
>>> does
>>>
>>> info->fix = atmel_lcdfb_fix;
>>>
>>> and unless I miss something (this is well possible) that is used e.g. in
>>> atmel_lcdfb_set_par() -> atmel_lcdfb_update_dma(). So atmel_lcdfb_fix
>>> should better not live in .init memory?! Someone with more knowledge
>>> about fbdev might want to take a look and decide if this justifies a
>>> separate fix that should then be backported to stable, too?!
>>
>> I don't think a backport this is necessary.
>> The "__initconst" atmel_lcdfb_fix struct was only copied in the
>> "__init" atmel_lcdfb_probe() function.
>> So, both were dropped at the same time in older kernels.
>
> But info and so info->fix live longer than the probe function, don't
> they?
Yes, they do.
But AFAICS info->fix contains a *copy* of the initial atmel_lcdfb_fix struct
(and not a pointer to it). So that should be ok.
Helge
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-08 21:57 ` Helge Deller
@ 2023-11-09 6:24 ` Uwe Kleine-König
2023-11-09 9:55 ` Helge Deller
0 siblings, 1 reply; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-09 6:24 UTC (permalink / raw)
To: Helge Deller
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
Nathan Chancellor, kernel, linux-arm-kernel
[-- Attachment #1.1: Type: text/plain, Size: 689 bytes --]
Hello,
On Wed, Nov 08, 2023 at 10:57:00PM +0100, Helge Deller wrote:
> On 11/8/23 22:52, Uwe Kleine-König wrote:
> > But info and so info->fix live longer than the probe function, don't
> > they?
>
> Yes, they do.
> But AFAICS info->fix contains a *copy* of the initial atmel_lcdfb_fix struct
> (and not a pointer to it). So that should be ok.
If you say so that's good. I grepped a bit around and didn't find a
place where a copy is made. But that's probably me and I'll consider the
case closed.
Thanks
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-09 6:24 ` Uwe Kleine-König
@ 2023-11-09 9:55 ` Helge Deller
2023-11-09 10:20 ` Nicolas Ferre
2023-11-09 10:32 ` Uwe Kleine-König
0 siblings, 2 replies; 16+ messages in thread
From: Helge Deller @ 2023-11-09 9:55 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
Nathan Chancellor, kernel, linux-arm-kernel
On 11/9/23 07:24, Uwe Kleine-König wrote:
> Hello,
>
> On Wed, Nov 08, 2023 at 10:57:00PM +0100, Helge Deller wrote:
>> On 11/8/23 22:52, Uwe Kleine-König wrote:
>>> But info and so info->fix live longer than the probe function, don't
>>> they?
>>
>> Yes, they do.
>> But AFAICS info->fix contains a *copy* of the initial atmel_lcdfb_fix struct
>> (and not a pointer to it). So that should be ok.
>
> If you say so that's good. I grepped a bit around and didn't find a
> place where a copy is made. But that's probably me and I'll consider the
> case closed.
It's not directly obvious, but the copy happens in the line you pointed
out previously.
In include/linux/fb.h:
struct fb_info {
...
struct fb_var_screeninfo var; /* Current var */
struct fb_fix_screeninfo fix; /* Current fix */
so, "fb_info.fix" is a struct, and not a pointer.
In drivers/video/fbdev/atmel_lcdfb.c:
static int atmel_lcdfb_probe(struct platform_device *pdev)
{
...
info->fix = atmel_lcdfb_fix; // (line 1065)
this becomes effectively a:
memcpy(&info->fix, &atmel_lcdfb_fix, sizeof(struct fb_fix_screeninfo));
so, the compiler copies the "__initconst" data over to the info->fix struct.
Helge
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-09 9:55 ` Helge Deller
@ 2023-11-09 10:20 ` Nicolas Ferre
2023-11-09 10:32 ` Uwe Kleine-König
1 sibling, 0 replies; 16+ messages in thread
From: Nicolas Ferre @ 2023-11-09 10:20 UTC (permalink / raw)
To: Helge Deller, Uwe Kleine-König, Nathan Chancellor
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
kernel, linux-arm-kernel
On 09/11/2023 at 10:55, Helge Deller wrote:
> On 11/9/23 07:24, Uwe Kleine-König wrote:
>> Hello,
>>
>> On Wed, Nov 08, 2023 at 10:57:00PM +0100, Helge Deller wrote:
>>> On 11/8/23 22:52, Uwe Kleine-König wrote:
>>>> But info and so info->fix live longer than the probe function, don't
>>>> they?
>>>
>>> Yes, they do.
>>> But AFAICS info->fix contains a *copy* of the initial atmel_lcdfb_fix struct
>>> (and not a pointer to it). So that should be ok.
>>
>> If you say so that's good. I grepped a bit around and didn't find a
>> place where a copy is made. But that's probably me and I'll consider the
>> case closed.
>
> It's not directly obvious, but the copy happens in the line you pointed
> out previously.
>
> In include/linux/fb.h:
>
> struct fb_info {
> ...
> struct fb_var_screeninfo var; /* Current var */
> struct fb_fix_screeninfo fix; /* Current fix */
>
> so, "fb_info.fix" is a struct, and not a pointer.
>
> In drivers/video/fbdev/atmel_lcdfb.c:
> static int atmel_lcdfb_probe(struct platform_device *pdev)
> {
> ...
> info->fix = atmel_lcdfb_fix; // (line 1065)
>
> this becomes effectively a:
> memcpy(&info->fix, &atmel_lcdfb_fix, sizeof(struct fb_fix_screeninfo));
>
> so, the compiler copies the "__initconst" data over to the info->fix struct.
Helge, Uwe and Nathan,
Thanks a lot for making this move, patch and detailed explanation.
Best regards,
Nicolas
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe()
2023-11-09 9:55 ` Helge Deller
2023-11-09 10:20 ` Nicolas Ferre
@ 2023-11-09 10:32 ` Uwe Kleine-König
1 sibling, 0 replies; 16+ messages in thread
From: Uwe Kleine-König @ 2023-11-09 10:32 UTC (permalink / raw)
To: Helge Deller
Cc: linux-fbdev, llvm, Alexandre Belloni, dri-devel, Claudiu Beznea,
Nathan Chancellor, kernel, linux-arm-kernel
[-- Attachment #1.1: Type: text/plain, Size: 1576 bytes --]
Hello Helge,
On Thu, Nov 09, 2023 at 10:55:41AM +0100, Helge Deller wrote:
> On 11/9/23 07:24, Uwe Kleine-König wrote:
> > Hello,
> >
> > On Wed, Nov 08, 2023 at 10:57:00PM +0100, Helge Deller wrote:
> > > On 11/8/23 22:52, Uwe Kleine-König wrote:
> > > > But info and so info->fix live longer than the probe function, don't
> > > > they?
> > >
> > > Yes, they do.
> > > But AFAICS info->fix contains a *copy* of the initial atmel_lcdfb_fix struct
> > > (and not a pointer to it). So that should be ok.
> >
> > If you say so that's good. I grepped a bit around and didn't find a
> > place where a copy is made. But that's probably me and I'll consider the
> > case closed.
>
> It's not directly obvious, but the copy happens in the line you pointed
> out previously.
>
> In include/linux/fb.h:
>
> struct fb_info {
> ...
> struct fb_var_screeninfo var; /* Current var */
> struct fb_fix_screeninfo fix; /* Current fix */
>
> so, "fb_info.fix" is a struct, and not a pointer.
>
> In drivers/video/fbdev/atmel_lcdfb.c:
> static int atmel_lcdfb_probe(struct platform_device *pdev)
> {
> ...
> info->fix = atmel_lcdfb_fix; // (line 1065)
>
> this becomes effectively a:
> memcpy(&info->fix, &atmel_lcdfb_fix, sizeof(struct fb_fix_screeninfo));
Ah right. Thanks for that hint. I didn't spot this and grepped for
memcpy and memdup.
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2023-11-09 10:33 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-07 9:17 [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 02/22] fb: atmel_lcdfb: Stop using platform_driver_probe() Uwe Kleine-König
2023-11-07 20:01 ` Uwe Kleine-König
2023-11-07 20:37 ` Helge Deller
2023-11-08 18:48 ` Nathan Chancellor
2023-11-08 20:27 ` Helge Deller
2023-11-08 21:00 ` Uwe Kleine-König
2023-11-08 21:24 ` Helge Deller
2023-11-08 21:52 ` Uwe Kleine-König
2023-11-08 21:57 ` Helge Deller
2023-11-09 6:24 ` Uwe Kleine-König
2023-11-09 9:55 ` Helge Deller
2023-11-09 10:20 ` Nicolas Ferre
2023-11-09 10:32 ` Uwe Kleine-König
2023-11-07 9:17 ` [PATCH 13/22] fb: atmel_lcdfb: Convert to platform remove callback returning void Uwe Kleine-König
2023-11-07 13:57 ` [PATCH 00/22] fb: handle remove callbacks in .exit.text and convert to .remove_new Helge Deller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).