Print this page
10924 Need mitigation of L1TF (CVE-2018-3646)
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Peter Tribble <peter.tribble@gmail.com>

*** 73,82 **** --- 73,83 ---- #include <sys/schedctl.h> #include <sys/waitq.h> #include <sys/cpucaps.h> #include <sys/kiconv.h> #include <sys/ctype.h> + #include <sys/ht.h> struct kmem_cache *thread_cache; /* cache of free threads */ struct kmem_cache *lwp_cache; /* cache of free lwps */ struct kmem_cache *turnstile_cache; /* cache of free turnstiles */
*** 485,525 **** kpreempt_disable(); curthread->t_prev->t_next = t; curthread->t_prev = t; /* ! * Threads should never have a NULL t_cpu pointer so assign it ! * here. If the thread is being created with state TS_RUN a ! * better CPU may be chosen when it is placed on the run queue. ! * ! * We need to keep kernel preemption disabled when setting all ! * three fields to keep them in sync. Also, always create in ! * the default partition since that's where kernel threads go ! * (if this isn't a kernel thread, t_cpupart will be changed ! * in lwp_create before setting the thread runnable). */ t->t_cpupart = &cp_default; /* * For now, affiliate this thread with the root lgroup. * Since the kernel does not (presently) allocate its memory * in a locality aware fashion, the root is an appropriate home. * If this thread is later associated with an lwp, it will have ! * it's lgroup re-assigned at that time. */ lgrp_move_thread(t, &cp_default.cp_lgrploads[LGRP_ROOTID], 1); /* ! * Inherit the current cpu. If this cpu isn't part of the chosen ! * lgroup, a new cpu will be chosen by cpu_choose when the thread ! * is ready to run. */ ! if (CPU->cpu_part == &cp_default) t->t_cpu = CPU; ! else ! t->t_cpu = disp_lowpri_cpu(cp_default.cp_cpulist, t->t_lpl, ! t->t_pri, NULL); t->t_disp_queue = t->t_cpu->cpu_disp; kpreempt_enable(); /* --- 486,523 ---- kpreempt_disable(); curthread->t_prev->t_next = t; curthread->t_prev = t; /* ! * We'll always create in the default partition since that's where ! * kernel threads go (we'll change this later if needed, in ! * lwp_create()). */ t->t_cpupart = &cp_default; /* * For now, affiliate this thread with the root lgroup. * Since the kernel does not (presently) allocate its memory * in a locality aware fashion, the root is an appropriate home. * If this thread is later associated with an lwp, it will have ! * its lgroup re-assigned at that time. */ lgrp_move_thread(t, &cp_default.cp_lgrploads[LGRP_ROOTID], 1); /* ! * If the current CPU is in the default cpupart, use it. Otherwise, ! * pick one that is; before entering the dispatcher code, we'll ! * make sure to keep the invariant that ->t_cpu is set. (In fact, we ! * rely on this, in ht_should_run(), in the call tree of ! * disp_lowpri_cpu().) */ ! if (CPU->cpu_part == &cp_default) { t->t_cpu = CPU; ! } else { ! t->t_cpu = cp_default.cp_cpulist; ! t->t_cpu = disp_lowpri_cpu(t->t_cpu, t, t->t_pri); ! } t->t_disp_queue = t->t_cpu->cpu_disp; kpreempt_enable(); /*
*** 1324,1333 **** --- 1322,1333 ---- ASSERT(t->t_intr != NULL); itp = t->t_intr; /* interrupted thread */ t->t_intr = NULL; /* clear interrupt ptr */ + ht_end_intr(); + /* * Get state from interrupt thread for the one * it interrupted. */