summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_cpu.c
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2007-08-20 06:28:26 +0000
committernjl <njl@FreeBSD.org>2007-08-20 06:28:26 +0000
commit4140a5b7358b4711c4211ca3cd9df47b89140967 (patch)
treef9243025cddb48733af291af99660a4d7c25a4cf /sys/kern/kern_cpu.c
parent7d2f2820572ca43c54851bca79c520f6fe6de70f (diff)
downloadFreeBSD-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/kern/kern_cpu.c')
-rw-r--r--sys/kern/kern_cpu.c40
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;
OpenPOWER on IntegriCloud