mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Bharata B Rao <bharata@amd.com>
To: <linux-kernel@vger.kernel.org>, <linux-mm@kvack.org>
Cc: <Jonathan.Cameron@huawei.com>, <dave.hansen@intel.com>,
	<gourry@gourry.net>, <mgorman@techsingularity.net>,
	<mingo@redhat.com>, <peterz@infradead.org>,
	<raghavendra.kt@amd.com>, <riel@surriel.com>,
	<rientjes@google.com>, <sj@kernel.org>, <weixugc@google.com>,
	<willy@infradead.org>, <ying.huang@linux.alibaba.com>,
	<ziy@nvidia.com>, <dave@stgolabs.net>, <nifan.cxl@gmail.com>,
	<xuezhengchu@huawei.com>, <yiannis@zptcorp.com>,
	<akpm@linux-foundation.org>, <david@kernel.org>,
	<byungchul@sk.com>, <kinseyho@google.com>,
	<joshua.hahnjy@gmail.com>, <yuanchu@google.com>,
	<balbirs@nvidia.com>, <alok.rathore@samsung.com>,
	<shivankg@amd.com>, <donettom@linux.ibm.com>
Subject: Re: [PATCH v8 7/8] x86/mm/ibs: In-kernel driver for AMD IBS Memory Profiler
Date: Tue, 4 Aug 2026 10:30:12 +0530	[thread overview]
Message-ID: <7a6aca7d-6c06-4a4b-a404-f0e0a95eae5f@amd.com> (raw)
In-Reply-To: <20260728054356.291998-8-bharata@amd.com>

[Reply to Shashiko review]

On 28-Jul-26 11:13 AM, Bharata B Rao wrote:
> diff --git a/arch/x86/mm/ibs-mprof.c b/arch/x86/mm/ibs-mprof.c
> new file mode 100644
> index 000000000000..923fb8f99552
> --- /dev/null
> +++ b/arch/x86/mm/ibs-mprof.c
> +
> +static bool mprof_pop_sample(struct mprof_sample_pcpu *pcpu, struct mprof_sample *s)
> +{
> +	int tail = READ_ONCE(pcpu->tail);
> +	/*
> +	 * Pairs with the smp_store_release() of head in mprof_push_sample();
> +	 * ensures the sample slot stores are visible before we read the slot.
> +	 */
> +	int head = smp_load_acquire(&pcpu->head);
> +	int next = tail + 1;
> +
> +	if (head == tail)
> +		return false;
> +
> +	if (next >= IBS_NR_SAMPLES)
> +		next = 0;
> +
> +	*s = pcpu->samples[tail];
> +
> +	WRITE_ONCE(pcpu->tail, next);
> +	return true;
> +}

> Could the compiler reorder the non-volatile struct assignment of the sample
> after the volatile store to tail?
>
> If a hardware interrupt preempts the worker thread exactly after the tail
> update is published but before the sample copy is complete, the interrupt
> handler could observe the advanced tail and overwrite the sample data being
> read.
>
> Would it be safer to use smp_store_release(&pcpu->tail, next) here to ensure
> memory reads are strictly ordered before the tail update is published?

In this sample buffer SPSC ring, there is always one empty slot which keeps the
producer at least one slot behind the consumer. So writes to the same slot that
is being read is not possible even if the tail update is observed early.

Having said that, making the tail publish an explicit release is clearer and
symmetric with the head handling. Hence will update this tail publish using
smp_store_release().

> +static void mprof_overflow_handler(void)
> +{
> +	u64 mem_ctl, mem_data3, mem_data2, paddr, data_src;
> +	struct work_struct *w = &this_cpu_ptr(&mprof_work)->work;
> +	unsigned long pfn;
> +	struct page *page;
> +
> +	rdmsrq(MSR_AMD64_IBS_MPROF_CTL, mem_ctl);
> +	if (!(mem_ctl & IBS_MPROF_CTL_VAL))
> +		return;
> +
> +	mprof_disable_profiling(mem_ctl);
> +	count_vm_event(HWHINT_TOTAL_EVENTS);
> +
> +	rdmsrq(MSR_AMD64_IBS_MPROF_DATA3, mem_data3);
> +	rdmsrq(MSR_AMD64_IBS_MPROF_DATA2, mem_data2);
> +
> +	data_src = mem_data2 & IBS_MPROF_DATA2_DATASRC_MASK;
> +	data_src |= ((mem_data2 & IBS_MPROF_DATA2_DATASRC_MASK_HIGH) >>
> +			IBS_MPROF_DATA2_DATASRC_MASK_HIGH_SHIFT);
> +
> +	switch (data_src) {
> +	case IBS_MPROF_DATA2_DATASRC_DRAM:
> +		count_vm_event(HWHINT_DRAM_ACCESSES);
> +		break;
> +	case IBS_MPROF_DATA2_DATASRC_EXT_MEM:
> +		count_vm_event(HWHINT_EXTMEM_ACCESSES);
> +		break;
> +	}
> +

> Does this switch intentionally omit the IBS_MPROF_DATA2_DATASRC_DRAM_FAR case?
> It appears that if remote DRAM accesses occur, they are currently silently
> dropped from the statistics rather than being counted under
> HWHINT_DRAM_ACCESSES.

No it was an oversight, remote DRAM access is still a DRAM access. It is just a
stats reporting mismatch and promotion behaviour isn't affected. Will include
remote DRAM access into HWHINT_DRAM_ACCESSES counter.

> +
> +static int x86_amd_ibs_mprof_teardown(unsigned int cpu)
> +{
> +	int offset = get_mprof_lvt_offset();
> +	u64 mem_ctl;
> +
> +	if (offset >= 0)
> +		setup_APIC_eilvt(offset, IBS_MEMPROF_VECTOR, APIC_DELIVERY_MODE_FIXED, 1);
> +
> +	rdmsrq(MSR_AMD64_IBS_MPROF_CTL, mem_ctl);
> +	mprof_disable_profiling(mem_ctl);
> +
> +	/*
> +	 * The producer is now silenced and this CPU's worker is gone. Drop
> +	 * any unconsumed samples (see mprof_drain_cpu) and clear the pending
> +	 * flag so a subsequent re-online of this CPU starts from a clean
> +	 * state.
> +	 */
> +	mprof_drain_cpu(cpu);
> +	per_cpu(mprof_work_pending, cpu) = false;
> +
> +	return 0;
> +}
> +

> Is the assumption that "this CPU's worker is gone" always true here?
>
> When a CPU goes offline, its per-CPU workqueues are unbound during the
> CPUHP_AP_WORKQUEUE_ONLINE phase, meaning pending work items like
> mprof_work_handler can migrate to another CPU and continue executing.
>
> Because x86_amd_ibs_mprof_teardown runs later in the STARTING phase,
> mprof_drain_cpu() modifies the ring buffer unsynchronized. If the migrated
> worker is concurrently popping a sample, this could happen:
>
> Worker CPU (migrated):
> mprof_pop_sample() reads tail
>
> Dying CPU:
> mprof_drain_cpu() zeroes head and tail
>
> Worker CPU (migrated):
> mprof_pop_sample() updates tail = next
>
> Could this desync the tail pointer, potentially causing the worker loop to
> read up to 149 uninitialized or stale samples and falsely report them to
> pghot_record_access?
>
> Would it be safer to register the teardown at an ONLINE-level hotplug state
> so it can use cancel_work_sync() after disabling profiling?

That comment/assumption was inaccurate: after the workqueue unbind at offline,
the worker can still be running on another CPU, so mprof_drain_cpu()'s ring
reset could race it.

The migrated worker operates on its own ring buffer, so it is a single consumer
which completely drains the ring on its own. The teardown reset was therefore
both redundant and the only thing racing the worker. I will drop it in the next
version.

Regards,
Bharata.

  reply	other threads:[~2026-08-04  5:00 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-28  5:43 [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure Bharata B Rao
2026-07-28  5:43 ` [PATCH v8 1/8] mm: migrate: Allow misplaced migration without VMA Bharata B Rao
2026-09-29 22:06   ` Davidlohr Bueso
2026-07-28  5:43 ` [PATCH v8 2/8] mm: migrate: Add promote_misplaced_memcg_folios() Bharata B Rao
2026-07-30  6:34   ` Bharata B Rao
2026-09-29 22:08   ` Davidlohr Bueso
2026-07-28  5:43 ` [PATCH v8 3/8] mm: Hot page tracking and promotion - pghot Bharata B Rao
2026-07-31 16:14   ` Bharata B Rao
2026-09-27 23:25   ` Davidlohr Bueso
2026-09-28  4:14     ` Bharata B Rao
2026-07-28  5:43 ` [PATCH v8 4/8] mm: pghot: Precision mode for pghot Bharata B Rao
2026-07-31 16:27   ` Bharata B Rao
2026-07-28  5:43 ` [PATCH v8 5/8] mm: sched: move NUMA balancing tiering promotion to pghot Bharata B Rao
2026-08-03  8:23   ` Bharata B Rao
2026-07-28  5:43 ` [PATCH v8 6/8] x86/ibs: Move IBS caps definitions into its own header Bharata B Rao
2026-07-28  5:43 ` [PATCH v8 7/8] x86/mm/ibs: In-kernel driver for AMD IBS Memory Profiler Bharata B Rao
2026-08-04  5:00   ` Bharata B Rao [this message]
2026-10-28 10:09   ` [RFC] x86: Remove CALL_FUNCTION_VECTOR Peter Zijlstra
2026-10-28 10:21     ` Jürgen Groß
2026-07-28  5:43 ` [PATCH v8 8/8] x86/mm/ibs: Add runtime controls for IBS memprofiler Bharata B Rao
2026-08-04  5:20   ` Bharata B Rao
2026-07-28  5:55 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure - microbenchmark numbers Bharata B Rao
2026-07-28  5:59 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure - NAS BT Bharata B Rao
2026-07-28  6:02 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure - Graph500 Bharata B Rao
2026-07-28  6:05 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure - redis-memtier Bharata B Rao
2026-07-28  6:17 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure - llama-bench Bharata B Rao
2026-07-28 18:14 ` [PATCH v8 0/8] mm: Hot page tracking and promotion infrastructure Andrew Morton
2026-07-28 18:24   ` Matthew Wilcox
2026-07-28 18:57     ` Gregory Price
2026-07-28 19:20       ` David Hildenbrand (Arm)
2026-07-28 19:59         ` Gregory Price
2026-07-29 11:45         ` Bharata B Rao
2026-08-10  3:38     ` Yongting Lin
2026-08-10  4:16       ` Matthew Wilcox
2026-08-10  5:35         ` Bharata B Rao
2026-08-11  7:15         ` Yongting Lin
2026-08-13  2:21         ` Gregory Price
2026-08-10 14:37       ` SJ Park
2026-08-11  6:37         ` Yongting Lin
2026-07-29  9:35   ` Bharata B Rao
2026-07-29 13:54     ` SJ Park
2026-08-04  1:23       ` SJ Park
2026-08-06  5:49   ` Bharata B Rao
2026-08-06 13:44     ` SJ Park
2026-08-10  4:46       ` Bharata B Rao
2026-08-10 14:25         ` SJ Park
2026-09-11 21:08 ` Joshua Hahn
2026-09-16  3:08   ` Bharata B Rao
2026-09-16 20:52     ` Joshua Hahn
2026-09-17  5:23       ` Bharata B Rao
2026-09-27 23:21     ` Davidlohr Bueso
2026-09-28  4:13       ` Bharata B Rao
2026-09-25  2:12 ` Davidlohr Bueso
2026-09-25  9:50   ` SJ Park
2026-09-25 16:30     ` Davidlohr Bueso
2026-09-25 16:57       ` Gregory Price
2026-09-27 15:51   ` Bharata B Rao
2026-09-29 19:56     ` Davidlohr Bueso

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=7a6aca7d-6c06-4a4b-a404-f0e0a95eae5f@amd.com \
    --to=bharata@amd.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=akpm@linux-foundation.org \
    --cc=alok.rathore@samsung.com \
    --cc=balbirs@nvidia.com \
    --cc=byungchul@sk.com \
    --cc=dave.hansen@intel.com \
    --cc=dave@stgolabs.net \
    --cc=david@kernel.org \
    --cc=donettom@linux.ibm.com \
    --cc=gourry@gourry.net \
    --cc=joshua.hahnjy@gmail.com \
    --cc=kinseyho@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=mingo@redhat.com \
    --cc=nifan.cxl@gmail.com \
    --cc=peterz@infradead.org \
    --cc=raghavendra.kt@amd.com \
    --cc=riel@surriel.com \
    --cc=rientjes@google.com \
    --cc=shivankg@amd.com \
    --cc=sj@kernel.org \
    --cc=weixugc@google.com \
    --cc=willy@infradead.org \
    --cc=xuezhengchu@huawei.com \
    --cc=yiannis@zptcorp.com \
    --cc=ying.huang@linux.alibaba.com \
    --cc=yuanchu@google.com \
    --cc=ziy@nvidia.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

all inboxes | Powered by JetHome®