diff --git a/arch/arm64/include/asm/mpam_resource.h b/arch/arm64/include/asm/mpam_resource.h index ab90596c9194332512e522ce975a1e33f435fbed..1a6904c22b9c8b9e56f2a5bea4aeeb3f42276403 100644 --- a/arch/arm64/include/asm/mpam_resource.h +++ b/arch/arm64/include/asm/mpam_resource.h @@ -89,6 +89,10 @@ /* [FIXME] hard code for hardlim */ #define MBW_MAX_SET(v) (MBW_MAX_HARDLIM|((v) << (16 - BWA_WD))) #define MBW_MAX_GET(v) (((v) & MBW_MAX_MASK) >> (16 - BWA_WD)) + +/* hard code for mbw_max max-percentage's cresponding masks */ +#define MBA_MAX_WD 63u + /* * emulate the mpam nodes * These should be reported by ACPI MPAM Table. diff --git a/arch/arm64/include/asm/resctrl.h b/arch/arm64/include/asm/resctrl.h index 0a0a12b17ab3856c0dcd41e97ce2b81da96d28a9..fb5fa6c138436e6a877ab769a161dee5b484cb8f 100644 --- a/arch/arm64/include/asm/resctrl.h +++ b/arch/arm64/include/asm/resctrl.h @@ -65,4 +65,6 @@ int mongroup_create_dir(struct kernfs_node *parent_kn, struct resctrl_group *prgrp, char *name, struct kernfs_node **dest_kn); +int rdtgroup_init_alloc(struct rdtgroup *rdtgrp); + #endif /* _ASM_ARM64_RESCTRL_H */ diff --git a/arch/arm64/kernel/mpam.c b/arch/arm64/kernel/mpam.c index 4007a31b5249438be9d79d47a2812bb93298b449..dc6dd566fc37dafb9cc4aa208b473ba9a56b9e75 100644 --- a/arch/arm64/kernel/mpam.c +++ b/arch/arm64/kernel/mpam.c @@ -91,6 +91,9 @@ static inline void mpam_node_assign_val(struct mpam_node *n, n->addr = hwpage_address; n->component_id = component_id; n->cpus_list = "0"; + + if (n->type == MPAM_RESOURCE_MC) + n->default_ctrl = MBA_MAX_WD; } #define MPAM_NODE_NAME_SIZE (10) @@ -549,6 +552,20 @@ void post_resctrl_mount(void) static int reset_all_ctrls(struct resctrl_resource *r) { + struct raw_resctrl_resource *rr; + struct rdt_domain *d; + int partid; + + rr = (struct raw_resctrl_resource *)r->res; + for (partid = 0; partid < rr->num_partid; partid++) { + list_for_each_entry(d, &r->domains, list) { + d->new_ctrl = rr->default_ctrl; + d->ctrl_val[partid] = rr->default_ctrl; + d->have_new_ctrl = true; + rr->msr_update(d, partid); + } + } + return 0; } diff --git a/arch/arm64/kernel/mpam_ctrlmon.c b/arch/arm64/kernel/mpam_ctrlmon.c index c9d306a93b246ae42ac36dc9a17770e1c6cf5fb2..90f34987e5b84db79a5a93256178b32bbdaf1e07 100644 --- a/arch/arm64/kernel/mpam_ctrlmon.c +++ b/arch/arm64/kernel/mpam_ctrlmon.c @@ -589,3 +589,31 @@ int resctrl_mkdir_ctrlmon_mondata(struct kernfs_node *parent_kn, } return ret; } + +/* Initialize the RDT group's allocations. */ +int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) +{ + struct resctrl_resource *r; + struct raw_resctrl_resource *rr; + struct rdt_domain *d; + int ret; + + for_each_resctrl_resource(r) { + if (!r->alloc_enabled) + continue; + + rr = (struct raw_resctrl_resource *)r->res; + list_for_each_entry(d, &r->domains, list) { + d->new_ctrl = rr->default_ctrl; + d->have_new_ctrl = true; + } + + ret = update_domains(r, rdtgrp); + if (ret < 0) { + rdt_last_cmd_puts("Failed to initialize allocations\n"); + return ret; + } + } + + return 0; +} diff --git a/fs/resctrlfs.c b/fs/resctrlfs.c index 4d3fa5da03796608dcde5135f5639e8e26c3b94a..9c48cd165ea45b97a6b19188687c70f983c5b686 100644 --- a/fs/resctrlfs.c +++ b/fs/resctrlfs.c @@ -673,6 +673,11 @@ static int resctrl_group_mkdir_ctrl_mon(struct kernfs_node *parent_kn, ret = 0; rdtgrp->closid = closid; + + ret = rdtgroup_init_alloc(rdtgrp); + if (ret < 0) + goto out_id_free; + list_add(&rdtgrp->resctrl_group_list, &resctrl_all_groups); if (resctrl_mon_capable) {