diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index d3d499272d1392eda45fea179131856661585455..b613ec89e99c1a52aeefe7afbac95f0da3c00ae9 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -704,10 +704,14 @@ void audit_free(struct task_struct *tsk)
 {
 	struct audit_context *context;
 
-	task_lock(tsk);
+	/*
+	 * No need to lock the task - when we execute audit_free()
+	 * then the task has no external references anymore, and
+	 * we are tearing it down. (The locking also confuses
+	 * DEBUG_LOCKDEP - this freeing may occur in softirq
+	 * contexts as well, via RCU.)
+	 */
 	context = audit_get_context(tsk, 0, 0);
-	task_unlock(tsk);
-
 	if (likely(!context))
 		return;