Message ID | 168177444676.1758847.11474266921067437724.stgit@bmoger-ubuntu |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp2473901vqo; Mon, 17 Apr 2023 16:48:41 -0700 (PDT) X-Google-Smtp-Source: AKy350Y1i35H/HSuHT9QhLejCWu+h73BzKnOroCOKqXmEut3rjIDPQY4A/4WuDS8jmi7bgtp7xgA X-Received: by 2002:a17:90b:1d0f:b0:247:1f35:3314 with SMTP id on15-20020a17090b1d0f00b002471f353314mr114657pjb.48.1681775321346; Mon, 17 Apr 2023 16:48:41 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1681775321; cv=pass; d=google.com; s=arc-20160816; b=Lxbe6/pFMLx/3PZYL0q7MywZEnAMab8HyEmkO2nTo4V1e9NbQLmun+ynmPgoAWgqD9 w8VyvC7uZP3Oeq/dN+l0by4A+NEvd9sn6Nvc11I3t/6LqPgJqkyJ1jtyOBA0J3yCuj3U +kyJUnnZbUABSzL0a0NJAQT1am509sUL1naQW/bc4XBphGV14iGUHhQ2g3wtbDLc9Xl6 p2kBvY2CvGjF8x4v8PWwaVuvZdlddXwWuCW95vwirptugTYqOoATXnwE97/mzLuX47iI M9f2p8ZO7ydz6hgeMg6FNMyBgj4yfBfcs3/Pzo6JlIs7eeK+DUgUb7ZRjHns63H6J67O OJlw== 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=QcErqOAyciZV5H4WhJpBgNzP/FAuWfbxjPa096tf19A=; b=YgQzDpHtJQ7or+D7T49LibtHroVrR3i6H0T09cCVz7J4KsaXf/17+h8wJO1jaA/tbZ Jod3hw1MPMiuXTPywEANcp8c5C9tcta2lJmDuQinUaD9FHMJHtqDQ82t3F0ocSyKUPOu fL1Lo3OosKsQOgbt/DXziXIhjUUT0MNE2DGRHJuqPh8C7k6Z8LcmuziPjzo0y4YNYVHm f7TM8rvA7Ira83c8o/mNsTVtJS+BHU61q8ndydOaBNEBO5KAU5k7A798/bZHb0wpnN54 6KHHJ8f8YabUNnRpOYxbZV38p7lV1SXfEIHuTVpPh3OIAP3bbBPjkh/Y7ifxGeGX9d3H 2pkg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amd.com header.s=selector1 header.b=OGi9xZ+e; 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 2620:137:e000::1:20 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 (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n5-20020a17090ac68500b002479e0c027fsi2938776pjt.102.2023.04.17.16.48.28; Mon, 17 Apr 2023 16:48:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@amd.com header.s=selector1 header.b=OGi9xZ+e; 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 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amd.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230271AbjDQXeY (ORCPT <rfc822;leviz.kernel.dev@gmail.com> + 99 others); Mon, 17 Apr 2023 19:34:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230249AbjDQXeT (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 17 Apr 2023 19:34:19 -0400 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2077.outbound.protection.outlook.com [40.107.244.77]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 115A1E76; Mon, 17 Apr 2023 16:34:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=G/gVAb2UKZF30AgDr7AeeBrzHCQAkCvZJHdeXidoEXkBG7zv4SkqXTVRFrHqwthwRG9Df0v+goj7PADmZ6RDZ50bFtIx9Ztc8B0u8ngWZNwObvK+ThrcWp/f/5/BwM4JKk9DGuPfw6elZfi23APhZEZjzQo49gJdD8NxRFM+TVMVk2mK2UURFl1ql1mNiLkJTJz/8b4yoRIqwRXxb8xM7pktgFe3t5ePWfKaOkFBr8XqVlTFUEDu8wnMlHm0DJTMZl9L6ewLNeY1kY1lFephqyJifc/iCTDzHhO1iLDXlHecubDh/vCBtXj9FiXMEMhbNd/Cd3BudX1Mw0sdTHgj4Q== 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=QcErqOAyciZV5H4WhJpBgNzP/FAuWfbxjPa096tf19A=; b=JXq0pjItgqc1TtpFJv/I4SVqf6P+gZwHm4UW78CzGEN+gKbVDUBBez1sTbDYiM2T65MXLNEC93TQ99EeOqX/7NZ0hKIKez9HsQNSbu6IKD5FWIUf/Gc8iqf9cXKQ0bxTQRQtuqjAxjtcg1OLwnrWEibDRjPV/+fgKQZyx6CiWAaMVi+PXPDy8l2j7hZgzw+MXNvdx59J5jHHVzPDGEGv2zdZQRyAVDIH48UBahfUQyrnwtr9WIi3Sni3bIh3gTMNgWJ/8OLxfCDh2IMraR6vUOSFEzSw5FfAIZsHRQvrKMlB8sJS+02OEGI898iGXvDiTM4uybIhd0/0vTbuWGA0eQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=infradead.org 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 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=QcErqOAyciZV5H4WhJpBgNzP/FAuWfbxjPa096tf19A=; b=OGi9xZ+esO/BaSCvo1xJXUj81OW1rspuLV50z9gU5MFyAS2RcKrTWCDYXm8O6AvUmq2fUFCx98EKQUurrewgbch/1EG4Pmu+JgRCRh6ut25RHrAVdy+OPExkLAtIT2SHIIA2pqX0D9dMnn3z9bG5gxgENSIQyYYlCUs7r/AAZGc= Received: from DM6PR07CA0090.namprd07.prod.outlook.com (2603:10b6:5:337::23) by CY5PR12MB6132.namprd12.prod.outlook.com (2603:10b6:930:24::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.30; Mon, 17 Apr 2023 23:34:11 +0000 Received: from DM6NAM11FT020.eop-nam11.prod.protection.outlook.com (2603:10b6:5:337:cafe::a9) by DM6PR07CA0090.outlook.office365.com (2603:10b6:5:337::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6298.46 via Frontend Transport; Mon, 17 Apr 2023 23:34:11 +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 DM6NAM11FT020.mail.protection.outlook.com (10.13.172.224) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6319.19 via Frontend Transport; Mon, 17 Apr 2023 23:34:11 +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.2375.34; Mon, 17 Apr 2023 18:34:08 -0500 Subject: [PATCH v4 1/7] x86/resctrl: Add multiple tasks to the resctrl group at once From: Babu Moger <babu.moger@amd.com> To: <corbet@lwn.net>, <reinette.chatre@intel.com>, <tglx@linutronix.de>, <mingo@redhat.com>, <bp@alien8.de> CC: <fenghua.yu@intel.com>, <dave.hansen@linux.intel.com>, <x86@kernel.org>, <hpa@zytor.com>, <paulmck@kernel.org>, <akpm@linux-foundation.org>, <quic_neeraju@quicinc.com>, <rdunlap@infradead.org>, <damien.lemoal@opensource.wdc.com>, <songmuchun@bytedance.com>, <peterz@infradead.org>, <jpoimboe@kernel.org>, <pbonzini@redhat.com>, <babu.moger@amd.com>, <chang.seok.bae@intel.com>, <pawan.kumar.gupta@linux.intel.com>, <jmattson@google.com>, <daniel.sneddon@linux.intel.com>, <sandipan.das@amd.com>, <tony.luck@intel.com>, <james.morse@arm.com>, <linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <bagasdotme@gmail.com>, <eranian@google.com>, <christophe.leroy@csgroup.eu>, <pawan.kumar.gupta@linux.intel.com>, <jarkko@kernel.org>, <adrian.hunter@intel.com>, <quic_jiles@quicinc.com>, <peternewman@google.com>, <babu.moger@amd.com> Date: Mon, 17 Apr 2023 18:34:06 -0500 Message-ID: <168177444676.1758847.11474266921067437724.stgit@bmoger-ubuntu> In-Reply-To: <168177435378.1758847.8317743523931859131.stgit@bmoger-ubuntu> References: <168177435378.1758847.8317743523931859131.stgit@bmoger-ubuntu> 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: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6NAM11FT020:EE_|CY5PR12MB6132:EE_ X-MS-Office365-Filtering-Correlation-Id: 744f4389-94a2-4ed0-0bae-08db3f9c3f56 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OCO4TfKFDlE9UGurbnK2abE9teeoWSExm/a3c+HGZEP3UwB3EsFXU5AjZQD7F/UHYiwPKcUe94b+kCg6fAhahuPMG6nekwCDGZ5esr0F9eepxsS54KtLXCWJSiDFP3brqAspiKufT3edAwKo0JCCNU+7cDB/xjfwuE9xP7ZAM2Le9ci42D/dYCcfT6UdrxtisRmPd05841bVDdD0+3bBrzvPJMhk6gMjKNUEwcM+ukujDl+JgyfDxnkSimIEu77BNFVVmvcE7h3pci+wvMC0szcLreKKJJuoBxz6GTnK3yrTawlDsSobKIdw763hDV4ueLzUh56I9XEj0r/FDJdmPU63PARUqfbDuzUUXqDFVF4sWWpqk8HQqm++PdKtN75M+l1eQp5dUSzitXQXVvUjLSB68NwgsQnq+LlHdMw9AHYAO2bwDAmSDD31bKlTRmJ7+KqiYxQnx6VPwSp9r9kNkcWr00q/V+qzniAcXmDKVIB9c3oy9HRpZ31WVByzzwkYzafB+olRhJ2Y8i5MMZebN1Ek/YlN/lSIYCg46+GBfRh79php0FE36LOlxDUXhlxLTKL5wWp7/+OreqYgCGa0NxiskRmrqxDqo7mhQp9cPWGpRj9l7h89uxD7Lq8Yec/y66bYYlmPILyhEEK/M1sDOo9OhwKNYs9cV+Yt7KPB/A8eK8yZRSUPYjaNPAr62uGxKMnfkojlCOSRPo0p4ZWn+SGBrYCYu8tPyRV4yGnOqdiNcl7qNKCdljIQNZADh3bN 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:(13230028)(4636009)(7916004)(136003)(346002)(39860400002)(396003)(376002)(451199021)(40470700004)(46966006)(36840700001)(16526019)(82740400003)(316002)(4326008)(36860700001)(83380400001)(426003)(336012)(70206006)(47076005)(70586007)(478600001)(54906003)(8676002)(16576012)(41300700001)(8936002)(81166007)(356005)(110136005)(5660300002)(2906002)(86362001)(44832011)(7406005)(7416002)(26005)(186003)(9686003)(33716001)(66899021)(103116003)(82310400005)(40460700003)(40480700001)(71626016)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Apr 2023 23:34:11.2327 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 744f4389-94a2-4ed0-0bae-08db3f9c3f56 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: DM6NAM11FT020.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6132 X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_SPF_HELO, RCVD_IN_DNSWL_NONE,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-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763469239449331114?= X-GMAIL-MSGID: =?utf-8?q?1763469239449331114?= |
Series |
x86/resctrl: Miscellaneous resctrl features
|
|
Commit Message
Moger, Babu
April 17, 2023, 11:34 p.m. UTC
The resctrl task assignment for MONITOR or CONTROL group needs to be
done one at a time. For example:
$mount -t resctrl resctrl /sys/fs/resctrl/
$mkdir /sys/fs/resctrl/clos1
$echo 123 > /sys/fs/resctrl/clos1/tasks
$echo 456 > /sys/fs/resctrl/clos1/tasks
$echo 789 > /sys/fs/resctrl/clos1/tasks
This is not user-friendly when dealing with hundreds of tasks.
It can be improved by supporting the multiple task id assignment in
one command with the tasks separated by commas. For example:
$echo 123,456,789 > /sys/fs/resctrl/clos1/tasks
Signed-off-by: Babu Moger <babu.moger@amd.com>
---
Documentation/x86/resctrl.rst | 9 ++++++++-
arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 ++++++++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 2 deletions(-)
Comments
On Mon, 17 Apr 2023, Babu Moger wrote: > The resctrl task assignment for MONITOR or CONTROL group needs to be > done one at a time. For example: > > $mount -t resctrl resctrl /sys/fs/resctrl/ > $mkdir /sys/fs/resctrl/clos1 > $echo 123 > /sys/fs/resctrl/clos1/tasks > $echo 456 > /sys/fs/resctrl/clos1/tasks > $echo 789 > /sys/fs/resctrl/clos1/tasks > > This is not user-friendly when dealing with hundreds of tasks. > > It can be improved by supporting the multiple task id assignment in > one command with the tasks separated by commas. For example: > > $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks > > Signed-off-by: Babu Moger <babu.moger@amd.com> > --- > Documentation/x86/resctrl.rst | 9 ++++++++- > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 ++++++++++++++++++++++++++++++- > 2 files changed, 38 insertions(+), 2 deletions(-) > > diff --git a/Documentation/x86/resctrl.rst b/Documentation/x86/resctrl.rst > index 387ccbcb558f..f28ed1443a6a 100644 > --- a/Documentation/x86/resctrl.rst > +++ b/Documentation/x86/resctrl.rst > @@ -292,7 +292,14 @@ All groups contain the following files: > "tasks": > Reading this file shows the list of all tasks that belong to > this group. Writing a task id to the file will add a task to the > - group. If the group is a CTRL_MON group the task is removed from > + group. Multiple tasks can be added by separating the task ids > + with commas. Tasks will be assigned sequentially in the order it > + is entered. "Tasks ... it is ..." doesn't sound correct. > Failures while assigning the tasks will be aborted > + immediately and tasks next in the sequence will not be assigned. > + Users may need to retry them again. Failure details possibly with > + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. > + > + If the group is a CTRL_MON group the task is removed from > whichever previous CTRL_MON group owned the task and also from > any MON group that owned the task. If the group is a MON group, > then the task must already belong to the CTRL_MON parent of this > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index 6ad33f355861..df5bd13440b0 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -696,18 +696,41 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, > char *buf, size_t nbytes, loff_t off) > { > struct rdtgroup *rdtgrp; > + char *pid_str; > int ret = 0; > pid_t pid; > > - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) > + if (nbytes == 0) > return -EINVAL; > + > + buf[nbytes - 1] = '\0'; > + > rdtgrp = rdtgroup_kn_lock_live(of->kn); > if (!rdtgrp) { > rdtgroup_kn_unlock(of->kn); > return -ENOENT; > } > + > +next: > + if (!buf || buf[0] == '\0') > + goto unlock; > + > rdt_last_cmd_clear(); > > + pid_str = strim(strsep(&buf, ",")); > + > + if (kstrtoint(pid_str, 0, &pid)) { > + rdt_last_cmd_printf("Task list parsing error\n"); > + ret = -EINVAL; > + goto unlock; > + } > + > + if (pid < 0) { > + rdt_last_cmd_printf("Invalid pid %d value\n", pid); > + ret = -EINVAL; > + goto unlock; > + } > + > if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || > rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { > ret = -EINVAL; > @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, > } > > ret = rdtgroup_move_task(pid, rdtgrp, of); > + if (ret) { > + rdt_last_cmd_printf("Error while processing task %d\n", pid); > + goto unlock; > + } else { > + goto next; > + } Why is this not changed into a while () loop?? > > unlock: > rdtgroup_kn_unlock(of->kn); > >
Hi Jarvinen, On 4/19/23 07:58, Ilpo Järvinen wrote: > On Mon, 17 Apr 2023, Babu Moger wrote: > >> The resctrl task assignment for MONITOR or CONTROL group needs to be >> done one at a time. For example: >> >> $mount -t resctrl resctrl /sys/fs/resctrl/ >> $mkdir /sys/fs/resctrl/clos1 >> $echo 123 > /sys/fs/resctrl/clos1/tasks >> $echo 456 > /sys/fs/resctrl/clos1/tasks >> $echo 789 > /sys/fs/resctrl/clos1/tasks >> >> This is not user-friendly when dealing with hundreds of tasks. >> >> It can be improved by supporting the multiple task id assignment in >> one command with the tasks separated by commas. For example: >> >> $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks >> >> Signed-off-by: Babu Moger <babu.moger@amd.com> >> --- >> Documentation/x86/resctrl.rst | 9 ++++++++- >> arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 ++++++++++++++++++++++++++++++- >> 2 files changed, 38 insertions(+), 2 deletions(-) >> >> diff --git a/Documentation/x86/resctrl.rst b/Documentation/x86/resctrl.rst >> index 387ccbcb558f..f28ed1443a6a 100644 >> --- a/Documentation/x86/resctrl.rst >> +++ b/Documentation/x86/resctrl.rst >> @@ -292,7 +292,14 @@ All groups contain the following files: >> "tasks": >> Reading this file shows the list of all tasks that belong to >> this group. Writing a task id to the file will add a task to the >> - group. If the group is a CTRL_MON group the task is removed from >> + group. Multiple tasks can be added by separating the task ids >> + with commas. Tasks will be assigned sequentially in the order it >> + is entered. > > "Tasks ... it is ..." doesn't sound correct. How about "Tasks will be assigned sequentially in the order they are entered." > >> Failures while assigning the tasks will be aborted >> + immediately and tasks next in the sequence will not be assigned. >> + Users may need to retry them again. Failure details possibly with >> + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. >> + >> + If the group is a CTRL_MON group the task is removed from >> whichever previous CTRL_MON group owned the task and also from >> any MON group that owned the task. If the group is a MON group, >> then the task must already belong to the CTRL_MON parent of this >> diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> index 6ad33f355861..df5bd13440b0 100644 >> --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c >> @@ -696,18 +696,41 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, >> char *buf, size_t nbytes, loff_t off) >> { >> struct rdtgroup *rdtgrp; >> + char *pid_str; >> int ret = 0; >> pid_t pid; >> >> - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) >> + if (nbytes == 0) >> return -EINVAL; >> + >> + buf[nbytes - 1] = '\0'; >> + >> rdtgrp = rdtgroup_kn_lock_live(of->kn); >> if (!rdtgrp) { >> rdtgroup_kn_unlock(of->kn); >> return -ENOENT; >> } >> + >> +next: >> + if (!buf || buf[0] == '\0') >> + goto unlock; >> + >> rdt_last_cmd_clear(); >> >> + pid_str = strim(strsep(&buf, ",")); >> + >> + if (kstrtoint(pid_str, 0, &pid)) { >> + rdt_last_cmd_printf("Task list parsing error\n"); >> + ret = -EINVAL; >> + goto unlock; >> + } >> + >> + if (pid < 0) { >> + rdt_last_cmd_printf("Invalid pid %d value\n", pid); >> + ret = -EINVAL; >> + goto unlock; >> + } >> + >> if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || >> rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { >> ret = -EINVAL; >> @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, >> } >> >> ret = rdtgroup_move_task(pid, rdtgrp, of); >> + if (ret) { >> + rdt_last_cmd_printf("Error while processing task %d\n", pid); >> + goto unlock; >> + } else { >> + goto next; >> + } > > Why is this not changed into a while () loop?? Yes. I can change that. It might look bit more cleaner. > >> >> unlock: >> rdtgroup_kn_unlock(of->kn); >> >> > >
On Wed, 19 Apr 2023, Moger, Babu wrote: > Hi Jarvinen, > > On 4/19/23 07:58, Ilpo Järvinen wrote: > > On Mon, 17 Apr 2023, Babu Moger wrote: > > > >> The resctrl task assignment for MONITOR or CONTROL group needs to be > >> done one at a time. For example: > >> > >> $mount -t resctrl resctrl /sys/fs/resctrl/ > >> $mkdir /sys/fs/resctrl/clos1 > >> $echo 123 > /sys/fs/resctrl/clos1/tasks > >> $echo 456 > /sys/fs/resctrl/clos1/tasks > >> $echo 789 > /sys/fs/resctrl/clos1/tasks > >> > >> This is not user-friendly when dealing with hundreds of tasks. > >> > >> It can be improved by supporting the multiple task id assignment in > >> one command with the tasks separated by commas. For example: > >> > >> $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks > >> > >> Signed-off-by: Babu Moger <babu.moger@amd.com> > >> --- > >> Documentation/x86/resctrl.rst | 9 ++++++++- > >> arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 ++++++++++++++++++++++++++++++- > >> 2 files changed, 38 insertions(+), 2 deletions(-) > >> > >> diff --git a/Documentation/x86/resctrl.rst b/Documentation/x86/resctrl.rst > >> index 387ccbcb558f..f28ed1443a6a 100644 > >> --- a/Documentation/x86/resctrl.rst > >> +++ b/Documentation/x86/resctrl.rst > >> @@ -292,7 +292,14 @@ All groups contain the following files: > >> "tasks": > >> Reading this file shows the list of all tasks that belong to > >> this group. Writing a task id to the file will add a task to the > >> - group. If the group is a CTRL_MON group the task is removed from > >> + group. Multiple tasks can be added by separating the task ids > >> + with commas. Tasks will be assigned sequentially in the order it > >> + is entered. > > > > "Tasks ... it is ..." doesn't sound correct. > > How about "Tasks will be assigned sequentially in the order they are entered." It sounds better.
Hi Babu, On 4/17/2023 4:34 PM, Babu Moger wrote: > The resctrl task assignment for MONITOR or CONTROL group needs to be > done one at a time. For example: Why all caps for monitor and control? If the intention is to use the terms for these groups then it may be easier to use the same terms as in the documentation, or you could just not use all caps like you do in later patches. > > $mount -t resctrl resctrl /sys/fs/resctrl/ > $mkdir /sys/fs/resctrl/clos1 > $echo 123 > /sys/fs/resctrl/clos1/tasks > $echo 456 > /sys/fs/resctrl/clos1/tasks > $echo 789 > /sys/fs/resctrl/clos1/tasks > > This is not user-friendly when dealing with hundreds of tasks. > > It can be improved by supporting the multiple task id assignment in > one command with the tasks separated by commas. For example: Please use imperative mood (see Documentation/process/maintainer-tip.rst). Something like: "Improve multiple task id assignment ...." > > $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks > > Signed-off-by: Babu Moger <babu.moger@amd.com> > --- > Documentation/x86/resctrl.rst | 9 ++++++++- > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 ++++++++++++++++++++++++++++++- > 2 files changed, 38 insertions(+), 2 deletions(-) > > diff --git a/Documentation/x86/resctrl.rst b/Documentation/x86/resctrl.rst > index 387ccbcb558f..f28ed1443a6a 100644 > --- a/Documentation/x86/resctrl.rst > +++ b/Documentation/x86/resctrl.rst > @@ -292,7 +292,14 @@ All groups contain the following files: > "tasks": > Reading this file shows the list of all tasks that belong to > this group. Writing a task id to the file will add a task to the > - group. If the group is a CTRL_MON group the task is removed from > + group. Multiple tasks can be added by separating the task ids > + with commas. Tasks will be assigned sequentially in the order it I think the "in the order it is entered." can be dropped so that it just reads (note tense change): "Tasks are assigned sequentially." > + is entered. Failures while assigning the tasks will be aborted > + immediately and tasks next in the sequence will not be assigned. Multiple failures are not supported. A single failure encountered while attempting to assign a single task will cause the operation to abort. > + Users may need to retry them again. Failure details possibly with I am not sure about this guidance. From what I can tell a failure could be either that the pid does not exist or that the move is illegal. A retry would not achieve a different outcome. I think you may thus mean that the tasks that followed a task that could not be moved, but in that case the "retry" is not clear to me. > + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. Would it not always print the failing pid (if error was encountered while attempting to move a task) ? Maybe just drop that so that it reads "Failure details will be logged to ..." (adding file seems unnecessary). > + > + If the group is a CTRL_MON group the task is removed from > whichever previous CTRL_MON group owned the task and also from > any MON group that owned the task. If the group is a MON group, > then the task must already belong to the CTRL_MON parent of this > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > index 6ad33f355861..df5bd13440b0 100644 > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > @@ -696,18 +696,41 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, > char *buf, size_t nbytes, loff_t off) > { > struct rdtgroup *rdtgrp; > + char *pid_str; > int ret = 0; > pid_t pid; > > - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) > + if (nbytes == 0) > return -EINVAL; > + > + buf[nbytes - 1] = '\0'; > + This seems like another remnant of the schemata write code that expects that the buffer ends with a '\n'. Since this code does not have this requirement the above may have unintended consequences if a tool provides a buffer that does not end with '\n'. I think you just want to ensure that the buffer is properly terminated and from what I understand when looking at kernfs_fop_write_iter() this is already taken care of. > rdtgrp = rdtgroup_kn_lock_live(of->kn); > if (!rdtgrp) { > rdtgroup_kn_unlock(of->kn); > return -ENOENT; > } > + > +next: > + if (!buf || buf[0] == '\0') > + goto unlock; > + > rdt_last_cmd_clear(); Why is this buffer cleared on processing of each pid? > > + pid_str = strim(strsep(&buf, ",")); > + > + if (kstrtoint(pid_str, 0, &pid)) { > + rdt_last_cmd_printf("Task list parsing error\n"); rdt_last_cmd_puts()? > + ret = -EINVAL; > + goto unlock; > + } > + > + if (pid < 0) { > + rdt_last_cmd_printf("Invalid pid %d value\n", pid); > + ret = -EINVAL; > + goto unlock; > + } > + > if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || > rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { > ret = -EINVAL; The above code has nothing to do with the pid so repeating its execution does not seem necessary. > @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, > } > > ret = rdtgroup_move_task(pid, rdtgrp, of); > + if (ret) { > + rdt_last_cmd_printf("Error while processing task %d\n", pid); > + goto unlock; > + } else { > + goto next; > + } > > unlock: > rdtgroup_kn_unlock(of->kn); > > Reinette
[AMD Official Use Only - General] Hi Reinette, > -----Original Message----- > From: Reinette Chatre <reinette.chatre@intel.com> > Sent: Thursday, May 4, 2023 1:58 PM > To: Moger, Babu <Babu.Moger@amd.com>; corbet@lwn.net; > tglx@linutronix.de; mingo@redhat.com; bp@alien8.de > Cc: fenghua.yu@intel.com; dave.hansen@linux.intel.com; x86@kernel.org; > hpa@zytor.com; paulmck@kernel.org; akpm@linux-foundation.org; > quic_neeraju@quicinc.com; rdunlap@infradead.org; > damien.lemoal@opensource.wdc.com; songmuchun@bytedance.com; > peterz@infradead.org; jpoimboe@kernel.org; pbonzini@redhat.com; > chang.seok.bae@intel.com; pawan.kumar.gupta@linux.intel.com; > jmattson@google.com; daniel.sneddon@linux.intel.com; Das1, Sandipan > <Sandipan.Das@amd.com>; tony.luck@intel.com; james.morse@arm.com; > linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; > bagasdotme@gmail.com; eranian@google.com; christophe.leroy@csgroup.eu; > jarkko@kernel.org; adrian.hunter@intel.com; quic_jiles@quicinc.com; > peternewman@google.com > Subject: Re: [PATCH v4 1/7] x86/resctrl: Add multiple tasks to the resctrl group > at once > > Hi Babu, > > On 4/17/2023 4:34 PM, Babu Moger wrote: > > The resctrl task assignment for MONITOR or CONTROL group needs to be > > done one at a time. For example: > > Why all caps for monitor and control? If the intention is to use the terms for > these groups then it may be easier to use the same terms as in the > documentation, or you could just not use all caps like you do in later patches. Sure. > > > > > $mount -t resctrl resctrl /sys/fs/resctrl/ > > $mkdir /sys/fs/resctrl/clos1 > > $echo 123 > /sys/fs/resctrl/clos1/tasks > > $echo 456 > /sys/fs/resctrl/clos1/tasks > > $echo 789 > /sys/fs/resctrl/clos1/tasks > > > > This is not user-friendly when dealing with hundreds of tasks. > > > > It can be improved by supporting the multiple task id assignment in > > one command with the tasks separated by commas. For example: > > Please use imperative mood (see Documentation/process/maintainer-tip.rst). > > Something like: > "Improve multiple task id assignment ...." How about: "Improve the assignment by supporting multiple task id assignment in one command with the tasks separated by commas." > > > > > $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks > > > > Signed-off-by: Babu Moger <babu.moger@amd.com> > > --- > > Documentation/x86/resctrl.rst | 9 ++++++++- > > arch/x86/kernel/cpu/resctrl/rdtgroup.c | 31 > ++++++++++++++++++++++++++++++- > > 2 files changed, 38 insertions(+), 2 deletions(-) > > > > diff --git a/Documentation/x86/resctrl.rst > > b/Documentation/x86/resctrl.rst index 387ccbcb558f..f28ed1443a6a > > 100644 > > --- a/Documentation/x86/resctrl.rst > > +++ b/Documentation/x86/resctrl.rst > > @@ -292,7 +292,14 @@ All groups contain the following files: > > "tasks": > > Reading this file shows the list of all tasks that belong to > > this group. Writing a task id to the file will add a task to the > > - group. If the group is a CTRL_MON group the task is removed from > > + group. Multiple tasks can be added by separating the task ids > > + with commas. Tasks will be assigned sequentially in the order it > > I think the "in the order it is entered." can be dropped so that it just reads (note > tense change): "Tasks are assigned sequentially." Ok. Sure > > > + is entered. Failures while assigning the tasks will be aborted > > + immediately and tasks next in the sequence will not be assigned. > > Multiple failures are not supported. A single failure encountered while > attempting to assign a single task will cause the operation to abort. Ok. Sure > > > + Users may need to retry them again. Failure details possibly with > > I am not sure about this guidance. From what I can tell a failure could be either > that the pid does not exist or that the move is illegal. A retry would not achieve > a different outcome. I think you may thus mean that the tasks that followed a > task that could not be moved, but in that case the "retry" is not clear to me. Ok. Will drop "retry" sentence. > > > + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. > > Would it not always print the failing pid (if error was encountered while Not always. In this case it does not print the pid, rdt_last_cmd_puts("Can't move task to different control group\n"); return -EINVAL; > attempting to move a task) ? Maybe just drop that so that it reads "Failure > details will be logged to ..." (adding file seems unnecessary). Ok > > > > + > > + If the group is a CTRL_MON group the task is removed from > > whichever previous CTRL_MON group owned the task and also from > > any MON group that owned the task. If the group is a MON group, > > then the task must already belong to the CTRL_MON parent of this > > diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > > b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > > index 6ad33f355861..df5bd13440b0 100644 > > --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c > > +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c > > @@ -696,18 +696,41 @@ static ssize_t rdtgroup_tasks_write(struct > kernfs_open_file *of, > > char *buf, size_t nbytes, loff_t off) { > > struct rdtgroup *rdtgrp; > > + char *pid_str; > > int ret = 0; > > pid_t pid; > > > > - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) > > + if (nbytes == 0) > > return -EINVAL; > > + > > + buf[nbytes - 1] = '\0'; > > + > > This seems like another remnant of the schemata write code that expects that > the buffer ends with a '\n'. Since this code does not have this requirement the > above may have unintended consequences if a tool provides a buffer that does > not end with '\n'. > I think you just want to ensure that the buffer is properly terminated and from > what I understand when looking at kernfs_fop_write_iter() this is already taken > care of. Sure. Will check. Then I will have to change the check below to if (!buf). > > > rdtgrp = rdtgroup_kn_lock_live(of->kn); > > if (!rdtgrp) { > > rdtgroup_kn_unlock(of->kn); > > return -ENOENT; > > } > > + > > +next: > > + if (!buf || buf[0] == '\0') > > + goto unlock; > > + > > rdt_last_cmd_clear(); > > Why is this buffer cleared on processing of each pid? Will check. > > > > > + pid_str = strim(strsep(&buf, ",")); > > + > > + if (kstrtoint(pid_str, 0, &pid)) { > > + rdt_last_cmd_printf("Task list parsing error\n"); > > rdt_last_cmd_puts()? Sure. > > > + ret = -EINVAL; > > + goto unlock; > > + } > > + > > + if (pid < 0) { > > + rdt_last_cmd_printf("Invalid pid %d value\n", pid); > > + ret = -EINVAL; > > + goto unlock; > > + } > > + > > if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || > > rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { > > ret = -EINVAL; > > The above code has nothing to do with the pid so repeating its execution does > not seem necessary. Will remove.. Thanks Babu > > > @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct > kernfs_open_file *of, > > } > > > > ret = rdtgroup_move_task(pid, rdtgrp, of); > > + if (ret) { > > + rdt_last_cmd_printf("Error while processing task %d\n", pid); > > + goto unlock; > > + } else { > > + goto next; > > + } > > > > unlock: > > rdtgroup_kn_unlock(of->kn); > > > > > > Reinette
Hi Babu, On 5/5/2023 10:09 AM, Moger, Babu wrote: > [AMD Official Use Only - General] > > Hi Reinette, > >> -----Original Message----- >> From: Reinette Chatre <reinette.chatre@intel.com> >> Sent: Thursday, May 4, 2023 1:58 PM >> To: Moger, Babu <Babu.Moger@amd.com>; corbet@lwn.net; >> tglx@linutronix.de; mingo@redhat.com; bp@alien8.de >> Cc: fenghua.yu@intel.com; dave.hansen@linux.intel.com; x86@kernel.org; >> hpa@zytor.com; paulmck@kernel.org; akpm@linux-foundation.org; >> quic_neeraju@quicinc.com; rdunlap@infradead.org; >> damien.lemoal@opensource.wdc.com; songmuchun@bytedance.com; >> peterz@infradead.org; jpoimboe@kernel.org; pbonzini@redhat.com; >> chang.seok.bae@intel.com; pawan.kumar.gupta@linux.intel.com; >> jmattson@google.com; daniel.sneddon@linux.intel.com; Das1, Sandipan >> <Sandipan.Das@amd.com>; tony.luck@intel.com; james.morse@arm.com; >> linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; >> bagasdotme@gmail.com; eranian@google.com; christophe.leroy@csgroup.eu; >> jarkko@kernel.org; adrian.hunter@intel.com; quic_jiles@quicinc.com; >> peternewman@google.com >> Subject: Re: [PATCH v4 1/7] x86/resctrl: Add multiple tasks to the resctrl group >> at once >> >> Hi Babu, >> >> On 4/17/2023 4:34 PM, Babu Moger wrote: >>> The resctrl task assignment for MONITOR or CONTROL group needs to be >>> done one at a time. For example: >> >> Why all caps for monitor and control? If the intention is to use the terms for >> these groups then it may be easier to use the same terms as in the >> documentation, or you could just not use all caps like you do in later patches. > > Sure. >> >>> >>> $mount -t resctrl resctrl /sys/fs/resctrl/ >>> $mkdir /sys/fs/resctrl/clos1 >>> $echo 123 > /sys/fs/resctrl/clos1/tasks >>> $echo 456 > /sys/fs/resctrl/clos1/tasks >>> $echo 789 > /sys/fs/resctrl/clos1/tasks >>> >>> This is not user-friendly when dealing with hundreds of tasks. >>> >>> It can be improved by supporting the multiple task id assignment in >>> one command with the tasks separated by commas. For example: >> >> Please use imperative mood (see Documentation/process/maintainer-tip.rst). >> >> Something like: >> "Improve multiple task id assignment ...." > > How about: > "Improve the assignment by supporting multiple task id assignment in > one command with the tasks separated by commas." The double use of 'assignment' can be confusing. This is also a changelog where a clear context->problem->solution format can help. If your changelog is clear regarding the context and problem then it can end with brief solution description like: "Support multiple task assignment in one command with tasks ids separated by commas. For example: " (and also please use a non-x86 term for the group name in your example) >>> $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks >>> ... >>> + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. >> >> Would it not always print the failing pid (if error was encountered while > > Not always. In this case it does not print the pid, > rdt_last_cmd_puts("Can't move task to different control group\n"); > return -EINVAL; > What you quote above adds the relevant text to the last_cmd_status buffer ... and later (see below) more text is added to the buffer that contains the pid, no? ... >>> struct rdtgroup *rdtgrp; >>> + char *pid_str; >>> int ret = 0; >>> pid_t pid; >>> >>> - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) >>> + if (nbytes == 0) >>> return -EINVAL; >>> + >>> + buf[nbytes - 1] = '\0'; >>> + >> >> This seems like another remnant of the schemata write code that expects that >> the buffer ends with a '\n'. Since this code does not have this requirement the >> above may have unintended consequences if a tool provides a buffer that does >> not end with '\n'. >> I think you just want to ensure that the buffer is properly terminated and from >> what I understand when looking at kernfs_fop_write_iter() this is already taken >> care of. > > Sure. Will check. Then I will have to change the check below to if (!buf). Please check what kernfs_fop_write_iter() does. From what I can tell it does exactly what you are trying to do above, but without overwriting part of the string that user space provides. I thus do not think that the later check needs to change. From what I understand it is used to handle the scenario if user space provides a string like "pid," (last character is the separator). Please do confirm that the code can handle any variations that user space may throw at it. >>> @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct >> kernfs_open_file *of, >>> } >>> >>> ret = rdtgroup_move_task(pid, rdtgrp, of); >>> + if (ret) { >>> + rdt_last_cmd_printf("Error while processing task %d\n", pid); Note here the pid is added to the buffer that is printed when user space views last_cmd_status. I think this is the first time two lines of error may be added to the buffer so you could double check all works as expected. Reinette
Hi Reinette, On 5/5/23 13:49, Reinette Chatre wrote: > Hi Babu, > > On 5/5/2023 10:09 AM, Moger, Babu wrote: >> [AMD Official Use Only - General] >> >> Hi Reinette, >> >>> -----Original Message----- >>> From: Reinette Chatre <reinette.chatre@intel.com> >>> Sent: Thursday, May 4, 2023 1:58 PM >>> To: Moger, Babu <Babu.Moger@amd.com>; corbet@lwn.net; >>> tglx@linutronix.de; mingo@redhat.com; bp@alien8.de >>> Cc: fenghua.yu@intel.com; dave.hansen@linux.intel.com; x86@kernel.org; >>> hpa@zytor.com; paulmck@kernel.org; akpm@linux-foundation.org; >>> quic_neeraju@quicinc.com; rdunlap@infradead.org; >>> damien.lemoal@opensource.wdc.com; songmuchun@bytedance.com; >>> peterz@infradead.org; jpoimboe@kernel.org; pbonzini@redhat.com; >>> chang.seok.bae@intel.com; pawan.kumar.gupta@linux.intel.com; >>> jmattson@google.com; daniel.sneddon@linux.intel.com; Das1, Sandipan >>> <Sandipan.Das@amd.com>; tony.luck@intel.com; james.morse@arm.com; >>> linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; >>> bagasdotme@gmail.com; eranian@google.com; christophe.leroy@csgroup.eu; >>> jarkko@kernel.org; adrian.hunter@intel.com; quic_jiles@quicinc.com; >>> peternewman@google.com >>> Subject: Re: [PATCH v4 1/7] x86/resctrl: Add multiple tasks to the resctrl group >>> at once >>> >>> Hi Babu, >>> >>> On 4/17/2023 4:34 PM, Babu Moger wrote: >>>> The resctrl task assignment for MONITOR or CONTROL group needs to be >>>> done one at a time. For example: >>> >>> Why all caps for monitor and control? If the intention is to use the terms for >>> these groups then it may be easier to use the same terms as in the >>> documentation, or you could just not use all caps like you do in later patches. >> >> Sure. >>> >>>> >>>> $mount -t resctrl resctrl /sys/fs/resctrl/ >>>> $mkdir /sys/fs/resctrl/clos1 >>>> $echo 123 > /sys/fs/resctrl/clos1/tasks >>>> $echo 456 > /sys/fs/resctrl/clos1/tasks >>>> $echo 789 > /sys/fs/resctrl/clos1/tasks >>>> >>>> This is not user-friendly when dealing with hundreds of tasks. >>>> >>>> It can be improved by supporting the multiple task id assignment in >>>> one command with the tasks separated by commas. For example: >>> >>> Please use imperative mood (see Documentation/process/maintainer-tip.rst). >>> >>> Something like: >>> "Improve multiple task id assignment ...." >> >> How about: >> "Improve the assignment by supporting multiple task id assignment in >> one command with the tasks separated by commas." > > The double use of 'assignment' can be confusing. This is also a > changelog where a clear context->problem->solution format can help. > If your changelog is clear regarding the context and problem then it > can end with brief solution description like: > > "Support multiple task assignment in one command with tasks ids separated > by commas. For example: " (and also please use a non-x86 term for the group > name in your example) Sure. > >>>> $echo 123,456,789 > /sys/fs/resctrl/clos1/tasks >>>> > > ... > >>>> + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. >>> >>> Would it not always print the failing pid (if error was encountered while >> >> Not always. In this case it does not print the pid, >> rdt_last_cmd_puts("Can't move task to different control group\n"); >> return -EINVAL; >> > > What you quote above adds the relevant text to the last_cmd_status buffer ... > and later (see below) more text is added to the buffer that contains the > pid, no? Yes. That is correct. > > ... > >>>> struct rdtgroup *rdtgrp; >>>> + char *pid_str; >>>> int ret = 0; >>>> pid_t pid; >>>> >>>> - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) >>>> + if (nbytes == 0) >>>> return -EINVAL; >>>> + >>>> + buf[nbytes - 1] = '\0'; >>>> + >>> >>> This seems like another remnant of the schemata write code that expects that >>> the buffer ends with a '\n'. Since this code does not have this requirement the >>> above may have unintended consequences if a tool provides a buffer that does >>> not end with '\n'. >>> I think you just want to ensure that the buffer is properly terminated and from >>> what I understand when looking at kernfs_fop_write_iter() this is already taken >>> care of. >> >> Sure. Will check. Then I will have to change the check below to if (!buf). > > Please check what kernfs_fop_write_iter() does. From what I can tell it does > exactly what you are trying to do above, but without overwriting > part of the string that user space provides. > I thus do not think that the later check needs to change. From what I understand > it is used to handle the scenario if user space provides a string like "pid," > (last character is the separator). Please do confirm that the code can handle > any variations that user space may throw at it. Sure. Thanks Babu > >>>> @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct >>> kernfs_open_file *of, >>>> } >>>> >>>> ret = rdtgroup_move_task(pid, rdtgrp, of); >>>> + if (ret) { >>>> + rdt_last_cmd_printf("Error while processing task %d\n", pid); > > Note here the pid is added to the buffer that is printed when user space > views last_cmd_status. I think this is the first time two lines of error may > be added to the buffer so you could double check all works as expected. > > Reinette
diff --git a/Documentation/x86/resctrl.rst b/Documentation/x86/resctrl.rst index 387ccbcb558f..f28ed1443a6a 100644 --- a/Documentation/x86/resctrl.rst +++ b/Documentation/x86/resctrl.rst @@ -292,7 +292,14 @@ All groups contain the following files: "tasks": Reading this file shows the list of all tasks that belong to this group. Writing a task id to the file will add a task to the - group. If the group is a CTRL_MON group the task is removed from + group. Multiple tasks can be added by separating the task ids + with commas. Tasks will be assigned sequentially in the order it + is entered. Failures while assigning the tasks will be aborted + immediately and tasks next in the sequence will not be assigned. + Users may need to retry them again. Failure details possibly with + pid will be logged in /sys/fs/resctrl/info/last_cmd_status file. + + If the group is a CTRL_MON group the task is removed from whichever previous CTRL_MON group owned the task and also from any MON group that owned the task. If the group is a MON group, then the task must already belong to the CTRL_MON parent of this diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index 6ad33f355861..df5bd13440b0 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -696,18 +696,41 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, char *buf, size_t nbytes, loff_t off) { struct rdtgroup *rdtgrp; + char *pid_str; int ret = 0; pid_t pid; - if (kstrtoint(strstrip(buf), 0, &pid) || pid < 0) + if (nbytes == 0) return -EINVAL; + + buf[nbytes - 1] = '\0'; + rdtgrp = rdtgroup_kn_lock_live(of->kn); if (!rdtgrp) { rdtgroup_kn_unlock(of->kn); return -ENOENT; } + +next: + if (!buf || buf[0] == '\0') + goto unlock; + rdt_last_cmd_clear(); + pid_str = strim(strsep(&buf, ",")); + + if (kstrtoint(pid_str, 0, &pid)) { + rdt_last_cmd_printf("Task list parsing error\n"); + ret = -EINVAL; + goto unlock; + } + + if (pid < 0) { + rdt_last_cmd_printf("Invalid pid %d value\n", pid); + ret = -EINVAL; + goto unlock; + } + if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { ret = -EINVAL; @@ -716,6 +739,12 @@ static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, } ret = rdtgroup_move_task(pid, rdtgrp, of); + if (ret) { + rdt_last_cmd_printf("Error while processing task %d\n", pid); + goto unlock; + } else { + goto next; + } unlock: rdtgroup_kn_unlock(of->kn);