All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Hocko <mhocko@kernel.org>
To: Yong-Taek Lee <ytk.lee@samsung.com>
Cc: "linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Oleg Nesterov <oleg@redhat.com>
Subject: Re: [PATCH] mm, oom_adj: avoid meaningless loop to find processes sharing mm
Date: Tue, 9 Oct 2018 10:03:43 +0200	[thread overview]
Message-ID: <20181009080343.GE8528@dhcp22.suse.cz> (raw)
In-Reply-To: <20181009062330.GA8528@dhcp22.suse.cz>

On Tue 09-10-18 08:23:30, Michal Hocko wrote:
> [Cc Oleg]

JFYI there was new submission http://lkml.kernel.org/r/20181008011931epcms1p82dd01b7e5c067ea99946418bc97de46a@epcms1p8
> 
> On Fri 05-10-18 15:32:08, Yong-Taek Lee wrote:
> > It is introduced by commit 44a70adec910 ("mm, oom_adj: make sure
> > processes sharing mm have same view of oom_score_adj"). Most of
> > user process's mm_users is bigger than 1 but only one thread group.
> > In this case, for_each_process loop meaninglessly try to find processes
> > which sharing same mm even though there is only one thread group.
> > 
> > My idea is that target task's nr thread is smaller than mm_users if there
> > are more thread groups sharing the same mm. So we can skip loop
> 
> I remember trying to optimize this but ended up with nothing that would
> work reliable. E.g. what prevents a thread terminating right after we
> read mm reference count and result in early break and other process
> not being updated properly?
> 
> > if mm_user and nr_thread are same.
> > 
> > test result
> > while true; do count=0; time while [ $count -lt 10000 ]; do echo -1000 > /proc/
> > 1457/oom_score_adj; count=$((count+1)); done; done;
> 
> Is this overhead noticeable in a real work usecases though? Or are you
> updating oom_score_adj that often really?
> 
> > before patch
> > 0m00.59s real     0m00.09s user     0m00.51s system
> > 0m00.59s real     0m00.14s user     0m00.45s system
> > 0m00.58s real     0m00.11s user     0m00.47s system
> > 0m00.58s real     0m00.10s user     0m00.48s system
> > 0m00.59s real     0m00.11s user     0m00.48s system
> > 
> > after patch
> > 0m00.15s real     0m00.07s user     0m00.08s system
> > 0m00.14s real     0m00.10s user     0m00.04s system
> > 0m00.14s real     0m00.10s user     0m00.05s system
> > 0m00.14s real     0m00.08s user     0m00.07s system
> > 0m00.14s real     0m00.08s user     0m00.07s system
> > 
> > Signed-off-by: Lee YongTaek <ytk.lee@samsung.com>
> > ---
> >  fs/proc/base.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> > 
> > diff --git a/fs/proc/base.c b/fs/proc/base.c
> > index f9f72aee6d45..54b2fb5e9c51 100644
> > --- a/fs/proc/base.c
> > +++ b/fs/proc/base.c
> > @@ -1056,6 +1056,7 @@ static int __set_oom_adj(struct file *file, int oom_adj,
> > bool legacy)
> >         struct mm_struct *mm = NULL;
> >         struct task_struct *task;
> >         int err = 0;
> > +       int mm_users = 0;
> > 
> >         task = get_proc_task(file_inode(file));
> >         if (!task)
> > @@ -1092,7 +1093,8 @@ static int __set_oom_adj(struct file *file, int oom_adj,
> > bool legacy)
> >                 struct task_struct *p = find_lock_task_mm(task);
> > 
> >                 if (p) {
> > -                       if (atomic_read(&p->mm->mm_users) > 1) {
> > +                       mm_users = atomic_read(&p->mm->mm_users);
> > +                       if ((mm_users > 1) && (mm_users != get_nr_threads(p)))
> > {
> >                                 mm = p->mm;
> >                                 atomic_inc(&mm->mm_count);
> >                         }
> > --
> > 
> > *
> 
> -- 
> Michal Hocko
> SUSE Labs

-- 
Michal Hocko
SUSE Labs

  reply	other threads:[~2018-10-09  8:03 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20181005063208epcms1p22959cd2f771ad017996e2b18266791ea@epcms1p2>
2018-10-05  6:32 ` [PATCH] mm, oom_adj: avoid meaningless loop to find processes sharing mm Yong-Taek Lee
2018-10-09  6:23   ` Michal Hocko
2018-10-09  8:03     ` Michal Hocko [this message]
     [not found] <CGME20181008011931epcms1p82dd01b7e5c067ea99946418bc97de46a@epcms1p8>
2018-10-08  1:19 ` Yong-Taek Lee
2018-10-08  2:52   ` Tetsuo Handa
     [not found]   ` <CGME20181008011931epcms1p82dd01b7e5c067ea99946418bc97de46a@epcms1p5>
2018-10-08  6:14     ` Yong-Taek Lee
2018-10-08  6:22       ` Tetsuo Handa
     [not found]       ` <CGME20181008011931epcms1p82dd01b7e5c067ea99946418bc97de46a@epcms1p2>
2018-10-08  8:38         ` Yong-Taek Lee
2018-10-08  9:27           ` Tetsuo Handa
2018-10-09  6:35             ` Michal Hocko
2018-10-09  7:50               ` Michal Hocko
2018-10-09 10:00                 ` Tetsuo Handa
2018-10-09 11:10                   ` Michal Hocko
2018-10-09 12:52                     ` Tetsuo Handa
2018-10-09 12:58                       ` Michal Hocko
2018-10-09 13:14                         ` Tetsuo Handa
2018-10-09 13:26                           ` Michal Hocko
2018-10-09 13:51                             ` Tetsuo Handa
2018-10-09 14:09                               ` Michal Hocko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181009080343.GE8528@dhcp22.suse.cz \
    --to=mhocko@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=oleg@redhat.com \
    --cc=ytk.lee@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.