Date: Tue, 18 Feb 2014 16:28:18 -0800 From: Adrian Chadd <adrian@freebsd.org> To: "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>, freebsd-current <freebsd-current@freebsd.org>, Jeffrey Faden <jeffreyatw@gmail.com>, John Baldwin <jhb@freebsd.org> Subject: [rfc] bind per-cpu timeout threads to each CPU Message-ID: <CAJ-VmokMQnUS_Yjva0n_j7bbc0yj6SdAmM6df4z2K60aaxGbvQ@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi, This patch binds the per-CPU timeout swi threads to the CPU they're on. The scheduler may decide that a preempted kernel thread that's still runnable and this can happen during things like per-CPU TCP timers firing. Thanks, Index: sys/kern/kern_timeout.c =================================================================== --- sys/kern/kern_timeout.c (revision 261910) +++ sys/kern/kern_timeout.c (working copy) @@ -355,6 +355,7 @@ char name[MAXCOMLEN]; #ifdef SMP int cpu; + struct intr_event *ie; #endif cc = CC_CPU(timeout_cpu); @@ -362,6 +363,11 @@ if (swi_add(&clk_intr_event, name, softclock, cc, SWI_CLOCK, INTR_MPSAFE, &cc->cc_cookie)) panic("died while creating standard software ithreads"); + if (intr_event_bind(clk_intr_event, timeout_cpu) != 0) { + printf("%s: timeout clock couldn't be pinned to cpu %d\n", + __func__, + timeout_cpu); + } #ifdef SMP CPU_FOREACH(cpu) { if (cpu == timeout_cpu) @@ -370,9 +376,15 @@ cc->cc_callout = NULL; /* Only cpu0 handles timeout(9). */ callout_cpu_init(cc); snprintf(name, sizeof(name), "clock (%d)", cpu); - if (swi_add(NULL, name, softclock, cc, SWI_CLOCK, + ie = NULL; + if (swi_add(&ie, name, softclock, cc, SWI_CLOCK, INTR_MPSAFE, &cc->cc_cookie)) panic("died while creating standard software ithreads"); + if (intr_event_bind(ie, cpu) != 0) { + printf("%s: per-cpu clock couldn't be pinned to cpu %d\n", + __func__, + cpu); + } } #endif } -a
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmokMQnUS_Yjva0n_j7bbc0yj6SdAmM6df4z2K60aaxGbvQ>