Lines Matching +full:cpu +full:- +full:cfg
1 // SPDX-License-Identifier: GPL-2.0-only
4 * - Cache Allocation code.
18 #include <linux/cpu.h>
49 if (!r->membw.delay_linear && r->membw.arch_needs_linear) { in bw_validate()
50 rdt_last_cmd_puts("No support for non-linear MB domains\n"); in bw_validate()
66 if (bw < r->membw.min_bw || bw > r->membw.max_bw) { in bw_validate()
68 bw, r->membw.min_bw, r->membw.max_bw); in bw_validate()
72 *data = roundup(bw, (unsigned long)r->membw.bw_gran); in bw_validate()
79 struct resctrl_staged_config *cfg; in parse_bw() local
80 u32 closid = data->rdtgrp->closid; in parse_bw()
81 struct rdt_resource *r = s->res; in parse_bw()
84 cfg = &d->staged_config[s->conf_type]; in parse_bw()
85 if (cfg->have_new_ctrl) { in parse_bw()
86 rdt_last_cmd_printf("Duplicate domain %d\n", d->hdr.id); in parse_bw()
87 return -EINVAL; in parse_bw()
90 if (!bw_validate(data->buf, &bw_val, r)) in parse_bw()
91 return -EINVAL; in parse_bw()
94 d->mbps_val[closid] = bw_val; in parse_bw()
98 cfg->new_ctrl = bw_val; in parse_bw()
99 cfg->have_new_ctrl = true; in parse_bw()
106 * On Intel CPUs, non-contiguous 1s value support is indicated by CPUID:
107 * - CPUID.0x10.1:ECX[3]: L3 non-contiguous 1s value supported if 1
108 * - CPUID.0x10.2:ECX[3]: L2 non-contiguous 1s value supported if 1
110 * Haswell does not support a non-contiguous 1s value and additionally
112 * AMD allows non-contiguous bitmasks.
116 u32 supported_bits = BIT_MASK(r->cache.cbm_len) - 1; in cbm_validate()
117 unsigned int cbm_len = r->cache.cbm_len; in cbm_validate()
123 rdt_last_cmd_printf("Non-hex character in the mask %s\n", buf); in cbm_validate()
127 if ((r->cache.min_cbm_bits > 0 && val == 0) || val > supported_bits) { in cbm_validate()
135 /* Are non-contiguous bitmasks allowed? */ in cbm_validate()
136 if (!r->cache.arch_has_sparse_bitmasks && in cbm_validate()
138 rdt_last_cmd_printf("The mask %lx has non-consecutive 1-bits\n", val); in cbm_validate()
142 if ((zero_bit - first_bit) < r->cache.min_cbm_bits) { in cbm_validate()
144 r->cache.min_cbm_bits); in cbm_validate()
159 struct rdtgroup *rdtgrp = data->rdtgrp; in parse_cbm()
160 struct resctrl_staged_config *cfg; in parse_cbm() local
161 struct rdt_resource *r = s->res; in parse_cbm()
164 cfg = &d->staged_config[s->conf_type]; in parse_cbm()
165 if (cfg->have_new_ctrl) { in parse_cbm()
166 rdt_last_cmd_printf("Duplicate domain %d\n", d->hdr.id); in parse_cbm()
167 return -EINVAL; in parse_cbm()
171 * Cannot set up more than one pseudo-locked region in a cache in parse_cbm()
174 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP && in parse_cbm()
176 rdt_last_cmd_puts("Pseudo-locked region in hierarchy\n"); in parse_cbm()
177 return -EINVAL; in parse_cbm()
180 if (!cbm_validate(data->buf, &cbm_val, r)) in parse_cbm()
181 return -EINVAL; in parse_cbm()
183 if ((rdtgrp->mode == RDT_MODE_EXCLUSIVE || in parse_cbm()
184 rdtgrp->mode == RDT_MODE_SHAREABLE) && in parse_cbm()
186 rdt_last_cmd_puts("CBM overlaps with pseudo-locked region\n"); in parse_cbm()
187 return -EINVAL; in parse_cbm()
194 if (rdtgroup_cbm_overlaps(s, d, cbm_val, rdtgrp->closid, true)) { in parse_cbm()
196 return -EINVAL; in parse_cbm()
199 if (rdtgroup_cbm_overlaps(s, d, cbm_val, rdtgrp->closid, false)) { in parse_cbm()
200 if (rdtgrp->mode == RDT_MODE_EXCLUSIVE || in parse_cbm()
201 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in parse_cbm()
203 return -EINVAL; in parse_cbm()
207 cfg->new_ctrl = cbm_val; in parse_cbm()
208 cfg->have_new_ctrl = true; in parse_cbm()
222 enum resctrl_conf_type t = s->conf_type; in parse_line()
224 struct resctrl_staged_config *cfg; in parse_line() local
225 struct rdt_resource *r = s->res; in parse_line()
231 /* Walking r->domains, ensure it can't race with cpuhp */ in parse_line()
234 switch (r->schema_fmt) { in parse_line()
244 return -EINVAL; in parse_line()
246 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP && in parse_line()
247 (r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA)) { in parse_line()
248 rdt_last_cmd_puts("Cannot pseudo-lock MBA resource\n"); in parse_line()
249 return -EINVAL; in parse_line()
258 rdt_last_cmd_puts("Missing '=' or non-numeric domain\n"); in parse_line()
259 return -EINVAL; in parse_line()
262 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in parse_line()
263 if (d->hdr.id == dom_id) { in parse_line()
267 return -EINVAL; in parse_line()
268 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in parse_line()
269 cfg = &d->staged_config[t]; in parse_line()
271 * In pseudo-locking setup mode and just in parse_line()
273 * pseudo-locked. Only one locked region per in parse_line()
278 rdtgrp->plr->s = s; in parse_line()
279 rdtgrp->plr->d = d; in parse_line()
280 rdtgrp->plr->cbm = cfg->new_ctrl; in parse_line()
281 d->plr = rdtgrp->plr; in parse_line()
287 return -EINVAL; in parse_line()
296 if (!strcmp(resname, s->name) && rdtgrp->closid < s->num_closid) in rdtgroup_parse_resource()
300 return -EINVAL; in rdtgroup_parse_resource()
313 if (nbytes == 0 || buf[nbytes - 1] != '\n') in rdtgroup_schemata_write()
314 return -EINVAL; in rdtgroup_schemata_write()
315 buf[nbytes - 1] = '\0'; in rdtgroup_schemata_write()
317 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_schemata_write()
319 rdtgroup_kn_unlock(of->kn); in rdtgroup_schemata_write()
320 return -ENOENT; in rdtgroup_schemata_write()
325 * No changes to pseudo-locked region allowed. It has to be removed in rdtgroup_schemata_write()
326 * and re-created instead. in rdtgroup_schemata_write()
328 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { in rdtgroup_schemata_write()
329 ret = -EINVAL; in rdtgroup_schemata_write()
330 rdt_last_cmd_puts("Resource group is pseudo-locked\n"); in rdtgroup_schemata_write()
340 ret = -EINVAL; in rdtgroup_schemata_write()
345 ret = -EINVAL; in rdtgroup_schemata_write()
354 r = s->res; in rdtgroup_schemata_write()
363 ret = resctrl_arch_update_domains(r, rdtgrp->closid); in rdtgroup_schemata_write()
368 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_schemata_write()
370 * If pseudo-locking fails we keep the resource group in in rdtgroup_schemata_write()
372 * active and updated for just the domain the pseudo-locked in rdtgroup_schemata_write()
380 rdtgroup_kn_unlock(of->kn); in rdtgroup_schemata_write()
386 struct rdt_resource *r = schema->res; in show_doms()
391 /* Walking r->domains, ensure it can't race with cpuhp */ in show_doms()
394 seq_printf(s, "%*s:", max_name_width, schema->name); in show_doms()
395 list_for_each_entry(dom, &r->ctrl_domains, hdr.list) { in show_doms()
400 ctrl_val = dom->mbps_val[closid]; in show_doms()
403 schema->conf_type); in show_doms()
405 seq_printf(s, schema->fmt_str, dom->hdr.id, ctrl_val); in show_doms()
419 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_schemata_show()
421 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_schemata_show()
423 seq_printf(s, "%s:uninitialized\n", schema->name); in rdtgroup_schemata_show()
425 } else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { in rdtgroup_schemata_show()
426 if (!rdtgrp->plr->d) { in rdtgroup_schemata_show()
429 ret = -ENODEV; in rdtgroup_schemata_show()
432 rdtgrp->plr->s->res->name, in rdtgroup_schemata_show()
433 rdtgrp->plr->d->hdr.id, in rdtgroup_schemata_show()
434 rdtgrp->plr->cbm); in rdtgroup_schemata_show()
437 closid = rdtgrp->closid; in rdtgroup_schemata_show()
439 if (closid < schema->num_closid) in rdtgroup_schemata_show()
444 ret = -ENOENT; in rdtgroup_schemata_show()
446 rdtgroup_kn_unlock(of->kn); in rdtgroup_schemata_show()
464 if (nbytes == 0 || buf[nbytes - 1] != '\n') in rdtgroup_mba_mbps_event_write()
465 return -EINVAL; in rdtgroup_mba_mbps_event_write()
466 buf[nbytes - 1] = '\0'; in rdtgroup_mba_mbps_event_write()
468 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_mba_mbps_event_write()
470 rdtgroup_kn_unlock(of->kn); in rdtgroup_mba_mbps_event_write()
471 return -ENOENT; in rdtgroup_mba_mbps_event_write()
477 rdtgrp->mba_mbps_event = QOS_L3_MBM_LOCAL_EVENT_ID; in rdtgroup_mba_mbps_event_write()
479 ret = -EINVAL; in rdtgroup_mba_mbps_event_write()
482 rdtgrp->mba_mbps_event = QOS_L3_MBM_TOTAL_EVENT_ID; in rdtgroup_mba_mbps_event_write()
484 ret = -EINVAL; in rdtgroup_mba_mbps_event_write()
486 ret = -EINVAL; in rdtgroup_mba_mbps_event_write()
492 rdtgroup_kn_unlock(of->kn); in rdtgroup_mba_mbps_event_write()
503 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_mba_mbps_event_show()
506 switch (rdtgrp->mba_mbps_event) { in rdtgroup_mba_mbps_event_show()
514 pr_warn_once("Bad event %d\n", rdtgrp->mba_mbps_event); in rdtgroup_mba_mbps_event_show()
515 ret = -EINVAL; in rdtgroup_mba_mbps_event_show()
519 ret = -ENOENT; in rdtgroup_mba_mbps_event_show()
522 rdtgroup_kn_unlock(of->kn); in rdtgroup_mba_mbps_event_show()
536 if (id == d->id) in resctrl_find_domain()
539 if (id < d->id) in resctrl_find_domain()
553 int cpu; in mon_event_read() local
555 /* When picking a CPU from cpu_mask, ensure it can't race with cpuhp */ in mon_event_read()
561 rr->rgrp = rdtgrp; in mon_event_read()
562 rr->evtid = evtid; in mon_event_read()
563 rr->r = r; in mon_event_read()
564 rr->d = d; in mon_event_read()
565 rr->first = first; in mon_event_read()
566 rr->arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, evtid); in mon_event_read()
567 if (IS_ERR(rr->arch_mon_ctx)) { in mon_event_read()
568 rr->err = -EINVAL; in mon_event_read()
572 cpu = cpumask_any_housekeeping(cpumask, RESCTRL_PICK_ANY_CPU); in mon_event_read()
576 * are all the CPUs nohz_full? If yes, pick a CPU to IPI. in mon_event_read()
580 if (tick_nohz_full_cpu(cpu)) in mon_event_read()
583 smp_call_on_cpu(cpu, smp_mon_event_count, rr, false); in mon_event_read()
585 resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx); in mon_event_read()
590 struct kernfs_open_file *of = m->private; in rdtgroup_mondata_show()
597 int domid, cpu, ret = 0; in rdtgroup_mondata_show() local
602 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_mondata_show()
604 ret = -ENOENT; in rdtgroup_mondata_show()
608 md = of->kn->priv; in rdtgroup_mondata_show()
610 ret = -EIO; in rdtgroup_mondata_show()
614 resid = md->rid; in rdtgroup_mondata_show()
615 domid = md->domid; in rdtgroup_mondata_show()
616 evtid = md->evtid; in rdtgroup_mondata_show()
619 if (md->sum) { in rdtgroup_mondata_show()
626 list_for_each_entry(d, &r->mon_domains, hdr.list) { in rdtgroup_mondata_show()
627 if (d->ci_id == domid) { in rdtgroup_mondata_show()
628 rr.ci_id = d->ci_id; in rdtgroup_mondata_show()
629 cpu = cpumask_any(&d->hdr.cpu_mask); in rdtgroup_mondata_show()
630 ci = get_cpu_cacheinfo_level(cpu, RESCTRL_L3_CACHE); in rdtgroup_mondata_show()
634 &ci->shared_cpu_map, evtid, false); in rdtgroup_mondata_show()
638 ret = -ENOENT; in rdtgroup_mondata_show()
645 hdr = resctrl_find_domain(&r->mon_domains, domid, NULL); in rdtgroup_mondata_show()
646 if (!hdr || WARN_ON_ONCE(hdr->type != RESCTRL_MON_DOMAIN)) { in rdtgroup_mondata_show()
647 ret = -ENOENT; in rdtgroup_mondata_show()
651 mon_event_read(&rr, r, d, rdtgrp, &d->hdr.cpu_mask, evtid, false); in rdtgroup_mondata_show()
656 if (rr.err == -EIO) in rdtgroup_mondata_show()
658 else if (rr.err == -EINVAL) in rdtgroup_mondata_show()
664 rdtgroup_kn_unlock(of->kn); in rdtgroup_mondata_show()