FAILED: patch "[PATCH] getrusage: move thread_group_cputime_adjusted() outside of" failed to apply to 5.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x daa694e4137571b4ebec330f9a9b4d54aa8b8089
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024021925-cornstalk-army-948b@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
daa694e41375 ("getrusage: move thread_group_cputime_adjusted() outside of lock_task_sighand()") c7ac8231ace9 ("getrusage: add the "signal_struct *sig" local variable") bdd565f817a7 ("y2038: rusage: use __kernel_old_timeval")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From daa694e4137571b4ebec330f9a9b4d54aa8b8089 Mon Sep 17 00:00:00 2001
From: Oleg Nesterov <[email protected]>
Date: Mon, 22 Jan 2024 16:50:50 +0100
Subject: [PATCH] getrusage: move thread_group_cputime_adjusted() outside of
lock_task_sighand()
Patch series "getrusage: use sig->stats_lock", v2.
This patch (of 2):
thread_group_cputime() does its own locking, we can safely shift thread_group_cputime_adjusted() which does another for_each_thread loop outside of ->siglock protected section.
This is also preparation for the next patch which changes getrusage() to use stats_lock instead of siglock, thread_group_cputime() takes the same lock. With the current implementation recursive read_seqbegin_or_lock() is fine, thread_group_cputime() can't enter the slow mode if the caller holds stats_lock, yet this looks more safe and better performance-wise.
kernel/sys.c +21 -17
@@ -1785,17 +1785,19 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)struct task_struct *t;unsigned long flags;u64 tgutime, tgstime, utime, stime; -unsigned long maxrss =0 ; +unsigned long maxrss; +struct mm_struct *mm;struct signal_struct *sig = p->signal; -memset ((char *)r,0 ,sizeof (*r)); +memset (r,0 ,sizeof (*r)); utime = stime =0 ; + maxrss =0 ;if (who ==RUSAGE_THREAD ) {task_cputime_adjusted (current, &utime, &stime);accumulate_thread_rusage (p, r); maxrss = sig->maxrss; - goto out; + goto out_thread; }if (!lock_task_sighand (p, &flags))
@@ -1819,9 +1821,6 @@ void getrusage(struct task_struct *p, int who, struct rusage *r) fallthrough;case RUSAGE_SELF : -thread_group_cputime_adjusted (p, &tgutime, &tgstime); - utime += tgutime; - stime += tgstime; r->ru_nvcsw += sig->nvcsw; r->ru_nivcsw += sig->nivcsw; r->ru_minflt += sig->min_flt;
@@ -1839,19 +1838,24 @@ void getrusage(struct task_struct *p, int who, struct rusage *r) }unlock_task_sighand (p, &flags); -out: +if (who ==RUSAGE_CHILDREN ) + goto out_children; + +thread_group_cputime_adjusted (p, &tgutime, &tgstime); + utime += tgutime; + stime += tgstime; + +out_thread: + mm =get_task_mm (p); +if (mm) { +setmax_mm_hiwater_rss (&maxrss, mm); +mmput (mm); + } + +out_children: + r->ru_maxrss = maxrss * (PAGE_SIZE /1024 );/* convert pages to KBs */ r->ru_utime =ns_to_kernel_old_timeval (utime); r->ru_stime =ns_to_kernel_old_timeval (stime); - -if (who !=RUSAGE_CHILDREN ) { -struct mm_struct *mm =get_task_mm (p); - -if (mm) { -setmax_mm_hiwater_rss (&maxrss, mm); -mmput (mm); - } - } - r->ru_maxrss = maxrss * (PAGE_SIZE /1024 );/* convert pages to KBs */ } SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)