Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp2742733ybc; Mon, 25 Nov 2019 03:29:25 -0800 (PST) X-Google-Smtp-Source: APXvYqyWjQ0wiFQvxKC7Zz5rbfwXCDsCKhLoaVJR32bzIAVt1vd0Rzs++IrhYDwzKS64fD8Xu5vJ X-Received: by 2002:a50:ec82:: with SMTP id e2mr18055129edr.68.1574681365708; Mon, 25 Nov 2019 03:29:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574681365; cv=none; d=google.com; s=arc-20160816; b=U2U9N2cjcj4wLxtgg7ZTDuMXE6ce4n+s4Pat3OzhTynFINU+e7PSPuNP+P6kBOk7y4 WytItICLS0B7chkT9G++At+WrWg2H+PQoHJTqyxVSjHJqJB91AcaqT4xK2YADI9hUlee t35DdZBjAMN2kaS4Y/3EI4/oYoMMAl0FyOlTQGKPp2DWsJfxXTgfa1XjmdBPSN5stlTE h26uGI21h9SstRmdz5J6yeg428aYVZFLXW2WIqlMY7BdZxKBX+PKSaZ/HVUNaM8feMFc Y4FazJB2rWSkZB7LizEXafuWR0lxjsW1mKK6XYXtZVsk8vH+MvMv1RWA15ImLksZfst6 XDSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=9g1dsHSkZyIuogn9FJsE8Uhy7HUmJyPQt4umj/Cy1qM=; b=jacfuVeAw6MJyVLJxPr5QtewWMFBAQv64z53aUtCW4YGoC87ErBn4WD6e4DO73WJ5k hqlgu6SNxWZ7wiiiuZKWIzcj0SE7jR/wlbhoKX/l08K099HUybn09bNpxgNpS9Gamt+Y TK/JmWhwY9MwK4ob5XCWmrTD14G+kq87Br7FkiMW+W2k/4gzYPk8TUilkDQOEe7YxRo2 TGhvTd80wZgpSBU1R3mxRQ4AhFHpmT6Tcljvr/xKHU58BmJs7wDGZg4oGI+wmFdHAdVm vUsX+SdlLYYwKYGbOYh7eb09OXFQjmX0T/ema2QiZWl5EizEHxA3EskqW2nralliUj1Y C3nQ== 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t18si4757524eds.247.2019.11.25.03.29.01; Mon, 25 Nov 2019 03:29:25 -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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727322AbfKYJcV (ORCPT + 99 others); Mon, 25 Nov 2019 04:32:21 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:41245 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725793AbfKYJcV (ORCPT ); Mon, 25 Nov 2019 04:32:21 -0500 Received: by mail-wr1-f68.google.com with SMTP id b18so17026183wrj.8; Mon, 25 Nov 2019 01:32:18 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=9g1dsHSkZyIuogn9FJsE8Uhy7HUmJyPQt4umj/Cy1qM=; b=ebZrraCX980kznxsj6PVadip6OfG7OxiQeybCaI5jAz4hgrM5H3JhZTgCx4wo8yphS TBGAXJhH+2aBOfSKm2z+STT4xUISLzsKbb8N8krp0yAwwKPiYxK/41ThPpz4cXsaVH+K ovcWS49YswZOZp5ajy3kvAt3MTqTfEEJrDmRPntsdGuzYxiBMf0aiqDSSPi2mB4Bl6v2 pMPJNqW0pX7nl/UHV/3acbVMAYQwbkBMpGjcAfQ+GAHL4BKHFjJ9QlWPskYgDlsKjFiM clzJp/IVuwoXQE/XyNW0XlwDC7BTjD6RKhya2661HKMvCpxZfoCiK/KFKu/zo02stEQl 4ICA== X-Gm-Message-State: APjAAAUWTMkMbD3uMIQi8Y+HFnW0ZDeTjij9C9QYmIsdZeDz+4MFcRFn GjNU9dFKcOMY7dtBg6LsFXk= X-Received: by 2002:adf:f5c6:: with SMTP id k6mr29557791wrp.245.1574674337631; Mon, 25 Nov 2019 01:32:17 -0800 (PST) Received: from localhost (prg-ext-pat.suse.com. [213.151.95.130]) by smtp.gmail.com with ESMTPSA id q15sm8447341wrv.61.2019.11.25.01.32.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2019 01:32:16 -0800 (PST) Date: Mon, 25 Nov 2019 10:32:16 +0100 From: Michal Hocko To: Chen Yu Cc: x86@kernel.org, Chen Yu , Thomas Gleixner , Borislav Petkov , Ingo Molnar , "H. Peter Anvin" , Alexey Dobriyan , Andrew Morton , Reinette Chatre , Fenghua Yu , Tony Luck , Linus Torvalds , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org Subject: Re: [PATCH][v5] x86/resctrl: Add task resctrl information display Message-ID: <20191125093216.GF31714@dhcp22.suse.cz> References: <20191125040001.28943-1-yu.c.chen@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191125040001.28943-1-yu.c.chen@intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [Cc linux-api] On Mon 25-11-19 12:00:01, Chen Yu wrote: > Monitoring tools that want to find out which resctrl control > and monitor groups a task belongs to must currently read > the "tasks" file in every group until they locate the process > ID. > > Add an additional file /proc/{pid}/resctrl to provide this > information. > > The output is as followed according to Thomas's suggestion, > for example: > > 1) "" > Resctrl is not available. > > 2) "/" > Task is part of the root group, task is not associated to > any monitoring group. > > 3) "/mon_groups/mon0" > Task is part of the root group and monitoring group mon0. > > 4) "/group0" > Task is part of control group group0, task is not associated > to any monitoring group. > > 5) "/group0/mon_groups/mon1" > Task is part of control group group0 and monitoring group mon1. > > Tested-by: Jinshi Chen > Cc: Thomas Gleixner > Cc: Borislav Petkov > Cc: Ingo Molnar > Cc: "H. Peter Anvin" > Cc: Alexey Dobriyan > Cc: Andrew Morton > Cc: Reinette Chatre > Cc: Fenghua Yu > Cc: Tony Luck > Cc: Michal Hocko > Cc: Linus Torvalds > Cc: linux-fsdevel@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Chen Yu > --- > v2: Reduce indentation level in proc_resctrl_show() > according to Boris's suggestion. > Create the include/linux/resctrl.h header and > declare proc_resctrl_show() in this file, so > that other architectures would probably use it > in the future. Different architectures should > implement architectural specific proc_resctrl_show() > accordingly. > > v3: Return empty string if the resctrl filesystem has > not been mounted per Boris's suggestion. > Rename the config from CPU_RESCTRL to PROC_CPU_RESCTRL > to better represent its usage. Move PROC_CPU_RESCTRL > from arch/Kconfig to fs/proc/Kconfig. > And let PROC_CPU_RESCTRL to be depended on PROC_FS. > > v4: According to Thomas's suggestion, changed the output > from multiple lines to one single line. > > v5: According to Alexey's feedback, removed the header file > proc_fs.h in resctrl.h, and changed seq_puts() to > seq_putc() for simplicity. > --- > arch/x86/Kconfig | 1 + > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 78 ++++++++++++++++++++++++++ > fs/proc/Kconfig | 4 ++ > fs/proc/base.c | 7 +++ > include/linux/resctrl.h | 14 +++++ > 5 files changed, 104 insertions(+) > create mode 100644 include/linux/resctrl.h > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 8ef85139553f..252364d18887 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -455,6 +455,7 @@ config X86_CPU_RESCTRL > bool "x86 CPU resource control support" > depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD) > select KERNFS > + select PROC_CPU_RESCTRL if PROC_FS > help > Enable x86 CPU resource control support. > > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index 2e3b06d6bbc6..f786e7626a65 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -725,6 +725,84 @@ static int rdtgroup_tasks_show(struct kernfs_open_file *of, > return ret; > } > > +#ifdef CONFIG_PROC_CPU_RESCTRL > + > +/* > + * A task can only be part of one control > + * group and of one monitoring group which > + * is associated to that control group. > + * So one line is simple and clear enough: > + * > + * 1) "" > + * Resctrl is not available. > + * > + * 2) "/" > + * Task is part of the root group, and it is > + * not associated to any monitoring group. > + * > + * 3) "/mon_groups/mon0" > + * Task is part of the root group and monitoring > + * group mon0. > + * > + * 4) "/group0" > + * Task is part of control group group0, and it is > + * not associated to any monitoring group. > + * > + * 5) "/group0/mon_groups/mon1" > + * Task is part of control group group0 and monitoring > + * group mon1. > + */ > +int proc_resctrl_show(struct seq_file *s, struct pid_namespace *ns, > + struct pid *pid, struct task_struct *tsk) > +{ > + struct rdtgroup *rdtg; > + int ret = 0; > + > + mutex_lock(&rdtgroup_mutex); > + > + /* Return empty if resctrl has not been mounted. */ > + if (!static_branch_unlikely(&rdt_enable_key)) > + goto unlock; > + > + list_for_each_entry(rdtg, &rdt_all_groups, rdtgroup_list) { > + struct rdtgroup *crg; > + > + /* > + * Task information is only relevant for shareable > + * and exclusive groups. > + */ > + if (rdtg->mode != RDT_MODE_SHAREABLE && > + rdtg->mode != RDT_MODE_EXCLUSIVE) > + continue; > + > + if (rdtg->closid != tsk->closid) > + continue; > + > + seq_printf(s, "/%s", rdtg->kn->name); > + list_for_each_entry(crg, &rdtg->mon.crdtgrp_list, > + mon.crdtgrp_list) { > + if (tsk->rmid != crg->mon.rmid) > + continue; > + seq_printf(s, "%smon_groups/%s", > + rdtg == &rdtgroup_default ? "" : "/", > + crg->kn->name); > + break; > + } > + seq_putc(s, '\n'); > + goto unlock; > + } > + /* > + * The above search should succeed. Otherwise return > + * with an error. > + */ > + ret = -ENOENT; > +unlock: > + mutex_unlock(&rdtgroup_mutex); > + > + return ret; > +} > +#endif > + > static int rdt_last_cmd_status_show(struct kernfs_open_file *of, > struct seq_file *seq, void *v) > { > diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig > index cb5629bd5fff..ae96a339d24d 100644 > --- a/fs/proc/Kconfig > +++ b/fs/proc/Kconfig > @@ -103,3 +103,7 @@ config PROC_CHILDREN > config PROC_PID_ARCH_STATUS > def_bool n > depends on PROC_FS > + > +config PROC_CPU_RESCTRL > + def_bool n > + depends on PROC_FS > diff --git a/fs/proc/base.c b/fs/proc/base.c > index ebea9501afb8..0e4b8bf2b986 100644 > --- a/fs/proc/base.c > +++ b/fs/proc/base.c > @@ -94,6 +94,7 @@ > #include > #include > #include > +#include > #include > #include "internal.h" > #include "fd.h" > @@ -3060,6 +3061,9 @@ static const struct pid_entry tgid_base_stuff[] = { > #endif > #ifdef CONFIG_CGROUPS > ONE("cgroup", S_IRUGO, proc_cgroup_show), > +#endif > +#ifdef CONFIG_PROC_CPU_RESCTRL > + ONE("resctrl", S_IRUGO, proc_resctrl_show), > #endif > ONE("oom_score", S_IRUGO, proc_oom_score), > REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations), > @@ -3460,6 +3464,9 @@ static const struct pid_entry tid_base_stuff[] = { > #endif > #ifdef CONFIG_CGROUPS > ONE("cgroup", S_IRUGO, proc_cgroup_show), > +#endif > +#ifdef CONFIG_PROC_CPU_RESCTRL > + ONE("resctrl", S_IRUGO, proc_resctrl_show), > #endif > ONE("oom_score", S_IRUGO, proc_oom_score), > REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations), > diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h > new file mode 100644 > index 000000000000..daf5cf64c6a6 > --- /dev/null > +++ b/include/linux/resctrl.h > @@ -0,0 +1,14 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _RESCTRL_H > +#define _RESCTRL_H > + > +#ifdef CONFIG_PROC_CPU_RESCTRL > + > +int proc_resctrl_show(struct seq_file *m, > + struct pid_namespace *ns, > + struct pid *pid, > + struct task_struct *tsk); > + > +#endif > + > +#endif /* _RESCTRL_H */ > -- > 2.17.1 -- Michal Hocko SUSE Labs