cregit-Linux how code gets into the kernel

Release 4.14 arch/x86/kernel/nmi_selftest.c

Directory: arch/x86/kernel
// SPDX-License-Identifier: GPL-2.0
/*
 * arch/x86/kernel/nmi-selftest.c
 *
 * Testsuite for NMI: IPIs
 *
 * Started by Don Zickus:
 * (using lib/locking-selftest.c as a guide)
 *
 *   Copyright (C) 2011 Red Hat, Inc., Don Zickus <dzickus@redhat.com>
 */

#include <linux/smp.h>
#include <linux/cpumask.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/percpu.h>

#include <asm/apic.h>
#include <asm/nmi.h>


#define SUCCESS		0

#define FAILURE		1

#define TIMEOUT		2


static int __initdata nmi_fail;

/* check to see if NMI IPIs work on this machine */
static DECLARE_BITMAP(nmi_ipi_mask, NR_CPUS) __initdata;


static int __initdata testcase_total;

static int __initdata testcase_successes;

static int __initdata expected_testcase_failures;

static int __initdata unexpected_testcase_failures;

static int __initdata unexpected_testcase_unknowns;


static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs) { unexpected_testcase_unknowns++; return NMI_HANDLED; }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus2195.45%150.00%
Jan Beulich14.55%150.00%
Total22100.00%2100.00%


static void __init init_nmi_testsuite(void) { /* trap all the unknown NMIs we may generate */ register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk", __initdata); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus1982.61%133.33%
Li Zhong313.04%133.33%
Jan Beulich14.35%133.33%
Total23100.00%3100.00%


static void __init cleanup_nmi_testsuite(void) { unregister_nmi_handler(NMI_UNKNOWN, "nmi_selftest_unk"); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus1593.75%150.00%
Jan Beulich16.25%150.00%
Total16100.00%2100.00%


static int __init test_nmi_ipi_callback(unsigned int val, struct pt_regs *regs) { int cpu = raw_smp_processor_id(); if (cpumask_test_and_clear_cpu(cpu, to_cpumask(nmi_ipi_mask))) return NMI_HANDLED; return NMI_DONE; }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus3997.50%150.00%
Jan Beulich12.50%150.00%
Total40100.00%2100.00%


static void __init test_nmi_ipi(struct cpumask *mask) { unsigned long timeout; if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback, NMI_FLAG_FIRST, "nmi_selftest", __initdata)) { nmi_fail = FAILURE; return; } /* sync above data before sending NMI */ wmb(); apic->send_IPI_mask(mask, NMI_VECTOR); /* Don't wait longer than a second */ timeout = USEC_PER_SEC; while (!cpumask_empty(mask) && --timeout) udelay(1); /* What happens if we timeout, do we still unregister?? */ unregister_nmi_handler(NMI_LOCAL, "nmi_selftest"); if (!timeout) nmi_fail = TIMEOUT; return; }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus8594.44%125.00%
Li Zhong33.33%125.00%
Jan Beulich11.11%125.00%
Dan Carpenter11.11%125.00%
Total90100.00%4100.00%


static void __init remote_ipi(void) { cpumask_copy(to_cpumask(nmi_ipi_mask), cpu_online_mask); cpumask_clear_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); if (!cpumask_empty(to_cpumask(nmi_ipi_mask))) test_nmi_ipi(to_cpumask(nmi_ipi_mask)); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus4591.84%250.00%
Dan Carpenter36.12%125.00%
Jan Beulich12.04%125.00%
Total49100.00%4100.00%


static void __init local_ipi(void) { cpumask_clear(to_cpumask(nmi_ipi_mask)); cpumask_set_cpu(smp_processor_id(), to_cpumask(nmi_ipi_mask)); test_nmi_ipi(to_cpumask(nmi_ipi_mask)); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus3597.22%150.00%
Jan Beulich12.78%150.00%
Total36100.00%2100.00%


static void __init reset_nmi(void) { nmi_fail = 0; }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus1292.31%150.00%
Jan Beulich17.69%150.00%
Total13100.00%2100.00%


static void __init dotest(void (*testcase_fn)(void), int expected) { testcase_fn(); /* * Filter out expected failures: */ if (nmi_fail != expected) { unexpected_testcase_failures++; if (nmi_fail == FAILURE) printk(KERN_CONT "FAILED |"); else if (nmi_fail == TIMEOUT) printk(KERN_CONT "TIMEOUT|"); else printk(KERN_CONT "ERROR |"); dump_stack(); } else { testcase_successes++; printk(KERN_CONT " ok |"); } testcase_total++; reset_nmi(); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus8294.25%133.33%
Sasha Levin44.60%133.33%
Jan Beulich11.15%133.33%
Total87100.00%3100.00%


static inline void __init print_testname(const char *testname) { printk("%12s:", testname); }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus1995.00%150.00%
Jan Beulich15.00%150.00%
Total20100.00%2100.00%


void __init nmi_selftest(void) { init_nmi_testsuite(); /* * Run the testsuite: */ printk("----------------\n"); printk("| NMI testsuite:\n"); printk("--------------------\n"); print_testname("remote IPI"); dotest(remote_ipi, SUCCESS); printk(KERN_CONT "\n"); print_testname("local IPI"); dotest(local_ipi, SUCCESS); printk(KERN_CONT "\n"); cleanup_nmi_testsuite(); if (unexpected_testcase_failures) { printk("--------------------\n"); printk("BUG: %3d unexpected failures (out of %3d) - debugging disabled! |\n", unexpected_testcase_failures, testcase_total); printk("-----------------------------------------------------------------\n"); } else if (expected_testcase_failures && testcase_successes) { printk("--------------------\n"); printk("%3d out of %3d testcases failed, as expected. |\n", expected_testcase_failures, testcase_total); printk("----------------------------------------------------\n"); } else if (expected_testcase_failures && !testcase_successes) { printk("--------------------\n"); printk("All %3d testcases failed, as expected. |\n", expected_testcase_failures); printk("----------------------------------------\n"); } else { printk("--------------------\n"); printk("Good, all %3d testcases passed! |\n", testcase_successes); printk("---------------------------------\n"); } }

Contributors

PersonTokensPropCommitsCommitProp
Don Zickus16398.19%133.33%
Sasha Levin21.20%133.33%
Jan Beulich10.60%133.33%
Total166100.00%3100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Don Zickus59693.56%222.22%
Jan Beulich213.30%111.11%
Li Zhong60.94%111.11%
Sasha Levin60.94%111.11%
Dan Carpenter40.63%222.22%
Alex Shi30.47%111.11%
Greg Kroah-Hartman10.16%111.11%
Total637100.00%9100.00%
Directory: arch/x86/kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.