2015-04-08 03:59:53

by Yunlong Song

[permalink] [raw]
Subject: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

Commit 31a9883106cc ("perf record: Add clockid parameter") used
CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
11 SP2), thus there is a building error when making perf:

builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)
make[2]: *** [builtin-record.o] Error 1
make[2]: *** Waiting for unfinished jobs....
LD bench/perf-in.o
LD tests/perf-in.o
make[1]: *** [perf-in.o] Error 2
make: *** [all] Error 2

So define this macro if it is not defined.

Signed-off-by: Yunlong Song <[email protected]>
---
tools/perf/builtin-record.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index cfdff50..5b0962a 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -731,6 +731,9 @@ struct clockid_map {
#ifndef CLOCK_TAI
#define CLOCK_TAI 11
#endif
+#ifndef CLOCK_MONOTONIC_RAW
+#define CLOCK_MONOTONIC_RAW 4
+#endif

static const struct clockid_map clockids[] = {
/* available for all events, NMI safe */
--
1.8.5.5


2015-04-08 08:55:36

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

On Wed, Apr 08, 2015 at 12:02:28PM +0800, Yunlong Song wrote:
> Commit 31a9883106cc ("perf record: Add clockid parameter") used
> CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
> CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
> 11 SP2), thus there is a building error when making perf:
>
> builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)

Weird that, CLOCK_MONOTONIC_RAW is said to be in the kernel since
2.6.28, SLES11 SP2 is 3.0 based, SP1 is 2.6.32.

Now the original SLES11 started life with 2.6.27, so it looks like
someone forgot to update their kernel headers when upgrading.

2015-04-08 12:49:22

by Yunlong Song

[permalink] [raw]
Subject: Re: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

On 2015/4/8 16:55, Peter Zijlstra wrote:
> On Wed, Apr 08, 2015 at 12:02:28PM +0800, Yunlong Song wrote:
>> Commit 31a9883106cc ("perf record: Add clockid parameter") used
>> CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
>> CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
>> 11 SP2), thus there is a building error when making perf:
>>
>> builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)
>
> Weird that, CLOCK_MONOTONIC_RAW is said to be in the kernel since
> 2.6.28, SLES11 SP2 is 3.0 based, SP1 is 2.6.32.
>
> Now the original SLES11 started life with 2.6.27, so it looks like
> someone forgot to update their kernel headers when upgrading.
>
>
>
> .
>

Hi, Peter,

SLES 11 SP2 uses linux-kernel-headers-2.6.32-1.4.13, which really defines CLOCK_MONOTONIC_RAW
in <linux/time.h>. But the perf.h which is included in builtin-record.c uses <time.h> rather
than <linux/time.h>, and <time.h> finally includes <bits/time.h>. Both <time.h> and <bits/time.h>
belong to glibc-devel package, which is glibc-devel-2.11.3-17.31.1 for SLES11 SP2, and it does
not define CLOCK_MONOTONIC_RAW indeed. However, for the latest OSes (or say distributions), the
corresponding glibc-devel packages have already defined CLOCK_MONOTONIC_RAW.

--
Thanks,
Yunlong Song

2015-04-08 13:03:09

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

Em Wed, Apr 08, 2015 at 12:02:28PM +0800, Yunlong Song escreveu:
> Commit 31a9883106cc ("perf record: Add clockid parameter") used
> CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
> CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
> 11 SP2), thus there is a building error when making perf:
>
> builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)
> make[2]: *** [builtin-record.o] Error 1
> make[2]: *** Waiting for unfinished jobs....
> LD bench/perf-in.o
> LD tests/perf-in.o
> make[1]: *** [perf-in.o] Error 2
> make: *** [all] Error 2
>
> So define this macro if it is not defined.

Since I am fixing that pull request batch, I am folding this patch into
Peter's original, adding credit to you, ok?

- Arnaldo

> Signed-off-by: Yunlong Song <[email protected]>
> ---
> tools/perf/builtin-record.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index cfdff50..5b0962a 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -731,6 +731,9 @@ struct clockid_map {
> #ifndef CLOCK_TAI
> #define CLOCK_TAI 11
> #endif
> +#ifndef CLOCK_MONOTONIC_RAW
> +#define CLOCK_MONOTONIC_RAW 4
> +#endif
>
> static const struct clockid_map clockids[] = {
> /* available for all events, NMI safe */
> --
> 1.8.5.5

2015-04-08 13:11:38

by Yunlong Song

[permalink] [raw]
Subject: Re: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

On 2015/4/8 21:03, Arnaldo Carvalho de Melo wrote:
> Em Wed, Apr 08, 2015 at 12:02:28PM +0800, Yunlong Song escreveu:
>> Commit 31a9883106cc ("perf record: Add clockid parameter") used
>> CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
>> CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
>> 11 SP2), thus there is a building error when making perf:
>>
>> builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)
>> make[2]: *** [builtin-record.o] Error 1
>> make[2]: *** Waiting for unfinished jobs....
>> LD bench/perf-in.o
>> LD tests/perf-in.o
>> make[1]: *** [perf-in.o] Error 2
>> make: *** [all] Error 2
>>
>> So define this macro if it is not defined.
>
> Since I am fixing that pull request batch, I am folding this patch into
> Peter's original, adding credit to you, ok?
>
> - Arnaldo

OK.

--
Thanks,
Yunlong Song

2015-04-08 13:33:39

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf record: Conditionally define CLOCK_MONOTONIC_RAW for older OSes

Em Wed, Apr 08, 2015 at 09:10:47PM +0800, Yunlong Song escreveu:
> On 2015/4/8 21:03, Arnaldo Carvalho de Melo wrote:
> > Em Wed, Apr 08, 2015 at 12:02:28PM +0800, Yunlong Song escreveu:
> >> Commit 31a9883106cc ("perf record: Add clockid parameter") used
> >> CLOCK_MONOTONIC_RAW in the struct clockid_map clockids[], but the
> >> CLOCK_MONOTONIC_RAW macro is not defined in older releases (e.g., SLES
> >> 11 SP2), thus there is a building error when making perf:
> >>
> >> builtin-record.c:738: error: ‘CLOCK_MONOTONIC_RAW’ undeclared here (not in a function)
> >> make[2]: *** [builtin-record.o] Error 1
> >> make[2]: *** Waiting for unfinished jobs....
> >> LD bench/perf-in.o
> >> LD tests/perf-in.o
> >> make[1]: *** [perf-in.o] Error 2
> >> make: *** [all] Error 2
> >>
> >> So define this macro if it is not defined.
> >
> > Since I am fixing that pull request batch, I am folding this patch into
> > Peter's original, adding credit to you, ok?
> >
> > - Arnaldo
>
> OK.

Thanks, that helps keeping the tree bisectable :-)

- Arnaldo