All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
To: sj@kernel.org
Cc: corbet@lwn.net, damon@lists.linux.dev, linux-mm@kvack.org,
	rdunlap@infradead.org, sashiko-bot@kernel.org,
	skhan@linuxfoundation.org,
	Ravi Jonnalagadda <ravis.opensrc@gmail.com>
Subject: Re: [RFC PATCH v0] Docs/mm/damon/design: document data attributes report infra design (beyond page table accessed-bit milestone 2)
Date: Fri, 23 Oct 2026 12:48:48 -0700	[thread overview]
Message-ID: <20261023194848.2449-1-ravis.opensrc@gmail.com> (raw)
In-Reply-To: <20261022053227.90608-1-sj@kernel.org>

Hi SJ,

On Wed, 21 Oct 2026 22:32:26 -0700 SJ Park <sj@kernel.org> wrote:

> On Wed, 21 Oct 2026 21:17:08 -0700 Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
>
[...]
> > PEBS saves registers just after the instruction retires, so a load that
> > overwrites its base register defeats decode.  IBS saves no general
> > registers (perf reports the registers at the NMI), so decode is not
> > reliable on AMD.  Decode in kdamond must also survive exec, munmap, exit
> > and pid reuse.  These are synthetic loops chosen to separate the cases;
> > how often real code hits the failing case is not measured.
[...]
>
> Thank you for these testing, Ravi.  Unfortunately I'm still learning perf event
> and therefore not yet fully understanding these tests.  I will revisit after
> gaining more understanding.
>
> > So the suggestion is for the first report type to use the PMU-captured
> > address and load/store flag (AMD cpu-cycles:p; on Intel, the PEBS
> > memory events, which moves them into milestone 2).  Your call, of
> > course.
>
> Meanwhile, I will start with the current plan (capture register contents in NMI
> and decode in kdamond) if you don't have strong concern.

No strong concern.  Starting with decode makes sense, and VMs are a
good reason for it: in the KVM setups tried on Intel and AMD hosts, no
guest got a data address from the PMU, whereas every guest had a
software CPU clock (PERF_COUNT_SW_CPU_CLOCK) or basic hardware cycle
counter (PERF_COUNT_HW_CPU_CYCLES).

As quick background on why those earlier test tables brought up PEBS
and IBS: in perf_event, sampling CPU cycles has two modes, selected by
attr.precise_ip (the :p suffix in perf record):

  - Plain cycle or timer sampling (attr.precise_ip = 0, the default):
    a counter overflows and raises a normal interrupt/NMI.  The
    hardware does not record a data address; the handler just sees
    pt_regs where the CPU stopped between instructions.  Even though
    the interrupt lands a few instructions after the overflow ("skid"),
    regs->ip is the next instruction about to run and pt_regs holds
    its untouched input registers -- so decoding regs->ip gives the
    address it is about to access.

  - Hardware "precise" sampling (attr.precise_ip > 0, which routes to
    Intel PEBS or AMD IBS): the PMU hardware itself snapshots the
    instruction and, on supported events, the data address it touched.
    My earlier tables tested this mode.  Because PEBS records registers
    after the instruction retires (when a load into its own base
    register has already overwritten it) and IBS does not capture
    general registers, software decode breaks there -- which is fine,
    since in that mode you use the hardware-captured address instead
    (your Milestone 3).

So there is no need to revisit those earlier test tables for your
Milestone 2 prototype.

Two small tips for the prototype:

  - use PERF_COUNT_HW_CPU_CYCLES (or PERF_COUNT_SW_CPU_CLOCK in VMs
    without a virtual PMU) with the default attr.precise_ip = 0;
  - skip, and count, samples whose instruction does not access memory;
    in typical programs, only ~15-60% of cycle samples land on a load
    or store.

If you want to inspect what those samples look like from user space on
a program:

  R=AX,BX,CX,DX,SI,DI,BP,SP,IP,R8,R9,R10,R11,R12,R13,R14,R15
  perf record -c 2000003 -e cycles:u --intr-regs=$R -- <program>
  perf script -F ip,iregs,insn

(In a guest without hardware cycle counters, use -e cpu-clock:u
instead.)  Each sample shows the IP, the registers and the instruction
bytes to decode.

Thanks,
Ravi

  reply	other threads:[~2026-10-23 19:48 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-17 19:57 [RFC PATCH v0] Docs/mm/damon/design: document data attributes report infra design (beyond page table accessed-bit milestone 2) SJ Park
2026-10-18 19:58 ` sashiko-bot
2026-10-18 20:08   ` SJ Park
2026-10-22  4:17     ` Ravi Jonnalagadda
2026-10-22  5:32       ` SJ Park
2026-10-23 19:48         ` Ravi Jonnalagadda [this message]
2026-10-24  0:49           ` SJ Park
2026-10-22  4:17 ` Ravi Jonnalagadda
2026-10-22  5:29   ` SJ Park
2026-10-23 19:51     ` Ravi Jonnalagadda
2026-10-24  0:42       ` SJ 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=20261023194848.2449-1-ravis.opensrc@gmail.com \
    --to=ravis.opensrc@gmail.com \
    --cc=corbet@lwn.net \
    --cc=damon@lists.linux.dev \
    --cc=linux-mm@kvack.org \
    --cc=rdunlap@infradead.org \
    --cc=sashiko-bot@kernel.org \
    --cc=sj@kernel.org \
    --cc=skhan@linuxfoundation.org \
    /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.