* [PATCH 0/3] Introduce and use DO_ONCE statement expression macro
@ 2009-05-21 23:00 Joe Perches
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:00 UTC (permalink / raw)
To: linux-kernel
Cc: cpufreq, Dave Jones, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
The printk_once macro in kernel.h is limited to printk
This generalizes the functionality of printk_once and
allows statements like DO_ONCE(pr_info("foo\n"))
and DO_ONCE(initialize(foo));
Joe Perches (3):
kernel.h: Add DO_ONCE statement expression macro
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
kernel.h: Remove unused printk_once
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 4 ++--
include/linux/kernel.h | 27 ++++++++++++---------------
2 files changed, 14 insertions(+), 17 deletions(-)
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:00 [PATCH 0/3] Introduce and use DO_ONCE statement expression macro Joe Perches
@ 2009-05-21 23:00 ` Joe Perches
2009-05-21 23:27 ` Randy Dunlap
` (3 more replies)
2009-05-21 23:00 ` [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix Joe Perches
2009-05-21 23:00 ` [PATCH 3/3] kernel.h: Remove unused printk_once Joe Perches
2 siblings, 4 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:00 UTC (permalink / raw)
To: linux-kernel
Cc: cpufreq, Dave Jones, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
Add a DO_ONCE statement expression analogous to printk_once
that executes any arbitrary statement exactly once.
This will take the place of printk_once so that
DO_ONCE(pr_<foo>) or any other statement performed
a single time may be easily written.
Signed-off-by: Joe Perches <joe@perches.com>
---
include/linux/kernel.h | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 883cd44..a5520c9 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -637,6 +637,18 @@ static inline void ftrace_dump(void) { }
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+/*
+ * Do something once (analogous to WARN_ONCE() et al):
+ */
+#define DO_ONCE(x...) ({ \
+ static bool __done = false; \
+ \
+ if (!__done) { \
+ x; \
+ __done = true; \
+ } \
+})
+
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
--
1.6.3.1.10.g659a0.dirty
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
2009-05-21 23:00 [PATCH 0/3] Introduce and use DO_ONCE statement expression macro Joe Perches
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
@ 2009-05-21 23:00 ` Joe Perches
2009-05-21 23:26 ` Dave Jones
2009-05-21 23:00 ` [PATCH 3/3] kernel.h: Remove unused printk_once Joe Perches
2 siblings, 1 reply; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:00 UTC (permalink / raw)
To: linux-kernel
Cc: cpufreq, Dave Jones, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
Allows removal of printk_once.
Signed-off-by: Joe Perches <joe@perches.com>
---
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 208ecf6..f569cff 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
policy->cpuinfo.transition_latency > 20 * 1000) {
policy->cpuinfo.transition_latency = 20 * 1000;
- printk_once(KERN_INFO "Capping off P-state tranision"
- " latency at 20 uS\n");
+ DO_ONCE(printk(KERN_INFO
+ "P-state transition latency capped at 20 uS\n"));
}
/* table init */
--
1.6.3.1.10.g659a0.dirty
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/3] kernel.h: Remove unused printk_once
2009-05-21 23:00 [PATCH 0/3] Introduce and use DO_ONCE statement expression macro Joe Perches
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
2009-05-21 23:00 ` [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix Joe Perches
@ 2009-05-21 23:00 ` Joe Perches
2 siblings, 0 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:00 UTC (permalink / raw)
To: linux-kernel
Cc: cpufreq, Dave Jones, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
Signed-off-by: Joe Perches <joe@perches.com>
---
include/linux/kernel.h | 15 ---------------
1 files changed, 0 insertions(+), 15 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index a5520c9..5e37171 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -243,18 +243,6 @@ extern int printk_ratelimit(void);
extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
unsigned int interval_msec);
-/*
- * Print a one-time message (analogous to WARN_ONCE() et al):
- */
-#define printk_once(x...) ({ \
- static int __print_once = 1; \
- \
- if (__print_once) { \
- __print_once = 0; \
- printk(x); \
- } \
-})
-
void log_buf_kexec_setup(void);
#else
static inline int vprintk(const char *s, va_list args)
@@ -268,9 +256,6 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \
unsigned int interval_msec) \
{ return false; }
-/* No effect, but we still get type checking even in the !PRINTK case: */
-#define printk_once(x...) printk(x)
-
static inline void log_buf_kexec_setup(void)
{
}
--
1.6.3.1.10.g659a0.dirty
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
2009-05-21 23:00 ` [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix Joe Perches
@ 2009-05-21 23:26 ` Dave Jones
2009-05-21 23:34 ` Joe Perches
0 siblings, 1 reply; 16+ messages in thread
From: Dave Jones @ 2009-05-21 23:26 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
On Thu, May 21, 2009 at 04:00:23PM -0700, Joe Perches wrote:
> Allows removal of printk_once.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> index 208ecf6..f569cff 100644
> --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> @@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
> if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
> policy->cpuinfo.transition_latency > 20 * 1000) {
> policy->cpuinfo.transition_latency = 20 * 1000;
> - printk_once(KERN_INFO "Capping off P-state tranision"
> - " latency at 20 uS\n");
> + DO_ONCE(printk(KERN_INFO
> + "P-state transition latency capped at 20 uS\n"));
ewww. This looks pretty ugly to me. Anyone else?
Dave
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
@ 2009-05-21 23:27 ` Randy Dunlap
2009-05-21 23:32 ` Joe Perches
2009-05-22 0:27 ` Al Viro
` (2 subsequent siblings)
3 siblings, 1 reply; 16+ messages in thread
From: Randy Dunlap @ 2009-05-21 23:27 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
Joe Perches wrote:
> Add a DO_ONCE statement expression analogous to printk_once
> that executes any arbitrary statement exactly once.
>
> This will take the place of printk_once so that
> DO_ONCE(pr_<foo>) or any other statement performed
> a single time may be easily written.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> include/linux/kernel.h | 12 ++++++++++++
> 1 files changed, 12 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index 883cd44..a5520c9 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -637,6 +637,18 @@ static inline void ftrace_dump(void) { }
> #define swap(a, b) \
> do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
>
> +/*
> + * Do something once (analogous to WARN_ONCE() et al):
> + */
> +#define DO_ONCE(x...) ({ \
> + static bool __done = false; \
> + \
> + if (!__done) { \
> + x; \
> + __done = true; \
Hi Joe,
Since x is of arbitrary size & time duration, I think that x; should follow
__done = true;
instead of being before it, as was done in printk_once(). Otherwise there
could be a sizable window there x could be done more than once.
> + } \
> +})
> +
> /**
> * container_of - cast a member of a structure out to the containing structure
> * @ptr: the pointer to the member.
--
~Randy
LPC 2009, Sept. 23-25, Portland, Oregon
http://linuxplumbersconf.org/2009/
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:27 ` Randy Dunlap
@ 2009-05-21 23:32 ` Joe Perches
2009-05-21 23:36 ` H. Peter Anvin
2009-05-21 23:41 ` Alan Cox
0 siblings, 2 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:32 UTC (permalink / raw)
To: Randy Dunlap
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
On Thu, 2009-05-21 at 16:27 -0700, Randy Dunlap wrote:
> Joe Perches wrote:
> > Add a DO_ONCE statement expression analogous to printk_once
> > that executes any arbitrary statement exactly once.
> Since x is of arbitrary size & time duration, I think that x; should follow
> __done = true;
> instead of being before it, as was done in printk_once(). Otherwise there
> could be a sizable window there x could be done more than once.
Makes sense to me.
Add a DO_ONCE statement expression analogous to printk_once
that executes any arbitrary statement exactly once.
This will take the place of printk_once so that
DO_ONCE(pr_<foo>) or any other statement performed
a single time may be easily written.
Signed-off-by: Joe Perches <joe@perches.com>
---
include/linux/kernel.h | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 883cd44..a5520c9 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -637,7 +637,18 @@ static inline void ftrace_dump(void) { }
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+/*
+ * Do something once (analogous to WARN_ONCE() et al):
+ */
+#define DO_ONCE(x...) ({ \
+ static bool __done = false; \
+ \
+ if (!__done) { \
+ __done = true; \
+ x; \
+ } \
+})
+
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
--
1.6.3.1.10.g659a0.dirty
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
2009-05-21 23:26 ` Dave Jones
@ 2009-05-21 23:34 ` Joe Perches
2009-05-21 23:47 ` Dave Jones
0 siblings, 1 reply; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:34 UTC (permalink / raw)
To: Dave Jones
Cc: linux-kernel, cpufreq, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
On Thu, 2009-05-21 at 19:26 -0400, Dave Jones wrote:
> On Thu, May 21, 2009 at 04:00:23PM -0700, Joe Perches wrote:
> > diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > index 208ecf6..f569cff 100644
> > --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > @@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
> > if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
> > policy->cpuinfo.transition_latency > 20 * 1000) {
> > policy->cpuinfo.transition_latency = 20 * 1000;
> > - printk_once(KERN_INFO "Capping off P-state tranision"
> > - " latency at 20 uS\n");
> > + DO_ONCE(printk(KERN_INFO
> > + "P-state transition latency capped at 20 uS\n"));
>
> ewww. This looks pretty ugly to me. Anyone else?
What look ugly?
The macro use or the newline between KERN_INFO and "P-"
or the reformatting of the quoted string?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:32 ` Joe Perches
@ 2009-05-21 23:36 ` H. Peter Anvin
2009-05-21 23:41 ` Alan Cox
1 sibling, 0 replies; 16+ messages in thread
From: H. Peter Anvin @ 2009-05-21 23:36 UTC (permalink / raw)
To: Joe Perches
Cc: Randy Dunlap, linux-kernel, cpufreq, Dave Jones,
Greg Kroah-Hartman, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
Joe Perches wrote:
>
> Add a DO_ONCE statement expression analogous to printk_once
> that executes any arbitrary statement exactly once.
>
If you're truly going to make that guarantee you should use an atomic
test and set.
-hpa
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:32 ` Joe Perches
2009-05-21 23:36 ` H. Peter Anvin
@ 2009-05-21 23:41 ` Alan Cox
1 sibling, 0 replies; 16+ messages in thread
From: Alan Cox @ 2009-05-21 23:41 UTC (permalink / raw)
To: Joe Perches
Cc: Randy Dunlap, linux-kernel, cpufreq, Dave Jones,
Greg Kroah-Hartman, H. Peter Anvin, Ingo Molnar, x86, Len Brown,
Mike Travis, Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
> Add a DO_ONCE statement expression analogous to printk_once
> that executes any arbitrary statement exactly once.
Your implementation is racy. Its also hiding stuff in macro magic which
is asking for accidents to happen.
The natural kernel way to write this is
if (!test_and_set_bit(....))
which is a lot more obvious than a magic macro, doesn't race and can use
other bits in an existing set of flags and be used as a
"do-once-for-this-object-instance" - which is almost always want you want.
Alan
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
2009-05-21 23:34 ` Joe Perches
@ 2009-05-21 23:47 ` Dave Jones
2009-05-21 23:52 ` Joe Perches
0 siblings, 1 reply; 16+ messages in thread
From: Dave Jones @ 2009-05-21 23:47 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
On Thu, May 21, 2009 at 04:34:01PM -0700, Joe Perches wrote:
> On Thu, 2009-05-21 at 19:26 -0400, Dave Jones wrote:
> > On Thu, May 21, 2009 at 04:00:23PM -0700, Joe Perches wrote:
> > > diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > > index 208ecf6..f569cff 100644
> > > --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > > +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
> > > @@ -693,8 +693,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
> > > if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&
> > > policy->cpuinfo.transition_latency > 20 * 1000) {
> > > policy->cpuinfo.transition_latency = 20 * 1000;
> > > - printk_once(KERN_INFO "Capping off P-state tranision"
> > > - " latency at 20 uS\n");
> > > + DO_ONCE(printk(KERN_INFO
> > > + "P-state transition latency capped at 20 uS\n"));
> >
> > ewww. This looks pretty ugly to me. Anyone else?
>
> What look ugly?
>
> The macro use or the newline between KERN_INFO and "P-"
> or the reformatting of the quoted string?
I just think it's a less readable variant of the same thing.
The shouty macro, the extra level of brackets, the whole thing
just seems to be ugly to me with no redeeming feature.
What does doing this change really bring us?
Dave
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix
2009-05-21 23:47 ` Dave Jones
@ 2009-05-21 23:52 ` Joe Perches
0 siblings, 0 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-21 23:52 UTC (permalink / raw)
To: Dave Jones
Cc: linux-kernel, cpufreq, Greg Kroah-Hartman, H. Peter Anvin,
Ingo Molnar, x86, Len Brown, Mike Travis, Rusty Russell,
Thomas Gleixner, Venkatesh Pallipadi
On Thu, 2009-05-21 at 19:47 -0400, Dave Jones wrote:
> I just think it's a less readable variant of the same thing.
> The shouty macro, the extra level of brackets, the whole thing
> just seems to be ugly to me with no redeeming feature.
>
> What does doing this change really bring us?
The ability to use pr_<foo> types rather than printk_once(KERN_<foo>
and have the pr_fmt macro function correctly.
DO_ONCE(pr_info(
vs
printk_once(KERN_INFO
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
2009-05-21 23:27 ` Randy Dunlap
@ 2009-05-22 0:27 ` Al Viro
2009-05-22 1:09 ` Joe Perches
2009-05-25 6:45 ` Rusty Russell
2009-05-26 2:42 ` Andrew Morton
3 siblings, 1 reply; 16+ messages in thread
From: Al Viro @ 2009-05-22 0:27 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
On Thu, May 21, 2009 at 04:00:22PM -0700, Joe Perches wrote:
> Add a DO_ONCE statement expression analogous to printk_once
> that executes any arbitrary statement exactly once.
>
> This will take the place of printk_once so that
> DO_ONCE(pr_<foo>) or any other statement performed
> a single time may be easily written.
Interesting, how telling somebody that they need to learn C is considered
an unacceptable thing to do. Hostile to newbies, or some such. Introducing
more magic that has to be learnt if one wants to read the kernel source, OTOH,
is just fine...
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-22 0:27 ` Al Viro
@ 2009-05-22 1:09 ` Joe Perches
0 siblings, 0 replies; 16+ messages in thread
From: Joe Perches @ 2009-05-22 1:09 UTC (permalink / raw)
To: Al Viro
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
On Fri, 2009-05-22 at 01:27 +0100, Al Viro wrote:
> On Thu, May 21, 2009 at 04:00:22PM -0700, Joe Perches wrote:
> > Add a DO_ONCE statement expression analogous to printk_once
> > that executes any arbitrary statement exactly once.
> >
> > This will take the place of printk_once so that
> > DO_ONCE(pr_<foo>) or any other statement performed
> > a single time may be easily written.
>
> Interesting, how telling somebody that they need to learn C is considered
> an unacceptable thing to do. Hostile to newbies, or some such. Introducing
> more magic that has to be learnt if one wants to read the kernel source, OTOH,
> is just fine...
I'd be fine if the printk_once macro helper went away.
It was added in commit f036be96dd9ce442ffb9ab33e3c165f5178815c0
If the helper exists though, I think it should work with
all of the pr_<foo> variants.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
2009-05-21 23:27 ` Randy Dunlap
2009-05-22 0:27 ` Al Viro
@ 2009-05-25 6:45 ` Rusty Russell
2009-05-26 2:42 ` Andrew Morton
3 siblings, 0 replies; 16+ messages in thread
From: Rusty Russell @ 2009-05-25 6:45 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Thomas Gleixner, Venkatesh Pallipadi
On Fri, 22 May 2009 08:30:22 am Joe Perches wrote:
> Add a DO_ONCE statement expression analogous to printk_once
> that executes any arbitrary statement exactly once.
>
> This will take the place of printk_once so that
> DO_ONCE(pr_<foo>) or any other statement performed
> a single time may be easily written.
If you're going to use a statement expression, was the intent to make
it usable for a test? If so, you want something vaguely like:
#define DO_ONCE(x...) ({ \
static bool __done = false; \
bool did = !__done; \
if (!__done) { \
x; \
__done = true; \
} \
did; \
})
Otherwise, why not just use a normal do {} while (0) ?
Anyway, statements in macros leave me uncomfortable. I prefer explicit
ONCE() macro which can be tested.
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/3] kernel.h: Add DO_ONCE statement expression macro
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
` (2 preceding siblings ...)
2009-05-25 6:45 ` Rusty Russell
@ 2009-05-26 2:42 ` Andrew Morton
3 siblings, 0 replies; 16+ messages in thread
From: Andrew Morton @ 2009-05-26 2:42 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, cpufreq, Dave Jones, Greg Kroah-Hartman,
H. Peter Anvin, Ingo Molnar, x86, Len Brown, Mike Travis,
Rusty Russell, Thomas Gleixner, Venkatesh Pallipadi
On Thu, 21 May 2009 16:00:22 -0700 Joe Perches <joe@perches.com> wrote:
> +/*
> + * Do something once (analogous to WARN_ONCE() et al):
> + */
> +#define DO_ONCE(x...) ({ \
> + static bool __done = false; \
> + \
> + if (!__done) { \
> + x; \
> + __done = true; \
> + } \
> +})
Every single call site for this macro will be mind-bogglingly ugly and
complex callers won't look like C at all.
It would be much better to replace
DO_ONCE(code-sequence);
with
if (ONCE()) {
code-sequence;
}
I think that's fairly natural and clear and will allow us to clean up a
large number of callsites many of which do the same thing in different
ways, some of them buggily.
And yeah, if this is to be core kernel infrastructure then the default
implementation shouldn't be racy on SMP/preempt.
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2009-05-26 2:43 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-21 23:00 [PATCH 0/3] Introduce and use DO_ONCE statement expression macro Joe Perches
2009-05-21 23:00 ` [PATCH 1/3] kernel.h: Add " Joe Perches
2009-05-21 23:27 ` Randy Dunlap
2009-05-21 23:32 ` Joe Perches
2009-05-21 23:36 ` H. Peter Anvin
2009-05-21 23:41 ` Alan Cox
2009-05-22 0:27 ` Al Viro
2009-05-22 1:09 ` Joe Perches
2009-05-25 6:45 ` Rusty Russell
2009-05-26 2:42 ` Andrew Morton
2009-05-21 23:00 ` [PATCH 2/3] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: Use DO_ONCE & spelling fix Joe Perches
2009-05-21 23:26 ` Dave Jones
2009-05-21 23:34 ` Joe Perches
2009-05-21 23:47 ` Dave Jones
2009-05-21 23:52 ` Joe Perches
2009-05-21 23:00 ` [PATCH 3/3] kernel.h: Remove unused printk_once Joe Perches
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).