diff --git a/kernel/exit.c b/kernel/exit.c
index 4c70c377d21f0fcfae90431d71debf4541fabaeb..4a72f1753edb247dd617eee602d5bb2f4a1cde3d 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -149,6 +149,7 @@ static void __exit_signal(struct task_struct *tsk)
 		 * see account_group_exec_runtime().
 		 */
 		task_rq_unlock_wait(tsk);
+		tty_kref_put(sig->tty);
 		__cleanup_signal(sig);
 	}
 }
diff --git a/kernel/fork.c b/kernel/fork.c
index 2e9cc3139ec68ee5ea3a79279788fae9db143dbb..b7879ef6e7cdb68c1c5aa8ba54077507aa9d5481 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -892,7 +892,6 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
 void __cleanup_signal(struct signal_struct *sig)
 {
 	thread_group_cputime_free(sig);
-	tty_kref_put(sig->tty);
 	kmem_cache_free(signal_cachep, sig);
 }
 
@@ -1263,7 +1262,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
 				p->nsproxy->pid_ns->child_reaper = p;
 
 			p->signal->leader_pid = pid;
-			tty_kref_put(p->signal->tty);
 			p->signal->tty = tty_kref_get(current->signal->tty);
 			attach_pid(p, PIDTYPE_PGID, task_pgrp(current));
 			attach_pid(p, PIDTYPE_SID, task_session(current));