diff --git a/arch/amd64/include/cpu.h b/arch/amd64/include/cpu.h
index 12e48d6..99501a1 100644
--- a/arch/amd64/include/cpu.h
+++ b/arch/amd64/include/cpu.h
@@ -102,9 +102,11 @@ struct cpu_info {
        u_int32_t       ci_cflushsz;
        u_int64_t       ci_tsc_freq;
 
+#define ARCH_HAVE_CPU_TOPOLOGY
        u_int32_t       ci_smt_id;
        u_int32_t       ci_core_id;
        u_int32_t       ci_pkg_id;
+
        struct cpu_functions *ci_func;
        void (*cpu_setup)(struct cpu_info *);
        void (*ci_info)(struct cpu_info *);
diff --git a/kern/kern_sched.c b/kern/kern_sched.c
index 79eb28c..072ef38 100644
--- a/kern/kern_sched.c
+++ b/kern/kern_sched.c
@@ -496,6 +496,10 @@ int sched_cost_load = 1;
 int sched_cost_priority = 1;
 int sched_cost_runnable = 3;
 int sched_cost_resident = 1;
+#ifdef ARCH_HAVE_CPU_TOPOLOGY
+int sched_cost_diffcore = 2; /* cost for moving to a different core */
+int sched_cost_diffpkg = 3; /* cost for moving to a different package */
+#endif
 
 int
 sched_proc_to_cpu_cost(struct cpu_info *ci, struct proc *p)
@@ -536,6 +540,13 @@ sched_proc_to_cpu_cost(struct cpu_info *ci, struct proc *p)
                cost -= l2resident * sched_cost_resident;
        }
 
+#ifdef ARCH_HAVE_CPU_TOPOLOGY
+       if (p->p_cpu->ci_pkg_id != ci->ci_pkg_id)
+               cost *= sched_cost_diffpkg;
+       else if (p->p_cpu->ci_core_id != ci->ci_core_id)
+               cost *= sched_cost_diffcore;
+#endif
+
        return (cost);
 }
 
-- 
1.7.6

Reply via email to