This patch adds a new line to /proc/interrupts to account for the
doorbell interrupts that each hardware thread has received. The total
interrupt count in /proc/stat will now also include doorbells.
 # cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
 16:        551       1267        281        175      XICS Level     IPI
LOC:       2037       1503       1688       1625   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
CNT:          0          0          0          0   Performance monitoring interrupts
MCE:          0          0          0          0   Machine check exceptions
DBL:         42        550         20         91   Doorbell interrupts
Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
		
	
			
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Author: Kumar Gala <galak@kernel.crashing.org>
 | 
						|
 *
 | 
						|
 * Copyright 2009 Freescale Semiconductor Inc.
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute  it and/or modify it
 | 
						|
 * under  the terms of  the GNU General  Public License as published by the
 | 
						|
 * Free Software Foundation;  either version 2 of the  License, or (at your
 | 
						|
 * option) any later version.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/stddef.h>
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/smp.h>
 | 
						|
#include <linux/threads.h>
 | 
						|
#include <linux/hardirq.h>
 | 
						|
 | 
						|
#include <asm/dbell.h>
 | 
						|
#include <asm/irq_regs.h>
 | 
						|
 | 
						|
#ifdef CONFIG_SMP
 | 
						|
void doorbell_setup_this_cpu(void)
 | 
						|
{
 | 
						|
	unsigned long tag = mfspr(SPRN_DOORBELL_CPUTAG) & PPC_DBELL_TAG_MASK;
 | 
						|
 | 
						|
	smp_muxed_ipi_set_data(smp_processor_id(), tag);
 | 
						|
}
 | 
						|
 | 
						|
void doorbell_cause_ipi(int cpu, unsigned long data)
 | 
						|
{
 | 
						|
	/* Order previous accesses vs. msgsnd, which is treated as a store */
 | 
						|
	mb();
 | 
						|
	ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, data);
 | 
						|
}
 | 
						|
 | 
						|
void doorbell_exception(struct pt_regs *regs)
 | 
						|
{
 | 
						|
	struct pt_regs *old_regs = set_irq_regs(regs);
 | 
						|
 | 
						|
	irq_enter();
 | 
						|
 | 
						|
	may_hard_irq_enable();
 | 
						|
 | 
						|
	__get_cpu_var(irq_stat).doorbell_irqs++;
 | 
						|
 | 
						|
	smp_ipi_demux();
 | 
						|
 | 
						|
	irq_exit();
 | 
						|
	set_irq_regs(old_regs);
 | 
						|
}
 | 
						|
#else /* CONFIG_SMP */
 | 
						|
void doorbell_exception(struct pt_regs *regs)
 | 
						|
{
 | 
						|
	printk(KERN_WARNING "Received doorbell on non-smp system\n");
 | 
						|
}
 | 
						|
#endif /* CONFIG_SMP */
 | 
						|
 |