KEYS: Make the key reaper non-reentrant
David Howells [Mon, 22 Aug 2011 13:09:20 +0000 (14:09 +0100)]
Make the key reaper non-reentrant by sticking it on the appropriate system work
queue when we queue it.  This will allow it to have global state and drop
locks.  It should probably be non-reentrant already as it may spend a long time
holding the key serial spinlock, and so multiple entrants can spend long
periods of time just sitting there spinning, waiting to get the lock.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>

security/keys/key.c

index 991a15f..1f3ed44 100644 (file)
@@ -602,7 +602,7 @@ void key_put(struct key *key)
                key_check(key);
 
                if (atomic_dec_and_test(&key->usage))
-                       schedule_work(&key_gc_unused_work);
+                       queue_work(system_nrt_wq, &key_gc_unused_work);
        }
 }
 EXPORT_SYMBOL(key_put);