[rfc] bind curthread to target cpu for _CST change notification
Andriy Gapon
avg at FreeBSD.org
Thu Nov 29 15:29:17 UTC 2012
Turned out not be so rosy...
on 25/11/2012 21:37 Sean Bruno said the following:
>
>
> On Thu, 2012-11-22 at 16:53 +0200, Andriy Gapon wrote:
>> I would like to propose the following patch which should kill two birds with one
>> stone:
>>
>> - avoid race in acpi_cpu_cx_cst if more than one notifications occur in a rapid
>> succession for the same CPU and end up being concurrently handled by ACPI taskqeue
>> threads
critical_enter was a very a bad idea and can't be used here because
acpi_cpu_cx_cst acquires blockable locks and does waiting memory allocations.
Unfortunately, it was not immediately obvious to me.
>> - avoid race acpi_cpu_cx_cst and acpi_cpu_idle where the latter may access
>> resources being updated by the former
sched_bind wouldn't guarantee that this would work if critical_enter is not used,
because the current thread may block and the idle thread may get to run.
>> What do you think?
>>
>> Index: sys/dev/acpica/acpi_cpu.c
>> ===================================================================
>> --- sys/dev/acpica/acpi_cpu.c (revision 242854)
>> +++ sys/dev/acpica/acpi_cpu.c (working copy)
>> @@ -1047,7 +1047,16 @@
>> return;
>>
>> /* Update the list of Cx states. */
>> + thread_lock(curthread);
>> + sched_bind(curthread, sc->cpu_pcpu->pc_cpuid);
>> + thread_unlock(curthread);
>> + critical_enter();
>> acpi_cpu_cx_cst(sc);
>> + critical_exit();
>> + thread_lock(curthread);
>> + sched_unbind(curthread);
>> + thread_unlock(curthread);
>> +
>> acpi_cpu_cx_list(sc);
>>
>> ACPI_SERIAL_BEGIN(cpu);
>>
>
> Ack. This looks appropriate to me.
I am working on an alternative approach to these two issues.
Thank you.
--
Andriy Gapon
More information about the freebsd-acpi
mailing list