Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 041827a4 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Srinivasarao Pathipati
Browse files

tasks: Add a count of task RCU users



Add a count of the number of RCU users (currently 1) of the task
struct so that we can later add the scheduler case and get rid of the
very subtle task_rcu_dereference(), and just use rcu_dereference().

As suggested by Oleg have the count overlap rcu_head so that no
additional space in task_struct is required.

Change-Id: Ib1f00439f5e119cce4af2bf712df5a60b47fa81f
Inspired-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Inspired-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Chris Metcalf <cmetcalf@ezchip.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Kirill Tkhai <tkhai@yandex.ru>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russell King - ARM Linux admin <linux@armlinux.org.uk>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/87woebdplt.fsf_-_@x220.int.ebiederm.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Git-commit: 3fbd7ee285b2bbc6eebd15a3c8786d9776a402a8
Git-repo: https://android.googlesource.com/kernel/common/


[quic_spathi@quicinc.com: resolved trivial merge conflicts]
Signed-off-by: default avatarSrinivasarao Pathipati <quic_spathi@quicinc.com>
parent 067a3d9a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1344,7 +1344,10 @@ struct task_struct {

	struct tlbflush_unmap_batch	tlb_ubc;

	union {
		refcount_t		rcu_users;
		struct rcu_head		rcu;
	};

	/* Cache last used pipe for splice(): */
	struct pipe_inode_info		*splice_pipe;
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ static inline void put_task_struct(struct task_struct *t)
}

struct task_struct *task_rcu_dereference(struct task_struct **ptask);
void put_task_struct_rcu_user(struct task_struct *task);

#ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT
extern int arch_task_struct_size __read_mostly;
+6 −1
Original line number Diff line number Diff line
@@ -181,6 +181,11 @@ static void delayed_put_task_struct(struct rcu_head *rhp)
	put_task_struct(tsk);
}

void put_task_struct_rcu_user(struct task_struct *task)
{
	if (refcount_dec_and_test(&task->rcu_users))
		call_rcu(&task->rcu, delayed_put_task_struct);
}

void release_task(struct task_struct *p)
{
@@ -221,7 +226,7 @@ void release_task(struct task_struct *p)

	write_unlock_irq(&tasklist_lock);
	release_thread(p);
	call_rcu(&p->rcu, delayed_put_task_struct);
	put_task_struct_rcu_user(p);

	p = leader;
	if (unlikely(zap_leader))
+3 −4
Original line number Diff line number Diff line
@@ -896,10 +896,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
	tsk->stack_canary = get_random_canary();
#endif

	/*
	 * One for us, one for whoever does the "release_task()" (usually
	 * parent)
	 */
	/* One for the user space visible state that goes away when reaped. */
	refcount_set(&tsk->rcu_users, 1);
	/* One for the rcu users, and one for the scheduler */
	atomic_set(&tsk->usage, 2);
#ifdef CONFIG_BLK_DEV_IO_TRACE
	tsk->btrace_seq = 0;