Skip to content

Commit 97fec06

Browse files
aeglbp3tk0v
authored andcommitted
x86,fs/resctrl: Refactor domain create/remove using struct rdt_domain_hdr
Up until now, all monitoring events were associated with the L3 resource and it made sense to use the L3 specific "struct rdt_mon_domain *" argument to functions operating on domains. Telemetry events will be tied to a new resource with its instances represented by a new domain structure that, just like struct rdt_mon_domain, starts with the generic struct rdt_domain_hdr. Prepare to support domains belonging to different resources by changing the calling convention of functions operating on domains. Pass the generic header and use that to find the domain specific structure where needed. Signed-off-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Link: https://lore.kernel.org/20251217172121.12030-1-tony.luck@intel.com
1 parent c1b6305 commit 97fec06

5 files changed

Lines changed: 63 additions & 30 deletions

File tree

arch/x86/kernel/cpu/resctrl/core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ static void l3_mon_domain_setup(int cpu, int id, struct rdt_resource *r, struct
534534

535535
list_add_tail_rcu(&d->hdr.list, add_pos);
536536

537-
err = resctrl_online_mon_domain(r, d);
537+
err = resctrl_online_mon_domain(r, &d->hdr);
538538
if (err) {
539539
list_del_rcu(&d->hdr.list);
540540
synchronize_rcu();
@@ -661,7 +661,7 @@ static void domain_remove_cpu_mon(int cpu, struct rdt_resource *r)
661661

662662
d = container_of(hdr, struct rdt_mon_domain, hdr);
663663
hw_dom = resctrl_to_arch_mon_dom(d);
664-
resctrl_offline_mon_domain(r, d);
664+
resctrl_offline_mon_domain(r, hdr);
665665
list_del_rcu(&hdr->list);
666666
synchronize_rcu();
667667
mon_domain_free(hw_dom);

fs/resctrl/ctrlmondata.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,14 +551,21 @@ struct rdt_domain_hdr *resctrl_find_domain(struct list_head *h, int id,
551551
}
552552

553553
void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
554-
struct rdt_mon_domain *d, struct rdtgroup *rdtgrp,
554+
struct rdt_domain_hdr *hdr, struct rdtgroup *rdtgrp,
555555
cpumask_t *cpumask, int evtid, int first)
556556
{
557+
struct rdt_mon_domain *d = NULL;
557558
int cpu;
558559

559560
/* When picking a CPU from cpu_mask, ensure it can't race with cpuhp */
560561
lockdep_assert_cpus_held();
561562

563+
if (hdr) {
564+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
565+
return;
566+
d = container_of(hdr, struct rdt_mon_domain, hdr);
567+
}
568+
562569
/*
563570
* Setup the parameters to pass to mon_event_count() to read the data.
564571
*/
@@ -653,12 +660,11 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
653660
* the resource to find the domain with "domid".
654661
*/
655662
hdr = resctrl_find_domain(&r->mon_domains, domid, NULL);
656-
if (!hdr || !domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, resid)) {
663+
if (!hdr) {
657664
ret = -ENOENT;
658665
goto out;
659666
}
660-
d = container_of(hdr, struct rdt_mon_domain, hdr);
661-
mon_event_read(&rr, r, d, rdtgrp, &d->hdr.cpu_mask, evtid, false);
667+
mon_event_read(&rr, r, hdr, rdtgrp, &hdr->cpu_mask, evtid, false);
662668
}
663669

664670
checkresult:

fs/resctrl/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ void mon_event_count(void *info);
362362
int rdtgroup_mondata_show(struct seq_file *m, void *arg);
363363

364364
void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
365-
struct rdt_mon_domain *d, struct rdtgroup *rdtgrp,
365+
struct rdt_domain_hdr *hdr, struct rdtgroup *rdtgrp,
366366
cpumask_t *cpumask, int evtid, int first);
367367

368368
int resctrl_mon_resource_init(void);

fs/resctrl/rdtgroup.c

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3229,17 +3229,22 @@ static void mon_rmdir_one_subdir(struct kernfs_node *pkn, char *name, char *subn
32293229
* when last domain being summed is removed.
32303230
*/
32313231
static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
3232-
struct rdt_mon_domain *d)
3232+
struct rdt_domain_hdr *hdr)
32333233
{
32343234
struct rdtgroup *prgrp, *crgrp;
3235+
struct rdt_mon_domain *d;
32353236
char subname[32];
32363237
bool snc_mode;
32373238
char name[32];
32383239

3240+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
3241+
return;
3242+
3243+
d = container_of(hdr, struct rdt_mon_domain, hdr);
32393244
snc_mode = r->mon_scope == RESCTRL_L3_NODE;
3240-
sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci_id : d->hdr.id);
3245+
sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci_id : hdr->id);
32413246
if (snc_mode)
3242-
sprintf(subname, "mon_sub_%s_%02d", r->name, d->hdr.id);
3247+
sprintf(subname, "mon_sub_%s_%02d", r->name, hdr->id);
32433248

32443249
list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) {
32453250
mon_rmdir_one_subdir(prgrp->mon.mon_data_kn, name, subname);
@@ -3249,15 +3254,20 @@ static void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
32493254
}
32503255
}
32513256

3252-
static int mon_add_all_files(struct kernfs_node *kn, struct rdt_mon_domain *d,
3257+
static int mon_add_all_files(struct kernfs_node *kn, struct rdt_domain_hdr *hdr,
32533258
struct rdt_resource *r, struct rdtgroup *prgrp,
32543259
bool do_sum)
32553260
{
32563261
struct rmid_read rr = {0};
3262+
struct rdt_mon_domain *d;
32573263
struct mon_data *priv;
32583264
struct mon_evt *mevt;
32593265
int ret, domid;
32603266

3267+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
3268+
return -EINVAL;
3269+
3270+
d = container_of(hdr, struct rdt_mon_domain, hdr);
32613271
for_each_mon_event(mevt) {
32623272
if (mevt->rid != r->rid || !mevt->enabled)
32633273
continue;
@@ -3271,23 +3281,28 @@ static int mon_add_all_files(struct kernfs_node *kn, struct rdt_mon_domain *d,
32713281
return ret;
32723282

32733283
if (!do_sum && resctrl_is_mbm_event(mevt->evtid))
3274-
mon_event_read(&rr, r, d, prgrp, &d->hdr.cpu_mask, mevt->evtid, true);
3284+
mon_event_read(&rr, r, hdr, prgrp, &hdr->cpu_mask, mevt->evtid, true);
32753285
}
32763286

32773287
return 0;
32783288
}
32793289

32803290
static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
3281-
struct rdt_mon_domain *d,
3291+
struct rdt_domain_hdr *hdr,
32823292
struct rdt_resource *r, struct rdtgroup *prgrp)
32833293
{
32843294
struct kernfs_node *kn, *ckn;
3295+
struct rdt_mon_domain *d;
32853296
char name[32];
32863297
bool snc_mode;
32873298
int ret = 0;
32883299

32893300
lockdep_assert_held(&rdtgroup_mutex);
32903301

3302+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
3303+
return -EINVAL;
3304+
3305+
d = container_of(hdr, struct rdt_mon_domain, hdr);
32913306
snc_mode = r->mon_scope == RESCTRL_L3_NODE;
32923307
sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci_id : d->hdr.id);
32933308
kn = kernfs_find_and_get(parent_kn, name);
@@ -3305,13 +3320,13 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
33053320
ret = rdtgroup_kn_set_ugid(kn);
33063321
if (ret)
33073322
goto out_destroy;
3308-
ret = mon_add_all_files(kn, d, r, prgrp, snc_mode);
3323+
ret = mon_add_all_files(kn, hdr, r, prgrp, snc_mode);
33093324
if (ret)
33103325
goto out_destroy;
33113326
}
33123327

33133328
if (snc_mode) {
3314-
sprintf(name, "mon_sub_%s_%02d", r->name, d->hdr.id);
3329+
sprintf(name, "mon_sub_%s_%02d", r->name, hdr->id);
33153330
ckn = kernfs_create_dir(kn, name, parent_kn->mode, prgrp);
33163331
if (IS_ERR(ckn)) {
33173332
ret = -EINVAL;
@@ -3322,7 +3337,7 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
33223337
if (ret)
33233338
goto out_destroy;
33243339

3325-
ret = mon_add_all_files(ckn, d, r, prgrp, false);
3340+
ret = mon_add_all_files(ckn, hdr, r, prgrp, false);
33263341
if (ret)
33273342
goto out_destroy;
33283343
}
@@ -3340,20 +3355,20 @@ static int mkdir_mondata_subdir(struct kernfs_node *parent_kn,
33403355
* and "monitor" groups with given domain id.
33413356
*/
33423357
static void mkdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
3343-
struct rdt_mon_domain *d)
3358+
struct rdt_domain_hdr *hdr)
33443359
{
33453360
struct kernfs_node *parent_kn;
33463361
struct rdtgroup *prgrp, *crgrp;
33473362
struct list_head *head;
33483363

33493364
list_for_each_entry(prgrp, &rdt_all_groups, rdtgroup_list) {
33503365
parent_kn = prgrp->mon.mon_data_kn;
3351-
mkdir_mondata_subdir(parent_kn, d, r, prgrp);
3366+
mkdir_mondata_subdir(parent_kn, hdr, r, prgrp);
33523367

33533368
head = &prgrp->mon.crdtgrp_list;
33543369
list_for_each_entry(crgrp, head, mon.crdtgrp_list) {
33553370
parent_kn = crgrp->mon.mon_data_kn;
3356-
mkdir_mondata_subdir(parent_kn, d, r, crgrp);
3371+
mkdir_mondata_subdir(parent_kn, hdr, r, crgrp);
33573372
}
33583373
}
33593374
}
@@ -3362,14 +3377,14 @@ static int mkdir_mondata_subdir_alldom(struct kernfs_node *parent_kn,
33623377
struct rdt_resource *r,
33633378
struct rdtgroup *prgrp)
33643379
{
3365-
struct rdt_mon_domain *dom;
3380+
struct rdt_domain_hdr *hdr;
33663381
int ret;
33673382

33683383
/* Walking r->domains, ensure it can't race with cpuhp */
33693384
lockdep_assert_cpus_held();
33703385

3371-
list_for_each_entry(dom, &r->mon_domains, hdr.list) {
3372-
ret = mkdir_mondata_subdir(parent_kn, dom, r, prgrp);
3386+
list_for_each_entry(hdr, &r->mon_domains, list) {
3387+
ret = mkdir_mondata_subdir(parent_kn, hdr, r, prgrp);
33733388
if (ret)
33743389
return ret;
33753390
}
@@ -4253,16 +4268,23 @@ void resctrl_offline_ctrl_domain(struct rdt_resource *r, struct rdt_ctrl_domain
42534268
mutex_unlock(&rdtgroup_mutex);
42544269
}
42554270

4256-
void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d)
4271+
void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *hdr)
42574272
{
4273+
struct rdt_mon_domain *d;
4274+
42584275
mutex_lock(&rdtgroup_mutex);
42594276

4277+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
4278+
goto out_unlock;
4279+
4280+
d = container_of(hdr, struct rdt_mon_domain, hdr);
4281+
42604282
/*
42614283
* If resctrl is mounted, remove all the
42624284
* per domain monitor data directories.
42634285
*/
42644286
if (resctrl_mounted && resctrl_arch_mon_capable())
4265-
rmdir_mondata_subdir_allrdtgrp(r, d);
4287+
rmdir_mondata_subdir_allrdtgrp(r, hdr);
42664288

42674289
if (resctrl_is_mbm_enabled())
42684290
cancel_delayed_work(&d->mbm_over);
@@ -4280,7 +4302,7 @@ void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d
42804302
}
42814303

42824304
domain_destroy_mon_state(d);
4283-
4305+
out_unlock:
42844306
mutex_unlock(&rdtgroup_mutex);
42854307
}
42864308

@@ -4353,12 +4375,17 @@ int resctrl_online_ctrl_domain(struct rdt_resource *r, struct rdt_ctrl_domain *d
43534375
return err;
43544376
}
43554377

4356-
int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d)
4378+
int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *hdr)
43574379
{
4358-
int err;
4380+
struct rdt_mon_domain *d;
4381+
int err = -EINVAL;
43594382

43604383
mutex_lock(&rdtgroup_mutex);
43614384

4385+
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
4386+
goto out_unlock;
4387+
4388+
d = container_of(hdr, struct rdt_mon_domain, hdr);
43624389
err = domain_setup_mon_state(r, d);
43634390
if (err)
43644391
goto out_unlock;
@@ -4379,7 +4406,7 @@ int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d)
43794406
* If resctrl is mounted, add per domain monitor data directories.
43804407
*/
43814408
if (resctrl_mounted && resctrl_arch_mon_capable())
4382-
mkdir_mondata_subdir_allrdtgrp(r, d);
4409+
mkdir_mondata_subdir_allrdtgrp(r, hdr);
43834410

43844411
out_unlock:
43854412
mutex_unlock(&rdtgroup_mutex);

include/linux/resctrl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,9 +507,9 @@ int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_ctrl_domain *d,
507507
u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_ctrl_domain *d,
508508
u32 closid, enum resctrl_conf_type type);
509509
int resctrl_online_ctrl_domain(struct rdt_resource *r, struct rdt_ctrl_domain *d);
510-
int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d);
510+
int resctrl_online_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *hdr);
511511
void resctrl_offline_ctrl_domain(struct rdt_resource *r, struct rdt_ctrl_domain *d);
512-
void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_mon_domain *d);
512+
void resctrl_offline_mon_domain(struct rdt_resource *r, struct rdt_domain_hdr *hdr);
513513
void resctrl_online_cpu(unsigned int cpu);
514514
void resctrl_offline_cpu(unsigned int cpu);
515515

0 commit comments

Comments
 (0)