Deadlock in sd_open/revalidate [lk <= 2.4]
Hi folks,
There seems to be a potential deadlock in the sd_open path. The problem
is this while loop:
...
while (rscsi_disks[target].device->busy) {
barrier();
cpu_relax();
}
...In revalidate_scsidisk we do this:
... device->busy = 1; ... almost certain schedule(); ... device-busy = 0;
Both paths hold the kernel lock so if sd_open gets into the while loop when the revalidate is sleeping it's all over.
As a simple preventative fix I'd say put a schedule in the while loop. It's a little ugly, but less intrusive that adding a wait queue to the device.
Anoyone see anything wrong with doing that? Other solutions?
This seems to be present in 2.0, 2.2. and 2.4 (where we hit it). The while-forever-loop-with -kernel-lock seems to be gone in 2.5.
Cheers,
Phil
Signature · 3 lines
Philip R. Auld, Ph.D. Technical Staff Egenera Corp. [email protected] 165 Forest St., Marlboro, MA 01752 (508)858-2600