LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
@ 2008-03-02 23:43 Anton Vorontsov
  2008-03-03  0:08 ` Arjan van de Ven
  2008-03-03 14:18 ` Pavel Machek
  0 siblings, 2 replies; 8+ messages in thread
From: Anton Vorontsov @ 2008-03-02 23:43 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm

Currently drivers handle CONFIG_PM this way:

#ifdef CONFIG_PM
drv_suspend() {}
drv_resume() {}
#else
#define drv_suspend NULL
#define drv_resume NULL
#endif

struct driver drv = {
	.suspend = drv_suspend,
	.resume = drv_resume,
};

With this patch, the code above converts into:

drv_suspend() {}
drv_resume() {}

struct driver drv = {
	.suspend = pm_call(drv_suspend),
	.resume = pm_call(drv_resume),
};

GCC will optimize away suspend/resume calls if they're really
not used.

Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
---
 include/linux/pm.h |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 015b735..6e0b9c2 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -114,6 +114,13 @@ typedef struct pm_message {
 	int event;
 } pm_message_t;
 
+#ifdef CONFIG_PM
+#define pm_call(x) (x)
+#else
+/* avoid `defined but not used' warning */
+#define pm_call(x) ((x) - 1 ? NULL : NULL)
+#endif /* CONFIG_PM */
+
 /*
  * Several driver power state transitions are externally visible, affecting
  * the state of pending I/O queues and (for drivers that touch hardware)
-- 
1.5.4.3

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

* Re: [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-02 23:43 [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM Anton Vorontsov
@ 2008-03-03  0:08 ` Arjan van de Ven
  2008-03-03  0:29   ` Rafael J. Wysocki
  2008-03-03 23:26   ` Anton Vorontsov
  2008-03-03 14:18 ` Pavel Machek
  1 sibling, 2 replies; 8+ messages in thread
From: Arjan van de Ven @ 2008-03-03  0:08 UTC (permalink / raw)
  To: Anton Vorontsov; +Cc: linux-kernel, linux-pm

On Mon, 3 Mar 2008 02:43:08 +0300
Anton Vorontsov <cbouatmailru@gmail.com> wrote:

> Currently drivers handle CONFIG_PM this way:
> 
> #ifdef CONFIG_PM
> drv_suspend() {}
> drv_resume() {}
> #else
> #define drv_suspend NULL
> #define drv_resume NULL
> #endif
> 
> struct driver drv = {
> 	.suspend = drv_suspend,
> 	.resume = drv_resume,
> };
> 
> With this patch, the code above converts into:
> 
> drv_suspend() {}
> drv_resume() {}
> 
> struct driver drv = {
> 	.suspend = pm_call(drv_suspend),
> 	.resume = pm_call(drv_resume),
> };
> 
> GCC will optimize away suspend/resume calls if they're really
> not used.
> 


to be honest, at this point I would think it's time to remove CONFIG_PM, or rather,
just make it always be there and just get rid of the ifdefs. We're saving 2 words and a bit of code,
but only a case that not even the embedded guys use. 

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

* Re: [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-03  0:08 ` Arjan van de Ven
@ 2008-03-03  0:29   ` Rafael J. Wysocki
  2008-03-03 23:26   ` Anton Vorontsov
  1 sibling, 0 replies; 8+ messages in thread
From: Rafael J. Wysocki @ 2008-03-03  0:29 UTC (permalink / raw)
  To: Arjan van de Ven; +Cc: Anton Vorontsov, linux-kernel, linux-pm

On Monday, 3 of March 2008, Arjan van de Ven wrote:
> On Mon, 3 Mar 2008 02:43:08 +0300
> Anton Vorontsov <cbouatmailru@gmail.com> wrote:
> 
> > Currently drivers handle CONFIG_PM this way:
> > 
> > #ifdef CONFIG_PM
> > drv_suspend() {}
> > drv_resume() {}
> > #else
> > #define drv_suspend NULL
> > #define drv_resume NULL
> > #endif
> > 
> > struct driver drv = {
> > 	.suspend = drv_suspend,
> > 	.resume = drv_resume,
> > };
> > 
> > With this patch, the code above converts into:
> > 
> > drv_suspend() {}
> > drv_resume() {}
> > 
> > struct driver drv = {
> > 	.suspend = pm_call(drv_suspend),
> > 	.resume = pm_call(drv_resume),
> > };
> > 
> > GCC will optimize away suspend/resume calls if they're really
> > not used.
> > 
> 
> 
> to be honest, at this point I would think it's time to remove CONFIG_PM, or rather,
> just make it always be there and just get rid of the ifdefs. We're saving 2 words and a bit of code,
> but only a case that not even the embedded guys use. 

All of the drivers' ->suspend() and ->resume() callbacks currently depend on
CONFIG_PM, which they shouldn't.

Still, we're going to introduce new callbacks for suspend/hibernation and the
$subject change will probably get us in the way.  Also, it won't be necessary
afterwards.

Thanks,
Rafael

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

* Re: [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-02 23:43 [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM Anton Vorontsov
  2008-03-03  0:08 ` Arjan van de Ven
@ 2008-03-03 14:18 ` Pavel Machek
  2008-03-03 22:42   ` Anton Vorontsov
  2008-03-03 22:56   ` [linux-pm] " David Brownell
  1 sibling, 2 replies; 8+ messages in thread
From: Pavel Machek @ 2008-03-03 14:18 UTC (permalink / raw)
  To: Anton Vorontsov; +Cc: linux-kernel, linux-pm

Hi!

> diff --git a/include/linux/pm.h b/include/linux/pm.h
> index 015b735..6e0b9c2 100644
> --- a/include/linux/pm.h
> +++ b/include/linux/pm.h
> @@ -114,6 +114,13 @@ typedef struct pm_message {
>  	int event;
>  } pm_message_t;
>  
> +#ifdef CONFIG_PM
> +#define pm_call(x) (x)
> +#else
> +/* avoid `defined but not used' warning */
> +#define pm_call(x) ((x) - 1 ? NULL : NULL)
> +#endif /* CONFIG_PM */
> +

This is evil. Maybe your gcc is smart enough to optimize this away,
but I'm not sure mine is.
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-03 14:18 ` Pavel Machek
@ 2008-03-03 22:42   ` Anton Vorontsov
  2008-03-03 22:56   ` [linux-pm] " David Brownell
  1 sibling, 0 replies; 8+ messages in thread
From: Anton Vorontsov @ 2008-03-03 22:42 UTC (permalink / raw)
  To: Pavel Machek; +Cc: linux-kernel, linux-pm

On Mon, Mar 03, 2008 at 03:18:18PM +0100, Pavel Machek wrote:
> Hi!
> 
> > diff --git a/include/linux/pm.h b/include/linux/pm.h
> > index 015b735..6e0b9c2 100644
> > --- a/include/linux/pm.h
> > +++ b/include/linux/pm.h
> > @@ -114,6 +114,13 @@ typedef struct pm_message {
> >  	int event;
> >  } pm_message_t;
> >  
> > +#ifdef CONFIG_PM
> > +#define pm_call(x) (x)
> > +#else
> > +/* avoid `defined but not used' warning */
> > +#define pm_call(x) ((x) - 1 ? NULL : NULL)
> > +#endif /* CONFIG_PM */
> > +
> 
> This is evil. Maybe your gcc is smart enough to optimize this away,
> but I'm not sure mine is.

No problem. Let's use __maybe_unsed then, it gives the same effect.

- - - -
Subject: introduce pm_call() macro to get rid of most #ifdef CONFIG_PM

Currently drivers handle CONFIG_PM this way:

#ifdef CONFIG_PM
drv_suspend() {}
drv_resume() {}
#else
#define drv_suspend NULL
#define drv_resume NULL
#endif

struct driver drv = {
	.suspend = drv_suspend,
	.resume = drv_resume,
};

With this patch, the code above converts into:

__maybe_unused drv_suspend() {}
__maybe_unused drv_resume() {}

struct driver drv = {
	.suspend = pm_call(drv_suspend),
	.resume = pm_call(drv_resume),
};

GCC will optimize away suspend/resume calls if they're really
not used.

Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
---
 include/linux/pm.h |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 015b735..a3932c7 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -114,6 +114,12 @@ typedef struct pm_message {
 	int event;
 } pm_message_t;
 
+#ifdef CONFIG_PM
+#define pm_call(x) (x)
+#else
+#define pm_call(x) NULL
+#endif /* CONFIG_PM */
+
 /*
  * Several driver power state transitions are externally visible, affecting
  * the state of pending I/O queues and (for drivers that touch hardware)
-- 
1.5.4.3


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

* Re: [linux-pm] [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-03 14:18 ` Pavel Machek
  2008-03-03 22:42   ` Anton Vorontsov
@ 2008-03-03 22:56   ` David Brownell
  2008-03-03 23:16     ` Pavel Machek
  1 sibling, 1 reply; 8+ messages in thread
From: David Brownell @ 2008-03-03 22:56 UTC (permalink / raw)
  To: linux-pm; +Cc: Pavel Machek, Anton Vorontsov, linux-kernel

On Monday 03 March 2008, Pavel Machek wrote:
> > +/* avoid `defined but not used' warning */
> > +#define pm_call(x) ((x) - 1 ? NULL : NULL)
> > +#endif /* CONFIG_PM */
> > +
> 
> This is evil.

Ugly, yes.  It might merit some casts too.


> Maybe your gcc is smart enough to optimize this away, 
> but I'm not sure mine is.

It'll be a constant expression; it certainly ought to be.


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

* Re: [linux-pm] [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-03 22:56   ` [linux-pm] " David Brownell
@ 2008-03-03 23:16     ` Pavel Machek
  0 siblings, 0 replies; 8+ messages in thread
From: Pavel Machek @ 2008-03-03 23:16 UTC (permalink / raw)
  To: David Brownell; +Cc: linux-pm, Anton Vorontsov, linux-kernel

Hi!


> > > +/* avoid `defined but not used' warning */
> > > +#define pm_call(x) ((x) - 1 ? NULL : NULL)
> > > +#endif /* CONFIG_PM */
> > > +
> > 
> > This is evil.
> 
> Ugly, yes.  It might merit some casts too.
> 
> 
> > Maybe your gcc is smart enough to optimize this away, 
> > but I'm not sure mine is.
> 
> It'll be a constant expression; it certainly ought to be.

Well, we have just fooler compiler to think that x is used, and now we
want it to realize that x is unused and compile it out?

Maybe it is smart enough, but...
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM
  2008-03-03  0:08 ` Arjan van de Ven
  2008-03-03  0:29   ` Rafael J. Wysocki
@ 2008-03-03 23:26   ` Anton Vorontsov
  1 sibling, 0 replies; 8+ messages in thread
From: Anton Vorontsov @ 2008-03-03 23:26 UTC (permalink / raw)
  To: Arjan van de Ven; +Cc: linux-kernel, linux-pm

On Sun, Mar 02, 2008 at 04:08:20PM -0800, Arjan van de Ven wrote:
> On Mon, 3 Mar 2008 02:43:08 +0300
> Anton Vorontsov <cbouatmailru@gmail.com> wrote:
> 
> > Currently drivers handle CONFIG_PM this way:
> > 
> > #ifdef CONFIG_PM
> > drv_suspend() {}
> > drv_resume() {}
> > #else
> > #define drv_suspend NULL
> > #define drv_resume NULL
> > #endif
> > 
> > struct driver drv = {
> > 	.suspend = drv_suspend,
> > 	.resume = drv_resume,
> > };
> > 
> > With this patch, the code above converts into:
> > 
> > drv_suspend() {}
> > drv_resume() {}
> > 
> > struct driver drv = {
> > 	.suspend = pm_call(drv_suspend),
> > 	.resume = pm_call(drv_resume),
> > };
> > 
> > GCC will optimize away suspend/resume calls if they're really
> > not used.
> > 
> 
> 
> to be honest, at this point I would think it's time to remove
> CONFIG_PM, or rather,
> just make it always be there and just get rid of the ifdefs.

Don't be so CONFIG_PM-centric :-)

$ zcat /proc/config.gz | grep CONFIG_PM
# CONFIG_PM is not set

This is machine I use at home.

> We're saving 2 words and a bit of code,
> but only a case that not even the embedded guys use. 

Well, on my ARM machine, with CONFIG_PM=y vmlinux grows by 30KB, half
of that is in drivers/. 30KB is 1% of the vmlinux. Is it enough to
worth saving? I don't know.

On a x86 box, CONFIG_PM=y grows the vmlinux by 400KB (yeah, it's
including ACPI and stuff), though here I didn't count drivers'
suspend/resume hooks contribution share.

-- 
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2

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

end of thread, other threads:[~2008-03-03 23:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-03-02 23:43 [PATCH RFC] introduce pm_call() macro to get rid of most #ifdef CONFIG_PM Anton Vorontsov
2008-03-03  0:08 ` Arjan van de Ven
2008-03-03  0:29   ` Rafael J. Wysocki
2008-03-03 23:26   ` Anton Vorontsov
2008-03-03 14:18 ` Pavel Machek
2008-03-03 22:42   ` Anton Vorontsov
2008-03-03 22:56   ` [linux-pm] " David Brownell
2008-03-03 23:16     ` Pavel Machek

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).