From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1033057AbdAJTeV (ORCPT ); Tue, 10 Jan 2017 14:34:21 -0500 Received: from mga09.intel.com ([134.134.136.24]:27768 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S941648AbdAJTdB (ORCPT ); Tue, 10 Jan 2017 14:33:01 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,344,1477983600"; d="scan'208";a="921021902" From: Vikas Shivappa To: vikas.shivappa@intel.com, linux-kernel@vger.kernel.org Cc: x86@kernel.org, hpa@zytor.com, tglx@linutronix.de, mingo@kernel.org, peterz@infradead.org, ravi.v.shankar@intel.com, tony.luck@intel.com, fenghua.yu@intel.com, h.peter.anvin@intel.com, vikas.shivappa@linux.intel.com Subject: [PATCH 6/8] x86/intel_rdt/mba: Add info directory files for MBA Date: Tue, 10 Jan 2017 11:33:06 -0800 Message-Id: <1484076788-25385-7-git-send-email-vikas.shivappa@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1484076788-25385-1-git-send-email-vikas.shivappa@linux.intel.com> References: <1484076788-25385-1-git-send-email-vikas.shivappa@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add the files in info directory for MBA. The files in the info directory are as follows : - num_closids: max number of closids for MBA which represents the max class of service user can configure. - max_thrtl_by: the max throttle by values. Throttle by can have a linear scale and non linear scale. In linear scale, if a throttle_by value is 40%, it means that the memory b/w is throttled 'by' 40% or in other words a max of 60% b/w is allowed to pass. In non-linear scale, the throttle_by values are in 2^n granularity. The h/w does not guarantee a curve of actual throttle w.r.t the configured values. But if a throttle_by value of x > y, then x is guaranteed to throttle more b/w than y. - throttle granularity: Shows the throttle granularity of the throttle values that can be configured. Signed-off-by: Vikas Shivappa --- arch/x86/include/asm/intel_rdt.h | 8 ++- arch/x86/kernel/cpu/intel_rdt.c | 2 + arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 84 ++++++++++++++++++++++++++++++-- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/intel_rdt.h b/arch/x86/include/asm/intel_rdt.h index 49ae832..88725b6 100644 --- a/arch/x86/include/asm/intel_rdt.h +++ b/arch/x86/include/asm/intel_rdt.h @@ -5,7 +5,6 @@ #include #include - #include #define IA32_L3_QOS_CFG 0xc81 @@ -77,6 +76,8 @@ struct rftype { * @no_ctrl: Specifies max cache cbm or min mem b/w delay. * @min_cbm_bits: Minimum number of consecutive bits to be set * in a cache bit mask + * @info_files: resctrl info files for the resource + * @infofiles_len: Number of info files * @max_delay: Max throttle delay * @delay_gran: Throttle delay granularity * @delay_linear: true if delay is in linear scale @@ -98,6 +99,8 @@ struct rdt_resource { int cbm_len; int min_cbm_bits; u32 no_ctrl; + struct rftype *info_files; + int infofiles_len; u32 max_delay; u32 delay_gran; u32 delay_linear; @@ -137,6 +140,9 @@ struct msr_param { int high; }; +void rdt_get_cache_infofile(struct rdt_resource *r); +void rdt_get_mbe_infofile(struct rdt_resource *r); + extern struct mutex rdtgroup_mutex; extern struct rdt_resource rdt_resources_all[]; diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c index 6736e1d..bdfbd1d 100644 --- a/arch/x86/kernel/cpu/intel_rdt.c +++ b/arch/x86/kernel/cpu/intel_rdt.c @@ -154,6 +154,7 @@ static void rdt_get_mem_config(struct rdt_resource *r) if (r->delay_linear) r->delay_gran = MAX_MBA_THRTL - r->max_delay; + rdt_get_mbe_infofile(r); r->capable = true; r->enabled = true; } @@ -168,6 +169,7 @@ static void rdt_get_cache_config(int idx, struct rdt_resource *r) r->num_closid = edx.split.cos_max + 1; r->cbm_len = eax.split.cbm_len + 1; r->no_ctrl = BIT_MASK(eax.split.cbm_len + 1) - 1; + rdt_get_cache_infofile(r); r->capable = true; r->enabled = true; } diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c index 53f1917..9d9b7f4 100644 --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c @@ -517,9 +517,41 @@ static int rdt_min_cbm_bits_show(struct kernfs_open_file *of, return 0; } +static int rdt_max_delay_show(struct kernfs_open_file *of, + struct seq_file *seq, void *v) +{ + struct rdt_resource *r = of->kn->parent->priv; + + seq_printf(seq, "%d\n", r->max_delay); + + return 0; +} + +static int rdt_delay_gran_show(struct kernfs_open_file *of, + struct seq_file *seq, void *v) +{ + struct rdt_resource *r = of->kn->parent->priv; + + if (r->delay_linear) + seq_printf(seq, "%d\n", r->delay_gran); + else + seq_printf(seq, "power of 2\n"); + + return 0; +} + +static int rdt_delay_linear_show(struct kernfs_open_file *of, + struct seq_file *seq, void *v) +{ + struct rdt_resource *r = of->kn->parent->priv; + + seq_printf(seq, "%d\n", r->delay_linear); + + return 0; +} /* rdtgroup information files for one cache resource. */ -static struct rftype res_info_files[] = { +static struct rftype res_cache_info_files[] = { { .name = "num_closids", .mode = 0444, @@ -540,11 +572,52 @@ static int rdt_min_cbm_bits_show(struct kernfs_open_file *of, }, }; +/* rdtgroup information files for MBE. */ +static struct rftype res_mbe_info_files[] = { + { + .name = "num_closids", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_num_closids_show, + }, + { + .name = "max_thrtl_by", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_max_delay_show, + }, + { + .name = "thrtl_by_gran", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_delay_gran_show, + }, + { + .name = "thrtl_by_linear", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_delay_linear_show, + }, +}; + +void rdt_get_mbe_infofile(struct rdt_resource *r) +{ + r->info_files = &res_mbe_info_files[0]; + r->infofiles_len = ARRAY_SIZE(res_mbe_info_files); +} + +void rdt_get_cache_infofile(struct rdt_resource *r) +{ + r->info_files = &res_cache_info_files[0]; + r->infofiles_len = ARRAY_SIZE(res_cache_info_files); +} + static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn) { struct kernfs_node *kn_subdir; + struct rftype *res_info_files; struct rdt_resource *r; - int ret; + int ret, len; /* create the directory */ kn_info = kernfs_create_dir(parent_kn, "info", parent_kn->mode, NULL); @@ -563,8 +636,11 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn) ret = rdtgroup_kn_set_ugid(kn_subdir); if (ret) goto out_destroy; - ret = rdtgroup_add_files(kn_subdir, res_info_files, - ARRAY_SIZE(res_info_files)); + + res_info_files = r->info_files; + len = r->infofiles_len; + + ret = rdtgroup_add_files(kn_subdir, res_info_files, len); if (ret) goto out_destroy; kernfs_activate(kn_subdir); -- 1.9.1