Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754047AbcKCHXF (ORCPT ); Thu, 3 Nov 2016 03:23:05 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:50672 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752363AbcKCHXE (ORCPT ); Thu, 3 Nov 2016 03:23:04 -0400 From: Hemant Kumar To: linux-kernel@vger.kernel.org Cc: maddy@linux.vnet.ibm.com, mpe@ellerman.id.au, benh@kernel.crashing.org, paulus@samba.org, anton@samba.org, sukadev@linux.vnet.ibm.com, mikey@neuling.org, stewart@linux.vnet.ibm.com, eranian@google.com, Hemant Kumar Subject: [PATCH 0/6] IMA Instrumentation support Date: Thu, 3 Nov 2016 12:52:29 +0530 X-Mailer: git-send-email 2.7.4 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16110307-0008-0000-0000-000000D8B0F5 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16110307-0009-0000-0000-00000866B437 Message-Id: <1478157755-14636-1-git-send-email-hemant@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-11-03_02:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609300000 definitions=main-1611030137 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5568 Lines: 139 Powerpc has In-Memory-Accumulation (IMA) infrastructure which contains various Performance Monitoring Units (PMUs) at Nest level (these are on-chip but off-core). These Nest PMU counters are handled by a Nest IMA microcode. This microcode runs in the OCC (On-Chip Controller) complex and its purpose is to program the nest counters, collect the counter data and move the counter data to memory. The IMA infrastructure encapsulates nest (per-chip), core and thread level counters. While the nest IMA PMUs are handled by the nest IMA microcode, the core and thread level PMUs are handled by the Core-HPMC engine. This patchset enables the nest IMA PMUs and is based on the initial work done by Madhavan Srinivasan. "Nest Instrumentation Support" : https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-August/132078.html Nest events: Per-chip nest instrumentation provides various per-chip metrics such as memory, powerbus, Xlink and Alink bandwidth. PMU Events' Information: OPAL obtains the Nest PMU and event information from the IMA Catalog and passes on to the kernel via the device tree. The events' information contains : - Event name - Event Offset - Event description and, maybe : - Event scale - Event unit The event offset in the memory is where the counter data gets accumulated. The OPAL-side patches are posted upstream : https://lists.ozlabs.org/pipermail/skiboot/2016-October/005235.html The kernel discovers the IMA counters information in the device tree at the "ima-counters" device node which has a compatible field "ibm,opal-in-memory-counters". Parsing of the Events' information: To parse the IMA PMUs and events information, the kernel has to discover the "ima-counters" node and walk through the pmu and event nodes. Here is an excerpt of the dt showing the ima-counters and mcs node: /dts-v1/; [...] ima-counters { ima-nest-offset = <0x320000>; compatible = "ibm,opal-in-memory-counters"; ima-nest-size = <0x30000>; #address-cells = <0x1>; #size-cells = <0x1>; phandle = <0x10000238>; version-id = [00]; mcs { compatible = "ibm,ima-counters-chip"; ranges; #address-cells = <0x1>; #size-cells = <0x1>; phandle = <0x10000279>; PM_MCS_UP_128B_DATA_XFER_MC0@528 { desc = "Total Read Bandwidth seen on both MCS of MC0"; phandle = <0x1000028c>; reg = <0x118 0x8>; scale = "1.2207e-4"; unit = "MiB"; }; [...] >From the device tree, the kernel parses the PMUs and their events' information. After parsing the nest IMA PMUs and their events, the PMUs and their attributes are registered in the kernel. Example Usage : # perf list [...] nest_alink/PM_ALINK0_IN_DATA_CYC/ [Kernel PMU event] nest_alink/PM_ALINK0_IN_DATA_CYC_LAST_SAMPLE/ [Kernel PMU event] nest_alink/PM_ALINK0_IN_IDL_CYC/ [Kernel PMU event] [...] nest_mcs/PM_MCS_DOWN_128B_DATA_XFER_MC0/ [Kernel PMU event] nest_mcs/PM_MCS_DOWN_128B_DATA_XFER_MC0_LAST_SAMPLE/ [Kernel PMU event] nest_mcs/PM_MCS_DOWN_128B_DATA_XFER_MC1/ [Kernel PMU event] [...] nest_phb/PM_PHB_ANY_DMA_RCV_PHB0/ [Kernel PMU event] nest_phb/PM_PHB_ANY_DMA_RCV_PHB0_LAST_SAMPLE/ [Kernel PMU event] nest_phb/PM_PHB_ANY_DMA_RCV_PHB1/ [Kernel PMU event] [...] # perf stat -e "nest_mcs/PM_MCS_DOWN_128B_DATA_XFER_MC2/" -e "nest_mcs/PM_MCS_UP_128B_DATA_XFER_MC2/" -a --per-socket TODOs: - Add support for Core IMA. - Add support for thread IMA. Comments/feedback/suggestions are welcome. Cc: Madhavan Srinivasan Cc: Michael Ellerman Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Anton Blanchard Cc: Sukadev Bhattiprolu Cc: Michael Neuling Cc: Stewart Smith Cc: Stephane Eranian Signed-off-by: Hemant Kumar Hemant Kumar (6): powerpc/powernv: Data structure and macros definitions powerpc/powernv: Autoload IMA device driver module powerpc/powernv: Detect supported IMA units and its events powerpc/perf: Add event attribute and group to IMA pmus powerpc/perf: Generic ima pmu event functions powerpc/perf: IMA pmu cpumask and cpu hotplug support arch/powerpc/include/asm/ima-pmu.h | 75 +++++ arch/powerpc/include/asm/opal-api.h | 3 +- arch/powerpc/include/asm/opal.h | 2 + arch/powerpc/perf/Makefile | 3 +- arch/powerpc/perf/ima-pmu.c | 383 +++++++++++++++++++++ arch/powerpc/platforms/powernv/Makefile | 2 +- arch/powerpc/platforms/powernv/opal-ima.c | 447 +++++++++++++++++++++++++ arch/powerpc/platforms/powernv/opal-wrappers.S | 1 + arch/powerpc/platforms/powernv/opal.c | 13 + 9 files changed, 926 insertions(+), 3 deletions(-) create mode 100644 arch/powerpc/include/asm/ima-pmu.h create mode 100644 arch/powerpc/perf/ima-pmu.c create mode 100644 arch/powerpc/platforms/powernv/opal-ima.c -- 2.7.4