Loading MAINTAINERS +2 −2 Original line number Diff line number Diff line Loading @@ -1023,8 +1023,8 @@ W: http://www.ia64-linux.org/ S: Maintained SN-IA64 (Itanium) SUB-PLATFORM P: Jesse Barnes M: jbarnes@sgi.com P: Greg Edwards M: edwardsg@sgi.com L: linux-altix@sgi.com L: linux-ia64@vger.kernel.org W: http://www.sgi.com/altix Loading arch/ia64/kernel/entry.S +2 −2 Original line number Diff line number Diff line Loading @@ -1182,7 +1182,7 @@ ENTRY(notify_resume_user) ;; (pNonSys) mov out2=0 // out2==0 => not a syscall .fframe 16 .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!) .spillsp ar.unat, 16 st8 [sp]=r9,-16 // allocate space for ar.unat and save it st8 [out1]=loc1,-8 // save ar.pfs, out1=&sigscratch .body Loading @@ -1208,7 +1208,7 @@ GLOBAL_ENTRY(sys_rt_sigsuspend) adds out2=8,sp // out2=&sigscratch->ar_pfs ;; .fframe 16 .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!) .spillsp ar.unat, 16 st8 [sp]=r9,-16 // allocate space for ar.unat and save it st8 [out2]=loc1,-8 // save ar.pfs, out2=&sigscratch .body Loading arch/ia64/kernel/mca.c +2 −2 Original line number Diff line number Diff line Loading @@ -1390,8 +1390,7 @@ ia64_mca_init(void) register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); #ifdef CONFIG_ACPI /* Setup the CPEI/P vector and handler */ cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI); /* Setup the CPEI/P handler */ register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); #endif Loading Loading @@ -1436,6 +1435,7 @@ ia64_mca_late_init(void) #ifdef CONFIG_ACPI /* Setup the CPEI/P vector and handler */ cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI); init_timer(&cpe_poll_timer); cpe_poll_timer.function = ia64_mca_cpe_poll; Loading arch/ia64/kernel/minstate.h +1 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ (pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \ (pKStk) ld8 r3 = [r3];; \ (pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \ (pKStk) addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \ (pKStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \ (pUStk) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \ (pUStk) addl r22=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \ ;; \ Loading @@ -50,7 +50,6 @@ (pUStk) mov r23=ar.bspstore; /* save ar.bspstore */ \ (pUStk) dep r22=-1,r22,61,3; /* compute kernel virtual addr of RBS */ \ ;; \ (pKStk) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \ (pUStk) mov ar.bspstore=r22; /* switch to kernel RBS */ \ ;; \ (pUStk) mov r18=ar.bsp; \ Loading arch/ia64/kernel/perfmon.c +160 −15 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ * Version Perfmon-2.x is a rewrite of perfmon-1.x * by Stephane Eranian, Hewlett Packard Co. * * Copyright (C) 1999-2003, 2005 Hewlett Packard Co * Copyright (C) 1999-2005 Hewlett Packard Co * Stephane Eranian <eranian@hpl.hp.com> * David Mosberger-Tang <davidm@hpl.hp.com> * Loading Loading @@ -497,6 +497,9 @@ typedef struct { static pfm_stats_t pfm_stats[NR_CPUS]; static pfm_session_t pfm_sessions; /* global sessions information */ static spinlock_t pfm_alt_install_check = SPIN_LOCK_UNLOCKED; static pfm_intr_handler_desc_t *pfm_alt_intr_handler; static struct proc_dir_entry *perfmon_dir; static pfm_uuid_t pfm_null_uuid = {0,}; Loading Loading @@ -606,6 +609,7 @@ DEFINE_PER_CPU(unsigned long, pfm_syst_info); DEFINE_PER_CPU(struct task_struct *, pmu_owner); DEFINE_PER_CPU(pfm_context_t *, pmu_ctx); DEFINE_PER_CPU(unsigned long, pmu_activation_number); EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info); /* forward declaration */ Loading Loading @@ -1325,7 +1329,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu) error_conflict: DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n", pfm_sessions.pfs_sys_session[cpu]->pid, smp_processor_id())); cpu)); abort: UNLOCK_PFS(flags); Loading Loading @@ -5555,6 +5559,7 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs) int ret; this_cpu = get_cpu(); if (likely(!pfm_alt_intr_handler)) { min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min; max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max; Loading @@ -5575,6 +5580,11 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs) pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles; } } else { (*pfm_alt_intr_handler->handler)(irq, arg, regs); } put_cpu_no_resched(); return IRQ_HANDLED; } Loading Loading @@ -6425,6 +6435,141 @@ static struct irqaction perfmon_irqaction = { .name = "perfmon" }; static void pfm_alt_save_pmu_state(void *data) { struct pt_regs *regs; regs = ia64_task_regs(current); DPRINT(("called\n")); /* * should not be necessary but * let's take not risk */ pfm_clear_psr_up(); pfm_clear_psr_pp(); ia64_psr(regs)->pp = 0; /* * This call is required * May cause a spurious interrupt on some processors */ pfm_freeze_pmu(); ia64_srlz_d(); } void pfm_alt_restore_pmu_state(void *data) { struct pt_regs *regs; regs = ia64_task_regs(current); DPRINT(("called\n")); /* * put PMU back in state expected * by perfmon */ pfm_clear_psr_up(); pfm_clear_psr_pp(); ia64_psr(regs)->pp = 0; /* * perfmon runs with PMU unfrozen at all times */ pfm_unfreeze_pmu(); ia64_srlz_d(); } int pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl) { int ret, i; int reserve_cpu; /* some sanity checks */ if (hdl == NULL || hdl->handler == NULL) return -EINVAL; /* do the easy test first */ if (pfm_alt_intr_handler) return -EBUSY; /* one at a time in the install or remove, just fail the others */ if (!spin_trylock(&pfm_alt_install_check)) { return -EBUSY; } /* reserve our session */ for_each_online_cpu(reserve_cpu) { ret = pfm_reserve_session(NULL, 1, reserve_cpu); if (ret) goto cleanup_reserve; } /* save the current system wide pmu states */ ret = on_each_cpu(pfm_alt_save_pmu_state, NULL, 0, 1); if (ret) { DPRINT(("on_each_cpu() failed: %d\n", ret)); goto cleanup_reserve; } /* officially change to the alternate interrupt handler */ pfm_alt_intr_handler = hdl; spin_unlock(&pfm_alt_install_check); return 0; cleanup_reserve: for_each_online_cpu(i) { /* don't unreserve more than we reserved */ if (i >= reserve_cpu) break; pfm_unreserve_session(NULL, 1, i); } spin_unlock(&pfm_alt_install_check); return ret; } EXPORT_SYMBOL_GPL(pfm_install_alt_pmu_interrupt); int pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl) { int i; int ret; if (hdl == NULL) return -EINVAL; /* cannot remove someone else's handler! */ if (pfm_alt_intr_handler != hdl) return -EINVAL; /* one at a time in the install or remove, just fail the others */ if (!spin_trylock(&pfm_alt_install_check)) { return -EBUSY; } pfm_alt_intr_handler = NULL; ret = on_each_cpu(pfm_alt_restore_pmu_state, NULL, 0, 1); if (ret) { DPRINT(("on_each_cpu() failed: %d\n", ret)); } for_each_online_cpu(i) { pfm_unreserve_session(NULL, 1, i); } spin_unlock(&pfm_alt_install_check); return 0; } EXPORT_SYMBOL_GPL(pfm_remove_alt_pmu_interrupt); /* * perfmon initialization routine, called from the initcall() table */ Loading Loading
MAINTAINERS +2 −2 Original line number Diff line number Diff line Loading @@ -1023,8 +1023,8 @@ W: http://www.ia64-linux.org/ S: Maintained SN-IA64 (Itanium) SUB-PLATFORM P: Jesse Barnes M: jbarnes@sgi.com P: Greg Edwards M: edwardsg@sgi.com L: linux-altix@sgi.com L: linux-ia64@vger.kernel.org W: http://www.sgi.com/altix Loading
arch/ia64/kernel/entry.S +2 −2 Original line number Diff line number Diff line Loading @@ -1182,7 +1182,7 @@ ENTRY(notify_resume_user) ;; (pNonSys) mov out2=0 // out2==0 => not a syscall .fframe 16 .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!) .spillsp ar.unat, 16 st8 [sp]=r9,-16 // allocate space for ar.unat and save it st8 [out1]=loc1,-8 // save ar.pfs, out1=&sigscratch .body Loading @@ -1208,7 +1208,7 @@ GLOBAL_ENTRY(sys_rt_sigsuspend) adds out2=8,sp // out2=&sigscratch->ar_pfs ;; .fframe 16 .spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!) .spillsp ar.unat, 16 st8 [sp]=r9,-16 // allocate space for ar.unat and save it st8 [out2]=loc1,-8 // save ar.pfs, out2=&sigscratch .body Loading
arch/ia64/kernel/mca.c +2 −2 Original line number Diff line number Diff line Loading @@ -1390,8 +1390,7 @@ ia64_mca_init(void) register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction); #ifdef CONFIG_ACPI /* Setup the CPEI/P vector and handler */ cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI); /* Setup the CPEI/P handler */ register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); #endif Loading Loading @@ -1436,6 +1435,7 @@ ia64_mca_late_init(void) #ifdef CONFIG_ACPI /* Setup the CPEI/P vector and handler */ cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI); init_timer(&cpe_poll_timer); cpe_poll_timer.function = ia64_mca_cpe_poll; Loading
arch/ia64/kernel/minstate.h +1 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ (pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \ (pKStk) ld8 r3 = [r3];; \ (pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \ (pKStk) addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \ (pKStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \ (pUStk) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \ (pUStk) addl r22=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \ ;; \ Loading @@ -50,7 +50,6 @@ (pUStk) mov r23=ar.bspstore; /* save ar.bspstore */ \ (pUStk) dep r22=-1,r22,61,3; /* compute kernel virtual addr of RBS */ \ ;; \ (pKStk) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \ (pUStk) mov ar.bspstore=r22; /* switch to kernel RBS */ \ ;; \ (pUStk) mov r18=ar.bsp; \ Loading
arch/ia64/kernel/perfmon.c +160 −15 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ * Version Perfmon-2.x is a rewrite of perfmon-1.x * by Stephane Eranian, Hewlett Packard Co. * * Copyright (C) 1999-2003, 2005 Hewlett Packard Co * Copyright (C) 1999-2005 Hewlett Packard Co * Stephane Eranian <eranian@hpl.hp.com> * David Mosberger-Tang <davidm@hpl.hp.com> * Loading Loading @@ -497,6 +497,9 @@ typedef struct { static pfm_stats_t pfm_stats[NR_CPUS]; static pfm_session_t pfm_sessions; /* global sessions information */ static spinlock_t pfm_alt_install_check = SPIN_LOCK_UNLOCKED; static pfm_intr_handler_desc_t *pfm_alt_intr_handler; static struct proc_dir_entry *perfmon_dir; static pfm_uuid_t pfm_null_uuid = {0,}; Loading Loading @@ -606,6 +609,7 @@ DEFINE_PER_CPU(unsigned long, pfm_syst_info); DEFINE_PER_CPU(struct task_struct *, pmu_owner); DEFINE_PER_CPU(pfm_context_t *, pmu_ctx); DEFINE_PER_CPU(unsigned long, pmu_activation_number); EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info); /* forward declaration */ Loading Loading @@ -1325,7 +1329,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu) error_conflict: DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n", pfm_sessions.pfs_sys_session[cpu]->pid, smp_processor_id())); cpu)); abort: UNLOCK_PFS(flags); Loading Loading @@ -5555,6 +5559,7 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs) int ret; this_cpu = get_cpu(); if (likely(!pfm_alt_intr_handler)) { min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min; max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max; Loading @@ -5575,6 +5580,11 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs) pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles; } } else { (*pfm_alt_intr_handler->handler)(irq, arg, regs); } put_cpu_no_resched(); return IRQ_HANDLED; } Loading Loading @@ -6425,6 +6435,141 @@ static struct irqaction perfmon_irqaction = { .name = "perfmon" }; static void pfm_alt_save_pmu_state(void *data) { struct pt_regs *regs; regs = ia64_task_regs(current); DPRINT(("called\n")); /* * should not be necessary but * let's take not risk */ pfm_clear_psr_up(); pfm_clear_psr_pp(); ia64_psr(regs)->pp = 0; /* * This call is required * May cause a spurious interrupt on some processors */ pfm_freeze_pmu(); ia64_srlz_d(); } void pfm_alt_restore_pmu_state(void *data) { struct pt_regs *regs; regs = ia64_task_regs(current); DPRINT(("called\n")); /* * put PMU back in state expected * by perfmon */ pfm_clear_psr_up(); pfm_clear_psr_pp(); ia64_psr(regs)->pp = 0; /* * perfmon runs with PMU unfrozen at all times */ pfm_unfreeze_pmu(); ia64_srlz_d(); } int pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl) { int ret, i; int reserve_cpu; /* some sanity checks */ if (hdl == NULL || hdl->handler == NULL) return -EINVAL; /* do the easy test first */ if (pfm_alt_intr_handler) return -EBUSY; /* one at a time in the install or remove, just fail the others */ if (!spin_trylock(&pfm_alt_install_check)) { return -EBUSY; } /* reserve our session */ for_each_online_cpu(reserve_cpu) { ret = pfm_reserve_session(NULL, 1, reserve_cpu); if (ret) goto cleanup_reserve; } /* save the current system wide pmu states */ ret = on_each_cpu(pfm_alt_save_pmu_state, NULL, 0, 1); if (ret) { DPRINT(("on_each_cpu() failed: %d\n", ret)); goto cleanup_reserve; } /* officially change to the alternate interrupt handler */ pfm_alt_intr_handler = hdl; spin_unlock(&pfm_alt_install_check); return 0; cleanup_reserve: for_each_online_cpu(i) { /* don't unreserve more than we reserved */ if (i >= reserve_cpu) break; pfm_unreserve_session(NULL, 1, i); } spin_unlock(&pfm_alt_install_check); return ret; } EXPORT_SYMBOL_GPL(pfm_install_alt_pmu_interrupt); int pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl) { int i; int ret; if (hdl == NULL) return -EINVAL; /* cannot remove someone else's handler! */ if (pfm_alt_intr_handler != hdl) return -EINVAL; /* one at a time in the install or remove, just fail the others */ if (!spin_trylock(&pfm_alt_install_check)) { return -EBUSY; } pfm_alt_intr_handler = NULL; ret = on_each_cpu(pfm_alt_restore_pmu_state, NULL, 0, 1); if (ret) { DPRINT(("on_each_cpu() failed: %d\n", ret)); } for_each_online_cpu(i) { pfm_unreserve_session(NULL, 1, i); } spin_unlock(&pfm_alt_install_check); return 0; } EXPORT_SYMBOL_GPL(pfm_remove_alt_pmu_interrupt); /* * perfmon initialization routine, called from the initcall() table */ Loading