Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2204774imm; Mon, 28 May 2018 03:55:07 -0700 (PDT) X-Google-Smtp-Source: AB8JxZr5SV+gH+Ld1Z9hMWvcxx0sW7PdOCIWYYARG1pEJ9hVJxcYo+28cHwlYbXGNG2f6I19t6lr X-Received: by 2002:a17:902:206:: with SMTP id 6-v6mr13021865plc.294.1527504907173; Mon, 28 May 2018 03:55:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527504907; cv=none; d=google.com; s=arc-20160816; b=00e6N1yLD0UxhtT9TiWB3/wnMU2Qwlg5FSVxXNhX7yZ73cGULdZwgPMSeqaxVlTqiv PcWC9IlcktAPHlxzc8NH66mpBG+AmXmqvsgOuG2tQeKmn7PLuiIwdJVTZYdrVyT1/cSV dtdzWYjidHY4CT/oUADf1I6+B6Here8Y1plRkpk42gP+QhEzsp1j+dI1M6Fo44Z6bU+g t56Qp7665bR2rYKtxLDIm8LCfCcZj+gzJXZXzXufrIIz8T/6klDnhuDjEN9SUsxrngmm juz04OQalQyOIkqSzLHiEyKWCSmBmlzrgGe1jV+6hYhZ1xfNZQXagWYc1GJeaQIMjKw1 SDew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=Rqs4+RM/R2ZJLi/HD8D8A+PMgpb61mQBc/cHU2TArBc=; b=D/7Nj+jmdZWAAjPIYv6uQMgAmA6GJggt/4kjHJHxBXTaHIjlJOHEu3Fs6d8/UQVTsW UxR4z/nbCHatinF7TOLw87CUtaviTjtpis2ChHXZUljSBGjegLHnhxx+3hmQxB2MS8Ic OKHmeTr+zLEtuRBVoVtpxZfl9s1o4q3/yDbEJN4oR357LCU08ekqtyUoH6uVWwW+yrLa EhQ03Z03N8nL+HzjbVL7uBTpOnCfilBbl68gOPhuVmDvDmd56rXBV1P3fe4f9dzIY2V7 jMEfsJGBYRamnYMcEZ7gas2reh86dicKXnEnEcE+gOXnvIQWflkt1iBntHde9S+Dgj1W Jp3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=TvHrAcA8; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p11-v6si13174974plq.192.2018.05.28.03.54.52; Mon, 28 May 2018 03:55:07 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=default header.b=TvHrAcA8; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1164171AbeE1Kxl (ORCPT + 99 others); Mon, 28 May 2018 06:53:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:42650 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163766AbeE1Kxc (ORCPT ); Mon, 28 May 2018 06:53:32 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 79513206B7; Mon, 28 May 2018 10:53:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527504812; bh=63962i56Nl6j0QRym9XfjfahU2lImfTMrtCdKi4F6Cw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TvHrAcA8B/52pqgWKfj6nWGz+c3AjDNJduN+Hr1FrwwJRxuw5GJvMkc/a76b+yV5w DaLAKktxU74UlJFMiYslvhNXbmNWoXWdE6+8lwgyolaEFhx804sOjF36Rgw3WB8RgB w7j9W74C8nn1HEyAmHgHhEBiJNfmZ6Qh5P15tdIc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ephraim Park , Song Liu , "Peter Zijlstra (Intel)" , jolsa@redhat.com, kernel-team@fb.com, Alexander Shishkin , Arnaldo Carvalho de Melo , Linus Torvalds , Stephane Eranian , Thomas Gleixner , Vince Weaver , Ingo Molnar , Sasha Levin Subject: [PATCH 4.14 272/496] perf/cgroup: Fix child event counting bug Date: Mon, 28 May 2018 12:00:57 +0200 Message-Id: <20180528100331.312543282@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100319.498712256@linuxfoundation.org> References: <20180528100319.498712256@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Song Liu [ Upstream commit c917e0f259908e75bd2a65877e25f9d90c22c848 ] When a perf_event is attached to parent cgroup, it should count events for all children cgroups: parent_group <---- perf_event \ - child_group <---- process(es) However, in our tests, we found this perf_event cannot report reliable results. Here is an example case: # create cgroups mkdir -p /sys/fs/cgroup/p/c # start perf for parent group perf stat -e instructions -G "p" # on another console, run test process in child cgroup: stressapptest -s 2 -M 1000 & echo $! > /sys/fs/cgroup/p/c/cgroup.procs # after the test process is done, stop perf in the first console shows instructions p The instruction should not be "not counted" as the process runs in the child cgroup. We found this is because perf_event->cgrp and cpuctx->cgrp are not identical, thus perf_event->cgrp are not updated properly. This patch fixes this by updating perf_cgroup properly for ancestor cgroup(s). Reported-by: Ephraim Park Signed-off-by: Song Liu Signed-off-by: Peter Zijlstra (Intel) Cc: Cc: Cc: Alexander Shishkin Cc: Arnaldo Carvalho de Melo Cc: Jiri Olsa Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Vince Weaver Link: http://lkml.kernel.org/r/20180312165943.1057894-1-songliubraving@fb.com Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- kernel/events/core.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -642,9 +642,15 @@ static inline void __update_cgrp_time(st static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx) { - struct perf_cgroup *cgrp_out = cpuctx->cgrp; - if (cgrp_out) - __update_cgrp_time(cgrp_out); + struct perf_cgroup *cgrp = cpuctx->cgrp; + struct cgroup_subsys_state *css; + + if (cgrp) { + for (css = &cgrp->css; css; css = css->parent) { + cgrp = container_of(css, struct perf_cgroup, css); + __update_cgrp_time(cgrp); + } + } } static inline void update_cgrp_time_from_event(struct perf_event *event) @@ -672,6 +678,7 @@ perf_cgroup_set_timestamp(struct task_st { struct perf_cgroup *cgrp; struct perf_cgroup_info *info; + struct cgroup_subsys_state *css; /* * ctx->lock held by caller @@ -682,8 +689,12 @@ perf_cgroup_set_timestamp(struct task_st return; cgrp = perf_cgroup_from_task(task, ctx); - info = this_cpu_ptr(cgrp->info); - info->timestamp = ctx->timestamp; + + for (css = &cgrp->css; css; css = css->parent) { + cgrp = container_of(css, struct perf_cgroup, css); + info = this_cpu_ptr(cgrp->info); + info->timestamp = ctx->timestamp; + } } static DEFINE_PER_CPU(struct list_head, cgrp_cpuctx_list);