All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add minimal support for software performance counters for ia64
@ 2009-08-19 16:04 William Cohen
  2009-08-19 16:12 ` Peter Zijlstra
  2009-08-19 16:12   ` [PATCH] Add minimal support for software performance counters Ingo Molnar
  0 siblings, 2 replies; 10+ messages in thread
From: William Cohen @ 2009-08-19 16:04 UTC (permalink / raw)
  To: Peter Zijlstra, Paul Mackerras, Ingo Molnar; +Cc: Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 777 bytes --]

The following patch adds minimal support for software performance counters for ia64.

For the kernel the patch enables configuration of the perf counter
option, adds the perf_counter_open syscall, and includes a minimal machine
specific asm/perf.h header file.

For the perf tool the header perf.h includes an ia64 specific section
and the options used in the Makefile were adjusted to allow
compilation on ia64.  The -Wcast-align gives "cast increases required
alignment of target type" warning for the list_for_each_entry()
macro. The "-fno-strict-aliasing" was used to avoid warnings for
"dereferencing type-punned pointer will break strict-aliasing rules"
warnings for sscanf() functions in util/trace-event-parse.c

-Will

Signed-off-by: William Cohen <wcohen@redhat.com>

[-- Attachment #2: perf_ia64a.patch --]
[-- Type: text/plain, Size: 3998 bytes --]

diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 170042b..8471526 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -29,6 +29,7 @@ config IA64
 	select HAVE_KVM
 	select HAVE_ARCH_TRACEHOOK
 	select HAVE_DMA_API_DEBUG
+	select HAVE_PERF_COUNTERS
 	default y
 	help
 	  The Itanium Processor Family is Intel's 64-bit successor to
diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h
index 5a5347f..f69d1c9 100644
--- a/arch/ia64/include/asm/unistd.h
+++ b/arch/ia64/include/asm/unistd.h
@@ -311,11 +311,12 @@
 #define __NR_preadv			1319
 #define __NR_pwritev			1320
 #define __NR_rt_tgsigqueueinfo		1321
+#define __NR_perf_counter_open		1322
 
 #ifdef __KERNEL__
 
 
-#define NR_syscalls			298 /* length of syscall table */
+#define NR_syscalls			299 /* length of syscall table */
 
 /*
  * The following defines stop scripts/checksyscalls.sh from complaining about
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index d0e7d37..4cf88b0 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -1806,6 +1806,7 @@ sys_call_table:
 	data8 sys_preadv
 	data8 sys_pwritev			// 1320
 	data8 sys_rt_tgsigqueueinfo
+	data8 sys_perf_counter_open
 
 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
 #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
diff --git a/include/asm-ia64/perf_counter.h b/include/asm-ia64/perf_counter.h
new file mode 100644
index 0000000..cab4352
--- /dev/null
+++ b/include/asm-ia64/perf_counter.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_IA64_PERF_COUNTER_H
+#define __ASM_IA64_PERF_COUNTER_H
+
+/* IA64 only supports software counters through this interface. */
+static inline void set_perf_counter_pending(void) {}
+
+#define PERF_COUNTER_INDEX_OFFSET	0
+
+#endif /* __ASM_IA64_PERF_COUNTER_H */
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index c481a51..69db3de 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -159,8 +159,10 @@ uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
 
 # If we're on a 64-bit kernel, use -m64
 ifndef NO_64BIT
-	ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
-	  M64 := -m64
+	ifeq ($(patsubst %ia64,%,$(uname_M)),$(uname_M))
+	  ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
+	    M64 := -m64
+	  endif
 	endif
 endif
 
@@ -169,9 +171,9 @@ endif
 #
 # Include saner warnings here, which can catch bugs:
 #
-EXTRA_WARNINGS = -Wcast-align -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
+EXTRA_WARNINGS = -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
 
-CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS)
+CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 -fno-strict-aliasing $(EXTRA_WARNINGS)
 LDFLAGS = -lpthread -lrt -lelf -lm
 ALL_CFLAGS = $(CFLAGS)
 ALL_LDFLAGS = $(LDFLAGS)
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index e5148e2..90179c9 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -41,6 +41,12 @@
 #define cpu_relax()	asm volatile("" ::: "memory");
 #endif
 
+#ifdef __ia64__
+#include "../../arch/ia64/include/asm/unistd.h"
+#define rmb()		asm volatile("" ::: "memory")
+#define cpu_relax()	asm volatile("" ::: "memory");
+#endif
+
 #include <time.h>
 #include <unistd.h>
 #include <sys/types.h>

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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-19 16:04 [PATCH] Add minimal support for software performance counters for ia64 William Cohen
@ 2009-08-19 16:12 ` Peter Zijlstra
  2009-08-19 19:04   ` William Cohen
  2009-08-19 16:12   ` [PATCH] Add minimal support for software performance counters Ingo Molnar
  1 sibling, 1 reply; 10+ messages in thread
From: Peter Zijlstra @ 2009-08-19 16:12 UTC (permalink / raw)
  To: William Cohen; +Cc: Paul Mackerras, Ingo Molnar, Linux Kernel Mailing List

On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
> +#ifdef __ia64__
> +#include "../../arch/ia64/include/asm/unistd.h"
> +#define rmb()          asm volatile("" ::: "memory")
> +#define cpu_relax()    asm volatile("" ::: "memory");
> +#endif

Surely the itanic has a real memory barrier? The kernel seems to use
something along the lines of mf.

Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
"memory"), although we don't seem to have an actual user of cpu_relax()
in perf atm.




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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-19 16:04 [PATCH] Add minimal support for software performance counters for ia64 William Cohen
@ 2009-08-19 16:12   ` Ingo Molnar
  2009-08-19 16:12   ` [PATCH] Add minimal support for software performance counters Ingo Molnar
  1 sibling, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2009-08-19 16:12 UTC (permalink / raw)
  To: William Cohen, Luck, Tony, Fenghua Yu, linux-ia64
  Cc: Peter Zijlstra, Paul Mackerras, Linux Kernel Mailing List


* William Cohen <wcohen@redhat.com> wrote:

> The following patch adds minimal support for software 
> performance counters for ia64.

Nice!

> For the kernel the patch enables configuration of the 
> perf counter option, adds the perf_counter_open 
> syscall, and includes a minimal machine specific 
> asm/perf.h header file.
> 
> For the perf tool the header perf.h includes an ia64 
> specific section and the options used in the Makefile 
> were adjusted to allow compilation on ia64.  The 
> -Wcast-align gives "cast increases required alignment 
> of target type" warning for the list_for_each_entry() 
> macro. The "-fno-strict-aliasing" was used to avoid 
> warnings for "dereferencing type-punned pointer will 
> break strict-aliasing rules" warnings for sscanf() 
> functions in util/trace-event-parse.c

Tony, Fenghua Yu, this patch already depends on .32 
changes in the perfcounters tree - would be OK to you if 
we merged this patch into the perfcounters tree? Plus 
perhaps merge a syscall placeholder patch into the ia64 
tree?

Thanks,

	Ingo

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

* Re: [PATCH] Add minimal support for software performance counters
@ 2009-08-19 16:12   ` Ingo Molnar
  0 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2009-08-19 16:12 UTC (permalink / raw)
  To: William Cohen, Luck, Tony, Fenghua Yu, linux-ia64
  Cc: Peter Zijlstra, Paul Mackerras, Linux Kernel Mailing List


* William Cohen <wcohen@redhat.com> wrote:

> The following patch adds minimal support for software 
> performance counters for ia64.

Nice!

> For the kernel the patch enables configuration of the 
> perf counter option, adds the perf_counter_open 
> syscall, and includes a minimal machine specific 
> asm/perf.h header file.
> 
> For the perf tool the header perf.h includes an ia64 
> specific section and the options used in the Makefile 
> were adjusted to allow compilation on ia64.  The 
> -Wcast-align gives "cast increases required alignment 
> of target type" warning for the list_for_each_entry() 
> macro. The "-fno-strict-aliasing" was used to avoid 
> warnings for "dereferencing type-punned pointer will 
> break strict-aliasing rules" warnings for sscanf() 
> functions in util/trace-event-parse.c

Tony, Fenghua Yu, this patch already depends on .32 
changes in the perfcounters tree - would be OK to you if 
we merged this patch into the perfcounters tree? Plus 
perhaps merge a syscall placeholder patch into the ia64 
tree?

Thanks,

	Ingo

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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-19 16:12 ` Peter Zijlstra
@ 2009-08-19 19:04   ` William Cohen
  2009-08-19 19:06     ` Peter Zijlstra
  0 siblings, 1 reply; 10+ messages in thread
From: William Cohen @ 2009-08-19 19:04 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: Paul Mackerras, Ingo Molnar, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 713 bytes --]

Peter Zijlstra wrote:
> On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
>> +#ifdef __ia64__
>> +#include "../../arch/ia64/include/asm/unistd.h"
>> +#define rmb()          asm volatile("" ::: "memory")
>> +#define cpu_relax()    asm volatile("" ::: "memory");
>> +#endif
> 
> Surely the itanic has a real memory barrier? The kernel seems to use
> something along the lines of mf.
> 
> Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
> "memory"), although we don't seem to have an actual user of cpu_relax()
> in perf atm.
> 
> 
> 

Peter, thanks for the comment. I took a look at the rmb() and cpu_relax() code
in the kernel and revised the patch with the appropriate defines

-Will

[-- Attachment #2: perf_ia64b.patch --]
[-- Type: text/plain, Size: 4010 bytes --]

diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 170042b..8471526 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -29,6 +29,7 @@ config IA64
 	select HAVE_KVM
 	select HAVE_ARCH_TRACEHOOK
 	select HAVE_DMA_API_DEBUG
+	select HAVE_PERF_COUNTERS
 	default y
 	help
 	  The Itanium Processor Family is Intel's 64-bit successor to
diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h
index 5a5347f..f69d1c9 100644
--- a/arch/ia64/include/asm/unistd.h
+++ b/arch/ia64/include/asm/unistd.h
@@ -311,11 +311,12 @@
 #define __NR_preadv			1319
 #define __NR_pwritev			1320
 #define __NR_rt_tgsigqueueinfo		1321
+#define __NR_perf_counter_open		1322
 
 #ifdef __KERNEL__
 
 
-#define NR_syscalls			298 /* length of syscall table */
+#define NR_syscalls			299 /* length of syscall table */
 
 /*
  * The following defines stop scripts/checksyscalls.sh from complaining about
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index d0e7d37..4cf88b0 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -1806,6 +1806,7 @@ sys_call_table:
 	data8 sys_preadv
 	data8 sys_pwritev			// 1320
 	data8 sys_rt_tgsigqueueinfo
+	data8 sys_perf_counter_open
 
 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
 #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
diff --git a/include/asm-ia64/perf_counter.h b/include/asm-ia64/perf_counter.h
new file mode 100644
index 0000000..cab4352
--- /dev/null
+++ b/include/asm-ia64/perf_counter.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_IA64_PERF_COUNTER_H
+#define __ASM_IA64_PERF_COUNTER_H
+
+/* IA64 only supports software counters through this interface. */
+static inline void set_perf_counter_pending(void) {}
+
+#define PERF_COUNTER_INDEX_OFFSET	0
+
+#endif /* __ASM_IA64_PERF_COUNTER_H */
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index c481a51..69db3de 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -159,8 +159,10 @@ uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
 
 # If we're on a 64-bit kernel, use -m64
 ifndef NO_64BIT
-	ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
-	  M64 := -m64
+	ifeq ($(patsubst %ia64,%,$(uname_M)),$(uname_M))
+	  ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
+	    M64 := -m64
+	  endif
 	endif
 endif
 
@@ -169,9 +171,9 @@ endif
 #
 # Include saner warnings here, which can catch bugs:
 #
-EXTRA_WARNINGS = -Wcast-align -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
+EXTRA_WARNINGS = -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
 
-CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS)
+CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 -fno-strict-aliasing $(EXTRA_WARNINGS)
 LDFLAGS = -lpthread -lrt -lelf -lm
 ALL_CFLAGS = $(CFLAGS)
 ALL_LDFLAGS = $(LDFLAGS)
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index e5148e2..c849337 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -41,6 +41,12 @@
 #define cpu_relax()	asm volatile("" ::: "memory");
 #endif
 
+#ifdef __ia64__
+#include "../../arch/ia64/include/asm/unistd.h"
+#define rmb()		asm volatile("mf" ::: "memory")
+#define cpu_relax()	asm volatile("hint @pause" ::: "memory")
+#endif
+
 #include <time.h>
 #include <unistd.h>
 #include <sys/types.h>

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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-19 19:04   ` William Cohen
@ 2009-08-19 19:06     ` Peter Zijlstra
  2009-08-20 21:19       ` William Cohen
  0 siblings, 1 reply; 10+ messages in thread
From: Peter Zijlstra @ 2009-08-19 19:06 UTC (permalink / raw)
  To: William Cohen; +Cc: Paul Mackerras, Ingo Molnar, Linux Kernel Mailing List

On Wed, 2009-08-19 at 15:04 -0400, William Cohen wrote:
> Peter Zijlstra wrote:
> > On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
> >> +#ifdef __ia64__
> >> +#include "../../arch/ia64/include/asm/unistd.h"
> >> +#define rmb()          asm volatile("" ::: "memory")
> >> +#define cpu_relax()    asm volatile("" ::: "memory");
> >> +#endif
> > 
> > Surely the itanic has a real memory barrier? The kernel seems to use
> > something along the lines of mf.
> > 
> > Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
> > "memory"), although we don't seem to have an actual user of cpu_relax()
> > in perf atm.
> > 
> > 
> > 
> 
> Peter, thanks for the comment. I took a look at the rmb() and cpu_relax() code
> in the kernel and revised the patch with the appropriate defines

Looks good now, thanks!


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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-19 19:06     ` Peter Zijlstra
@ 2009-08-20 21:19       ` William Cohen
  2009-08-21 14:25         ` Ingo Molnar
  0 siblings, 1 reply; 10+ messages in thread
From: William Cohen @ 2009-08-20 21:19 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: Paul Mackerras, Ingo Molnar, Linux Kernel Mailing List

Peter Zijlstra wrote:
> On Wed, 2009-08-19 at 15:04 -0400, William Cohen wrote:
>> Peter Zijlstra wrote:
>>> On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
>>>> +#ifdef __ia64__
>>>> +#include "../../arch/ia64/include/asm/unistd.h"
>>>> +#define rmb()          asm volatile("" ::: "memory")
>>>> +#define cpu_relax()    asm volatile("" ::: "memory");
>>>> +#endif
>>> Surely the itanic has a real memory barrier? The kernel seems to use
>>> something along the lines of mf.
>>>
>>> Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
>>> "memory"), although we don't seem to have an actual user of cpu_relax()
>>> in perf atm.
>>>
>>>
>>>
>> Peter, thanks for the comment. I took a look at the rmb() and cpu_relax() code
>> in the kernel and revised the patch with the appropriate defines
> 
> Looks good now, thanks!
> 

When looking through the patch today I realized the new perf_counter.h was
placed in include/asm-ia64. It should be placed in
arch/ia64/include/asm/perf_counter.h.

-Will

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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-20 21:19       ` William Cohen
@ 2009-08-21 14:25         ` Ingo Molnar
  2009-08-21 15:09           ` William Cohen
  0 siblings, 1 reply; 10+ messages in thread
From: Ingo Molnar @ 2009-08-21 14:25 UTC (permalink / raw)
  To: William Cohen; +Cc: Peter Zijlstra, Paul Mackerras, Linux Kernel Mailing List


* William Cohen <wcohen@redhat.com> wrote:

> Peter Zijlstra wrote:
> > On Wed, 2009-08-19 at 15:04 -0400, William Cohen wrote:
> >> Peter Zijlstra wrote:
> >>> On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
> >>>> +#ifdef __ia64__
> >>>> +#include "../../arch/ia64/include/asm/unistd.h"
> >>>> +#define rmb()          asm volatile("" ::: "memory")
> >>>> +#define cpu_relax()    asm volatile("" ::: "memory");
> >>>> +#endif
> >>> Surely the itanic has a real memory barrier? The kernel seems to use
> >>> something along the lines of mf.
> >>>
> >>> Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
> >>> "memory"), although we don't seem to have an actual user of cpu_relax()
> >>> in perf atm.
> >>>
> >>>
> >>>
> >> Peter, thanks for the comment. I took a look at the rmb() and cpu_relax() code
> >> in the kernel and revised the patch with the appropriate defines
> > 
> > Looks good now, thanks!
> > 
> 
> When looking through the patch today I realized the new 
> perf_counter.h was placed in include/asm-ia64. It should be placed 
> in arch/ia64/include/asm/perf_counter.h.

mind sending out a v2 patch with all review feedback folded in, for 
IA64 maintainers to ack if they like it?

Thanks,

	Ingo

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

* Re: [PATCH] Add minimal support for software performance counters for ia64
  2009-08-21 14:25         ` Ingo Molnar
@ 2009-08-21 15:09           ` William Cohen
  2009-08-21 16:37             ` [PATCH, V2] perf_counter, IA64: Add support for software performance counters Ingo Molnar
  0 siblings, 1 reply; 10+ messages in thread
From: William Cohen @ 2009-08-21 15:09 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Peter Zijlstra, Paul Mackerras, Linux Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 1445 bytes --]

Ingo Molnar wrote:
> * William Cohen <wcohen@redhat.com> wrote:
> 
>> Peter Zijlstra wrote:
>>> On Wed, 2009-08-19 at 15:04 -0400, William Cohen wrote:
>>>> Peter Zijlstra wrote:
>>>>> On Wed, 2009-08-19 at 12:04 -0400, William Cohen wrote:
>>>>>> +#ifdef __ia64__
>>>>>> +#include "../../arch/ia64/include/asm/unistd.h"
>>>>>> +#define rmb()          asm volatile("" ::: "memory")
>>>>>> +#define cpu_relax()    asm volatile("" ::: "memory");
>>>>>> +#endif
>>>>> Surely the itanic has a real memory barrier? The kernel seems to use
>>>>> something along the lines of mf.
>>>>>
>>>>> Also, cpu_relax() seems to end up being asm volatile("hint @pause" :::
>>>>> "memory"), although we don't seem to have an actual user of cpu_relax()
>>>>> in perf atm.
>>>>>
>>>>>
>>>>>
>>>> Peter, thanks for the comment. I took a look at the rmb() and cpu_relax() code
>>>> in the kernel and revised the patch with the appropriate defines
>>> Looks good now, thanks!
>>>
>> When looking through the patch today I realized the new 
>> perf_counter.h was placed in include/asm-ia64. It should be placed 
>> in arch/ia64/include/asm/perf_counter.h.
> 
> mind sending out a v2 patch with all review feedback folded in, for 
> IA64 maintainers to ack if they like it?
> 
> Thanks,
> 
> 	Ingo

Hi Ingo,

The following is the revised patch with the corrected macros and the include
file in the correct place.

Signed-off-by: William Cohen <wcohen@redhat.com>

-Will

[-- Attachment #2: perf_ia64c.patch --]
[-- Type: text/plain, Size: 4025 bytes --]

diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 170042b..8471526 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -29,6 +29,7 @@ config IA64
 	select HAVE_KVM
 	select HAVE_ARCH_TRACEHOOK
 	select HAVE_DMA_API_DEBUG
+	select HAVE_PERF_COUNTERS
 	default y
 	help
 	  The Itanium Processor Family is Intel's 64-bit successor to
diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h
index 5a5347f..f69d1c9 100644
--- a/arch/ia64/include/asm/unistd.h
+++ b/arch/ia64/include/asm/unistd.h
@@ -311,11 +311,12 @@
 #define __NR_preadv			1319
 #define __NR_pwritev			1320
 #define __NR_rt_tgsigqueueinfo		1321
+#define __NR_perf_counter_open		1322
 
 #ifdef __KERNEL__
 
 
-#define NR_syscalls			298 /* length of syscall table */
+#define NR_syscalls			299 /* length of syscall table */
 
 /*
  * The following defines stop scripts/checksyscalls.sh from complaining about
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index d0e7d37..4cf88b0 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -1806,6 +1806,7 @@ sys_call_table:
 	data8 sys_preadv
 	data8 sys_pwritev			// 1320
 	data8 sys_rt_tgsigqueueinfo
+	data8 sys_perf_counter_open
 
 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
 #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
diff --git a/arch/ia64/include/asm/perf_counter.h b/arch/ia64/include/asm/perf_counter.h
new file mode 100644
index 0000000..cab4352
--- /dev/null
+++ b/arch/ia64/include/asm/perf_counter.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_IA64_PERF_COUNTER_H
+#define __ASM_IA64_PERF_COUNTER_H
+
+/* IA64 only supports software counters through this interface. */
+static inline void set_perf_counter_pending(void) {}
+
+#define PERF_COUNTER_INDEX_OFFSET	0
+
+#endif /* __ASM_IA64_PERF_COUNTER_H */
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index c481a51..69db3de 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -159,8 +159,10 @@ uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
 
 # If we're on a 64-bit kernel, use -m64
 ifndef NO_64BIT
-	ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
-	  M64 := -m64
+	ifeq ($(patsubst %ia64,%,$(uname_M)),$(uname_M))
+	  ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
+	    M64 := -m64
+	  endif
 	endif
 endif
 
@@ -169,9 +171,9 @@ endif
 #
 # Include saner warnings here, which can catch bugs:
 #
-EXTRA_WARNINGS = -Wcast-align -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
+EXTRA_WARNINGS = -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
 
-CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS)
+CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 -fno-strict-aliasing $(EXTRA_WARNINGS)
 LDFLAGS = -lpthread -lrt -lelf -lm
 ALL_CFLAGS = $(CFLAGS)
 ALL_LDFLAGS = $(LDFLAGS)
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index e5148e2..c849337 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -41,6 +41,12 @@
 #define cpu_relax()	asm volatile("" ::: "memory");
 #endif
 
+#ifdef __ia64__
+#include "../../arch/ia64/include/asm/unistd.h"
+#define rmb()		asm volatile("mf" ::: "memory")
+#define cpu_relax()	asm volatile("hint @pause" ::: "memory")
+#endif
+
 #include <time.h>
 #include <unistd.h>
 #include <sys/types.h>

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

* [PATCH, V2] perf_counter, IA64: Add support for software performance counters
  2009-08-21 15:09           ` William Cohen
@ 2009-08-21 16:37             ` Ingo Molnar
  0 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2009-08-21 16:37 UTC (permalink / raw)
  To: William Cohen; +Cc: Peter Zijlstra, Paul Mackerras, Linux Kernel Mailing List


* William Cohen <wcohen@redhat.com> wrote:

> The following is the revised patch with the corrected macros and 
> the include file in the correct place.

Note, this is not how v2 patches are generally expected to be 
submitted upstream - all info is supposed to be re-submitted with a 
new v2 email title to make it easy and context-less for maintainers.

I've done that here: i've tidied up the changelog (to match IA64 and 
perf_counter patch title standards), added a diffstat, added the 
acks/signoffs the patch got in the discussion and included the whole 
thing below, for IA64 folks to comment on.

Thanks,

	Ingo

---------------------->
Subject: perf_counter, IA64: Add support for software performance counters
From: William Cohen <wcohen@redhat.com>
Date: Fri, 21 Aug 2009 11:09:29 -0400

The patch enables configuration of the perf counter option on
IA64, adds the perf_counter_open syscall, and includes a
minimal machine specific asm/perf.h header file.

For the perf tool the header perf.h includes an ia64 specific
section and the options used in the Makefile were adjusted to
allow compilation on ia64.

[ The -Wcast-align gives "cast increases required alignment of
  target type" warning for the list_for_each_entry() macro. The
  "-fno-strict-aliasing" was used to avoid warnings for
  "dereferencing type-punned pointer will break strict-aliasing
  rules" warnings for sscanf() functions in
  util/trace-event-parse.c ]

Signed-off-by: William Cohen <wcohen@redhat.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <4A8EB8A9.9000900@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 arch/ia64/Kconfig                    |    1 +
 arch/ia64/include/asm/perf_counter.h |    9 +++++++++
 arch/ia64/include/asm/unistd.h       |    3 ++-
 arch/ia64/kernel/entry.S             |    1 +
 tools/perf/Makefile                  |   10 ++++++----
 tools/perf/perf.h                    |    6 ++++++
 6 files changed, 25 insertions(+), 5 deletions(-)

Index: tip/arch/ia64/Kconfig
===================================================================
--- tip.orig/arch/ia64/Kconfig
+++ tip/arch/ia64/Kconfig
@@ -29,6 +29,7 @@ config IA64
 	select HAVE_KVM
 	select HAVE_ARCH_TRACEHOOK
 	select HAVE_DMA_API_DEBUG
+	select HAVE_PERF_COUNTERS
 	default y
 	help
 	  The Itanium Processor Family is Intel's 64-bit successor to
Index: tip/arch/ia64/include/asm/perf_counter.h
===================================================================
--- /dev/null
+++ tip/arch/ia64/include/asm/perf_counter.h
@@ -0,0 +1,9 @@
+#ifndef __ASM_IA64_PERF_COUNTER_H
+#define __ASM_IA64_PERF_COUNTER_H
+
+/* IA64 only supports software counters through this interface. */
+static inline void set_perf_counter_pending(void) {}
+
+#define PERF_COUNTER_INDEX_OFFSET	0
+
+#endif /* __ASM_IA64_PERF_COUNTER_H */
Index: tip/arch/ia64/include/asm/unistd.h
===================================================================
--- tip.orig/arch/ia64/include/asm/unistd.h
+++ tip/arch/ia64/include/asm/unistd.h
@@ -311,11 +311,12 @@
 #define __NR_preadv			1319
 #define __NR_pwritev			1320
 #define __NR_rt_tgsigqueueinfo		1321
+#define __NR_perf_counter_open		1322
 
 #ifdef __KERNEL__
 
 
-#define NR_syscalls			298 /* length of syscall table */
+#define NR_syscalls			299 /* length of syscall table */
 
 /*
  * The following defines stop scripts/checksyscalls.sh from complaining about
Index: tip/arch/ia64/kernel/entry.S
===================================================================
--- tip.orig/arch/ia64/kernel/entry.S
+++ tip/arch/ia64/kernel/entry.S
@@ -1806,6 +1806,7 @@ sys_call_table:
 	data8 sys_preadv
 	data8 sys_pwritev			// 1320
 	data8 sys_rt_tgsigqueueinfo
+	data8 sys_perf_counter_open
 
 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
 #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
Index: tip/tools/perf/Makefile
===================================================================
--- tip.orig/tools/perf/Makefile
+++ tip/tools/perf/Makefile
@@ -159,8 +159,10 @@ uname_V := $(shell sh -c 'uname -v 2>/de
 
 # If we're on a 64-bit kernel, use -m64
 ifndef NO_64BIT
-	ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
-	  M64 := -m64
+	ifeq ($(patsubst %ia64,%,$(uname_M)),$(uname_M))
+	  ifneq ($(patsubst %64,%,$(uname_M)),$(uname_M))
+	    M64 := -m64
+	  endif
 	endif
 endif
 
@@ -169,9 +171,9 @@ endif
 #
 # Include saner warnings here, which can catch bugs:
 #
-EXTRA_WARNINGS = -Wcast-align -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
+EXTRA_WARNINGS = -Wformat -Wformat-security -Wformat-y2k -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
 
-CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS)
+CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -fstack-protector-all -D_FORTIFY_SOURCE=2 -fno-strict-aliasing $(EXTRA_WARNINGS)
 LDFLAGS = -lpthread -lrt -lelf -lm
 ALL_CFLAGS = $(CFLAGS)
 ALL_LDFLAGS = $(LDFLAGS)
Index: tip/tools/perf/perf.h
===================================================================
--- tip.orig/tools/perf/perf.h
+++ tip/tools/perf/perf.h
@@ -41,6 +41,12 @@
 #define cpu_relax()	asm volatile("" ::: "memory");
 #endif
 
+#ifdef __ia64__
+#include "../../arch/ia64/include/asm/unistd.h"
+#define rmb()		asm volatile("mf" ::: "memory")
+#define cpu_relax()	asm volatile("hint @pause" ::: "memory")
+#endif
+
 #include <time.h>
 #include <unistd.h>
 #include <sys/types.h>

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

end of thread, other threads:[~2009-08-21 16:38 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-19 16:04 [PATCH] Add minimal support for software performance counters for ia64 William Cohen
2009-08-19 16:12 ` Peter Zijlstra
2009-08-19 19:04   ` William Cohen
2009-08-19 19:06     ` Peter Zijlstra
2009-08-20 21:19       ` William Cohen
2009-08-21 14:25         ` Ingo Molnar
2009-08-21 15:09           ` William Cohen
2009-08-21 16:37             ` [PATCH, V2] perf_counter, IA64: Add support for software performance counters Ingo Molnar
2009-08-19 16:12 ` [PATCH] Add minimal support for software performance counters for ia64 Ingo Molnar
2009-08-19 16:12   ` [PATCH] Add minimal support for software performance counters Ingo Molnar

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.