 a6a058e52a
			
		
	
	
	a6a058e52a
	
	
	
		
			
			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 */
 | |
| 
 |