cregit-Linux how code gets into the kernel

Release 4.14 arch/powerpc/kernel/dbell.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>
#include <asm/kvm_ppc.h>

#ifdef CONFIG_SMP

/*
 * Doorbells must only be used if CPU_FTR_DBELL is available.
 * msgsnd is used in HV, and msgsndp is used in !HV.
 *
 * These should be used by platform code that is aware of restrictions.
 * Other arch code should use ->cause_ipi.
 *
 * doorbell_global_ipi() sends a dbell to any target CPU.
 * Must be used only by architectures that address msgsnd target
 * by PIR/get_hard_smp_processor_id.
 */

void doorbell_global_ipi(int cpu) { u32 tag = get_hard_smp_processor_id(cpu); kvmppc_set_host_ipi(cpu, 1); /* Order previous accesses vs. msgsnd, which is treated as a store */ ppc_msgsnd_sync(); ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag); }

Contributors

PersonTokensPropCommitsCommitProp
Nicholas Piggin2055.56%250.00%
Benjamin Herrenschmidt925.00%125.00%
Milton D. Miller II719.44%125.00%
Total36100.00%4100.00%

/* * doorbell_core_ipi() sends a dbell to a target CPU in the same core. * Must be used only by architectures that address msgsnd target * by TIR/cpu_thread_in_core. */
void doorbell_core_ipi(int cpu) { u32 tag = cpu_thread_in_core(cpu); kvmppc_set_host_ipi(cpu, 1); /* Order previous accesses vs. msgsnd, which is treated as a store */ ppc_msgsnd_sync(); ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag); }

Contributors

PersonTokensPropCommitsCommitProp
Nicholas Piggin2158.33%233.33%
Kumar Gala1027.78%116.67%
Paul Mackerras38.33%116.67%
Milton D. Miller II12.78%116.67%
Ian Munsie12.78%116.67%
Total36100.00%6100.00%

/* * Attempt to cause a core doorbell if destination is on the same core. * Returns 1 on success, 0 on failure. */
int doorbell_try_core_ipi(int cpu) { int this_cpu = get_cpu(); int ret = 0; if (cpumask_test_cpu(cpu, cpu_sibling_mask(this_cpu))) { doorbell_core_ipi(cpu); ret = 1; } put_cpu(); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Nicholas Piggin4593.75%150.00%
Kumar Gala36.25%150.00%
Total48100.00%2100.00%


void doorbell_exception(struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); ppc_msgsync(); may_hard_irq_enable(); kvmppc_set_host_ipi(smp_processor_id(), 0); __this_cpu_inc(irq_stat.doorbell_irqs); smp_ipi_demux_relaxed(); /* already performed the barrier */ irq_exit(); set_irq_regs(old_regs); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1628.57%333.33%
David Gibson1425.00%111.11%
Paul Mackerras814.29%111.11%
Milton D. Miller II610.71%111.11%
Nicholas Piggin58.93%111.11%
Ian Munsie58.93%111.11%
Christoph Lameter23.57%111.11%
Total56100.00%9100.00%

#else /* CONFIG_SMP */
void doorbell_exception(struct pt_regs *regs) { printk(KERN_WARNING "Received doorbell on non-smp system\n"); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt16100.00%1100.00%
Total16100.00%1100.00%

#endif /* CONFIG_SMP */

Overall Contributors

PersonTokensPropCommitsCommitProp
Nicholas Piggin9441.05%214.29%
Benjamin Herrenschmidt4720.52%321.43%
Kumar Gala3414.85%17.14%
David Gibson177.42%17.14%
Milton D. Miller II156.55%214.29%
Paul Mackerras146.11%214.29%
Ian Munsie62.62%214.29%
Christoph Lameter20.87%17.14%
Total229100.00%14100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.