diff options
author | njl <njl@FreeBSD.org> | 2007-08-20 06:28:26 +0000 |
---|---|---|
committer | njl <njl@FreeBSD.org> | 2007-08-20 06:28:26 +0000 |
commit | 4140a5b7358b4711c4211ca3cd9df47b89140967 (patch) | |
tree | f9243025cddb48733af291af99660a4d7c25a4cf /sys | |
parent | 7d2f2820572ca43c54851bca79c520f6fe6de70f (diff) | |
download | FreeBSD-src-4140a5b7358b4711c4211ca3cd9df47b89140967.zip FreeBSD-src-4140a5b7358b4711c4211ca3cd9df47b89140967.tar.gz |
Always call sched_bind(), even if on the CPU in question. It is wrong to
check if we're already on that cpu and skip the bind since the thread could
be migrated off in the meantime.
Suggested by: jeff
Approved by: re
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_cpu.c | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/sys/kern/kern_cpu.c b/sys/kern/kern_cpu.c index 1b631b9..c72ead6 100644 --- a/sys/kern/kern_cpu.c +++ b/sys/kern/kern_cpu.c @@ -227,7 +227,7 @@ cf_set_method(device_t dev, const struct cf_level *level, int priority) const struct cf_setting *set; struct cf_saved_freq *saved_freq, *curr_freq; struct pcpu *pc; - int cpu_id, error, i; + int error, i; sc = device_get_softc(dev); error = 0; @@ -294,22 +294,17 @@ cf_set_method(device_t dev, const struct cf_level *level, int priority) goto out; } - /* Bind to the target CPU before switching, if necessary. */ - cpu_id = PCPU_GET(cpuid); + /* Bind to the target CPU before switching. */ pc = cpu_get_pcpu(set->dev); - if (cpu_id != pc->pc_cpuid) { - thread_lock(curthread); - sched_bind(curthread, pc->pc_cpuid); - thread_unlock(curthread); - } + thread_lock(curthread); + sched_bind(curthread, pc->pc_cpuid); + thread_unlock(curthread); CF_DEBUG("setting abs freq %d on %s (cpu %d)\n", set->freq, device_get_nameunit(set->dev), PCPU_GET(cpuid)); error = CPUFREQ_DRV_SET(set->dev, set); - if (cpu_id != pc->pc_cpuid) { - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); - } + thread_lock(curthread); + sched_unbind(curthread); + thread_unlock(curthread); if (error) { goto out; } @@ -323,22 +318,17 @@ cf_set_method(device_t dev, const struct cf_level *level, int priority) goto out; } - /* Bind to the target CPU before switching, if necessary. */ - cpu_id = PCPU_GET(cpuid); + /* Bind to the target CPU before switching. */ pc = cpu_get_pcpu(set->dev); - if (cpu_id != pc->pc_cpuid) { - thread_lock(curthread); - sched_bind(curthread, pc->pc_cpuid); - thread_unlock(curthread); - } + thread_lock(curthread); + sched_bind(curthread, pc->pc_cpuid); + thread_unlock(curthread); CF_DEBUG("setting rel freq %d on %s (cpu %d)\n", set->freq, device_get_nameunit(set->dev), PCPU_GET(cpuid)); error = CPUFREQ_DRV_SET(set->dev, set); - if (cpu_id != pc->pc_cpuid) { - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); - } + thread_lock(curthread); + sched_unbind(curthread); + thread_unlock(curthread); if (error) { /* XXX Back out any successful setting? */ goto out; |