linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: SeongJae Park <sj38.park@gmail.com>
To: Shakeel Butt <shakeelb@google.com>
Cc: SeongJae Park <sj38.park@gmail.com>,
	SeongJae Park <sjpark@amazon.de>,
	Jonathan.Cameron@huawei.com, acme@kernel.org,
	alexander.shishkin@linux.intel.com, amit@kernel.org,
	benh@kernel.crashing.org,
	Brendan Higgins <brendanhiggins@google.com>,
	Jonathan Corbet <corbet@lwn.net>,
	David Hildenbrand <david@redhat.com>,
	dwmw@amazon.com, Marco Elver <elver@google.com>,
	"Du, Fan" <fan.du@intel.com>,
	foersleo@amazon.de, greg@kroah.com,
	Greg Thelen <gthelen@google.com>,
	guoju.fgj@alibaba-inc.com, jgowans@amazon.com,
	Mel Gorman <mgorman@suse.de>,
	mheyne@amazon.de, Minchan Kim <minchan@kernel.org>,
	Ingo Molnar <mingo@redhat.com>,
	namhyung@kernel.org,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Rik van Riel <riel@surriel.com>,
	David Rientjes <rientjes@google.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mike Rapoport <rppt@kernel.org>, Shuah Khan <shuah@kernel.org>,
	sieberf@amazon.com, snu@zelle79.org,
	Vlastimil Babka <vbabka@suse.cz>,
	Vladimir Davydov <vdavydov.dev@gmail.com>,
	zgf574564920@gmail.com, linux-damon@amazon.com,
	Linux MM <linux-mm@kvack.org>,
	linux-doc@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v31 01/13] mm: Introduce Data Access MONitor (DAMON)
Date: Thu, 24 Jun 2021 10:26:19 +0000	[thread overview]
Message-ID: <20210624102623.24563-1-sjpark@amazon.de> (raw)
In-Reply-To: <CALvZod7byYA5jfzF3Vtr1czwWoiaHjkqn9M4e1Ajn1PP47k9=w@mail.gmail.com>

From: SeongJae Park <sjpark@amazon.de>

On Tue, 22 Jun 2021 07:59:11 -0700 Shakeel Butt <shakeelb@google.com> wrote:

> On Mon, Jun 21, 2021 at 1:31 AM SeongJae Park <sj38.park@gmail.com> wrote:
> >
> > From: SeongJae Park <sjpark@amazon.de>
> >
> > DAMON is a data access monitoring framework for the Linux kernel.  The
> > core mechanisms of DAMON make it
> >
> >  - accurate (the monitoring output is useful enough for DRAM level
> >    performance-centric memory management; It might be inappropriate for
> >    CPU cache levels, though),
> >  - light-weight (the monitoring overhead is normally low enough to be
> >    applied online), and
> >  - scalable (the upper-bound of the overhead is in constant range
> >    regardless of the size of target workloads).
> >
> > Using this framework, hence, we can easily write efficient kernel space
> > data access monitoring applications.  For example, the kernel's memory
> > management mechanisms can make advanced decisions using this.
> > Experimental data access aware optimization works that incurring high
> > access monitoring overhead could again be implemented on top of this.
> >
> > Due to its simple and flexible interface, providing user space interface
> > would be also easy.  Then, user space users who have some special
> > workloads can write personalized applications for better understanding
> > and optimizations of their workloads and systems.
> >
> > ===
> >
> > Nevertheless, this commit is defining and implementing only basic access
> > check part without the overhead-accuracy handling core logic.  The basic
> > access check is as below.
> >
> > The output of DAMON says what memory regions are how frequently accessed
> > for a given duration.  The resolution of the access frequency is
> > controlled by setting ``sampling interval`` and ``aggregation
> > interval``.  In detail, DAMON checks access to each page per ``sampling
> > interval`` and aggregates the results.  In other words, counts the
> > number of the accesses to each region.  After each ``aggregation
> > interval`` passes, DAMON calls callback functions that previously
> > registered by users so that users can read the aggregated results and
> > then clears the results.  This can be described in below simple
> > pseudo-code::
> >
> >     init()
> >     while monitoring_on:
> >         for page in monitoring_target:
> >             if accessed(page):
> >                 nr_accesses[page] += 1
> >         if time() % aggregation_interval == 0:
> >             for callback in user_registered_callbacks:
> >                 callback(monitoring_target, nr_accesses)
> >             for page in monitoring_target:
> >                 nr_accesses[page] = 0
> >         if time() % update_interval == 0:
> 
> regions_update_interval?

It used the name before.  But, I changed the name in this way to use it as a
general periodic updates of monitoring primitives.  Of course we can use the
specific name only in this specific example, but also want to make this as
similar to the actual code as possible.

If you strongly want to rename this, please feel free to let me know.

> 
> >             update()
> >         sleep(sampling interval)
> >
> > The target regions constructed at the beginning of the monitoring and
> > updated after each ``regions_update_interval``, because the target
> > regions could be dynamically changed (e.g., mmap() or memory hotplug).
> > The monitoring overhead of this mechanism will arbitrarily increase as
> > the size of the target workload grows.
> >
> > The basic monitoring primitives for actual access check and dynamic
> > target regions construction aren't in the core part of DAMON.  Instead,
> > it allows users to implement their own primitives that are optimized for
> > their use case and configure DAMON to use those.  In other words, users
> > cannot use current version of DAMON without some additional works.
> >
> > Following commits will implement the core mechanisms for the
> > overhead-accuracy control and default primitives implementations.
> >
> > Signed-off-by: SeongJae Park <sjpark@amazon.de>
> > Reviewed-by: Leonard Foerster <foersleo@amazon.de>
> > Reviewed-by: Fernand Sieber <sieberf@amazon.com>
> 
> Few nits below otherwise look good to me. You can add:
> 
> Acked-by: Shakeel Butt <shakeelb@google.com>

Thank you!

> 
> [...]
> > +/*
> > + * __damon_start() - Starts monitoring with given context.
> > + * @ctx:       monitoring context
> > + *
> > + * This function should be called while damon_lock is hold.
> > + *
> > + * Return: 0 on success, negative error code otherwise.
> > + */
> > +static int __damon_start(struct damon_ctx *ctx)
> > +{
> > +       int err = -EBUSY;
> > +
> > +       mutex_lock(&ctx->kdamond_lock);
> > +       if (!ctx->kdamond) {
> > +               err = 0;
> > +               ctx->kdamond_stop = false;
> > +               ctx->kdamond = kthread_create(kdamond_fn, ctx, "kdamond.%d",
> > +                               nr_running_ctxs);
> > +               if (IS_ERR(ctx->kdamond))
> > +                       err = PTR_ERR(ctx->kdamond);
> > +               else
> > +                       wake_up_process(ctx->kdamond);
> 
> Nit: You can use kthread_run() here.

Ok, I will use that from the next spin.

> 
> > +       }
> > +       mutex_unlock(&ctx->kdamond_lock);
> > +
> > +       return err;
> > +}
> > +
> [...]
> > +static int __damon_stop(struct damon_ctx *ctx)
> > +{
> > +       mutex_lock(&ctx->kdamond_lock);
> > +       if (ctx->kdamond) {
> > +               ctx->kdamond_stop = true;
> > +               mutex_unlock(&ctx->kdamond_lock);
> > +               while (damon_kdamond_running(ctx))
> > +                       usleep_range(ctx->sample_interval,
> > +                                       ctx->sample_interval * 2);
> 
> Any reason to not use kthread_stop() here?

Using 'kthread_stop()' here will make the code much simpler.  But, 'kdamond'
also stops itself when all monitoring targets became invalid (e.g., all
monitoring target processes terminated).  However, 'kthread_stop()' is not easy
to be used for the use case (self stopping).  It's of course possible, but it
would make the code longer.  That's why I use 'kdamond_stop' flag here.  So,
I'd like leave this as is.  If you think 'kthread_stop()' should be used,
please feel free to let me know.


Thanks,
SeongJae Park

  reply	other threads:[~2021-06-24 10:26 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-21  8:30 [PATCH v31 00/13] Introduce Data Access MONitor (DAMON) SeongJae Park
2021-06-21  8:30 ` [PATCH v31 01/13] mm: " SeongJae Park
2021-06-22 14:59   ` Shakeel Butt
2021-06-24 10:26     ` SeongJae Park [this message]
2021-06-24 14:34       ` Shakeel Butt
2021-06-21  8:30 ` [PATCH v31 02/13] mm/damon/core: Implement region-based sampling SeongJae Park
2021-06-22 14:59   ` Shakeel Butt
2021-06-21  8:30 ` [PATCH v31 03/13] mm/damon: Adaptively adjust regions SeongJae Park
2021-06-22 14:59   ` Shakeel Butt
2021-06-24 10:26     ` SeongJae Park
2021-06-21  8:30 ` [PATCH v31 04/13] mm/idle_page_tracking: Make PG_idle reusable SeongJae Park
2021-06-21  8:31 ` [PATCH v31 05/13] mm/damon: Implement primitives for the virtual memory address spaces SeongJae Park
2021-06-22 15:00   ` Shakeel Butt
2021-06-24 10:26     ` SeongJae Park
2021-06-24 14:42       ` Shakeel Butt
2021-06-24 15:21         ` SeongJae Park
2021-06-24 16:33           ` Shakeel Butt
2021-06-24 17:38             ` SeongJae Park
2021-07-01  0:18   ` Shakeel Butt
2021-07-01  0:19     ` Shakeel Butt
2021-06-21  8:31 ` [PATCH v31 06/13] mm/damon: Add a tracepoint SeongJae Park
2021-06-22 15:01   ` Shakeel Butt
2021-06-21  8:31 ` [PATCH v31 07/13] mm/damon: Implement a debugfs-based user space interface SeongJae Park
2021-06-22 18:12   ` Shakeel Butt
2021-06-24 10:26     ` SeongJae Park
2021-06-24 14:52       ` Shakeel Butt
2021-06-21  8:31 ` [PATCH v31 08/13] mm/damon/dbgfs: Export kdamond pid to the user space SeongJae Park
2021-06-22 18:23   ` Shakeel Butt
2021-06-24 10:26     ` SeongJae Park
2021-06-21  8:31 ` [PATCH v31 09/13] mm/damon/dbgfs: Support multiple contexts SeongJae Park
2021-06-21  8:31 ` [PATCH v31 10/13] Documentation: Add documents for DAMON SeongJae Park
2021-06-21  8:31 ` [PATCH v31 11/13] mm/damon: Add kunit tests SeongJae Park
2021-06-21  8:31 ` [PATCH v31 12/13] mm/damon: Add user space selftests SeongJae Park
2021-06-21  8:31 ` [PATCH v31 13/13] MAINTAINERS: Update for DAMON SeongJae Park

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=20210624102623.24563-1-sjpark@amazon.de \
    --to=sj38.park@gmail.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=amit@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=brendanhiggins@google.com \
    --cc=corbet@lwn.net \
    --cc=david@redhat.com \
    --cc=dwmw@amazon.com \
    --cc=elver@google.com \
    --cc=fan.du@intel.com \
    --cc=foersleo@amazon.de \
    --cc=greg@kroah.com \
    --cc=gthelen@google.com \
    --cc=guoju.fgj@alibaba-inc.com \
    --cc=jgowans@amazon.com \
    --cc=linux-damon@amazon.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=mheyne@amazon.de \
    --cc=minchan@kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=riel@surriel.com \
    --cc=rientjes@google.com \
    --cc=rostedt@goodmis.org \
    --cc=rppt@kernel.org \
    --cc=shakeelb@google.com \
    --cc=shuah@kernel.org \
    --cc=sieberf@amazon.com \
    --cc=sjpark@amazon.de \
    --cc=snu@zelle79.org \
    --cc=vbabka@suse.cz \
    --cc=vdavydov.dev@gmail.com \
    --cc=zgf574564920@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).