Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp6466334pxv; Thu, 29 Jul 2021 15:40:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz868fgtbbM3M786KYv4fTwPLOsMXggJLC+NogtM7Dw9hhc5PiPxTRsg+IG28EmBYbsB8+i X-Received: by 2002:a17:906:bc87:: with SMTP id lv7mr6726917ejb.365.1627598448765; Thu, 29 Jul 2021 15:40:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627598448; cv=none; d=google.com; s=arc-20160816; b=jFaxv26SUf0w4kSP8XJeTrHgAcKG3xGq9gfGmEN+iwyyWsBIVSzpYeR+8bV30p70Ya HKQ3NA0phbJ2Oz3CYP/Q15/5Tkai7/D9dHORRuTwqF1BfOGVKB1Tz3toCbOeVxeiYPfa a6JJoXNrvhR10BwmtGnQBrsNXgDJSuI4ozbpzMgFr1ec2jS82am8/4es23JrGoGSH50p GoSAnuB8auqrmAKp2AND3NwzGHZtM9oEvSI0sUiwJGLyA35Y9fKMd1NNC/S4N3Q4o4Ao Ppf/+XxZNBfcHOe50Vxk+zOAiFdeZRA9UMt4L5DLUw5ZPjQqLIK45ko4lnV8PKPSGdF4 xRPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=YcISxkOD3a2fLU6M/7p0jvAv3AuA5Y5MewzO+MMLGEs=; b=HWUKGQHoXHEHwtI2lSlAlSIeWREe3Z4eXzSV9nQA+vIpAYOJJqHQ6IL15qk4NnR/vz OmSnuPyq2atfFSROrHfiM21ymAjw9viquLFHk2yTcDqHdfiwkQhwhSzRszHtrN9enhl5 IJ/KqykAwI7aXpZkz8SAf2H8YMjXspxi4GoaHLQEBZOg0LjZNo/8mT1PKjXQ3NtnwWZZ huxE1Y7Vx2IC+M71+4lWre2zIyzrWRychxbrQ1KCeKVuT35l7GIR6hbUnE6sowyaLAyq SRUfqfBQ8Rbz0m1sprdOqCTx4y2OOTyKrdyZ/h92Riy840zIQZApKzXevXhCEWSsEjem YxWw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g3si3451885edy.24.2021.07.29.15.40.25; Thu, 29 Jul 2021 15:40:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234395AbhG2Wgn (ORCPT + 99 others); Thu, 29 Jul 2021 18:36:43 -0400 Received: from foss.arm.com ([217.140.110.172]:59022 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234464AbhG2Wgh (ORCPT ); Thu, 29 Jul 2021 18:36:37 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1C7DD11FB; Thu, 29 Jul 2021 15:36:33 -0700 (PDT) Received: from merodach.members.linode.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 292D13F70D; Thu, 29 Jul 2021 15:36:31 -0700 (PDT) From: James Morse To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Fenghua Yu , Reinette Chatre , Thomas Gleixner , Ingo Molnar , Borislav Petkov , H Peter Anvin , Babu Moger , James Morse , shameerali.kolothum.thodi@huawei.com, Jamie Iles , D Scott Phillips OS , lcherian@marvell.com, bobo.shaobowang@huawei.com Subject: [PATCH v1 04/20] x86/resctrl: Add domain offline callback for resctrl work Date: Thu, 29 Jul 2021 22:35:54 +0000 Message-Id: <20210729223610.29373-5-james.morse@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210729223610.29373-1-james.morse@arm.com> References: <20210729223610.29373-1-james.morse@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Because domains are exposed to user-space via resctrl, the filesystem must update its state when cpu hotplug callbacks are triggered. Some of this work is common to any architecture that would support resctrl, but the work is tied up with the architecture code to free the memory. Move the monitor subdir removal and the cancelling of the mbm/limbo works into a new resctrl_offline_domain() call. Signed-off-by: James Morse --- arch/x86/kernel/cpu/resctrl/core.c | 24 +--------------- arch/x86/kernel/cpu/resctrl/internal.h | 2 -- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 39 +++++++++++++++++++++++--- include/linux/resctrl.h | 1 + 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 718f8ff00d87..56b3541617b5 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -516,27 +516,8 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) cpumask_clear_cpu(cpu, &d->cpu_mask); if (cpumask_empty(&d->cpu_mask)) { - /* - * If resctrl is mounted, remove all the - * per domain monitor data directories. - */ - if (static_branch_unlikely(&rdt_mon_enable_key)) - rmdir_mondata_subdir_allrdtgrp(r, d->id); + resctrl_offline_domain(r, d); list_del(&d->list); - if (r->mon_capable && is_mbm_enabled()) - cancel_delayed_work(&d->mbm_over); - if (is_llc_occupancy_enabled() && has_busy_rmid(r, d)) { - /* - * When a package is going down, forcefully - * decrement rmid->ebusy. There is no way to know - * that the L3 was flushed and hence may lead to - * incorrect counts in rare scenarios, but leaving - * the RMID as busy creates RMID leaks if the - * package never comes back. - */ - __check_limbo(d, true); - cancel_delayed_work(&d->cqm_limbo); - } /* * rdt_domain "d" is going to be freed below, so clear @@ -547,9 +528,6 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) kfree(hw_dom->ctrl_val); kfree(hw_dom->mbps_val); - bitmap_free(d->rmid_busy_llc); - kfree(d->mbm_total); - kfree(d->mbm_local); kfree(hw_dom); return; } diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index be48a682dbdb..e12b55f815bf 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -522,8 +522,6 @@ void free_rmid(u32 rmid); int rdt_get_mon_l3_config(struct rdt_resource *r); void mon_event_count(void *info); int rdtgroup_mondata_show(struct seq_file *m, void *arg); -void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r, - unsigned int dom_id); void mon_event_read(struct rmid_read *rr, struct rdt_resource *r, struct rdt_domain *d, struct rdtgroup *rdtgrp, int evtid, int first); diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index e1af1d81b924..cf0db0b7a5d0 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -2497,14 +2497,12 @@ static int mon_addfile(struct kernfs_node *parent_kn, const char *name, * Remove all subdirectories of mon_data of ctrl_mon groups * and monitor groups with given domain id. */ -void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r, unsigned int dom_id) +static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r, + unsigned int dom_id) { struct rdtgroup *prgrp, *crgrp; char name[32]; - if (!r->mon_capable) - return; - list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) { sprintf(name, "mon_%s_%02d", r->name, dom_id); kernfs_remove_by_name(prgrp->mon.mon_data_kn, name); @@ -3229,6 +3227,39 @@ static int __init rdtgroup_setup_root(void) return ret; } +void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d) +{ + lockdep_assert_held(&rdtgroup_mutex); // the arch code took this for us + + if (!r->mon_capable) + return; + + /* + * If resctrl is mounted, remove all the + * per domain monitor data directories. + */ + if (static_branch_unlikely(&rdt_mon_enable_key)) + rmdir_mondata_subdir_allrdtgrp(r, d->id); + + if (r->mon_capable && is_mbm_enabled()) + cancel_delayed_work(&d->mbm_over); + if (is_llc_occupancy_enabled() && has_busy_rmid(r, d)) { + /* + * When a package is going down, forcefully + * decrement rmid->ebusy. There is no way to know + * that the L3 was flushed and hence may lead to + * incorrect counts in rare scenarios, but leaving + * the RMID as busy creates RMID leaks if the + * package never comes back. + */ + __check_limbo(d, true); + cancel_delayed_work(&d->cqm_limbo); + } + bitmap_free(d->rmid_busy_llc); + kfree(d->mbm_total); + kfree(d->mbm_local); +} + static int domain_setup_mon_state(struct rdt_resource *r, struct rdt_domain *d) { size_t tsize; diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index cb48976a8d88..7aeeb4ac6bcc 100644 --- a/include/linux/resctrl.h +++ b/include/linux/resctrl.h @@ -196,5 +196,6 @@ void resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d, u32 closid, enum resctrl_conf_type type, u32 *value); int resctrl_online_domain(struct rdt_resource *r, struct rdt_domain *d); +void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d); #endif /* _RESCTRL_H */ -- 2.30.2