Message ID | 170240414535.760665.1609957728181418569.stgit@bmoger-ubuntu |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp7900973vqy; Tue, 12 Dec 2023 10:03:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IERwkvDA1kHaPpPYVKxNrG52/KqC/rNZmqqcU1wCunQVruOfmRpkCH2JFD8Ejh2vrlLNw2o X-Received: by 2002:a05:6a21:a581:b0:190:5c4e:8c99 with SMTP id gd1-20020a056a21a58100b001905c4e8c99mr4545856pzc.38.1702404200225; Tue, 12 Dec 2023 10:03:20 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1702404200; cv=pass; d=google.com; s=arc-20160816; b=Xf4/+7TKnIl9MDMd28chDgMWqTPb/syIUJWqPYT37FJsVpMdpFdu0YIT/2uufzkK/c TLLwSZdJreYDWWWkHXOYDl9UruV8kBDdhzZ+RHPOTKRitOtzbakBN+DDg9jlxz9H76xH DhDarlDWvR3Bzppra9fDVq/qik5EgOZy73EvH/hYNUMECH/XU2pP4BqiqOL2CaS8W8+O KReHKQHWqhg7IYoYDbhJh87jn9kRK0I06d7G3BoegzUCtHDmw2775SvKgaV0J0vH2ULx MNvvr3mK6L+ycIIhfu/4X6b2qArwR/5WVtGovvkNEqJgb031hLTHj+SceDkwg61g73MI EDWA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:dkim-signature; bh=3nW6IBtwaqzxSxz54Xd8xgCLLSM5Vpt7m3SYoV9TVUI=; fh=vF0N9Z0ba3gyWrEQcQJLcn0rHBkZA/Vpru/MVFB3YIY=; b=HW7HuXDCYtPCxKpLeL3vlhv2wAzS+ZimTDWDv6NYAPUiM3EM7CYfotrnhy8yCJ4Jyh 9DmpNf4PjCnL+OvDIH1kws65gkSSnr3ABuSbtQo45SW0UfRDFeNaMJTd8ScyT27JjuQg kY3dXa7mVqxJyXZocGEmPOTFCOuvL1mB5zKz9zFYv0nwxYfuhKMgNNnq2wrWyI1YoQpm wZtrd1fpFdnwQNT7CF+KJCIgXahmhtHHVzT/gXkCfyIgmPGbQubosVB4V5oyvftqRa8r qzVc71GYDDXAp4F9kIR6+HjQx+AfRMCNDH6ia462IaiXwgYks8kxPkIzATafMs+CDSkG WSyw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amd.com header.s=selector1 header.b=RKz6FMHo; arc=pass (i=1 spf=pass spfdomain=amd.com dmarc=pass fromdomain=amd.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amd.com Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id d35-20020a631d63000000b005b930e0b600si6947605pgm.820.2023.12.12.10.03.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Dec 2023 10:03:20 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@amd.com header.s=selector1 header.b=RKz6FMHo; arc=pass (i=1 spf=pass spfdomain=amd.com dmarc=pass fromdomain=amd.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amd.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id D0B518069D9D; Tue, 12 Dec 2023 10:03:17 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377072AbjLLSDJ (ORCPT <rfc822;dexuan.linux@gmail.com> + 99 others); Tue, 12 Dec 2023 13:03:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1377055AbjLLSDI (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 12 Dec 2023 13:03:08 -0500 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2063.outbound.protection.outlook.com [40.107.223.63]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2A15BC; Tue, 12 Dec 2023 10:03:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lz2vQa/3VIJpjdR9pkgXJBLB70aPyJvP/MFHT7wai1xcoPPvANAAA69DHubfTGVh6bfbv+V1JQNfkktzcdjw74NkaT1ybIZgMmy6vBGwM0JLueLKUOm4etx6sZrZn/JwqFTfK4um6FzyDr5jM4KETfB/cpeazlohGD8b9ZKdg31+ezGiX4xaKP/ITvG1qjWNL4En+n0p/2ktOVXD2V05EvazOLf0BFTg+2iAsJx7D24LjCzeW7wNjG5AxBudJAqz3ROWRmtxVIVUCpFh/dd/1zsscGt9IPFQuocrksvNkbI6C3tNZGumkNzZ4s3WHnUyau1H2o1882nrH90AmjWplw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3nW6IBtwaqzxSxz54Xd8xgCLLSM5Vpt7m3SYoV9TVUI=; b=n3qH1QKcrkrF40FX85oJMlGXy2lsXYQviF7PpaL2xJfnmQt77HHNPprxMmd8GzcR4umw1d8vcDb41tIHoIc5TDwI/mpF/CoEPXFncBQFGW47RCxZ7XcUy6uXM9lilTZZidq8aAUWlEM3he+HDDSlWZDln38KPcOMBKijsKCXbl1pXVY6n0l3E9xjMBz9zIyWq7KuPg8+O2/+gcYHz5AxiZ2NSYp4+zkwEFNeYSPdFKAF0uUOh3afWhFRg+0oPM183liYvbReqG6vgBNSO5IH/bQUOMh704hUpDt1YunEPys1t44lmgtFJUV14F2dhVTYMJfFwQLoUwLlGJwjUVeE0Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=redhat.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3nW6IBtwaqzxSxz54Xd8xgCLLSM5Vpt7m3SYoV9TVUI=; b=RKz6FMHohgBemifTTbg3ld8dcHDak38+gxj6W1K7wfL7jspc83MoXGds7MAGhPWYJ3p+HwvupA51vvn6sShxMFMn/wFwKTH7BUN5pbJ34fjM2P2p8Ld7rJNwG+0Ghz3cIaSVZX3JqCMpw8PWuPdDwKTO6BSjZ5omlhKS5o+tnXs= Received: from CY5PR03CA0016.namprd03.prod.outlook.com (2603:10b6:930:8::37) by BL1PR12MB5825.namprd12.prod.outlook.com (2603:10b6:208:394::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33; Tue, 12 Dec 2023 18:03:09 +0000 Received: from CY4PEPF0000E9D2.namprd03.prod.outlook.com (2603:10b6:930:8:cafe::e5) by CY5PR03CA0016.outlook.office365.com (2603:10b6:930:8::37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7068.33 via Frontend Transport; Tue, 12 Dec 2023 18:03:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000E9D2.mail.protection.outlook.com (10.167.241.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7091.26 via Frontend Transport; Tue, 12 Dec 2023 18:03:09 +0000 Received: from [127.0.1.1] (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Tue, 12 Dec 2023 12:03:03 -0600 Subject: [PATCH v2 2/2] x86/resctrl: Remove hard-coded memory bandwidth event configuration From: Babu Moger <babu.moger@amd.com> To: <corbet@lwn.net>, <fenghua.yu@intel.com>, <reinette.chatre@intel.com>, <tglx@linutronix.de>, <mingo@redhat.com>, <bp@alien8.de>, <dave.hansen@linux.intel.com> CC: <x86@kernel.org>, <hpa@zytor.com>, <paulmck@kernel.org>, <rdunlap@infradead.org>, <tj@kernel.org>, <peterz@infradead.org>, <seanjc@google.com>, <kim.phillips@amd.com>, <babu.moger@amd.com>, <jmattson@google.com>, <ilpo.jarvinen@linux.intel.com>, <jithu.joseph@intel.com>, <kan.liang@linux.intel.com>, <nikunj@amd.com>, <daniel.sneddon@linux.intel.com>, <pbonzini@redhat.com>, <rick.p.edgecombe@intel.com>, <rppt@kernel.org>, <maciej.wieczor-retman@intel.com>, <linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <eranian@google.com>, <peternewman@google.com>, <dhagiani@amd.com>, <babu.moger@amd.com> Date: Tue, 12 Dec 2023 12:02:25 -0600 Message-ID: <170240414535.760665.1609957728181418569.stgit@bmoger-ubuntu> In-Reply-To: <20231201005720.235639-1-babu.moger@amd.com> References: <20231201005720.235639-1-babu.moger@amd.com> User-Agent: StGit/1.1.dev103+g5369f4c MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000E9D2:EE_|BL1PR12MB5825:EE_ X-MS-Office365-Filtering-Correlation-Id: 63379046-8f51-4837-2ce5-08dbfb3c996a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: jOtkfbmmOKwwOZyYUfUDpfHOxxoc3UNC1Mly85k7F/1i/5R0KQCm3jYY/VgcckL1trwShOzZU2UFIlvOMFTKaL2yZEBIXPBrtyVyuFdaMWFJBGGh0BjQYfRPBAjqWk/awJtu51BaUmYfwTpBZeTUGXGu4v83vi5zaitIg5NV1KEbK5cFgSnNvYo02wu1A9dpf6hIpYLIScW9ZW9/WYv4U6utwpj0P9jdCjJhRGNT7hoeeMIZLU17BVnfG3mH0ajNmVyPYB8tyLeZDeJD3AxUIRvwL+4zVgKM2PfZc2GDKzKp5sJoDlmHqzm5sXRoaep+N4uK9Uhm98/vH9tcAIRPy//3U3EORrJX7T9CVdKK9FfE7b+txkdvvjutaGHBC5V6tOvd2uKBUaCEjDLGXIsVLH+aDV2Yg25/3cCWuEFzF/ks6m82lZv27O/PuTaYe19gbz5OTVhlK5tipbU+ol0UwA/FCitpJS7CMmI1EvRCvveQbZ5rJH3kbsz/4uBwArlEtXyC7s3yexVmNdX0qEfZ7m+suCiqJfDqFvoa3cUrAUfpvoEGiHoVO3z/pJxZd5O6zWwf7SEUAt+llfmxDordBJZPqoBM4MawNexMItbMMtPs5beOQb7MwkZo01GegGcUuqpQOreVLA1CqQpGRrhE+RQ68c9b2/D04AKxLgGI/9m34zz75oI5sBQKN7W96WHvuqtrFXQjP/bDMjmmec2nDHkrlFpr5YcJJnRpn4xLW7xEG//7bbDgAUfdJHk0EbX+siEZ3uEAQRR8JClW4ocp0+XYEhlegdO4/N1hIkwBdu440r70itRY0uimBRPmTRmj/ercRGcjaOQr+6zrFNLJYg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(4636009)(7916004)(376002)(136003)(39860400002)(346002)(396003)(230922051799003)(451199024)(1800799012)(64100799003)(186009)(82310400011)(36840700001)(40470700004)(46966006)(8936002)(8676002)(41300700001)(2906002)(4326008)(44832011)(5660300002)(7416002)(33716001)(478600001)(36860700001)(966005)(103116003)(16526019)(426003)(83380400001)(26005)(336012)(40480700001)(47076005)(6666004)(9686003)(82740400003)(54906003)(110136005)(16576012)(316002)(70586007)(70206006)(86362001)(81166007)(356005)(40460700003)(71626019)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2023 18:03:09.2289 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 63379046-8f51-4837-2ce5-08dbfb3c996a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000E9D2.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5825 X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_SPF_HELO, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 12 Dec 2023 10:03:17 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784039110226718051 X-GMAIL-MSGID: 1785100186689147141 |
Series |
None
|
|
Commit Message
Moger, Babu
Dec. 12, 2023, 6:02 p.m. UTC
If the BMEC (Bandwidth Monitoring Event Configuration) feature is
supported, the bandwidth events can be configured. The maximum supported
bandwidth bitmask can be determined by following CPUID command.
CPUID_Fn80000020_ECX_x03 [Platform QoS Monitoring Bandwidth Event
Configuration] Read-only. Reset: 0000_007Fh.
Bits Description
31:7 Reserved
6:0 Identifies the bandwidth sources that can be tracked.
The bandwidth sources can change with the processor generations.
Currently, this information is hard-coded. Remove the hard-coded value
and detect using CPUID command. Also print the valid bitmask when the
user tries to configure invalid value.
The CPUID details are documentation in the PPR listed below [1].
[1] Processor Programming Reference (PPR) Vol 1.1 for AMD Family 19h Model
11h B1 - 55901 Rev 0.25.
Fixes: dc2a3e857981 ("x86/resctrl: Add interface to read mbm_total_bytes_config")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537
Signed-off-by: Babu Moger <babu.moger@amd.com>
---
v2: Earlier Sent as a part of ABMC feature.
https://lore.kernel.org/lkml/20231201005720.235639-1-babu.moger@amd.com/
But this is not related to ABMC. Sending it separate now.
Removed the global resctrl_max_evt_bitmask. Added event_mask as part of
the resource.
---
arch/x86/kernel/cpu/resctrl/internal.h | 5 ++---
arch/x86/kernel/cpu/resctrl/monitor.c | 6 ++++++
arch/x86/kernel/cpu/resctrl/rdtgroup.c | 18 ++++++++++--------
3 files changed, 18 insertions(+), 11 deletions(-)
Comments
Hi Babu, On 12/12/2023 10:02 AM, Babu Moger wrote: > If the BMEC (Bandwidth Monitoring Event Configuration) feature is > supported, the bandwidth events can be configured. The maximum supported > bandwidth bitmask can be determined by following CPUID command. > > CPUID_Fn80000020_ECX_x03 [Platform QoS Monitoring Bandwidth Event > Configuration] Read-only. Reset: 0000_007Fh. > Bits Description > 31:7 Reserved > 6:0 Identifies the bandwidth sources that can be tracked. > > The bandwidth sources can change with the processor generations. > Currently, this information is hard-coded. Remove the hard-coded value > and detect using CPUID command. Also print the valid bitmask when the > user tries to configure invalid value. > > The CPUID details are documentation in the PPR listed below [1]. > [1] Processor Programming Reference (PPR) Vol 1.1 for AMD Family 19h Model > 11h B1 - 55901 Rev 0.25. > > Fixes: dc2a3e857981 ("x86/resctrl: Add interface to read mbm_total_bytes_config") > Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537 > Signed-off-by: Babu Moger <babu.moger@amd.com> > > --- > v2: Earlier Sent as a part of ABMC feature. > https://lore.kernel.org/lkml/20231201005720.235639-1-babu.moger@amd.com/ > But this is not related to ABMC. Sending it separate now. > Removed the global resctrl_max_evt_bitmask. Added event_mask as part of > the resource. > --- > arch/x86/kernel/cpu/resctrl/internal.h | 5 ++--- > arch/x86/kernel/cpu/resctrl/monitor.c | 6 ++++++ > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 18 ++++++++++-------- > 3 files changed, 18 insertions(+), 11 deletions(-) > > diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h > index d2979748fae4..3e2f505614d8 100644 > --- a/arch/x86/kernel/cpu/resctrl/internal.h > +++ b/arch/x86/kernel/cpu/resctrl/internal.h > @@ -50,9 +50,6 @@ > /* Dirty Victims to All Types of Memory */ > #define DIRTY_VICTIMS_TO_ALL_MEM BIT(6) > > -/* Max event bits supported */ > -#define MAX_EVT_CONFIG_BITS GENMASK(6, 0) > - > struct rdt_fs_context { > struct kernfs_fs_context kfc; > bool enable_cdpl2; > @@ -394,6 +391,7 @@ struct rdt_parse_data { > * @msr_update: Function pointer to update QOS MSRs > * @mon_scale: cqm counter * mon_scale = occupancy in bytes > * @mbm_width: Monitor width, to detect and correct for overflow. > + * @event_mask: Max supported event bitmask. This is a very generic name and description for this feature. Note that in resctrl monitoring an "event" is already clear (see members of enum resctrl_event_id) so a generic type of "event_mask" can easily cause confusion with existing concept of events. How about "mbm_cfg_mask"? Please also make the description more detailed - it could include that this is unique to BMEC. > * @cdp_enabled: CDP state of this resource > * > * Members of this structure are either private to the architecture > @@ -408,6 +406,7 @@ struct rdt_hw_resource { > struct rdt_resource *r); > unsigned int mon_scale; > unsigned int mbm_width; > + unsigned int event_mask; > bool cdp_enabled; > }; > > diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c > index f136ac046851..30bf919edfda 100644 > --- a/arch/x86/kernel/cpu/resctrl/monitor.c > +++ b/arch/x86/kernel/cpu/resctrl/monitor.c > @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) > return ret; > > if (rdt_cpu_has(X86_FEATURE_BMEC)) { > + u32 eax, ebx, ecx, edx; > + > + /* Detect list of bandwidth sources that can be tracked */ > + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); > + hw_res->event_mask = ecx; > + This has the same issue as I mentioned in V1. Note that this treats reserved bits as valid values. I think this is a risky thing to do. For example when this code is run on future hardware the currently reserved bits may have values with different meaning than what this code uses it for. > if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { > mbm_total_event.configurable = true; > mbm_config_rftype_init("mbm_total_bytes_config"); > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index 69a1de92384a..8a1e9fdab974 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) > { > struct mon_config_info *mon_info = info; > unsigned int index; > - u64 msrval; > + u32 h; > > index = mon_event_config_index_get(mon_info->evtid); > if (index == INVALID_CONFIG_INDEX) { > pr_warn_once("Invalid event id %d\n", mon_info->evtid); > return; > } > - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); > - > - /* Report only the valid event configuration bits */ > - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; > + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); I do not think this code needed to be changed. We do not want to treat reserved bits as valid values. > } > > static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mon_info) > @@ -1557,6 +1554,7 @@ static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mo > > static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid) > { > + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); > struct mon_config_info mon_info = {0}; > struct rdt_domain *dom; > bool sep = false; > @@ -1571,7 +1569,9 @@ static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid > mon_info.evtid = evtid; > mondata_config_read(dom, &mon_info); > > - seq_printf(s, "%d=0x%02x", dom->id, mon_info.mon_config); > + /* Report only the valid event configuration bits */ > + seq_printf(s, "%d=0x%02x", dom->id, > + mon_info.mon_config & hw_res->event_mask); > sep = true; > } > seq_puts(s, "\n"); > @@ -1617,12 +1617,14 @@ static void mon_event_config_write(void *info) > static int mbm_config_write_domain(struct rdt_resource *r, > struct rdt_domain *d, u32 evtid, u32 val) > { > + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); > struct mon_config_info mon_info = {0}; > int ret = 0; > > /* mon_config cannot be more than the supported set of events */ > - if (val > MAX_EVT_CONFIG_BITS) { > - rdt_last_cmd_puts("Invalid event configuration\n"); > + if ((val & hw_res->event_mask) != val) { > + rdt_last_cmd_printf("Invalid input: The maximum valid bitmask is 0x%02x\n", > + hw_res->event_mask); > return -EINVAL; > } > > > Reinette
Hi Reinette, Sorry for late response. I was out of office for couple of weeks. On 12/14/23 19:24, Reinette Chatre wrote: > Hi Babu, > > On 12/12/2023 10:02 AM, Babu Moger wrote: >> If the BMEC (Bandwidth Monitoring Event Configuration) feature is >> supported, the bandwidth events can be configured. The maximum supported >> bandwidth bitmask can be determined by following CPUID command. >> >> CPUID_Fn80000020_ECX_x03 [Platform QoS Monitoring Bandwidth Event >> Configuration] Read-only. Reset: 0000_007Fh. >> Bits Description >> 31:7 Reserved >> 6:0 Identifies the bandwidth sources that can be tracked. >> >> The bandwidth sources can change with the processor generations. >> Currently, this information is hard-coded. Remove the hard-coded value >> and detect using CPUID command. Also print the valid bitmask when the >> user tries to configure invalid value. >> >> The CPUID details are documentation in the PPR listed below [1]. >> [1] Processor Programming Reference (PPR) Vol 1.1 for AMD Family 19h Model >> 11h B1 - 55901 Rev 0.25. >> >> Fixes: dc2a3e857981 ("x86/resctrl: Add interface to read mbm_total_bytes_config") >> Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537 >> Signed-off-by: Babu Moger <babu.moger@amd.com> >> >> --- >> v2: Earlier Sent as a part of ABMC feature. >> https://lore.kernel.org/lkml/20231201005720.235639-1-babu.moger@amd.com/ >> But this is not related to ABMC. Sending it separate now. >> Removed the global resctrl_max_evt_bitmask. Added event_mask as part of >> the resource. >> --- >> arch/x86/kernel/cpu/resctrl/internal.h | 5 ++--- >> arch/x86/kernel/cpu/resctrl/monitor.c | 6 ++++++ >> arch/x86/kernel/cpu/resctrl/rdtgroup.c | 18 ++++++++++-------- >> 3 files changed, 18 insertions(+), 11 deletions(-) >> >> diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h >> index d2979748fae4..3e2f505614d8 100644 >> --- a/arch/x86/kernel/cpu/resctrl/internal.h >> +++ b/arch/x86/kernel/cpu/resctrl/internal.h >> @@ -50,9 +50,6 @@ >> /* Dirty Victims to All Types of Memory */ >> #define DIRTY_VICTIMS_TO_ALL_MEM BIT(6) >> >> -/* Max event bits supported */ >> -#define MAX_EVT_CONFIG_BITS GENMASK(6, 0) >> - >> struct rdt_fs_context { >> struct kernfs_fs_context kfc; >> bool enable_cdpl2; >> @@ -394,6 +391,7 @@ struct rdt_parse_data { >> * @msr_update: Function pointer to update QOS MSRs >> * @mon_scale: cqm counter * mon_scale = occupancy in bytes >> * @mbm_width: Monitor width, to detect and correct for overflow. >> + * @event_mask: Max supported event bitmask. > > This is a very generic name and description for this feature. Note that in > resctrl monitoring an "event" is already clear (see members of enum resctrl_event_id) > so a generic type of "event_mask" can easily cause confusion with existing > concept of events. How about "mbm_cfg_mask"? Please also make the description That should be fine. > more detailed - it could include that this is unique to BMEC. Sure. > >> * @cdp_enabled: CDP state of this resource >> * >> * Members of this structure are either private to the architecture >> @@ -408,6 +406,7 @@ struct rdt_hw_resource { >> struct rdt_resource *r); >> unsigned int mon_scale; >> unsigned int mbm_width; >> + unsigned int event_mask; >> bool cdp_enabled; >> }; >> >> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >> index f136ac046851..30bf919edfda 100644 >> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >> @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) >> return ret; >> >> if (rdt_cpu_has(X86_FEATURE_BMEC)) { >> + u32 eax, ebx, ecx, edx; >> + >> + /* Detect list of bandwidth sources that can be tracked */ >> + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); >> + hw_res->event_mask = ecx; >> + > > This has the same issue as I mentioned in V1. Note that this treats > reserved bits as valid values. I think this is a risky thing to do. For example > when this code is run on future hardware the currently reserved bits may have > values with different meaning than what this code uses it for. Sure. Will use the mask MAX_EVT_CONFIG_BITS. hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; > >> if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { >> mbm_total_event.configurable = true; >> mbm_config_rftype_init("mbm_total_bytes_config"); >> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> index 69a1de92384a..8a1e9fdab974 100644 >> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) >> { >> struct mon_config_info *mon_info = info; >> unsigned int index; >> - u64 msrval; >> + u32 h; >> >> index = mon_event_config_index_get(mon_info->evtid); >> if (index == INVALID_CONFIG_INDEX) { >> pr_warn_once("Invalid event id %d\n", mon_info->evtid); >> return; >> } >> - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); >> - >> - /* Report only the valid event configuration bits */ >> - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; >> + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); > > I do not think this code needed to be changed. We do not want to treat > reserved bits as valid values. The logic is still the same. We don't have access to rdt_hw_resource in this function. So, I just moved the masking to mbm_config_show while printing. Thanks Babu > >> } >> >> static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mon_info) >> @@ -1557,6 +1554,7 @@ static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mo >> >> static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid) >> { >> + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); >> struct mon_config_info mon_info = {0}; >> struct rdt_domain *dom; >> bool sep = false; >> @@ -1571,7 +1569,9 @@ static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid >> mon_info.evtid = evtid; >> mondata_config_read(dom, &mon_info); >> >> - seq_printf(s, "%d=0x%02x", dom->id, mon_info.mon_config); >> + /* Report only the valid event configuration bits */ >> + seq_printf(s, "%d=0x%02x", dom->id, >> + mon_info.mon_config & hw_res->event_mask); >> sep = true; >> } >> seq_puts(s, "\n"); >> @@ -1617,12 +1617,14 @@ static void mon_event_config_write(void *info) >> static int mbm_config_write_domain(struct rdt_resource *r, >> struct rdt_domain *d, u32 evtid, u32 val) >> { >> + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); >> struct mon_config_info mon_info = {0}; >> int ret = 0; >> >> /* mon_config cannot be more than the supported set of events */ >> - if (val > MAX_EVT_CONFIG_BITS) { >> - rdt_last_cmd_puts("Invalid event configuration\n"); >> + if ((val & hw_res->event_mask) != val) { >> + rdt_last_cmd_printf("Invalid input: The maximum valid bitmask is 0x%02x\n", >> + hw_res->event_mask); >> return -EINVAL; >> } >> >> >> > > Reinette
Hi Babu, On 1/2/2024 12:00 PM, Moger, Babu wrote: > On 12/14/23 19:24, Reinette Chatre wrote: >> On 12/12/2023 10:02 AM, Babu Moger wrote: >>> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >>> index f136ac046851..30bf919edfda 100644 >>> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >>> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >>> @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) >>> return ret; >>> >>> if (rdt_cpu_has(X86_FEATURE_BMEC)) { >>> + u32 eax, ebx, ecx, edx; >>> + >>> + /* Detect list of bandwidth sources that can be tracked */ >>> + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); >>> + hw_res->event_mask = ecx; >>> + >> >> This has the same issue as I mentioned in V1. Note that this treats >> reserved bits as valid values. I think this is a risky thing to do. For example >> when this code is run on future hardware the currently reserved bits may have >> values with different meaning than what this code uses it for. > > Sure. Will use the mask MAX_EVT_CONFIG_BITS. > hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; > >> >>> if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { >>> mbm_total_event.configurable = true; >>> mbm_config_rftype_init("mbm_total_bytes_config"); >>> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>> index 69a1de92384a..8a1e9fdab974 100644 >>> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>> @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) >>> { >>> struct mon_config_info *mon_info = info; >>> unsigned int index; >>> - u64 msrval; >>> + u32 h; >>> >>> index = mon_event_config_index_get(mon_info->evtid); >>> if (index == INVALID_CONFIG_INDEX) { >>> pr_warn_once("Invalid event id %d\n", mon_info->evtid); >>> return; >>> } >>> - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); >>> - >>> - /* Report only the valid event configuration bits */ >>> - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; >>> + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); >> >> I do not think this code needed to be changed. We do not want to treat >> reserved bits as valid values. > > The logic is still the same. We don't have access to rdt_hw_resource in > this function. So, I just moved the masking to mbm_config_show while printing. Why do you need access to rdt_hw_resource? This comment is not about the bandwidth events supported by the device but instead the bits used to represent these events. This is the same issue as in rdt_get_mon_l3_config. The above change returns reserved bits as valid while the original code ensured that only bits used for field are returned (through the usage of MAX_EVT_CONFIG_BITS). Reinette
Hi Reinette, On 1/3/24 12:38, Reinette Chatre wrote: > Hi Babu, > > On 1/2/2024 12:00 PM, Moger, Babu wrote: >> On 12/14/23 19:24, Reinette Chatre wrote: >>> On 12/12/2023 10:02 AM, Babu Moger wrote: > >>>> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >>>> index f136ac046851..30bf919edfda 100644 >>>> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >>>> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >>>> @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) >>>> return ret; >>>> >>>> if (rdt_cpu_has(X86_FEATURE_BMEC)) { >>>> + u32 eax, ebx, ecx, edx; >>>> + >>>> + /* Detect list of bandwidth sources that can be tracked */ >>>> + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); >>>> + hw_res->event_mask = ecx; >>>> + >>> >>> This has the same issue as I mentioned in V1. Note that this treats >>> reserved bits as valid values. I think this is a risky thing to do. For example >>> when this code is run on future hardware the currently reserved bits may have >>> values with different meaning than what this code uses it for. >> >> Sure. Will use the mask MAX_EVT_CONFIG_BITS. >> hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; >> >>> >>>> if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { >>>> mbm_total_event.configurable = true; >>>> mbm_config_rftype_init("mbm_total_bytes_config"); >>>> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>> index 69a1de92384a..8a1e9fdab974 100644 >>>> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>> @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) >>>> { >>>> struct mon_config_info *mon_info = info; >>>> unsigned int index; >>>> - u64 msrval; >>>> + u32 h; >>>> >>>> index = mon_event_config_index_get(mon_info->evtid); >>>> if (index == INVALID_CONFIG_INDEX) { >>>> pr_warn_once("Invalid event id %d\n", mon_info->evtid); >>>> return; >>>> } >>>> - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); >>>> - >>>> - /* Report only the valid event configuration bits */ >>>> - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; >>>> + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); >>> >>> I do not think this code needed to be changed. We do not want to treat >>> reserved bits as valid values. >> >> The logic is still the same. We don't have access to rdt_hw_resource in >> this function. So, I just moved the masking to mbm_config_show while printing. > > Why do you need access to rdt_hw_resource? This comment is not about the bandwidth > events supported by the device but instead the bits used to represent these events. > This is the same issue as in rdt_get_mon_l3_config. The above change returns > reserved bits as valid while the original code ensured that only bits used for > field are returned (through the usage of MAX_EVT_CONFIG_BITS). We are already saving the valid bits in hw_res->mbm_cfg_mask during the init. hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; I thought we can use it here directly to mask any unsupported bits. So, I re-arranged the code here.
Hi Babu, On 1/3/2024 1:03 PM, Moger, Babu wrote: > On 1/3/24 12:38, Reinette Chatre wrote: >> On 1/2/2024 12:00 PM, Moger, Babu wrote: >>> On 12/14/23 19:24, Reinette Chatre wrote: >>>> On 12/12/2023 10:02 AM, Babu Moger wrote: >> >>>>> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >>>>> index f136ac046851..30bf919edfda 100644 >>>>> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >>>>> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >>>>> @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) >>>>> return ret; >>>>> >>>>> if (rdt_cpu_has(X86_FEATURE_BMEC)) { >>>>> + u32 eax, ebx, ecx, edx; >>>>> + >>>>> + /* Detect list of bandwidth sources that can be tracked */ >>>>> + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); >>>>> + hw_res->event_mask = ecx; >>>>> + >>>> >>>> This has the same issue as I mentioned in V1. Note that this treats >>>> reserved bits as valid values. I think this is a risky thing to do. For example >>>> when this code is run on future hardware the currently reserved bits may have >>>> values with different meaning than what this code uses it for. >>> >>> Sure. Will use the mask MAX_EVT_CONFIG_BITS. >>> hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; >>> >>>> >>>>> if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { >>>>> mbm_total_event.configurable = true; >>>>> mbm_config_rftype_init("mbm_total_bytes_config"); >>>>> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>> index 69a1de92384a..8a1e9fdab974 100644 >>>>> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>> @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) >>>>> { >>>>> struct mon_config_info *mon_info = info; >>>>> unsigned int index; >>>>> - u64 msrval; >>>>> + u32 h; >>>>> >>>>> index = mon_event_config_index_get(mon_info->evtid); >>>>> if (index == INVALID_CONFIG_INDEX) { >>>>> pr_warn_once("Invalid event id %d\n", mon_info->evtid); >>>>> return; >>>>> } >>>>> - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); >>>>> - >>>>> - /* Report only the valid event configuration bits */ >>>>> - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; >>>>> + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); >>>> >>>> I do not think this code needed to be changed. We do not want to treat >>>> reserved bits as valid values. >>> >>> The logic is still the same. We don't have access to rdt_hw_resource in >>> this function. So, I just moved the masking to mbm_config_show while printing. >> >> Why do you need access to rdt_hw_resource? This comment is not about the bandwidth >> events supported by the device but instead the bits used to represent these events. >> This is the same issue as in rdt_get_mon_l3_config. The above change returns >> reserved bits as valid while the original code ensured that only bits used for >> field are returned (through the usage of MAX_EVT_CONFIG_BITS). > > We are already saving the valid bits in hw_res->mbm_cfg_mask during the init. > > hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; > > I thought we can use it here directly to mask any unsupported bits. So, I > re-arranged the code here. I am not sure where you mean when you say "use it here" since mbm_cfg_mask is not used in mon_event_config_read(). My comment is related to mon_event_config_read() that can reasonably be expected to, and thus should, return the current "mon event config" value and nothing more. Reinette
Hi Reinette, On 1/3/24 15:40, Reinette Chatre wrote: > Hi Babu, > > On 1/3/2024 1:03 PM, Moger, Babu wrote: >> On 1/3/24 12:38, Reinette Chatre wrote: >>> On 1/2/2024 12:00 PM, Moger, Babu wrote: >>>> On 12/14/23 19:24, Reinette Chatre wrote: >>>>> On 12/12/2023 10:02 AM, Babu Moger wrote: >>> >>>>>> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c >>>>>> index f136ac046851..30bf919edfda 100644 >>>>>> --- a/arch/x86/kernel/cpu/resctrl/monitor.c >>>>>> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c >>>>>> @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) >>>>>> return ret; >>>>>> >>>>>> if (rdt_cpu_has(X86_FEATURE_BMEC)) { >>>>>> + u32 eax, ebx, ecx, edx; >>>>>> + >>>>>> + /* Detect list of bandwidth sources that can be tracked */ >>>>>> + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); >>>>>> + hw_res->event_mask = ecx; >>>>>> + >>>>> >>>>> This has the same issue as I mentioned in V1. Note that this treats >>>>> reserved bits as valid values. I think this is a risky thing to do. For example >>>>> when this code is run on future hardware the currently reserved bits may have >>>>> values with different meaning than what this code uses it for. >>>> >>>> Sure. Will use the mask MAX_EVT_CONFIG_BITS. >>>> hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; >>>> >>>>> >>>>>> if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { >>>>>> mbm_total_event.configurable = true; >>>>>> mbm_config_rftype_init("mbm_total_bytes_config"); >>>>>> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>>> index 69a1de92384a..8a1e9fdab974 100644 >>>>>> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>>> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >>>>>> @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) >>>>>> { >>>>>> struct mon_config_info *mon_info = info; >>>>>> unsigned int index; >>>>>> - u64 msrval; >>>>>> + u32 h; >>>>>> >>>>>> index = mon_event_config_index_get(mon_info->evtid); >>>>>> if (index == INVALID_CONFIG_INDEX) { >>>>>> pr_warn_once("Invalid event id %d\n", mon_info->evtid); >>>>>> return; >>>>>> } >>>>>> - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); >>>>>> - >>>>>> - /* Report only the valid event configuration bits */ >>>>>> - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; >>>>>> + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); >>>>> >>>>> I do not think this code needed to be changed. We do not want to treat >>>>> reserved bits as valid values. >>>> >>>> The logic is still the same. We don't have access to rdt_hw_resource in >>>> this function. So, I just moved the masking to mbm_config_show while printing. >>> >>> Why do you need access to rdt_hw_resource? This comment is not about the bandwidth >>> events supported by the device but instead the bits used to represent these events. >>> This is the same issue as in rdt_get_mon_l3_config. The above change returns >>> reserved bits as valid while the original code ensured that only bits used for >>> field are returned (through the usage of MAX_EVT_CONFIG_BITS). >> >> We are already saving the valid bits in hw_res->mbm_cfg_mask during the init. >> >> hw_res->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS; >> >> I thought we can use it here directly to mask any unsupported bits. So, I >> re-arranged the code here. > > I am not sure where you mean when you say "use it here" since mbm_cfg_mask is not > used in mon_event_config_read(). My comment is related to mon_event_config_read() > that can reasonably be expected to, and thus should, return the current "mon event > config" value and nothing more. > Ok. Sure. Lets keep the same code as before.
diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index d2979748fae4..3e2f505614d8 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -50,9 +50,6 @@ /* Dirty Victims to All Types of Memory */ #define DIRTY_VICTIMS_TO_ALL_MEM BIT(6) -/* Max event bits supported */ -#define MAX_EVT_CONFIG_BITS GENMASK(6, 0) - struct rdt_fs_context { struct kernfs_fs_context kfc; bool enable_cdpl2; @@ -394,6 +391,7 @@ struct rdt_parse_data { * @msr_update: Function pointer to update QOS MSRs * @mon_scale: cqm counter * mon_scale = occupancy in bytes * @mbm_width: Monitor width, to detect and correct for overflow. + * @event_mask: Max supported event bitmask. * @cdp_enabled: CDP state of this resource * * Members of this structure are either private to the architecture @@ -408,6 +406,7 @@ struct rdt_hw_resource { struct rdt_resource *r); unsigned int mon_scale; unsigned int mbm_width; + unsigned int event_mask; bool cdp_enabled; }; diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index f136ac046851..30bf919edfda 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -813,6 +813,12 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r) return ret; if (rdt_cpu_has(X86_FEATURE_BMEC)) { + u32 eax, ebx, ecx, edx; + + /* Detect list of bandwidth sources that can be tracked */ + cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx); + hw_res->event_mask = ecx; + if (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL)) { mbm_total_event.configurable = true; mbm_config_rftype_init("mbm_total_bytes_config"); diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index 69a1de92384a..8a1e9fdab974 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -1537,17 +1537,14 @@ static void mon_event_config_read(void *info) { struct mon_config_info *mon_info = info; unsigned int index; - u64 msrval; + u32 h; index = mon_event_config_index_get(mon_info->evtid); if (index == INVALID_CONFIG_INDEX) { pr_warn_once("Invalid event id %d\n", mon_info->evtid); return; } - rdmsrl(MSR_IA32_EVT_CFG_BASE + index, msrval); - - /* Report only the valid event configuration bits */ - mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; + rdmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, h); } static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mon_info) @@ -1557,6 +1554,7 @@ static void mondata_config_read(struct rdt_domain *d, struct mon_config_info *mo static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid) { + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); struct mon_config_info mon_info = {0}; struct rdt_domain *dom; bool sep = false; @@ -1571,7 +1569,9 @@ static int mbm_config_show(struct seq_file *s, struct rdt_resource *r, u32 evtid mon_info.evtid = evtid; mondata_config_read(dom, &mon_info); - seq_printf(s, "%d=0x%02x", dom->id, mon_info.mon_config); + /* Report only the valid event configuration bits */ + seq_printf(s, "%d=0x%02x", dom->id, + mon_info.mon_config & hw_res->event_mask); sep = true; } seq_puts(s, "\n"); @@ -1617,12 +1617,14 @@ static void mon_event_config_write(void *info) static int mbm_config_write_domain(struct rdt_resource *r, struct rdt_domain *d, u32 evtid, u32 val) { + struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); struct mon_config_info mon_info = {0}; int ret = 0; /* mon_config cannot be more than the supported set of events */ - if (val > MAX_EVT_CONFIG_BITS) { - rdt_last_cmd_puts("Invalid event configuration\n"); + if ((val & hw_res->event_mask) != val) { + rdt_last_cmd_printf("Invalid input: The maximum valid bitmask is 0x%02x\n", + hw_res->event_mask); return -EINVAL; }