Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4723311imu; Tue, 18 Dec 2018 22:10:48 -0800 (PST) X-Google-Smtp-Source: AFSGD/VPZKI4n/QI68uZdKcFEeGut78Ss6jEl357/ZqvsT0s72XWd59NQTOWRvmUC88xBnhuC+d1 X-Received: by 2002:a17:902:3124:: with SMTP id w33mr19343488plb.241.1545199848871; Tue, 18 Dec 2018 22:10:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545199848; cv=none; d=google.com; s=arc-20160816; b=B0ybdugRC+Qbcvigm+zZIktxTl/tWRftEPJHsP6z1l+lUlZulRcAUGy11eQ452z5iR QpSqzEnrqshIeIZIxn1BJe79ZlgMDJIrEf3sBI7byK3vXjFPhz5KGLKsQl4sCS7GRgO6 mBu1L9pWQ1ILpklnvalOToyQE+PtI+OpvcA8mfmes0PRxIvTvd3AVD9M3k722m80qfN+ rJb91xJChSpfXvnlfcjnHmGJGUJdHQpp57lAb+ZJUlemJjkjz/NBlwIDapF4vpikNOAN buMU4evx0iPigBdFvJjFrhq1B+nUV+Ywe6hraHqS0tAwUqnH5+34Y1mckAEkqOIy+MR6 z2CQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :from:references:cc:to:subject; bh=isKHm0RRUJr0Hg/rLib1r15gToxFpXTVeqxbAlAmLKo=; b=zli0JK5Iub8GwPt6vLyJedxWRfCpNbP/hkqQ2hHTLI2OqUiwQ7U36311m9iH7sb06j cloza+4a6q5rZ5l3g1Loahj/ukOUF4QUmLxRKmOfwlAo0NbiEsT6zoM51EkUCesG9Dmy hGOYxcfDXthbiOupTXGW6/0qDaZ3yj4WuJ3CNpA7RrNdVPl7xzEfHTf3AI/mogvkbbqK RcIW1Dpb0dyhzyZ4MDZ+V9z6f+NlHkRXvPLXPamQ1Lj8HV0LbIkiPlK5bIEPlQXwWog8 9m23lmel4SjOrIIVHZ2xaWIl0FNvckUWO0o2xDhuSnPl79v3yTfny3NviVgavDSpL9bF 4+5w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s35si15493847pgk.392.2018.12.18.22.10.32; Tue, 18 Dec 2018 22:10:48 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728141AbeLSGJE (ORCPT + 99 others); Wed, 19 Dec 2018 01:09:04 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:42574 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727636AbeLSGIt (ORCPT ); Wed, 19 Dec 2018 01:08:49 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id wBJ68m8W137599 for ; Wed, 19 Dec 2018 01:08:48 -0500 Received: from e06smtp03.uk.ibm.com (e06smtp03.uk.ibm.com [195.75.94.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 2pfdtue0gc-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 19 Dec 2018 01:08:40 -0500 Received: from localhost by e06smtp03.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 19 Dec 2018 06:08:39 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp03.uk.ibm.com (192.168.101.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 19 Dec 2018 06:08:36 -0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id wBJ68aDW21954764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 19 Dec 2018 06:08:36 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0988FA4057; Wed, 19 Dec 2018 06:08:36 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4218DA4040; Wed, 19 Dec 2018 06:08:35 +0000 (GMT) Received: from [9.126.27.138] (unknown [9.126.27.138]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 19 Dec 2018 06:08:35 +0000 (GMT) Subject: Re: [PATCH v2 4/5] powerpc/perf: Trace imc events detection and cpuhotplug To: Anju T Sudhakar , mpe@ellerman.id.au, linux-kernel@vger.kernel.org Cc: linuxppc-dev@lists.ozlabs.org References: <20181214091122.20992-1-anju@linux.vnet.ibm.com> <20181214091122.20992-5-anju@linux.vnet.ibm.com> From: Madhavan Srinivasan Date: Wed, 19 Dec 2018 11:38:34 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20181214091122.20992-5-anju@linux.vnet.ibm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-TM-AS-GCONF: 00 x-cbid: 18121906-0012-0000-0000-000002DB166B X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18121906-0013-0000-0000-00002110B20E Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-12-19_03:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1812190053 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 14/12/18 2:41 PM, Anju T Sudhakar wrote: > Patch detects trace-imc events, does memory initilizations for each online > cpu, and registers cpuhotplug call-backs. Reviewed-by: Madhavan Srinivasan > Signed-off-by: Anju T Sudhakar > --- > arch/powerpc/perf/imc-pmu.c | 91 +++++++++++++++++++++++ > arch/powerpc/platforms/powernv/opal-imc.c | 3 + > include/linux/cpuhotplug.h | 1 + > 3 files changed, 95 insertions(+) > > diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c > index 5ca80545a849..1f09265c8fb0 100644 > --- a/arch/powerpc/perf/imc-pmu.c > +++ b/arch/powerpc/perf/imc-pmu.c > @@ -43,6 +43,10 @@ static DEFINE_PER_CPU(u64 *, thread_imc_mem); > static struct imc_pmu *thread_imc_pmu; > static int thread_imc_mem_size; > > +/* Trace IMC data structures */ > +static DEFINE_PER_CPU(u64 *, trace_imc_mem); > +static int trace_imc_mem_size; > + > static struct imc_pmu *imc_event_to_pmu(struct perf_event *event) > { > return container_of(event->pmu, struct imc_pmu, pmu); > @@ -1068,6 +1072,54 @@ static void thread_imc_event_del(struct perf_event *event, int flags) > imc_event_update(event); > } > > +/* > + * Allocate a page of memory for each cpu, and load LDBAR with 0. > + */ > +static int trace_imc_mem_alloc(int cpu_id, int size) > +{ > + u64 *local_mem = per_cpu(trace_imc_mem, cpu_id); > + int phys_id = cpu_to_node(cpu_id), rc = 0; > + > + if (!local_mem) { > + local_mem = page_address(alloc_pages_node(phys_id, > + GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE | > + __GFP_NOWARN, get_order(size))); > + if (!local_mem) > + return -ENOMEM; > + per_cpu(trace_imc_mem, cpu_id) = local_mem; > + > + /* Initialise the counters for trace mode */ > + rc = opal_imc_counters_init(OPAL_IMC_COUNTERS_TRACE, __pa((void *)local_mem), > + get_hard_smp_processor_id(cpu_id)); > + if (rc) { > + pr_info("IMC:opal init failed for trace imc\n"); > + return rc; > + } > + } > + > + mtspr(SPRN_LDBAR, 0); > + return 0; > +} > + > +static int ppc_trace_imc_cpu_online(unsigned int cpu) > +{ > + return trace_imc_mem_alloc(cpu, trace_imc_mem_size); > +} > + > +static int ppc_trace_imc_cpu_offline(unsigned int cpu) > +{ > + mtspr(SPRN_LDBAR, 0); > + return 0; > +} > + > +static int trace_imc_cpu_init(void) > +{ > + return cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE, > + "perf/powerpc/imc_trace:online", > + ppc_trace_imc_cpu_online, > + ppc_trace_imc_cpu_offline); > +} > + > /* update_pmu_ops : Populate the appropriate operations for "pmu" */ > static int update_pmu_ops(struct imc_pmu *pmu) > { > @@ -1189,6 +1241,17 @@ static void cleanup_all_thread_imc_memory(void) > } > } > > +static void cleanup_all_trace_imc_memory(void) > +{ > + int i, order = get_order(trace_imc_mem_size); > + > + for_each_online_cpu(i) { > + if (per_cpu(trace_imc_mem, i)) > + free_pages((u64)per_cpu(trace_imc_mem, i), order); > + > + } > +} > + > /* Function to free the attr_groups which are dynamically allocated */ > static void imc_common_mem_free(struct imc_pmu *pmu_ptr) > { > @@ -1230,6 +1293,11 @@ static void imc_common_cpuhp_mem_free(struct imc_pmu *pmu_ptr) > cpuhp_remove_state(CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE); > cleanup_all_thread_imc_memory(); > } > + > + if (pmu_ptr->domain == IMC_DOMAIN_TRACE) { > + cpuhp_remove_state(CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE); > + cleanup_all_trace_imc_memory(); > + } > } > > /* > @@ -1312,6 +1380,21 @@ static int imc_mem_init(struct imc_pmu *pmu_ptr, struct device_node *parent, > > thread_imc_pmu = pmu_ptr; > break; > + case IMC_DOMAIN_TRACE: > + /* Update the pmu name */ > + pmu_ptr->pmu.name = kasprintf(GFP_KERNEL, "%s%s", s, "_imc"); > + if (!pmu_ptr->pmu.name) > + return -ENOMEM; > + > + trace_imc_mem_size = pmu_ptr->counter_mem_size; > + for_each_online_cpu(cpu) { > + res = trace_imc_mem_alloc(cpu, trace_imc_mem_size); > + if (res) { > + cleanup_all_trace_imc_memory(); > + goto err; > + } > + } > + break; > default: > return -EINVAL; > } > @@ -1384,6 +1467,14 @@ int init_imc_pmu(struct device_node *parent, struct imc_pmu *pmu_ptr, int pmu_id > goto err_free_mem; > } > > + break; > + case IMC_DOMAIN_TRACE: > + ret = trace_imc_cpu_init(); > + if (ret) { > + cleanup_all_trace_imc_memory(); > + goto err_free_mem; > + } > + > break; > default: > return -EINVAL; /* Unknown domain */ > diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c > index 58a07948c76e..dedc9ae22662 100644 > --- a/arch/powerpc/platforms/powernv/opal-imc.c > +++ b/arch/powerpc/platforms/powernv/opal-imc.c > @@ -284,6 +284,9 @@ static int opal_imc_counters_probe(struct platform_device *pdev) > case IMC_TYPE_THREAD: > domain = IMC_DOMAIN_THREAD; > break; > + case IMC_TYPE_TRACE: > + domain = IMC_DOMAIN_TRACE; > + break; > default: > pr_warn("IMC Unknown Device type \n"); > domain = -1; > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index e0cd2baa8380..c471f2de878b 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -167,6 +167,7 @@ enum cpuhp_state { > CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE, > CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE, > CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE, > + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE, > CPUHP_AP_WATCHDOG_ONLINE, > CPUHP_AP_WORKQUEUE_ONLINE, > CPUHP_AP_RCUTREE_ONLINE,