mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-10 14:02:43 +00:00
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
This commit is contained in:
parent
2145b9d207
commit
62db376af3
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=171898
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user