Lockdep treats down_write_trylock like regular down_write
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_semaphoint 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; }
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...
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_userand 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...