Thread (1 message) 1 message, 1 author, 2012-12-10

Re: [PATCH] mtd: cfi_cmdset_0002: Support Persistent Protection Bits (PPB) locking

From: Stefan Roese <hidden>
Date: 2012-12-10 18:40:58

On 12/10/2012 04:00 PM, Artem Bityutskiy wrote:
On Fri, 2012-12-07 at 08:22 +0100, Stefan Roese wrote:
quoted
+       /*
+        * Wait for some time as unlocking of all sectors takes quite long
+        */
+       timeo = jiffies + (2 * HZ);     /* 2s max (un)locking */
Please, use msecs_to_jiffies() instead.
Sure, thats better.
quoted
+       for (;;) {
+               if (chip_ready(map, adr))
+                       break;
+
+               if (time_after(jiffies, timeo)) {
+                       printk(KERN_ERR "Waiting for chip to be ready timed out.\n");
+                       ret = -EIO;
+                       break;
+               }
+               mutex_unlock(&chip->mutex);
+               cfi_udelay(1);
+               mutex_lock(&chip->mutex);
+       } 
Would you please educate me a bit and explain what is protected by
'chip->mutex' and by 'get_chip()'.
AFAIK, chip->mutex protects the access to the chip itself. So that
sequences are not interrupted.

I have to admit that I haven't looked into get_chip() so far. It seems
to handle a state machine. Normally (idle state) it will just fall
through (FL_READY).
Why you need to drop the mutex here?
Not sure, that might not be necessary. Copy and past from another loop
in the same file.
Why is it not an ABBA deadlock to do this:

Task 1: In the loop above, has chip locked, doing
        mutex_lock(&chip->mutex);

Task 2: done mutex_lock(&chip->mutex), now doing
        ret = get_chip(map, chip, adr + chip->start, FL_LOCKING);
I don't see two different locks/mutexes (only A) here. As get_chip()
does no request any real mutex. Please correct me if I'm wrong.

In many other places UDELAY() is called:

#define UDELAY(map, chip, adr, usec)  \
do {  \
	mutex_unlock(&chip->mutex);  \
	cfi_udelay(usec);  \
	mutex_lock(&chip->mutex);  \
} while (0)

So dropping this lock seems to be quite common in this driver.

Thanks,
Stefan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help