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

Commit e25ff11f authored by Al Viro's avatar Al Viro
Browse files

split the slow path in acct_process() off



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent cdd37e23
Loading
Loading
Loading
Loading
+28 −22
Original line number Diff line number Diff line
@@ -599,8 +599,9 @@ void acct_collect(long exitcode, int group_dead)
	spin_unlock_irq(&current->sighand->siglock);
}

static void acct_process_in_ns(struct pid_namespace *ns)
static void slow_acct_process(struct pid_namespace *ns)
{
	for ( ; ns; ns = ns->parent) {
		struct file *file = NULL;
		struct bsd_acct_struct *acct;

@@ -609,13 +610,13 @@ static void acct_process_in_ns(struct pid_namespace *ns)
		 * accelerate the common fastpath:
		 */
		if (!acct || !acct->file)
		return;
			continue;

		spin_lock(&acct_lock);
		file = acct->file;
		if (unlikely(!file)) {
			spin_unlock(&acct_lock);
		return;
			continue;
		}
		get_file(file);
		spin_unlock(&acct_lock);
@@ -623,10 +624,10 @@ static void acct_process_in_ns(struct pid_namespace *ns)
		do_acct_process(acct, ns, file);
		fput(file);
	}
}

/**
 * acct_process - now just a wrapper around acct_process_in_ns,
 * which in turn is a wrapper around do_acct_process.
 * acct_process
 *
 * handles process accounting for an exiting task
 */
@@ -639,6 +640,11 @@ void acct_process(void)
	 * alive and holds its namespace, which in turn holds
	 * its parent.
	 */
	for (ns = task_active_pid_ns(current); ns != NULL; ns = ns->parent)
		acct_process_in_ns(ns);
	for (ns = task_active_pid_ns(current); ns != NULL; ns = ns->parent) {
		struct bsd_acct_struct *acct = ns->bacct;
		if (acct && acct->file)
			break;
	}
	if (unlikely(ns))
		slow_acct_process(ns);
}