forked from Minki/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
@ -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 New Issue
Block a user