慢慢欣赏linux powerpc中断绑核

如何查看当前中断绑核情况

static int __init proc_interrupts_init(void)
    proc_create("interrupts", 0, NULL, &proc_interrupts_operations);
                                                /\
                                                ||
                                                \/
static const struct file_operations proc_interrupts_operations = {
    .open        = interrupts_open,
    .read        = seq_read,
    .llseek        = seq_lseek,
    .release    = seq_release,
};

interrupts_open
    =>static int interrupts_open(struct inode *inode, struct file *filp)
        return seq_open(filp, &int_seq_ops);
                                /\
                                ||
                                \/                                
                                static const struct seq_operations int_seq_ops = {
                                    .start = int_seq_start,
                                    .next  = int_seq_next,
                                    .stop  = int_seq_stop,
                                    .show  = show_interrupts
                                };
                                
int show_interrupts(struct seq_file *p, void *v)
    /* print header */
    if (i == 0) {
        seq_printf(p, "%*s", prec + 8, "");
        for_each_online_cpu(j)
            seq_printf(p, "CPU%-8d", j);
        seq_putc(p, '\n');
    }
    for_each_online_cpu(j)
        any_count |= kstat_irqs_cpu(i, j);
            =>unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
                struct irq_desc *desc = irq_to_desc(irq);
                return desc ? desc->kstat_irqs[cpu] : 0;
                
                
中断绑核处理
static int setup_affinity(unsigned int irq, struct irq_desc *desc)
    desc->chip->set_affinity(irq, desc->affinity);//mpic->hc_irq.set_affinity = mpic_set_affinity;
        =>int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)//核心思想是公平从头开始分配
            struct mpic *mpic = mpic_from_irq(irq);
            unsigned int src = mpic_irq_to_hw(irq);
            if (mpic->flags & MPIC_SINGLE_DEST_CPU)
                int cpuid = irq_choose_cpu(cpumask);
                    =>static int irq_choose_cpu(const cpumask_t *mask)
                        if (cpumask_equal(mask, cpu_all_mask))
                            /* Round-robin distribution... */
                        do_round_robin:
                            while (!cpu_online(irq_rover)) {
                                if (++irq_rover >= NR_CPUS)
                                    irq_rover = 0;
                            }
                            cpuid = irq_rover;
                            do {
                                if (++irq_rover >= NR_CPUS)
                                    irq_rover = 0;
                            } while (!cpu_online(irq_rover));
                        else {
                            cpuid = cpumask_first_and(mask, cpu_online_mask);
                            if (cpuid >= nr_cpu_ids)
                                goto do_round_robin;
                        }
                        return get_hard_smp_processor_id(cpuid);
                mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), 1 << cpuid);//绑定哪个核则开哪个核的掩码
            
            
一个关于Linux中断的问题:硬件处理,初始化和中断处理            
http://www.elecfans.com/d/725543.html

Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
https://www.cnblogs.com/LittleHann/p/4104598.html        

Linux 中断详解
https://blog.csdn.net/tiangwan2011/article/details/7891818

ARM+Linux中断系统详细分析
https://blog.csdn.net/luteresa/article/details/68061906

ldd3学习之七:中断处理     博客好好学习
http://blog.chinaunix.net/uid-24708340-id-3035617.html
            

你可能感兴趣的:(linux内核,linux,device,driver)