From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,HTML_MESSAGE,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MIME_HTML_ONLY,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DB965C433DB for ; Sun, 31 Jan 2021 19:51:19 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6377064DDD for ; Sun, 31 Jan 2021 19:51:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6377064DDD Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.vnet.ibm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 4DTMC74LjhzDrRH for ; Mon, 1 Feb 2021 06:51:15 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=linux.vnet.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=atrajeev@linux.vnet.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=DELAjC21; dkim-atps=neutral Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4DT9Tr6X9CzDqW3 for ; Sun, 31 Jan 2021 23:33:19 +1100 (AEDT) Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 10VCWXYh071354 for ; Sun, 31 Jan 2021 07:33:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=subject : mime-version : content-type : from : in-reply-to : date : cc : content-transfer-encoding : message-id : references : to; s=pp1; bh=w4tF5FmrwW4jd055pVkQU0NbK4dj9Z9qFOEHqeQijqI=; b=DELAjC2131T9BPCVsMm7g5fJk8u5JZ6oJNwN9mlvGx2z3a6BNV6o6j0cpc9zO4ejQmn7 MblWu+UoEHGgnAwd04Uz9Zznr4CEsbhH+nWWrfQ4vvUtMhGzvWo2MBsyqWloNZo66Lxa XuJ3uIMXgWT11pKJtna5Puz10L97GCW17tguoxk2/+T2cZtldBm43FQ9FfqJQYx2CdbM rae83mg58PijSFhj8Ax3/IhBckOtU5vDXo0COXEyLx8MXMa91glqka6yEFknrRXacHUD iFSx8KPlzR3xt25Li4knWvyrhMsF4ZSuhYmbGKYvipuvJZ9/dqt1+J+8lS5Oo01ZzaFq nQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 36dvmhr0np-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Sun, 31 Jan 2021 07:33:15 -0500 Received: from m0098393.ppops.net (m0098393.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 10VCXEUQ072600 for ; Sun, 31 Jan 2021 07:33:14 -0500 Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 36dvmhr0md-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 31 Jan 2021 07:33:14 -0500 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.0.42/8.16.0.42) with SMTP id 10VCTwg1007529; Sun, 31 Jan 2021 12:33:12 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma03fra.de.ibm.com with ESMTP id 36cy388gey-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 31 Jan 2021 12:33:12 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 10VCXAOo41550306 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 31 Jan 2021 12:33:10 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F2AF9AE053; Sun, 31 Jan 2021 12:33:09 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D8407AE04D; Sun, 31 Jan 2021 12:33:08 +0000 (GMT) Received: from [9.79.253.164] (unknown [9.79.253.164]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTPS; Sun, 31 Jan 2021 12:33:08 +0000 (GMT) Subject: Re: [PATCH v7 19/42] powerpc/perf: move perf irq/nmi handling details into traps.c Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.4\)) Content-Type: text/html; charset=us-ascii X-Apple-Auto-Saved: 1 X-Apple-Mail-Plain-Text-Draft: yes From: Athira Rajeev X-Apple-Mail-Remote-Attachments: YES X-Apple-Base-Url: x-msg://5/ In-Reply-To: <20210130130852.2952424-20-npiggin@gmail.com> X-Apple-Windows-Friendly: 1 Date: Sun, 31 Jan 2021 18:00:53 +0530 X-Apple-Mail-Signature: SKIP_SIGNATURE Content-Transfer-Encoding: quoted-printable Message-Id: <6B8EDA3A-5263-4FF4-9E14-B676AC6DF669@linux.vnet.ibm.com> References: <20210130130852.2952424-1-npiggin@gmail.com> <20210130130852.2952424-20-npiggin@gmail.com> X-Uniform-Type-Identifier: com.apple.mail-draft To: Nicholas Piggin X-Mailer: Apple Mail (2.3608.120.23.2.4) X-TM-AS-GCONF: 00 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.369, 18.0.737 definitions=2021-01-31_04:2021-01-29, 2021-01-31 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 mlxlogscore=999 bulkscore=0 priorityscore=1501 mlxscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2009150000 definitions=main-2101310065 X-Mailman-Approved-At: Mon, 01 Feb 2021 06:49:17 +1100 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev"


On = 30-Jan-2021, at 6:38 PM, Nicholas Piggin <npiggin@gmail.com> = wrote:

This is required in order to allow more significant = differences between
NMI type interrupt handlers and regular = asynchronous handlers.

Signed-off-by: Nicholas Piggin = <npiggin@gmail.com>
---
arch/powerpc/kernel/traps.c =      | 31 = +++++++++++++++++++++++++++-
arch/powerpc/perf/core-book3s.c  | = 35 ++------------------------------
arch/powerpc/perf/core-fsl-emb.c = | 25 -----------------------
3 files changed, 32 insertions(+), 59 = deletions(-)

diff --git a/arch/powerpc/kernel/traps.c = b/arch/powerpc/kernel/traps.c
index 4349b25807cf..6da3a3642dfb = 100644
--- a/arch/powerpc/kernel/traps.c
+++ = b/arch/powerpc/kernel/traps.c
@@ -1892,11 +1892,40 @@ void = vsx_unavailable_tm(struct pt_regs *regs)
}
#endif /* = CONFIG_PPC_TRANSACTIONAL_MEM */

-void = performance_monitor_exception(struct pt_regs *regs)
+static void = performance_monitor_exception_nmi(struct pt_regs *regs)
+{
+ = nmi_enter();
+
+ = __this_cpu_inc(irq_stat.pmu_irqs);
+
+ = perf_irq(regs);
+
+ nmi_exit();
+}
+
+static = void performance_monitor_exception_async(struct pt_regs = *regs)
{
+ = irq_enter();
+
= __this_cpu_inc(irq_stat.pmu_irqs);

= perf_irq(regs);
+
+ irq_exit();
+}
+
+void = performance_monitor_exception(struct pt_regs *regs)
+{
+ = /*
+ = * On 64-bit, if perf interrupts hit in a = local_irq_disable
+ * (soft-masked) region, we = consider them as NMIs. This is required to
+ * = prevent hash faults on user addresses when reading callchains = (and
+ = * looks better from an irq tracing perspective).
+ = */
+ = if (IS_ENABLED(CONFIG_PPC64) && = unlikely(arch_irq_disabled_regs(regs)))
+ = performance_monitor_exception_nmi(regs);
+ = else
+ = = performance_monitor_exception_async(regs);
}


Hi Nick,
Thanks for the change in tracing of PMI = interrupts.

I tested with this patch that moves perf irq/nmi = handling details into traps.c
and verified the patch works fine for = NMI and asynchronous cases.

Test scenario1: My test kernel module = tries to create one of performance monitor
counter overflow between = local_irq_save/local_irq_restore which should be delivered as an = NMI.

Verified it calls NMI exception handler from my ftrace logs = below

<<>>
dummy_perf = <-performance_monitor_exception_nmi
<<>>

Test = scenario2: My test kernel module tries to create one of performance = monitor counter
overflow between powerpc_local_irq_pmu_save/restore = which should be delivered as an
asynchronous interrupt ( replayed PMI = ).

Verified it calls correct handler from my ftrace = logs:

<<>>
replay_soft_interrupts = <-arch_local_irq_restore
irq_enter = <-performance_monitor_exception_async
irq_enter_rcu = <-performance_monitor_exception_async
dummy_perf = <-performance_monitor_exception_async
irq_exit = <-performance_monitor_exception_async
<<>>

Review= ed-and-Tested-by:  Athira Rajeev = <atrajeev@linux.vnet.ibm.com>


#ifdef CONFIG_PPC_ADV_DEBUG_REGS
diff --git = a/arch/powerpc/perf/core-book3s.c = b/arch/powerpc/perf/core-book3s.c
index 28206b1fe172..9fd06010e8b6 = 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ = b/arch/powerpc/perf/core-book3s.c
@@ -110,10 +110,6 @@ static inline = void perf_read_regs(struct pt_regs *regs)
{
= regs->result =3D 0;
}
-static inline int = perf_intr_is_nmi(struct pt_regs *regs)
-{
- return = 0;
-}

static inline int siar_valid(struct pt_regs = *regs)
{
@@ -353,15 +349,6 @@ static inline void = perf_read_regs(struct pt_regs *regs)
regs->result =3D = use_siar;
}

-/*
- * If interrupts were soft-disabled when a = PMU interrupt occurs, treat
- * it as an NMI.
- */
-static = inline int perf_intr_is_nmi(struct pt_regs *regs)
-{
- return = (regs->softe & IRQS_DISABLED);
-}
-
/*
* On = processors like P7+ that have the SIAR-Valid bit, marked = instructions
* must be sampled only if the SIAR-valid bit is = set.
@@ -2279,7 +2266,6 @@ static void __perf_event_interrupt(struct = pt_regs *regs)
struct perf_event = *event;
= unsigned long val[8];
int found, active;
- int = nmi;

= if (cpuhw->n_limited)
freeze_limited_counters(cpuhw, = mfspr(SPRN_PMC5),
@@ -2287,18 +2273,6 @@ static void = __perf_event_interrupt(struct pt_regs *regs)

= perf_read_regs(regs);

- /*
- * If = perf interrupts hit in a local_irq_disable (soft-masked) = region,
- = * we consider them as NMIs. This is required to prevent hash = faults on
- = * user addresses when reading callchains. See the NMI test = in
- = * do_hash_page.
- */
- nmi =3D = perf_intr_is_nmi(regs);
- if (nmi)
- = nmi_enter();
- else
- = irq_enter();
-
/* Read all the PMCs since we'll = need them a bunch of times */
for (i =3D 0; i < = ppmu->n_counter; ++i)
val[i] =3D read_pmc(i + 1);
@@ = -2344,8 +2318,8 @@ static void __perf_event_interrupt(struct pt_regs = *regs)
= = = }
= = }
= }
- = if (!found && !nmi && = printk_ratelimit())
- printk(KERN_WARNING "Can't find = PMC that caused IRQ\n");
+ if (unlikely(!found) && = !arch_irq_disabled_regs(regs))
+ printk_ratelimited(KERN_WARNING = "Can't find PMC that caused IRQ\n");

/*
* Reset = MMCR0 to its normal value.  This will set PMXE and
@@ -2355,11 = +2329,6 @@ static void __perf_event_interrupt(struct pt_regs = *regs)
= * we get back out of this interrupt.
= */
= write_mmcr0(cpuhw, cpuhw->mmcr.mmcr0);
-
- if = (nmi)
- = = nmi_exit();
- else
- = irq_exit();
}

static void perf_event_interrupt(struct = pt_regs *regs)
diff --git a/arch/powerpc/perf/core-fsl-emb.c = b/arch/powerpc/perf/core-fsl-emb.c
index e0e7e276bfd2..ee721f420a7b = 100644
--- a/arch/powerpc/perf/core-fsl-emb.c
+++ = b/arch/powerpc/perf/core-fsl-emb.c
@@ -31,19 +31,6 @@ static atomic_t = num_events;
/* Used to avoid races in calling = reserve/release_pmc_hardware */
static = DEFINE_MUTEX(pmc_reserve_mutex);

-/*
- * If interrupts were = soft-disabled when a PMU interrupt occurs, treat
- * it as an = NMI.
- */
-static inline int perf_intr_is_nmi(struct pt_regs = *regs)
-{
-#ifdef __powerpc64__
- return (regs->softe & = IRQS_DISABLED);
-#else
- return = 0;
-#endif
-}
-
static void perf_event_interrupt(struct = pt_regs *regs);

/*
@@ -659,13 +646,6 @@ static void = perf_event_interrupt(struct pt_regs *regs)
struct = perf_event *event;
unsigned long val;
int found = =3D 0;
- = int nmi;
-
- nmi =3D = perf_intr_is_nmi(regs);
- if (nmi)
- = nmi_enter();
- else
- = irq_enter();

for (i =3D 0; i < = ppmu->n_counter; ++i) {
event =3D = cpuhw->event[i];
@@ -690,11 +670,6 @@ static void = perf_event_interrupt(struct pt_regs *regs)
= mtmsr(mfmsr() | MSR_PMM);
mtpmr(PMRN_PMGC0, PMGC0_PMIE | = PMGC0_FCECE);
= isync();
-
- if (nmi)
- = nmi_exit();
- else
- = irq_exit();
}

void hw_perf_event_setup(int cpu)
-- =
2.23.0


=