forked from mirrors/linux
		
	ia64: Remove perfmon
perfmon has been marked broken and thus been disabled for all builds for more than two years. Remove it entirely. Cc: Anant Thazhemadam <anant.thazhemadam@gmail.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Enthusiastically-ACKed-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Tony Luck <tony.luck@intel.com> Link: https://lore.kernel.org/r/20200911094920.1173631-1-hch@lst.de
This commit is contained in:
		
							parent
							
								
									f4d51dffc6
								
							
						
					
					
						commit
						ecf5b72d5f
					
				
					 20 changed files with 4 additions and 6998 deletions
				
			
		|  | @ -362,15 +362,6 @@ config ARCH_PROC_KCORE_TEXT | |||
| config IA64_MCA_RECOVERY | ||||
| 	tristate "MCA recovery from errors other than TLB." | ||||
| 
 | ||||
| config PERFMON | ||||
| 	bool "Performance monitor support" | ||||
| 	depends on BROKEN | ||||
| 	help | ||||
| 	  Selects whether support for the IA-64 performance monitor hardware | ||||
| 	  is included in the kernel.  This makes some kernel data-structures a | ||||
| 	  little bigger and slows down execution a bit, but it is generally | ||||
| 	  a good idea to turn this on.  If you're unsure, say Y. | ||||
| 
 | ||||
| config IA64_PALINFO | ||||
| 	tristate "/proc/pal support" | ||||
| 	help | ||||
|  |  | |||
|  | @ -11,7 +11,6 @@ CONFIG_SMP=y | |||
| CONFIG_NR_CPUS=2 | ||||
| CONFIG_PREEMPT=y | ||||
| # CONFIG_VIRTUAL_MEM_MAP is not set | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_EFI_VARS=y | ||||
| CONFIG_BINFMT_MISC=m | ||||
|  |  | |||
|  | @ -18,7 +18,6 @@ CONFIG_IA64_CYCLONE=y | |||
| CONFIG_SMP=y | ||||
| CONFIG_HOTPLUG_CPU=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_KEXEC=y | ||||
| CONFIG_CRASH_DUMP=y | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ CONFIG_NR_CPUS=512 | |||
| CONFIG_HOTPLUG_CPU=y | ||||
| CONFIG_SPARSEMEM_MANUAL=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_EFI_VARS=y | ||||
| CONFIG_BINFMT_MISC=m | ||||
|  |  | |||
|  | @ -21,7 +21,6 @@ CONFIG_HOTPLUG_CPU=y | |||
| CONFIG_PERMIT_BSP_REMOVE=y | ||||
| CONFIG_FORCE_CPEI_RETARGET=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_KEXEC=y | ||||
| CONFIG_EFI_VARS=y | ||||
|  |  | |||
|  | @ -10,7 +10,6 @@ CONFIG_NR_CPUS=16 | |||
| CONFIG_HOTPLUG_CPU=y | ||||
| CONFIG_FLATMEM_MANUAL=y | ||||
| CONFIG_IA64_MCA_RECOVERY=y | ||||
| CONFIG_PERFMON=y | ||||
| CONFIG_IA64_PALINFO=y | ||||
| CONFIG_CRASH_DUMP=y | ||||
| CONFIG_EFI_VARS=y | ||||
|  |  | |||
|  | @ -280,15 +280,6 @@ struct thread_struct { | |||
| 	__u64 map_base;			/* base address for get_unmapped_area() */ | ||||
| 	__u64 rbs_bot;			/* the base address for the RBS */ | ||||
| 	int last_fph_cpu;		/* CPU that may hold the contents of f32-f127 */ | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	void *pfm_context;		     /* pointer to detailed PMU context */ | ||||
| 	unsigned long pfm_needs_checking;    /* when >0, pending perfmon work on kernel exit */ | ||||
| # define INIT_THREAD_PM		.pfm_context =		NULL,     \ | ||||
| 				.pfm_needs_checking =	0UL, | ||||
| #else | ||||
| # define INIT_THREAD_PM | ||||
| #endif | ||||
| 	unsigned long dbr[IA64_NUM_DBG_REGS]; | ||||
| 	unsigned long ibr[IA64_NUM_DBG_REGS]; | ||||
| 	struct ia64_fpreg fph[96];	/* saved/loaded on demand */ | ||||
|  | @ -301,7 +292,6 @@ struct thread_struct { | |||
| 	.map_base =	DEFAULT_MAP_BASE,			\ | ||||
| 	.rbs_bot =	STACK_TOP - DEFAULT_USER_STACK_SIZE,	\ | ||||
| 	.last_fph_cpu =  -1,					\ | ||||
| 	INIT_THREAD_PM						\ | ||||
| 	.dbr =		{0, },					\ | ||||
| 	.ibr =		{0, },					\ | ||||
| 	.fph =		{{{{0}}}, }				\ | ||||
|  |  | |||
|  | @ -31,16 +31,8 @@ extern struct task_struct *ia64_switch_to (void *next_task); | |||
| extern void ia64_save_extra (struct task_struct *task); | ||||
| extern void ia64_load_extra (struct task_struct *task); | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
|   DECLARE_PER_CPU(unsigned long, pfm_syst_info); | ||||
| # define PERFMON_IS_SYSWIDE() (__this_cpu_read(pfm_syst_info) & 0x1) | ||||
| #else | ||||
| # define PERFMON_IS_SYSWIDE() (0) | ||||
| #endif | ||||
| 
 | ||||
| #define IA64_HAS_EXTRA_STATE(t)							\ | ||||
| 	((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID)	\ | ||||
| 	 || PERFMON_IS_SYSWIDE()) | ||||
| 	((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID)) | ||||
| 
 | ||||
| #define __switch_to(prev,next,last) do {							 \ | ||||
| 	if (IA64_HAS_EXTRA_STATE(prev))								 \ | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ endif | |||
| extra-y	:= head.o vmlinux.lds | ||||
| 
 | ||||
| obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o	\
 | ||||
| 	 irq_lsapic.o ivt.o pal.o patch.o process.o perfmon.o ptrace.o sal.o		\
 | ||||
| 	 irq_lsapic.o ivt.o pal.o patch.o process.o ptrace.o sal.o		\
 | ||||
| 	 salinfo.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \
 | ||||
| 	 unwind.o mca.o mca_asm.o topology.o dma-mapping.o iosapic.o acpi.o \
 | ||||
| 	 acpi-ext.o | ||||
|  | @ -21,7 +21,6 @@ obj-$(CONFIG_IA64_PALINFO)	+= palinfo.o | |||
| obj-$(CONFIG_MODULES)		+= module.o | ||||
| obj-$(CONFIG_SMP)		+= smp.o smpboot.o | ||||
| obj-$(CONFIG_NUMA)		+= numa.o | ||||
| obj-$(CONFIG_PERFMON)		+= perfmon_default_smpl.o | ||||
| obj-$(CONFIG_IA64_CYCLONE)	+= cyclone.o | ||||
| obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o | ||||
| obj-$(CONFIG_KPROBES)		+= kprobes.o | ||||
|  |  | |||
|  | @ -40,10 +40,6 @@ | |||
| #include <asm/hw_irq.h> | ||||
| #include <asm/tlbflush.h> | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| # include <asm/perfmon.h> | ||||
| #endif | ||||
| 
 | ||||
| #define IRQ_DEBUG	0 | ||||
| 
 | ||||
| #define IRQ_VECTOR_UNASSIGNED	(0) | ||||
|  | @ -627,9 +623,6 @@ init_IRQ (void) | |||
| 				    "irq_move"); | ||||
| 	} | ||||
| #endif | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	pfm_init_percpu(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -51,10 +51,6 @@ | |||
| 
 | ||||
| #include "entry.h" | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| # include <asm/perfmon.h> | ||||
| #endif | ||||
| 
 | ||||
| #include "sigframe.h" | ||||
| 
 | ||||
| void (*ia64_mark_idle)(int); | ||||
|  | @ -174,15 +170,6 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall) | |||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	if (current->thread.pfm_needs_checking) | ||||
| 		/*
 | ||||
| 		 * Note: pfm_handle_work() allow us to call it with interrupts | ||||
| 		 * disabled, and may enable interrupts within the function. | ||||
| 		 */ | ||||
| 		pfm_handle_work(); | ||||
| #endif | ||||
| 
 | ||||
| 	/* deal with pending signal delivery */ | ||||
| 	if (test_thread_flag(TIF_SIGPENDING)) { | ||||
| 		local_irq_enable();	/* force interrupt enable */ | ||||
|  | @ -264,41 +251,15 @@ void arch_cpu_idle(void) | |||
| void | ||||
| ia64_save_extra (struct task_struct *task) | ||||
| { | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	unsigned long info; | ||||
| #endif | ||||
| 
 | ||||
| 	if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0) | ||||
| 		ia64_save_debug_regs(&task->thread.dbr[0]); | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0) | ||||
| 		pfm_save_regs(task); | ||||
| 
 | ||||
| 	info = __this_cpu_read(pfm_syst_info); | ||||
| 	if (info & PFM_CPUINFO_SYST_WIDE) | ||||
| 		pfm_syst_wide_update_task(task, info, 0); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void | ||||
| ia64_load_extra (struct task_struct *task) | ||||
| { | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	unsigned long info; | ||||
| #endif | ||||
| 
 | ||||
| 	if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0) | ||||
| 		ia64_load_debug_regs(&task->thread.dbr[0]); | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0) | ||||
| 		pfm_load_regs(task); | ||||
| 
 | ||||
| 	info = __this_cpu_read(pfm_syst_info); | ||||
| 	if (info & PFM_CPUINFO_SYST_WIDE) | ||||
| 		pfm_syst_wide_update_task(task, info, 1); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -432,11 +393,6 @@ copy_thread(unsigned long clone_flags, unsigned long user_stack_base, | |||
| 	 */ | ||||
| 	child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) | ||||
| 				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	if (current->thread.pfm_context) | ||||
| 		pfm_inherit(p, child_ptregs); | ||||
| #endif | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
|  | @ -563,15 +519,6 @@ exit_thread (struct task_struct *tsk) | |||
| { | ||||
| 
 | ||||
| 	ia64_drop_fpu(tsk); | ||||
| #ifdef CONFIG_PERFMON | ||||
|        /* if needed, stop monitoring and flush state to perfmon context */ | ||||
| 	if (tsk->thread.pfm_context) | ||||
| 		pfm_exit_thread(tsk); | ||||
| 
 | ||||
| 	/* free debug register resources */ | ||||
| 	if (tsk->thread.flags & IA64_THREAD_DBG_VALID) | ||||
| 		pfm_release_debug_registers(tsk); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| unsigned long | ||||
|  |  | |||
|  | @ -30,9 +30,6 @@ | |||
| #include <asm/rse.h> | ||||
| #include <linux/uaccess.h> | ||||
| #include <asm/unwind.h> | ||||
| #ifdef CONFIG_PERFMON | ||||
| #include <asm/perfmon.h> | ||||
| #endif | ||||
| 
 | ||||
| #include "entry.h" | ||||
| 
 | ||||
|  | @ -1951,27 +1948,6 @@ access_uarea(struct task_struct *child, unsigned long addr, | |||
| 				"address 0x%lx\n", addr); | ||||
| 		return -1; | ||||
| 	} | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	/*
 | ||||
| 	 * Check if debug registers are used by perfmon. This | ||||
| 	 * test must be done once we know that we can do the | ||||
| 	 * operation, i.e. the arguments are all valid, but | ||||
| 	 * before we start modifying the state. | ||||
| 	 * | ||||
| 	 * Perfmon needs to keep a count of how many processes | ||||
| 	 * are trying to modify the debug registers for system | ||||
| 	 * wide monitoring sessions. | ||||
| 	 * | ||||
| 	 * We also include read access here, because they may | ||||
| 	 * cause the PMU-installed debug register state | ||||
| 	 * (dbr[], ibr[]) to be reset. The two arrays are also | ||||
| 	 * used by perfmon, but we do not use | ||||
| 	 * IA64_THREAD_DBG_VALID. The registers are restored | ||||
| 	 * by the PMU context switch code. | ||||
| 	 */ | ||||
| 	if (pfm_use_debug_registers(child)) | ||||
| 		return -1; | ||||
| #endif | ||||
| 
 | ||||
| 	if (!(child->thread.flags & IA64_THREAD_DBG_VALID)) { | ||||
| 		child->thread.flags |= IA64_THREAD_DBG_VALID; | ||||
|  |  | |||
|  | @ -355,10 +355,6 @@ smp_callin (void) | |||
| 	extern void ia64_init_itm(void); | ||||
| 	extern volatile int time_keeper_id; | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	extern void pfm_init_percpu(void); | ||||
| #endif | ||||
| 
 | ||||
| 	cpuid = smp_processor_id(); | ||||
| 	phys_id = hard_smp_processor_id(); | ||||
| 	itc_master = time_keeper_id; | ||||
|  | @ -389,10 +385,6 @@ smp_callin (void) | |||
| 
 | ||||
| 	ia64_mca_cmc_vector_setup();	/* Setup vector on AP */ | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	pfm_init_percpu(); | ||||
| #endif | ||||
| 
 | ||||
| 	local_irq_enable(); | ||||
| 
 | ||||
| 	if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) { | ||||
|  |  | |||
|  | @ -160,7 +160,7 @@ | |||
| 148	common	mmap2				sys_mmap2 | ||||
| 149	common	pciconfig_read			sys_pciconfig_read | ||||
| 150	common	pciconfig_write			sys_pciconfig_write | ||||
| 151	common	perfmonctl			sys_perfmonctl | ||||
| 151	common	perfmonctl			sys_ni_syscall | ||||
| 152	common	sigaltstack			sys_sigaltstack | ||||
| 153	common	rt_sigaction			sys_rt_sigaction | ||||
| 154	common	rt_sigpending			sys_rt_sigpending | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ lib-y := io.o __divsi3.o __udivsi3.o __modsi3.o __umodsi3.o		\ | |||
| 
 | ||||
| lib-$(CONFIG_ITANIUM)	+= copy_page.o copy_user.o memcpy.o | ||||
| lib-$(CONFIG_MCKINLEY)	+= copy_page_mck.o memcpy_mck.o | ||||
| lib-$(CONFIG_PERFMON)	+= carta_random.o | ||||
| 
 | ||||
| AFLAGS___divdi3.o	= | ||||
| AFLAGS___udivdi3.o	= -DUNSIGNED | ||||
|  |  | |||
|  | @ -1,55 +0,0 @@ | |||
| /* SPDX-License-Identifier: GPL-2.0 */ | ||||
| /* | ||||
|  * Fast, simple, yet decent quality random number generator based on | ||||
|  * a paper by David G. Carta ("Two Fast Implementations of the | ||||
|  * `Minimal Standard' Random Number Generator," Communications of the | ||||
|  * ACM, January, 1990). | ||||
|  * | ||||
|  * Copyright (C) 2002 Hewlett-Packard Co | ||||
|  *	David Mosberger-Tang <davidm@hpl.hp.com>
 | ||||
|  */ | ||||
| 
 | ||||
| #include <asm/asmmacro.h> | ||||
| 
 | ||||
| #define a	r2 | ||||
| #define m	r3 | ||||
| #define lo	r8 | ||||
| #define hi	r9 | ||||
| #define t0	r16 | ||||
| #define t1	r17 | ||||
| #define	seed	r32 | ||||
| 
 | ||||
| GLOBAL_ENTRY(carta_random32) | ||||
| 	movl	a = (16807 << 16) | 16807 | ||||
| 	;;
 | ||||
| 	pmpyshr2.u t0 = a, seed, 0 | ||||
| 	pmpyshr2.u t1 = a, seed, 16 | ||||
| 	;;
 | ||||
| 	unpack2.l t0 = t1, t0 | ||||
| 	dep	m = -1, r0, 0, 31 | ||||
| 	;;
 | ||||
| 	zxt4	lo = t0 | ||||
| 	shr.u	hi = t0, 32 | ||||
| 	;;
 | ||||
| 	dep	t0 = 0, hi, 15, 49	// t0 = (hi & 0x7fff) | ||||
| 	;;
 | ||||
| 	shl	t0 = t0, 16		// t0 = (hi & 0x7fff) << 16 | ||||
| 	shr	t1 = hi, 15		// t1 = (hi >> 15) | ||||
| 	;;
 | ||||
| 	add	lo = lo, t0 | ||||
| 	;;
 | ||||
| 	cmp.gtu	p6, p0 = lo, m | ||||
| 	;;
 | ||||
| (p6)	and	lo = lo, m | ||||
| 	;;
 | ||||
| (p6)	add	lo = 1, lo | ||||
| 	;;
 | ||||
| 	add	lo = lo, t1 | ||||
| 	;;
 | ||||
| 	cmp.gtu p6, p0 = lo, m | ||||
| 	;;
 | ||||
| (p6)	and	lo = lo, m | ||||
| 	;;
 | ||||
| (p6)	add	lo = 1, lo | ||||
| 	br.ret.sptk.many rp | ||||
| END(carta_random32) | ||||
|  | @ -8,4 +8,3 @@ DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \ | |||
| 		timer_int.o ) | ||||
| 
 | ||||
| oprofile-y := $(DRIVER_OBJS) init.o backtrace.o | ||||
| oprofile-$(CONFIG_PERFMON) += perfmon.o | ||||
|  |  | |||
|  | @ -18,21 +18,11 @@ extern void ia64_backtrace(struct pt_regs * const regs, unsigned int depth); | |||
| 
 | ||||
| int __init oprofile_arch_init(struct oprofile_operations *ops) | ||||
| { | ||||
| 	int ret = -ENODEV; | ||||
| 
 | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	/* perfmon_init() can fail, but we have no way to report it */ | ||||
| 	ret = perfmon_init(ops); | ||||
| #endif | ||||
| 	ops->backtrace = ia64_backtrace; | ||||
| 
 | ||||
| 	return ret; | ||||
| 	return -ENODEV; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void oprofile_arch_exit(void) | ||||
| { | ||||
| #ifdef CONFIG_PERFMON | ||||
| 	perfmon_exit(); | ||||
| #endif | ||||
| } | ||||
|  |  | |||
|  | @ -1,99 +0,0 @@ | |||
| /**
 | ||||
|  * @file perfmon.c | ||||
|  * | ||||
|  * @remark Copyright 2003 OProfile authors | ||||
|  * @remark Read the file COPYING | ||||
|  * | ||||
|  * @author John Levon <levon@movementarian.org> | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/oprofile.h> | ||||
| #include <linux/sched.h> | ||||
| #include <asm/perfmon.h> | ||||
| #include <asm/ptrace.h> | ||||
| #include <asm/errno.h> | ||||
| 
 | ||||
| static int allow_ints; | ||||
| 
 | ||||
| static int | ||||
| perfmon_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, | ||||
|                 struct pt_regs *regs, unsigned long stamp) | ||||
| { | ||||
| 	int event = arg->pmd_eventid; | ||||
|   | ||||
| 	arg->ovfl_ctrl.bits.reset_ovfl_pmds = 1; | ||||
| 
 | ||||
| 	/* the owner of the oprofile event buffer may have exited
 | ||||
| 	 * without perfmon being shutdown (e.g. SIGSEGV) | ||||
| 	 */ | ||||
| 	if (allow_ints) | ||||
| 		oprofile_add_sample(regs, event); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static int perfmon_start(void) | ||||
| { | ||||
| 	allow_ints = 1; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void perfmon_stop(void) | ||||
| { | ||||
| 	allow_ints = 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #define OPROFILE_FMT_UUID { \ | ||||
| 	0x77, 0x7a, 0x6e, 0x61, 0x20, 0x65, 0x73, 0x69, 0x74, 0x6e, 0x72, 0x20, 0x61, 0x65, 0x0a, 0x6c } | ||||
| 
 | ||||
| static pfm_buffer_fmt_t oprofile_fmt = { | ||||
|  	.fmt_name 	    = "oprofile_format", | ||||
|  	.fmt_uuid	    = OPROFILE_FMT_UUID, | ||||
|  	.fmt_handler	    = perfmon_handler, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static char *get_cpu_type(void) | ||||
| { | ||||
| 	__u8 family = local_cpu_data->family; | ||||
| 
 | ||||
| 	switch (family) { | ||||
| 		case 0x07: | ||||
| 			return "ia64/itanium"; | ||||
| 		case 0x1f: | ||||
| 			return "ia64/itanium2"; | ||||
| 		default: | ||||
| 			return "ia64/ia64"; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* all the ops are handled via userspace for IA64 perfmon */ | ||||
| 
 | ||||
| static int using_perfmon; | ||||
| 
 | ||||
| int perfmon_init(struct oprofile_operations *ops) | ||||
| { | ||||
| 	int ret = pfm_register_buffer_fmt(&oprofile_fmt); | ||||
| 	if (ret) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	ops->cpu_type = get_cpu_type(); | ||||
| 	ops->start = perfmon_start; | ||||
| 	ops->stop = perfmon_stop; | ||||
| 	using_perfmon = 1; | ||||
| 	printk(KERN_INFO "oprofile: using perfmon.\n"); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void perfmon_exit(void) | ||||
| { | ||||
| 	if (!using_perfmon) | ||||
| 		return; | ||||
| 
 | ||||
| 	pfm_unregister_buffer_fmt(oprofile_fmt.fmt_uuid); | ||||
| } | ||||
		Loading…
	
		Reference in a new issue
	
	 Christoph Hellwig
						Christoph Hellwig