Skip to contentSkip to conversation

Lockdep treats down_write_trylock like regular down_write

PATCH In review Pavel Emelianov 2 participants 3 messages Apr 9, 2007 – Apr 10, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Lockdep treats down_write_trylock like regular down_write

This causes constructions like

down_write(&mm1->mmap_sem);

if (down_write_trylock(&mm2->mmap_sem)) {
       ...
       up_write(&mm2->mmap_sem);
}

up_write(&mm1->mmap_sem);

generate a lockdep warning about circular locking dependence.

Call rwsem_acquire() with trylock set to 1.

kernel/rwsem.c renamed from kernel/rwsem.c.pbonrem +1 -1
@@ -60,7 +60,7 @@ int down_write_trylock(struct rw_semapho
 	int ret = __down_write_trylock(sem);
 
 	if (ret == 1)
-		rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);
+		rwsem_acquire(&sem->dep_map, 0, 1, _RET_IP_);
 	return ret;
 }
 
#1 lore raw
Quoted 10 lines · Pavel Emelianov

This causes constructions like

down_write(&mm1->mmap_sem);

if (down_write_trylock(&mm2->mmap_sem)) {
       ...
       up_write(&mm2->mmap_sem);
}

up_write(&mm1->mmap_sem);

generate a lockdep warning about circular locking dependence.

please show me why this is safe, especially if you intermix it with down_read()'s... like copy_to_user and co may do.

this feels like a very unsafe construct to me...

#2 lore raw
Quoted 10 lines · Arjan van de Ven
Quoted 9 lines · Pavel Emelianov

This causes constructions like

down_write(&mm1->mmap_sem);

if (down_write_trylock(&mm2->mmap_sem)) {
       ...
       up_write(&mm2->mmap_sem);
}

up_write(&mm1->mmap_sem);

Quoted 4 lines
Quoted 1 line

generate a lockdep warning about circular locking dependence.

please show me why this is safe, especially if you intermix it with down_read()'s... like copy_to_user and co may do.

This is safe as once the task locks the mm1->mmap_sem and gets into '...' place it is *running* and will release booth semaphores for sure.

Quoted 2 lines

this feels like a very unsafe construct to me...