Deadlock in sd_open/revalidate [lk <= 2.4]

From: Philip R. Auld (pauld@egenera.com)
Date: Mon Apr 07 2003 - 08:20:12 EST


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

-- 
Philip R. Auld, Ph.D.                  Technical Staff 
Egenera Corp.                        pauld@egenera.com
165 Forest St., Marlboro, MA 01752       (508)858-2600
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Apr 07 2003 - 22:00:31 EST