cregit-Linux how code gets into the kernel

Release 4.8 kernel/panic.c

Directory: kernel
/*
 *  linux/kernel/panic.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

/*
 * This function is used through-out the kernel (including mm and fs)
 * to indicate a major problem.
 */
#include <linux/debug_locks.h>
#include <linux/interrupt.h>
#include <linux/kmsg_dump.h>
#include <linux/kallsyms.h>
#include <linux/notifier.h>
#include <linux/module.h>
#include <linux/random.h>
#include <linux/ftrace.h>
#include <linux/reboot.h>
#include <linux/delay.h>
#include <linux/kexec.h>
#include <linux/sched.h>
#include <linux/sysrq.h>
#include <linux/init.h>
#include <linux/nmi.h>
#include <linux/console.h>
#include <linux/bug.h>


#define PANIC_TIMER_STEP 100

#define PANIC_BLINK_SPD 18


int panic_on_oops = CONFIG_PANIC_ON_OOPS_VALUE;

static unsigned long tainted_mask;

static int pause_on_oops;

static int pause_on_oops_flag;
static DEFINE_SPINLOCK(pause_on_oops_lock);

bool crash_kexec_post_notifiers;

int panic_on_warn __read_mostly;


int panic_timeout = CONFIG_PANIC_TIMEOUT;

EXPORT_SYMBOL_GPL(panic_timeout);


ATOMIC_NOTIFIER_HEAD(panic_notifier_list);


EXPORT_SYMBOL(panic_notifier_list);


static long no_blink(int state) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
tamuki shoichitamuki shoichi12100.00%1100.00%
Total12100.00%1100.00%

/* Returns how long it waited in ms */ long (*panic_blink)(int state); EXPORT_SYMBOL(panic_blink); /* * Stop ourself in panic -- architecture code may override this */
void __weak panic_smp_self_stop(void) { while (1) cpu_relax(); }

Contributors

PersonTokensPropCommitsCommitProp
michael holzheumichael holzheu15100.00%1100.00%
Total15100.00%1100.00%

/* * Stop ourselves in NMI context if another CPU has already panicked. Arch code * may override this to prepare for crash dumping, e.g. save regs info. */
void __weak nmi_panic_self_stop(struct pt_regs *regs) { panic_smp_self_stop(); }

Contributors

PersonTokensPropCommitsCommitProp
hidehiro kawaihidehiro kawai14100.00%1100.00%
Total14100.00%1100.00%

atomic_t panic_cpu = ATOMIC_INIT(PANIC_CPU_INVALID); /* * A variant of panic() called from NMI context. We return if we've already * panicked on this CPU. If another CPU already panicked, loop in * nmi_panic_self_stop() which can provide architecture dependent code such * as saving register state for crash dump. */
void nmi_panic(struct pt_regs *regs, const char *msg) { int old_cpu, cpu; cpu = raw_smp_processor_id(); old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, cpu); if (old_cpu == PANIC_CPU_INVALID) panic("%s", msg); else if (old_cpu != cpu) nmi_panic_self_stop(regs); }

Contributors

PersonTokensPropCommitsCommitProp
hidehiro kawaihidehiro kawai62100.00%1100.00%
Total62100.00%1100.00%

EXPORT_SYMBOL(nmi_panic); /** * panic - halt the system * @fmt: The text string to print * * Display a message, then perform cleanups. * * This function never returns. */
void panic(const char *fmt, ...) { static char buf[1024]; va_list args; long i, i_next = 0; int state = 0; int old_cpu, this_cpu; bool _crash_kexec_post_notifiers = crash_kexec_post_notifiers; /* * Disable local interrupts. This will prevent panic_smp_self_stop * from deadlocking the first cpu that invokes the panic, since * there is nothing to prevent an interrupt handler (that runs * after setting panic_cpu) from invoking panic() again. */ local_irq_disable(); /* * It's possible to come here directly from a panic-assertion and * not have preempt disabled. Some functions called from here want * preempt to be disabled. No point enabling it later though... * * Only one CPU is allowed to execute the panic code from here. For * multiple parallel invocations of panic, all other CPUs either * stop themself or will wait until they are stopped by the 1st CPU * with smp_send_stop(). * * `old_cpu == PANIC_CPU_INVALID' means this is the 1st CPU which * comes here, so go ahead. * `old_cpu == this_cpu' means we came from nmi_panic() which sets * panic_cpu to this CPU. In this case, this is also the 1st CPU. */ this_cpu = raw_smp_processor_id(); old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, this_cpu); if (old_cpu != PANIC_CPU_INVALID && old_cpu != this_cpu) panic_smp_self_stop(); console_verbose(); bust_spinlocks(1); va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); pr_emerg("Kernel panic - not syncing: %s\n", buf); #ifdef CONFIG_DEBUG_BUGVERBOSE /* * Avoid nested stack-dumping if a panic occurs during oops processing */ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) dump_stack(); #endif /* * If we have crashed and we have a crash kernel loaded let it handle * everything else. * If we want to run this after calling panic_notifiers, pass * the "crash_kexec_post_notifiers" option to the kernel. * * Bypass the panic_cpu check and call __crash_kexec directly. */ if (!_crash_kexec_post_notifiers) { printk_nmi_flush_on_panic(); __crash_kexec(NULL); } /* * Note smp_send_stop is the usual smp shutdown function, which * unfortunately means it may not be hardened to work in a panic * situation. */ smp_send_stop(); /* * Run any panic handlers, including those that might need to * add information to the kmsg dump output. */ atomic_notifier_call_chain(&panic_notifier_list, 0, buf); /* Call flush even twice. It tries harder with a single online CPU */ printk_nmi_flush_on_panic(); kmsg_dump(KMSG_DUMP_PANIC); /* * If you doubt kdump always works fine in any situation, * "crash_kexec_post_notifiers" offers you a chance to run * panic_notifiers and dumping kmsg before kdump. * Note: since some panic_notifiers can make crashed kernel * more unstable, it can increase risks of the kdump failure too. * * Bypass the panic_cpu check and call __crash_kexec directly. */ if (_crash_kexec_post_notifiers) __crash_kexec(NULL); bust_spinlocks(0); /* * We may have ended up stopping the CPU holding the lock (in * smp_send_stop()) while still having some valuable data in the console * buffer. Try to acquire the lock then release it regardless of the * result. The release will also print the buffers out. Locks debug * should be disabled to avoid reporting bad unlock balance when * panic() is not being callled from OOPS. */ debug_locks_off(); console_flush_on_panic(); if (!panic_blink) panic_blink = no_blink; if (panic_timeout > 0) { /* * Delay timeout seconds before rebooting the machine. * We can't use the "normal" timers since we just panicked. */ pr_emerg("Rebooting in %d seconds..", panic_timeout); for (i = 0; i < panic_timeout * 1000; i += PANIC_TIMER_STEP) { touch_nmi_watchdog(); if (i >= i_next) { i += panic_blink(state ^= 1); i_next = i + 3600 / PANIC_BLINK_SPD; } mdelay(PANIC_TIMER_STEP); } } if (panic_timeout != 0) { /* * This will not be a clean reboot, with everything * shutting down. But if there is a chance of * rebooting the system it will be rebooted. */ emergency_restart(); } #ifdef __sparc__ { extern int stop_a_enabled; /* Make sure the user can actually press Stop-A (L1-A) */ stop_a_enabled = 1; pr_emerg("Press Stop-A (L1-A) to return to the boot prom\n"); } #endif #if defined(CONFIG_S390) { unsigned long caller; caller = (unsigned long)__builtin_return_address(0); disabled_wait(caller); } #endif pr_emerg("---[ end Kernel panic - not syncing: %s\n", buf); local_irq_enable(); for (i = 0; ; i += PANIC_TIMER_STEP) { touch_softlockup_watchdog(); if (i >= i_next) { i += panic_blink(state ^= 1); i_next = i + 3600 / PANIC_BLINK_SPD; } mdelay(PANIC_TIMER_STEP); } }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git10426.13%817.78%
tamuki shoichitamuki shoichi9122.86%12.22%
hidehiro kawaihidehiro kawai4110.30%36.67%
ingo molnaringo molnar297.29%36.67%
andrew mortonandrew morton225.53%24.44%
fabian frederickfabian frederick102.51%12.22%
andi kleenandi kleen102.51%24.44%
petr mladekpetr mladek92.26%12.22%
masami hiramatsumasami hiramatsu82.01%12.22%
hugh dickinshugh dickins82.01%12.22%
jason wesseljason wessel71.76%12.22%
kees cookkees cook61.51%12.22%
vitaly kuznetsovvitaly kuznetsov61.51%24.44%
michael holzheumichael holzheu51.26%12.22%
aaro koskinenaaro koskinen51.26%12.22%
linus torvaldslinus torvalds51.26%12.22%
eric w. biedermaneric w. biederman51.26%24.44%
anton blanchardanton blanchard41.01%24.44%
seiji aguchiseiji aguchi41.01%12.22%
jan beulichjan beulich30.75%12.22%
daisuke hatayamadaisuke hatayama30.75%12.22%
vikram mulukutlavikram mulukutla30.75%12.22%
alexander nybergalexander nyberg30.75%12.22%
tom 'spot' callawaytom 'spot' callaway20.50%12.22%
tejun heotejun heo10.25%12.22%
jeff dikejeff dike10.25%12.22%
christian borntragerchristian borntrager10.25%12.22%
martin schwidefskymartin schwidefsky10.25%12.22%
alan sternalan stern10.25%12.22%
Total398100.00%45100.00%

EXPORT_SYMBOL(panic); struct tnt { u8 bit; char true; char false; }; static const struct tnt tnts[] = { { TAINT_PROPRIETARY_MODULE, 'P', 'G' }, { TAINT_FORCED_MODULE, 'F', ' ' }, { TAINT_CPU_OUT_OF_SPEC, 'S', ' ' }, { TAINT_FORCED_RMMOD, 'R', ' ' }, { TAINT_MACHINE_CHECK, 'M', ' ' }, { TAINT_BAD_PAGE, 'B', ' ' }, { TAINT_USER, 'U', ' ' }, { TAINT_DIE, 'D', ' ' }, { TAINT_OVERRIDDEN_ACPI_TABLE, 'A', ' ' }, { TAINT_WARN, 'W', ' ' }, { TAINT_CRAP, 'C', ' ' }, { TAINT_FIRMWARE_WORKAROUND, 'I', ' ' }, { TAINT_OOT_MODULE, 'O', ' ' }, { TAINT_UNSIGNED_MODULE, 'E', ' ' }, { TAINT_SOFTLOCKUP, 'L', ' ' }, { TAINT_LIVEPATCH, 'K', ' ' }, }; /** * print_tainted - return a string to represent the kernel taint state. * * 'P' - Proprietary module has been loaded. * 'F' - Module has been forcibly loaded. * 'S' - SMP with CPUs not designed for SMP. * 'R' - User forced a module unload. * 'M' - System experienced a machine check exception. * 'B' - System has hit bad_page. * 'U' - Userspace-defined naughtiness. * 'D' - Kernel has oopsed before * 'A' - ACPI table overridden. * 'W' - Taint on warning. * 'C' - modules from drivers/staging are loaded. * 'I' - Working around severe firmware bug. * 'O' - Out-of-tree module has been loaded. * 'E' - Unsigned module has been loaded. * 'L' - A soft lockup has previously occurred. * 'K' - Kernel has been live patched. * * The string is overwritten by the next call to print_tainted(). */
const char *print_tainted(void) { static char buf[ARRAY_SIZE(tnts) + sizeof("Tainted: ")]; if (tainted_mask) { char *s; int i; s = buf + sprintf(buf, "Tainted: "); for (i = 0; i < ARRAY_SIZE(tnts); i++) { const struct tnt *t = &tnts[i]; *s++ = test_bit(t->bit, &tainted_mask) ? t->true : t->false; } *s = 0; } else snprintf(buf, sizeof(buf), "Not tainted"); return buf; }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen10183.47%150.00%
linus torvaldslinus torvalds2016.53%150.00%
Total121100.00%2100.00%


int test_taint(unsigned flag) { return test_bit(flag, &tainted_mask); }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen17100.00%2100.00%
Total17100.00%2100.00%

EXPORT_SYMBOL(test_taint);
unsigned long get_taint(void) { return tainted_mask; }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen872.73%150.00%
andrew mortonandrew morton327.27%150.00%
Total11100.00%2100.00%

/** * add_taint: add a taint flag if not already set. * @flag: one of the TAINT_* constants. * @lockdep_ok: whether lock debugging is still OK. * * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for * some notewortht-but-not-corrupting cases, it can be set to true. */
void add_taint(unsigned flag, enum lockdep_ok lockdep_ok) { if (lockdep_ok == LOCKDEP_NOW_UNRELIABLE && __debug_locks_off()) pr_warn("Disabling lock debugging due to kernel taint\n"); set_bit(flag, &tainted_mask); }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen1132.35%222.22%
rusty russellrusty russell823.53%111.11%
andrew mortonandrew morton514.71%111.11%
frederic weisbeckerfrederic weisbecker514.71%111.11%
peter zijlstrapeter zijlstra25.88%111.11%
ingo molnaringo molnar12.94%111.11%
arjan van de venarjan van de ven12.94%111.11%
fabian frederickfabian frederick12.94%111.11%
Total34100.00%9100.00%

EXPORT_SYMBOL(add_taint);
static void spin_msec(int msecs) { int i; for (i = 0; i < msecs; i++) { touch_nmi_watchdog(); mdelay(1); } }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton35100.00%1100.00%
Total35100.00%1100.00%

/* * It just happens that oops_enter() and oops_exit() are identically * implemented... */
static void do_oops_enter_exit(void) { unsigned long flags; static int spin_counter; if (!pause_on_oops) return; spin_lock_irqsave(&pause_on_oops_lock, flags); if (pause_on_oops_flag == 0) { /* This CPU may now print the oops message */ pause_on_oops_flag = 1; } else { /* We need to stall this CPU */ if (!spin_counter) { /* This CPU gets to do the counting */ spin_counter = pause_on_oops; do { spin_unlock(&pause_on_oops_lock); spin_msec(MSEC_PER_SEC); spin_lock(&pause_on_oops_lock); } while (--spin_counter); pause_on_oops_flag = 0; } else { /* This CPU waits for a different one */ while (spin_counter) { spin_unlock(&pause_on_oops_lock); spin_msec(1); spin_lock(&pause_on_oops_lock); } } } spin_unlock_irqrestore(&pause_on_oops_lock, flags); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton124100.00%1100.00%
Total124100.00%1100.00%

/* * Return true if the calling CPU is allowed to print oops-related info. * This is a bit racy.. */
int oops_may_print(void) { return pause_on_oops_flag == 0; }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton12100.00%1100.00%
Total12100.00%1100.00%

/* * Called when the architecture enters its oops handler, before it prints * anything. If this is the first CPU to oops, and it's oopsing the first * time then let it proceed. * * This is all enabled by the pause_on_oops kernel boot option. We do all * this to ensure that oopses don't scroll off the screen. It has the * side-effect of preventing later-oopsing CPUs from mucking up the display, * too. * * It turns out that the CPU which is allowed to print ends up pausing for * the right duration, whereas all the other CPUs pause for twice as long: * once in oops_enter(), once in oops_exit(). */
void oops_enter(void) { tracing_off(); /* can't trust the integrity of the kernel anymore: */ debug_locks_off(); do_oops_enter_exit(); }

Contributors

PersonTokensPropCommitsCommitProp
andrew mortonandrew morton1058.82%125.00%
arjan van de venarjan van de ven317.65%125.00%
thomas gleixnerthomas gleixner317.65%125.00%
ingo molnaringo molnar15.88%125.00%
Total17100.00%4100.00%

/* * 64-bit random ID for oopses: */ static u64 oops_id;
static int init_oops_id(void) { if (!oops_id) get_random_bytes(&oops_id, sizeof(oops_id)); else oops_id++; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven31100.00%2100.00%
Total31100.00%2100.00%

late_initcall(init_oops_id);
void print_oops_end_marker(void) { init_oops_id(); pr_warn("---[ end trace %016llx ]---\n", (unsigned long long)oops_id); }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven1568.18%250.00%
andrew mortonandrew morton627.27%125.00%
fabian frederickfabian frederick14.55%125.00%
Total22100.00%4100.00%

/* * Called when the architecture exits its oops handler, after printing * everything. */
void oops_exit(void) { do_oops_enter_exit(); print_oops_end_marker(); kmsg_dump(KMSG_DUMP_OOPS); }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven1372.22%150.00%
simon kagstromsimon kagstrom527.78%150.00%
Total18100.00%2100.00%

struct warn_args { const char *fmt; va_list args; };
void __warn(const char *file, int line, void *caller, unsigned taint, struct pt_regs *regs, struct warn_args *args) { disable_trace_on_warning(); pr_warn("------------[ cut here ]------------\n"); if (file) pr_warn("WARNING: CPU: %d PID: %d at %s:%d %pS\n", raw_smp_processor_id(), current->pid, file, line, caller); else pr_warn("WARNING: CPU: %d PID: %d at %pS\n", raw_smp_processor_id(), current->pid, caller); if (args) vprintk(args->fmt, args->args); if (panic_on_warn) { /* * This thread may hit another WARN() in the panic path. * Resetting this prevents additional WARN() from panicking the * system on this thread. Other threads are blocked by the * panic_mutex in panic(). */ panic_on_warn = 0; panic("panic_on_warn set ...\n"); } print_modules(); if (regs) show_regs(regs); else dump_stack(); print_oops_end_marker(); /* Just a warning, don't kill lockdep. */ add_taint(taint, LOCKDEP_STILL_OK); }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven5138.35%222.22%
josh poimboeufjosh poimboeuf3727.82%111.11%
prarit bhargavaprarit bhargava1612.03%111.11%
linus torvaldslinus torvalds107.52%111.11%
alex thorltonalex thorlton96.77%111.11%
ben hutchingsben hutchings43.01%111.11%
rusty russellrusty russell32.26%111.11%
steven rostedtsteven rostedt32.26%111.11%
Total133100.00%9100.00%

#ifdef WANT_WARN_ON_SLOWPATH
void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...) { struct warn_args args; args.fmt = fmt; va_start(args.args, fmt); __warn(file, line, __builtin_return_address(0), TAINT_WARN, NULL, &args); va_end(args.args); }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds5990.77%133.33%
josh poimboeufjosh poimboeuf46.15%133.33%
ben hutchingsben hutchings23.08%133.33%
Total65100.00%3100.00%

EXPORT_SYMBOL(warn_slowpath_fmt);
void warn_slowpath_fmt_taint(const char *file, int line, unsigned taint, const char *fmt, ...) { struct warn_args args; args.fmt = fmt; va_start(args.args, fmt); __warn(file, line, __builtin_return_address(0), taint, NULL, &args); va_end(args.args); }

Contributors

PersonTokensPropCommitsCommitProp
ben hutchingsben hutchings6494.12%150.00%
josh poimboeufjosh poimboeuf45.88%150.00%
Total68100.00%2100.00%

EXPORT_SYMBOL(warn_slowpath_fmt_taint);
void warn_slowpath_null(const char *file, int line) { __warn(file, line, __builtin_return_address(0), TAINT_WARN, NULL, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen2064.52%125.00%
linus torvaldslinus torvalds619.35%125.00%
josh poimboeufjosh poimboeuf39.68%125.00%
ben hutchingsben hutchings26.45%125.00%
Total31100.00%4100.00%

EXPORT_SYMBOL(warn_slowpath_null); #endif #ifdef CONFIG_CC_STACKPROTECTOR /* * Called when gcc's -fstack-protector feature is used, and * gcc detects corruption of the on-stack canary value */
__visible void __stack_chk_fail(void) { panic("stack-protector: Kernel stack is corrupted in: %p\n", __builtin_return_address(0)); }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven1161.11%133.33%
ingo molnaringo molnar633.33%133.33%
andi kleenandi kleen15.56%133.33%
Total18100.00%3100.00%

EXPORT_SYMBOL(__stack_chk_fail); #endif core_param(panic, panic_timeout, int, 0644); core_param(pause_on_oops, pause_on_oops, int, 0644); core_param(panic_on_warn, panic_on_warn, int, 0644); core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644);
static int __init oops_setup(char *s) { if (!s) return -EINVAL; if (!strcmp(s, "panic")) panic_on_oops = 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
olaf heringolaf hering37100.00%1100.00%
Total37100.00%1100.00%

early_param("oops", oops_setup);

Overall Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen27115.78%65.77%
andrew mortonandrew morton24614.33%43.85%
arjan van de venarjan van de ven1579.14%87.69%
hidehiro kawaihidehiro kawai1398.10%54.81%
linus torvaldslinus torvalds1257.28%43.85%
pre-gitpre-git1217.05%1312.50%
tamuki shoichitamuki shoichi1136.58%10.96%
ben hutchingsben hutchings935.42%32.88%
josh poimboeufjosh poimboeuf553.20%10.96%
ingo molnaringo molnar523.03%54.81%
olaf heringolaf hering442.56%10.96%
rusty russellrusty russell362.10%43.85%
prarit bhargavaprarit bhargava311.81%10.96%
michael holzheumichael holzheu211.22%10.96%
masami hiramatsumasami hiramatsu150.87%10.96%
arnaldo carvalho de meloarnaldo carvalho de melo120.70%10.96%
fabian frederickfabian frederick120.70%10.96%
seth jenningsseth jennings90.52%10.96%
vitaly kuznetsovvitaly kuznetsov90.52%21.92%
petr mladekpetr mladek90.52%10.96%
alex thorltonalex thorlton90.52%10.96%
hugh dickinshugh dickins80.47%10.96%
josh huntjosh hunt80.47%10.96%
simon kagstromsimon kagstrom80.47%10.96%
eric w. biedermaneric w. biederman70.41%21.92%
jason wesseljason wessel70.41%10.96%
mathieu desnoyersmathieu desnoyers70.41%10.96%
steven rostedtsteven rostedt60.35%10.96%
kees cookkees cook60.35%10.96%
nick pigginnick piggin60.35%21.92%
aaro koskinenaaro koskinen50.29%10.96%
huang yinghuang ying50.29%10.96%
frederic weisbeckerfrederic weisbecker50.29%10.96%
alan sternalan stern50.29%10.96%
anton blanchardanton blanchard40.23%21.92%
dave jonesdave jones40.23%21.92%
nur husseinnur hussein40.23%10.96%
seiji aguchiseiji aguchi40.23%10.96%
thomas gleixnerthomas gleixner30.17%10.96%
vikram mulukutlavikram mulukutla30.17%10.96%
eric pieleric piel30.17%10.96%
theodore tsotheodore tso30.17%10.96%
pavel emelianovpavel emelianov30.17%10.96%
daisuke hatayamadaisuke hatayama30.17%10.96%
alexander nybergalexander nyberg30.17%10.96%
jan beulichjan beulich30.17%10.96%
jason baronjason baron20.12%10.96%
peter zijlstrapeter zijlstra20.12%10.96%
tom 'spot' callawaytom 'spot' callaway20.12%10.96%
kyle mcmartinkyle mcmartin20.12%10.96%
greg kroah-hartmangreg kroah-hartman20.12%10.96%
martin schwidefskymartin schwidefsky10.06%10.96%
christian borntragerchristian borntrager10.06%10.96%
jeff dikejeff dike10.06%10.96%
heiko carstensheiko carstens10.06%10.96%
tejun heotejun heo10.06%10.96%
Total1717100.00%104100.00%
Directory: kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.