Lines Matching +full:0 +full:- +full:mon

1 // SPDX-License-Identifier: GPL-2.0-only
109 list_for_each_entry(dom, &r->ctrl_domains, hdr.list) in rdt_staged_configs_clear()
110 memset(dom->staged_config, 0, sizeof(dom->staged_config)); in rdt_staged_configs_clear()
124 * - We give up some options in configuring resource groups across multi-socket
126 * - Our choices on how to configure each resource become progressively more
144 rdt_min_closid = min(rdt_min_closid, s->num_closid); in closid_init()
146 closid_free_map = BIT_MASK(rdt_min_closid) - 1; in closid_init()
163 if (cleanest_closid < 0) in closid_alloc()
168 if (closid == 0) in closid_alloc()
169 return -ENOSPC; in closid_alloc()
170 closid--; in closid_alloc()
185 * closid_allocated - test if provided closid is in use
199 * rdtgroup_mode_by_closid - Return mode of resource group with closid
212 if (rdtgrp->closid == closid) in rdtgroup_mode_by_closid()
213 return rdtgrp->mode; in rdtgroup_mode_by_closid()
222 [RDT_MODE_PSEUDO_LOCKSETUP] = "pseudo-locksetup",
223 [RDT_MODE_PSEUDO_LOCKED] = "pseudo-locked",
227 * rdtgroup_mode_str - Return the string representation of mode
249 return 0; in rdtgroup_kn_set_ugid()
259 kn = __kernfs_create_file(parent_kn, rft->name, rft->mode, in rdtgroup_add_file()
261 0, rft->kf_ops, rft, NULL, NULL); in rdtgroup_add_file()
271 return 0; in rdtgroup_add_file()
276 struct kernfs_open_file *of = m->private; in rdtgroup_seqfile_show()
277 struct rftype *rft = of->kn->priv; in rdtgroup_seqfile_show()
279 if (rft->seq_show) in rdtgroup_seqfile_show()
280 return rft->seq_show(of, m, arg); in rdtgroup_seqfile_show()
281 return 0; in rdtgroup_seqfile_show()
287 struct rftype *rft = of->kn->priv; in rdtgroup_file_write()
289 if (rft->write) in rdtgroup_file_write()
290 return rft->write(of, buf, nbytes, off); in rdtgroup_file_write()
292 return -EINVAL; in rdtgroup_file_write()
308 struct rftype *rft = of->kn->priv; in is_cpu_list()
310 return rft->flags & RFTYPE_FLAGS_CPUS_LIST; in is_cpu_list()
318 int ret = 0; in rdtgroup_cpus_show()
320 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_cpus_show()
323 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { in rdtgroup_cpus_show()
324 if (!rdtgrp->plr->d) { in rdtgroup_cpus_show()
327 ret = -ENODEV; in rdtgroup_cpus_show()
329 mask = &rdtgrp->plr->d->hdr.cpu_mask; in rdtgroup_cpus_show()
336 cpumask_pr_args(&rdtgrp->cpu_mask)); in rdtgroup_cpus_show()
339 ret = -ENOENT; in rdtgroup_cpus_show()
341 rdtgroup_kn_unlock(of->kn); in rdtgroup_cpus_show()
357 this_cpu_write(pqr_state.default_closid, r->closid); in update_cpu_closid_rmid()
358 this_cpu_write(pqr_state.default_rmid, r->mon.rmid); in update_cpu_closid_rmid()
383 struct rdtgroup *prgrp = rdtgrp->mon.parent, *crgrp; in cpus_mon_write()
387 cpumask_andnot(tmpmask, newmask, &prgrp->cpu_mask); in cpus_mon_write()
390 return -EINVAL; in cpus_mon_write()
394 cpumask_andnot(tmpmask, &rdtgrp->cpu_mask, newmask); in cpus_mon_write()
397 cpumask_or(&prgrp->cpu_mask, &prgrp->cpu_mask, tmpmask); in cpus_mon_write()
403 * and update per-cpu rmid in cpus_mon_write()
405 cpumask_andnot(tmpmask, newmask, &rdtgrp->cpu_mask); in cpus_mon_write()
407 head = &prgrp->mon.crdtgrp_list; in cpus_mon_write()
408 list_for_each_entry(crgrp, head, mon.crdtgrp_list) { in cpus_mon_write()
411 cpumask_andnot(&crgrp->cpu_mask, &crgrp->cpu_mask, in cpus_mon_write()
417 /* Done pushing/pulling - update this group with new mask */ in cpus_mon_write()
418 cpumask_copy(&rdtgrp->cpu_mask, newmask); in cpus_mon_write()
420 return 0; in cpus_mon_write()
427 cpumask_andnot(&r->cpu_mask, &r->cpu_mask, m); in cpumask_rdtgrp_clear()
428 /* update the child mon group masks as well*/ in cpumask_rdtgrp_clear()
429 list_for_each_entry(crgrp, &r->mon.crdtgrp_list, mon.crdtgrp_list) in cpumask_rdtgrp_clear()
430 cpumask_and(&crgrp->cpu_mask, &r->cpu_mask, &crgrp->cpu_mask); in cpumask_rdtgrp_clear()
440 cpumask_andnot(tmpmask, &rdtgrp->cpu_mask, newmask); in cpus_ctrl_write()
445 return -EINVAL; in cpus_ctrl_write()
457 * and update per-cpu closid/rmid. in cpus_ctrl_write()
459 cpumask_andnot(tmpmask, newmask, &rdtgrp->cpu_mask); in cpus_ctrl_write()
464 cpumask_and(tmpmask1, &r->cpu_mask, tmpmask); in cpus_ctrl_write()
471 /* Done pushing/pulling - update this group with new mask */ in cpus_ctrl_write()
472 cpumask_copy(&rdtgrp->cpu_mask, newmask); in cpus_ctrl_write()
475 * Clear child mon group masks since there is a new parent mask in cpus_ctrl_write()
478 head = &rdtgrp->mon.crdtgrp_list; in cpus_ctrl_write()
479 list_for_each_entry(crgrp, head, mon.crdtgrp_list) { in cpus_ctrl_write()
480 cpumask_and(tmpmask, &rdtgrp->cpu_mask, &crgrp->cpu_mask); in cpus_ctrl_write()
482 cpumask_clear(&crgrp->cpu_mask); in cpus_ctrl_write()
485 return 0; in cpus_ctrl_write()
496 return -EINVAL; in rdtgroup_cpus_write()
499 return -ENOMEM; in rdtgroup_cpus_write()
502 return -ENOMEM; in rdtgroup_cpus_write()
507 return -ENOMEM; in rdtgroup_cpus_write()
510 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_cpus_write()
512 ret = -ENOENT; in rdtgroup_cpus_write()
516 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || in rdtgroup_cpus_write()
517 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_cpus_write()
518 ret = -EINVAL; in rdtgroup_cpus_write()
519 rdt_last_cmd_puts("Pseudo-locking in progress\n"); in rdtgroup_cpus_write()
536 ret = -EINVAL; in rdtgroup_cpus_write()
541 if (rdtgrp->type == RDTCTRL_GROUP) in rdtgroup_cpus_write()
543 else if (rdtgrp->type == RDTMON_GROUP) in rdtgroup_cpus_write()
546 ret = -EINVAL; in rdtgroup_cpus_write()
549 rdtgroup_kn_unlock(of->kn); in rdtgroup_cpus_write()
558 * rdtgroup_remove - the helper to remove resource group safely
571 kernfs_put(rdtgrp->kn); in rdtgroup_remove()
595 u32 closid, rmid = rdtgrp->mon.rmid; in task_in_rdtgroup()
597 if (rdtgrp->type == RDTCTRL_GROUP) in task_in_rdtgroup()
598 closid = rdtgrp->closid; in task_in_rdtgroup()
599 else if (rdtgrp->type == RDTMON_GROUP) in task_in_rdtgroup()
600 closid = rdtgrp->mon.parent->closid; in task_in_rdtgroup()
613 return 0; in __rdtgroup_move_task()
623 if (rdtgrp->type == RDTMON_GROUP && in __rdtgroup_move_task()
624 !resctrl_arch_match_closid(tsk, rdtgrp->mon.parent->closid)) { in __rdtgroup_move_task()
626 return -EINVAL; in __rdtgroup_move_task()
629 if (rdtgrp->type == RDTMON_GROUP) in __rdtgroup_move_task()
630 resctrl_arch_set_closid_rmid(tsk, rdtgrp->mon.parent->closid, in __rdtgroup_move_task()
631 rdtgrp->mon.rmid); in __rdtgroup_move_task()
633 resctrl_arch_set_closid_rmid(tsk, rdtgrp->closid, in __rdtgroup_move_task()
634 rdtgrp->mon.rmid); in __rdtgroup_move_task()
639 * This pairs with the full barrier between the rq->curr update and in __rdtgroup_move_task()
652 return 0; in __rdtgroup_move_task()
657 return (resctrl_arch_alloc_capable() && (r->type == RDTCTRL_GROUP) && in is_closid_match()
658 resctrl_arch_match_closid(t, r->closid)); in is_closid_match()
663 return (resctrl_arch_mon_capable() && (r->type == RDTMON_GROUP) && in is_rmid_match()
664 resctrl_arch_match_rmid(t, r->mon.parent->closid, in is_rmid_match()
665 r->mon.rmid)); in is_rmid_match()
669 * rdtgroup_tasks_assigned - Test if tasks have been assigned to resource group
672 * Return: 1 if tasks have been assigned to @r, 0 otherwise
677 int ret = 0; in rdtgroup_tasks_assigned()
698 int ret = 0; in rdtgroup_task_write_permission()
704 if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) && in rdtgroup_task_write_permission()
705 !uid_eq(cred->euid, tcred->uid) && in rdtgroup_task_write_permission()
706 !uid_eq(cred->euid, tcred->suid)) { in rdtgroup_task_write_permission()
707 rdt_last_cmd_printf("No permission to move task %d\n", task->pid); in rdtgroup_task_write_permission()
708 ret = -EPERM; in rdtgroup_task_write_permission()
727 return -ESRCH; in rdtgroup_move_task()
749 int ret = 0; in rdtgroup_tasks_write()
752 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_tasks_write()
754 rdtgroup_kn_unlock(of->kn); in rdtgroup_tasks_write()
755 return -ENOENT; in rdtgroup_tasks_write()
759 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED || in rdtgroup_tasks_write()
760 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_tasks_write()
761 ret = -EINVAL; in rdtgroup_tasks_write()
762 rdt_last_cmd_puts("Pseudo-locking in progress\n"); in rdtgroup_tasks_write()
766 while (buf && buf[0] != '\0' && buf[0] != '\n') { in rdtgroup_tasks_write()
769 if (kstrtoint(pid_str, 0, &pid)) { in rdtgroup_tasks_write()
771 ret = -EINVAL; in rdtgroup_tasks_write()
775 if (pid < 0) { in rdtgroup_tasks_write()
777 ret = -EINVAL; in rdtgroup_tasks_write()
789 rdtgroup_kn_unlock(of->kn); in rdtgroup_tasks_write()
814 int ret = 0; in rdtgroup_tasks_show()
816 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_tasks_show()
820 ret = -ENOENT; in rdtgroup_tasks_show()
821 rdtgroup_kn_unlock(of->kn); in rdtgroup_tasks_show()
830 int ret = 0; in rdtgroup_closid_show()
832 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_closid_show()
834 seq_printf(s, "%u\n", rdtgrp->closid); in rdtgroup_closid_show()
836 ret = -ENOENT; in rdtgroup_closid_show()
837 rdtgroup_kn_unlock(of->kn); in rdtgroup_closid_show()
846 int ret = 0; in rdtgroup_rmid_show()
848 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_rmid_show()
850 seq_printf(s, "%u\n", rdtgrp->mon.rmid); in rdtgroup_rmid_show()
852 ret = -ENOENT; in rdtgroup_rmid_show()
853 rdtgroup_kn_unlock(of->kn); in rdtgroup_rmid_show()
865 * mon:
870 * mon:
876 * mon:mon0
881 * mon:
887 * mon:mon1
895 int ret = 0; in proc_resctrl_show()
912 if (rdtg->mode != RDT_MODE_SHAREABLE && in proc_resctrl_show()
913 rdtg->mode != RDT_MODE_EXCLUSIVE) in proc_resctrl_show()
916 if (!resctrl_arch_match_closid(tsk, rdtg->closid)) in proc_resctrl_show()
920 rdtg->kn->name); in proc_resctrl_show()
921 seq_puts(s, "mon:"); in proc_resctrl_show()
922 list_for_each_entry(crg, &rdtg->mon.crdtgrp_list, in proc_resctrl_show()
923 mon.crdtgrp_list) { in proc_resctrl_show()
924 if (!resctrl_arch_match_rmid(tsk, crg->mon.parent->closid, in proc_resctrl_show()
925 crg->mon.rmid)) in proc_resctrl_show()
927 seq_printf(s, "%s", crg->kn->name); in proc_resctrl_show()
937 ret = -ENOENT; in proc_resctrl_show()
957 return 0; in rdt_last_cmd_status_show()
963 struct resctrl_schema *s = of->kn->parent->priv; in rdt_num_closids_show()
965 seq_printf(seq, "%u\n", s->num_closid); in rdt_num_closids_show()
966 return 0; in rdt_num_closids_show()
972 struct resctrl_schema *s = of->kn->parent->priv; in rdt_default_ctrl_show()
973 struct rdt_resource *r = s->res; in rdt_default_ctrl_show()
975 seq_printf(seq, "%x\n", r->default_ctrl); in rdt_default_ctrl_show()
976 return 0; in rdt_default_ctrl_show()
982 struct resctrl_schema *s = of->kn->parent->priv; in rdt_min_cbm_bits_show()
983 struct rdt_resource *r = s->res; in rdt_min_cbm_bits_show()
985 seq_printf(seq, "%u\n", r->cache.min_cbm_bits); in rdt_min_cbm_bits_show()
986 return 0; in rdt_min_cbm_bits_show()
992 struct resctrl_schema *s = of->kn->parent->priv; in rdt_shareable_bits_show()
993 struct rdt_resource *r = s->res; in rdt_shareable_bits_show()
995 seq_printf(seq, "%x\n", r->cache.shareable_bits); in rdt_shareable_bits_show()
996 return 0; in rdt_shareable_bits_show()
1000 * rdt_bit_usage_show - Display current usage of resources
1006 * 0 - currently unused
1007 * X - currently available for sharing and used by software and hardware
1008 * H - currently used by hardware only but available for software use
1009 * S - currently used and shareable by software only
1010 * E - currently used exclusively by one resource group
1011 * P - currently pseudo-locked by one resource group
1016 struct resctrl_schema *s = of->kn->parent->priv; in rdt_bit_usage_show()
1021 unsigned long sw_shareable = 0, hw_shareable = 0; in rdt_bit_usage_show()
1022 unsigned long exclusive = 0, pseudo_locked = 0; in rdt_bit_usage_show()
1023 struct rdt_resource *r = s->res; in rdt_bit_usage_show()
1032 hw_shareable = r->cache.shareable_bits; in rdt_bit_usage_show()
1033 list_for_each_entry(dom, &r->ctrl_domains, hdr.list) { in rdt_bit_usage_show()
1036 sw_shareable = 0; in rdt_bit_usage_show()
1037 exclusive = 0; in rdt_bit_usage_show()
1038 seq_printf(seq, "%d=", dom->hdr.id); in rdt_bit_usage_show()
1039 for (i = 0; i < closids_supported(); i++) { in rdt_bit_usage_show()
1043 s->conf_type); in rdt_bit_usage_show()
1068 for (i = r->cache.cbm_len - 1; i >= 0; i--) { in rdt_bit_usage_show()
1069 pseudo_locked = dom->plr ? dom->plr->cbm : 0; in rdt_bit_usage_show()
1085 seq_putc(seq, '0'); in rdt_bit_usage_show()
1092 return 0; in rdt_bit_usage_show()
1098 struct resctrl_schema *s = of->kn->parent->priv; in rdt_min_bw_show()
1099 struct rdt_resource *r = s->res; in rdt_min_bw_show()
1101 seq_printf(seq, "%u\n", r->membw.min_bw); in rdt_min_bw_show()
1102 return 0; in rdt_min_bw_show()
1108 struct rdt_resource *r = of->kn->parent->priv; in rdt_num_rmids_show()
1110 seq_printf(seq, "%d\n", r->num_rmid); in rdt_num_rmids_show()
1112 return 0; in rdt_num_rmids_show()
1118 struct rdt_resource *r = of->kn->parent->priv; in rdt_mon_features_show()
1121 list_for_each_entry(mevt, &r->evt_list, list) { in rdt_mon_features_show()
1122 seq_printf(seq, "%s\n", mevt->name); in rdt_mon_features_show()
1123 if (mevt->configurable) in rdt_mon_features_show()
1124 seq_printf(seq, "%s_config\n", mevt->name); in rdt_mon_features_show()
1127 return 0; in rdt_mon_features_show()
1133 struct resctrl_schema *s = of->kn->parent->priv; in rdt_bw_gran_show()
1134 struct rdt_resource *r = s->res; in rdt_bw_gran_show()
1136 seq_printf(seq, "%u\n", r->membw.bw_gran); in rdt_bw_gran_show()
1137 return 0; in rdt_bw_gran_show()
1143 struct resctrl_schema *s = of->kn->parent->priv; in rdt_delay_linear_show()
1144 struct rdt_resource *r = s->res; in rdt_delay_linear_show()
1146 seq_printf(seq, "%u\n", r->membw.delay_linear); in rdt_delay_linear_show()
1147 return 0; in rdt_delay_linear_show()
1155 return 0; in max_threshold_occ_show()
1161 struct resctrl_schema *s = of->kn->parent->priv; in rdt_thread_throttle_mode_show()
1162 struct rdt_resource *r = s->res; in rdt_thread_throttle_mode_show()
1164 if (r->membw.throttle_mode == THREAD_THROTTLE_PER_THREAD) in rdt_thread_throttle_mode_show()
1165 seq_puts(seq, "per-thread\n"); in rdt_thread_throttle_mode_show()
1169 return 0; in rdt_thread_throttle_mode_show()
1178 ret = kstrtouint(buf, 0, &bytes); in max_threshold_occ_write()
1183 return -EINVAL; in max_threshold_occ_write()
1191 * rdtgroup_mode_show - Display mode of this resource group
1198 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_mode_show()
1200 rdtgroup_kn_unlock(of->kn); in rdtgroup_mode_show()
1201 return -ENOENT; in rdtgroup_mode_show()
1204 seq_printf(s, "%s\n", rdtgroup_mode_str(rdtgrp->mode)); in rdtgroup_mode_show()
1206 rdtgroup_kn_unlock(of->kn); in rdtgroup_mode_show()
1207 return 0; in rdtgroup_mode_show()
1226 struct resctrl_schema *s = of->kn->parent->priv; in rdt_has_sparse_bitmasks_show()
1227 struct rdt_resource *r = s->res; in rdt_has_sparse_bitmasks_show()
1229 seq_printf(seq, "%u\n", r->cache.arch_has_sparse_bitmasks); in rdt_has_sparse_bitmasks_show()
1231 return 0; in rdt_has_sparse_bitmasks_show()
1235 * __rdtgroup_cbm_overlaps - Does CBM for intended closid overlap with other
1265 ctrl_b = r->cache.shareable_bits; in __rdtgroup_cbm_overlaps()
1266 if (bitmap_intersects(&cbm, &ctrl_b, r->cache.cbm_len)) in __rdtgroup_cbm_overlaps()
1271 for (i = 0; i < closids_supported(); i++) { in __rdtgroup_cbm_overlaps()
1276 if (bitmap_intersects(&cbm, &ctrl_b, r->cache.cbm_len)) { in __rdtgroup_cbm_overlaps()
1291 * rdtgroup_cbm_overlaps - Does CBM overlap with other use of hardware
1301 * which the CBM is intended though - when dealing with CDP resources that
1313 enum resctrl_conf_type peer_type = resctrl_peer_type(s->conf_type); in rdtgroup_cbm_overlaps()
1314 struct rdt_resource *r = s->res; in rdtgroup_cbm_overlaps()
1316 if (__rdtgroup_cbm_overlaps(r, d, cbm, closid, s->conf_type, in rdtgroup_cbm_overlaps()
1320 if (!resctrl_arch_get_cdp_enabled(r->rid)) in rdtgroup_cbm_overlaps()
1326 * rdtgroup_mode_test_exclusive - Test if this resource group can be exclusive
1340 int closid = rdtgrp->closid; in rdtgroup_mode_test_exclusive()
1347 /* Walking r->domains, ensure it can't race with cpuhp */ in rdtgroup_mode_test_exclusive()
1351 r = s->res; in rdtgroup_mode_test_exclusive()
1352 if (r->rid == RDT_RESOURCE_MBA || r->rid == RDT_RESOURCE_SMBA) in rdtgroup_mode_test_exclusive()
1355 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in rdtgroup_mode_test_exclusive()
1357 s->conf_type); in rdtgroup_mode_test_exclusive()
1374 * rdtgroup_mode_write - Modify the resource group's mode
1381 int ret = 0; in rdtgroup_mode_write()
1384 if (nbytes == 0 || buf[nbytes - 1] != '\n') in rdtgroup_mode_write()
1385 return -EINVAL; in rdtgroup_mode_write()
1386 buf[nbytes - 1] = '\0'; in rdtgroup_mode_write()
1388 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_mode_write()
1390 rdtgroup_kn_unlock(of->kn); in rdtgroup_mode_write()
1391 return -ENOENT; in rdtgroup_mode_write()
1396 mode = rdtgrp->mode; in rdtgroup_mode_write()
1400 (!strcmp(buf, "pseudo-locksetup") && in rdtgroup_mode_write()
1402 (!strcmp(buf, "pseudo-locked") && mode == RDT_MODE_PSEUDO_LOCKED)) in rdtgroup_mode_write()
1406 rdt_last_cmd_puts("Cannot change pseudo-locked group\n"); in rdtgroup_mode_write()
1407 ret = -EINVAL; in rdtgroup_mode_write()
1412 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_mode_write()
1417 rdtgrp->mode = RDT_MODE_SHAREABLE; in rdtgroup_mode_write()
1420 ret = -EINVAL; in rdtgroup_mode_write()
1423 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_mode_write()
1428 rdtgrp->mode = RDT_MODE_EXCLUSIVE; in rdtgroup_mode_write()
1429 } else if (!strcmp(buf, "pseudo-locksetup")) { in rdtgroup_mode_write()
1433 rdtgrp->mode = RDT_MODE_PSEUDO_LOCKSETUP; in rdtgroup_mode_write()
1436 ret = -EINVAL; in rdtgroup_mode_write()
1440 rdtgroup_kn_unlock(of->kn); in rdtgroup_mode_write()
1445 * rdtgroup_cbm_to_size - Translate CBM to size in bytes
1462 unsigned int size = 0; in rdtgroup_cbm_to_size()
1466 if (WARN_ON_ONCE(r->ctrl_scope != RESCTRL_L2_CACHE && r->ctrl_scope != RESCTRL_L3_CACHE)) in rdtgroup_cbm_to_size()
1469 num_b = bitmap_weight(&cbm, r->cache.cbm_len); in rdtgroup_cbm_to_size()
1470 ci = get_cpu_cacheinfo_level(cpumask_any(&d->hdr.cpu_mask), r->ctrl_scope); in rdtgroup_cbm_to_size()
1472 size = ci->size / r->cache.cbm_len * num_b; in rdtgroup_cbm_to_size()
1478 * rdtgroup_size_show - Display size in bytes of allocated regions
1492 int ret = 0; in rdtgroup_size_show()
1497 rdtgrp = rdtgroup_kn_lock_live(of->kn); in rdtgroup_size_show()
1499 rdtgroup_kn_unlock(of->kn); in rdtgroup_size_show()
1500 return -ENOENT; in rdtgroup_size_show()
1503 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { in rdtgroup_size_show()
1504 if (!rdtgrp->plr->d) { in rdtgroup_size_show()
1507 ret = -ENODEV; in rdtgroup_size_show()
1510 rdtgrp->plr->s->name); in rdtgroup_size_show()
1511 size = rdtgroup_cbm_to_size(rdtgrp->plr->s->res, in rdtgroup_size_show()
1512 rdtgrp->plr->d, in rdtgroup_size_show()
1513 rdtgrp->plr->cbm); in rdtgroup_size_show()
1514 seq_printf(s, "%d=%u\n", rdtgrp->plr->d->hdr.id, size); in rdtgroup_size_show()
1519 closid = rdtgrp->closid; in rdtgroup_size_show()
1522 r = schema->res; in rdtgroup_size_show()
1523 type = schema->conf_type; in rdtgroup_size_show()
1525 seq_printf(s, "%*s:", max_name_width, schema->name); in rdtgroup_size_show()
1526 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in rdtgroup_size_show()
1529 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { in rdtgroup_size_show()
1530 size = 0; in rdtgroup_size_show()
1533 ctrl = d->mbps_val[closid]; in rdtgroup_size_show()
1538 if (r->rid == RDT_RESOURCE_MBA || in rdtgroup_size_show()
1539 r->rid == RDT_RESOURCE_SMBA) in rdtgroup_size_show()
1544 seq_printf(s, "%d=%u", d->hdr.id, size); in rdtgroup_size_show()
1551 rdtgroup_kn_unlock(of->kn); in rdtgroup_size_show()
1564 * mon_event_config_index_get - get the hardware index for the
1568 * Return: 0 for evtid == QOS_L3_MBM_TOTAL_EVENT_ID
1576 return 0; in mon_event_config_index_get()
1591 index = mon_event_config_index_get(mon_info->evtid); in mon_event_config_read()
1593 pr_warn_once("Invalid event id %d\n", mon_info->evtid); in mon_event_config_read()
1599 mon_info->mon_config = msrval & MAX_EVT_CONFIG_BITS; in mon_event_config_read()
1604 smp_call_function_any(&d->hdr.cpu_mask, mon_event_config_read, mon_info, 1); in mondata_config_read()
1616 list_for_each_entry(dom, &r->mon_domains, hdr.list) { in mbm_config_show()
1620 memset(&mon_info, 0, sizeof(struct mon_config_info)); in mbm_config_show()
1624 seq_printf(s, "%d=0x%02x", dom->hdr.id, mon_info.mon_config); in mbm_config_show()
1632 return 0; in mbm_config_show()
1638 struct rdt_resource *r = of->kn->parent->priv; in mbm_total_bytes_config_show()
1642 return 0; in mbm_total_bytes_config_show()
1648 struct rdt_resource *r = of->kn->parent->priv; in mbm_local_bytes_config_show()
1652 return 0; in mbm_local_bytes_config_show()
1660 index = mon_event_config_index_get(mon_info->evtid); in mon_event_config_write()
1662 pr_warn_once("Invalid event id %d\n", mon_info->evtid); in mon_event_config_write()
1665 wrmsr(MSR_IA32_EVT_CFG_BASE + index, mon_info->mon_config, 0); in mon_event_config_write()
1671 struct mon_config_info mon_info = {0}; in mbm_config_write_domain()
1690 smp_call_function_any(&d->hdr.cpu_mask, mon_event_config_write, in mbm_config_write_domain()
1712 /* Walking r->domains, ensure it can't race with cpuhp */ in mon_config_write()
1716 if (!tok || tok[0] == '\0') in mon_config_write()
1717 return 0; in mon_config_write()
1724 rdt_last_cmd_puts("Missing '=' or non-numeric domain id\n"); in mon_config_write()
1725 return -EINVAL; in mon_config_write()
1729 rdt_last_cmd_puts("Non-numeric event configuration value\n"); in mon_config_write()
1730 return -EINVAL; in mon_config_write()
1734 if ((val & hw_res->mbm_cfg_mask) != val) { in mon_config_write()
1735 rdt_last_cmd_printf("Invalid event configuration: max valid mask is 0x%02x\n", in mon_config_write()
1736 hw_res->mbm_cfg_mask); in mon_config_write()
1737 return -EINVAL; in mon_config_write()
1740 list_for_each_entry(d, &r->mon_domains, hdr.list) { in mon_config_write()
1741 if (d->hdr.id == dom_id) { in mon_config_write()
1747 return -EINVAL; in mon_config_write()
1754 struct rdt_resource *r = of->kn->parent->priv; in mbm_total_bytes_config_write()
1758 if (nbytes == 0 || buf[nbytes - 1] != '\n') in mbm_total_bytes_config_write()
1759 return -EINVAL; in mbm_total_bytes_config_write()
1766 buf[nbytes - 1] = '\0'; in mbm_total_bytes_config_write()
1780 struct rdt_resource *r = of->kn->parent->priv; in mbm_local_bytes_config_write()
1784 if (nbytes == 0 || buf[nbytes - 1] != '\n') in mbm_local_bytes_config_write()
1785 return -EINVAL; in mbm_local_bytes_config_write()
1792 buf[nbytes - 1] = '\0'; in mbm_local_bytes_config_write()
2007 if (rft->fflags && ((fflags & rft->fflags) == rft->fflags)) { in rdtgroup_add_files()
2014 return 0; in rdtgroup_add_files()
2016 pr_warn("Failed to add %s, err=%d\n", rft->name, ret); in rdtgroup_add_files()
2017 while (--rft >= rfts) { in rdtgroup_add_files()
2018 if ((fflags & rft->fflags) == rft->fflags) in rdtgroup_add_files()
2019 kernfs_remove_by_name(kn, rft->name); in rdtgroup_add_files()
2033 if (!strcmp(rft->name, name)) in rdtgroup_get_rftype_by_name()
2046 rft->fflags = fflags; in resctrl_file_fflags_init()
2050 * rdtgroup_kn_mode_restrict - Restrict user access to named resctrl file
2058 * resctrl file has been locked down - that it is not relevant to the
2064 * Return: 0 on success, <0 on failure.
2070 int ret = 0; in rdtgroup_kn_mode_restrict()
2072 kn = kernfs_find_and_get_ns(r->kn, name, NULL); in rdtgroup_kn_mode_restrict()
2074 return -ENOENT; in rdtgroup_kn_mode_restrict()
2094 * rdtgroup_kn_mode_restore - Restore user access to named resctrl file
2102 * Return: 0 on success, <0 on failure.
2116 if (!strcmp(rft->name, name)) in rdtgroup_kn_mode_restore()
2117 iattr.ia_mode = rft->mode & mask; in rdtgroup_kn_mode_restore()
2120 kn = kernfs_find_and_get_ns(r->kn, name, NULL); in rdtgroup_kn_mode_restore()
2122 return -ENOENT; in rdtgroup_kn_mode_restore()
2128 iattr.ia_mode |= parent->mode; in rdtgroup_kn_mode_restore()
2153 kn_info->mode, priv); in rdtgroup_mkdir_info_resdir()
2177 kn_info = kernfs_create_dir(parent_kn, "info", parent_kn->mode, NULL); in rdtgroup_create_info_dir()
2187 r = s->res; in rdtgroup_create_info_dir()
2188 fflags = r->fflags | RFTYPE_CTRL_INFO; in rdtgroup_create_info_dir()
2189 ret = rdtgroup_mkdir_info_resdir(s, s->name, fflags); in rdtgroup_create_info_dir()
2195 fflags = r->fflags | RFTYPE_MON_INFO; in rdtgroup_create_info_dir()
2196 sprintf(name, "%s_MON", r->name); in rdtgroup_create_info_dir()
2208 return 0; in rdtgroup_create_info_dir()
2223 kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp); in mongroup_create_dir()
2236 return 0; in mongroup_create_dir()
2247 wrmsrl(MSR_IA32_L3_QOS_CFG, *enable ? L3_QOS_CDP_ENABLE : 0ULL); in l3_qos_cfg_update()
2254 wrmsrl(MSR_IA32_L2_QOS_CFG, *enable ? L2_QOS_CDP_ENABLE : 0ULL); in l2_qos_cfg_update()
2270 /* Walking r->domains, ensure it can't race with cpuhp */ in set_cache_qos_cfg()
2278 return -EINVAL; in set_cache_qos_cfg()
2281 return -ENOMEM; in set_cache_qos_cfg()
2284 list_for_each_entry(d, &r_l->ctrl_domains, hdr.list) { in set_cache_qos_cfg()
2285 if (r_l->cache.arch_has_per_cpu_cfg) in set_cache_qos_cfg()
2287 for_each_cpu(cpu, &d->hdr.cpu_mask) in set_cache_qos_cfg()
2291 cpumask_set_cpu(cpumask_any(&d->hdr.cpu_mask), cpu_mask); in set_cache_qos_cfg()
2299 return 0; in set_cache_qos_cfg()
2307 if (!r->cdp_capable) in rdt_domain_reconfigure_cdp()
2310 if (r->rid == RDT_RESOURCE_L2) in rdt_domain_reconfigure_cdp()
2311 l2_qos_cfg_update(&hw_res->cdp_enabled); in rdt_domain_reconfigure_cdp()
2313 if (r->rid == RDT_RESOURCE_L3) in rdt_domain_reconfigure_cdp()
2314 l3_qos_cfg_update(&hw_res->cdp_enabled); in rdt_domain_reconfigure_cdp()
2320 int cpu = cpumask_any(&d->hdr.cpu_mask); in mba_sc_domain_allocate()
2323 d->mbps_val = kcalloc_node(num_closid, sizeof(*d->mbps_val), in mba_sc_domain_allocate()
2325 if (!d->mbps_val) in mba_sc_domain_allocate()
2326 return -ENOMEM; in mba_sc_domain_allocate()
2328 for (i = 0; i < num_closid; i++) in mba_sc_domain_allocate()
2329 d->mbps_val[i] = MBA_MAX_MBPS; in mba_sc_domain_allocate()
2331 return 0; in mba_sc_domain_allocate()
2337 kfree(d->mbps_val); in mba_sc_domain_destroy()
2338 d->mbps_val = NULL; in mba_sc_domain_destroy()
2353 r->alloc_capable && is_mba_linear() && in supports_mba_mbps()
2354 r->ctrl_scope == rmbm->mon_scope); in supports_mba_mbps()
2370 return -EINVAL; in set_mba_sc()
2372 r->membw.mba_sc = mba_sc; in set_mba_sc()
2376 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in set_mba_sc()
2377 for (i = 0; i < num_closid; i++) in set_mba_sc()
2378 d->mbps_val[i] = MBA_MAX_MBPS; in set_mba_sc()
2381 fflags = mba_sc ? RFTYPE_CTRL_BASE | RFTYPE_MON_BASE : 0; in set_mba_sc()
2384 return 0; in set_mba_sc()
2392 if (!r_l->alloc_capable) in cdp_enable()
2393 return -EINVAL; in cdp_enable()
2406 if (r_hw->cdp_enabled) { in cdp_disable()
2408 r_hw->cdp_enabled = false; in cdp_disable()
2416 if (!hw_res->r_resctrl.cdp_capable) in resctrl_arch_set_cdp_enabled()
2417 return -EINVAL; in resctrl_arch_set_cdp_enabled()
2424 return 0; in resctrl_arch_set_cdp_enabled()
2439 * All the resource directories use "kn->priv" in kernfs_to_rdtgroup()
2444 if (kn == kn_info || kn->parent == kn_info) in kernfs_to_rdtgroup()
2447 return kn->priv; in kernfs_to_rdtgroup()
2449 return kn->parent->priv; in kernfs_to_rdtgroup()
2455 atomic_inc(&rdtgrp->waitcount); in rdtgroup_kn_get()
2461 if (atomic_dec_and_test(&rdtgrp->waitcount) && in rdtgroup_kn_put()
2462 (rdtgrp->flags & RDT_DELETED)) { in rdtgroup_kn_put()
2463 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || in rdtgroup_kn_put()
2464 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) in rdtgroup_kn_put()
2486 if (rdtgrp->flags & RDT_DELETED) in rdtgroup_kn_lock_live()
2520 int ret = 0; in rdt_enable_ctx()
2522 if (ctx->enable_cdpl2) { in rdt_enable_ctx()
2528 if (ctx->enable_cdpl3) { in rdt_enable_ctx()
2534 if (ctx->enable_mba_mbps) { in rdt_enable_ctx()
2540 if (ctx->enable_debug) in rdt_enable_ctx()
2543 return 0; in rdt_enable_ctx()
2561 return -ENOMEM; in schemata_list_add()
2563 s->res = r; in schemata_list_add()
2564 s->num_closid = resctrl_arch_get_num_closid(r); in schemata_list_add()
2565 if (resctrl_arch_get_cdp_enabled(r->rid)) in schemata_list_add()
2566 s->num_closid /= 2; in schemata_list_add()
2568 s->conf_type = type; in schemata_list_add()
2581 ret = snprintf(s->name, sizeof(s->name), "%s%s", r->name, suffix); in schemata_list_add()
2582 if (ret >= sizeof(s->name)) { in schemata_list_add()
2584 return -EINVAL; in schemata_list_add()
2587 cl = strlen(s->name); in schemata_list_add()
2594 if (r->cdp_capable && !resctrl_arch_get_cdp_enabled(r->rid)) in schemata_list_add()
2600 INIT_LIST_HEAD(&s->list); in schemata_list_add()
2601 list_add(&s->list, &resctrl_schema_all); in schemata_list_add()
2603 return 0; in schemata_list_add()
2609 int ret = 0; in schemata_list_create()
2612 if (resctrl_arch_get_cdp_enabled(r->rid)) { in schemata_list_create()
2634 list_del(&s->list); in schemata_list_destroy()
2653 ret = -EBUSY; in rdt_get_tree()
2683 if (ret < 0) in rdt_get_tree()
2690 if (ret < 0) in rdt_get_tree()
2695 if (ret < 0) in rdt_get_tree()
2697 rdtgroup_default.mon.mon_data_kn = kn_mondata; in rdt_get_tree()
2705 if (ret < 0) in rdt_get_tree()
2718 list_for_each_entry(dom, &r->mon_domains, hdr.list) in rdt_get_tree()
2772 if (opt < 0) in rdt_parse_param()
2777 ctx->enable_cdpl3 = true; in rdt_parse_param()
2778 return 0; in rdt_parse_param()
2780 ctx->enable_cdpl2 = true; in rdt_parse_param()
2781 return 0; in rdt_parse_param()
2786 ctx->enable_mba_mbps = true; in rdt_parse_param()
2787 return 0; in rdt_parse_param()
2789 ctx->enable_debug = true; in rdt_parse_param()
2790 return 0; in rdt_parse_param()
2793 return -EINVAL; in rdt_parse_param()
2816 return -ENOMEM; in rdt_init_fs_context()
2818 ctx->kfc.magic = RDTGROUP_SUPER_MAGIC; in rdt_init_fs_context()
2819 fc->fs_private = &ctx->kfc; in rdt_init_fs_context()
2820 fc->ops = &rdt_fs_context_ops; in rdt_init_fs_context()
2821 put_user_ns(fc->user_ns); in rdt_init_fs_context()
2822 fc->user_ns = get_user_ns(&init_user_ns); in rdt_init_fs_context()
2823 fc->global = true; in rdt_init_fs_context()
2824 return 0; in rdt_init_fs_context()
2835 /* Walking r->domains, ensure it can't race with cpuhp */ in reset_all_ctrls()
2839 msr_param.low = 0; in reset_all_ctrls()
2840 msr_param.high = hw_res->num_closid; in reset_all_ctrls()
2847 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in reset_all_ctrls()
2850 for (i = 0; i < hw_res->num_closid; i++) in reset_all_ctrls()
2851 hw_dom->ctrl_val[i] = r->default_ctrl; in reset_all_ctrls()
2853 smp_call_function_any(&d->hdr.cpu_mask, rdt_ctrl_update, &msr_param, 1); in reset_all_ctrls()
2856 return 0; in reset_all_ctrls()
2876 resctrl_arch_set_closid_rmid(t, to->closid, in rdt_move_group_tasks()
2877 to->mon.rmid); in rdt_move_group_tasks()
2882 * between the rq->curr update and resctrl_sched_in() in rdt_move_group_tasks()
2906 head = &rdtgrp->mon.crdtgrp_list; in free_all_child_rdtgrp()
2907 list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { in free_all_child_rdtgrp()
2908 free_rmid(sentry->closid, sentry->mon.rmid); in free_all_child_rdtgrp()
2909 list_del(&sentry->mon.crdtgrp_list); in free_all_child_rdtgrp()
2911 if (atomic_read(&sentry->waitcount) != 0) in free_all_child_rdtgrp()
2912 sentry->flags = RDT_DELETED; in free_all_child_rdtgrp()
2936 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || in rmdir_all_sub()
2937 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) in rmdir_all_sub()
2946 &rdtgroup_default.cpu_mask, &rdtgrp->cpu_mask); in rmdir_all_sub()
2948 free_rmid(rdtgrp->closid, rdtgrp->mon.rmid); in rmdir_all_sub()
2950 kernfs_remove(rdtgrp->kn); in rmdir_all_sub()
2951 list_del(&rdtgrp->rdtgroup_list); in rmdir_all_sub()
2953 if (atomic_read(&rdtgrp->waitcount) != 0) in rmdir_all_sub()
2954 rdtgrp->flags = RDT_DELETED; in rmdir_all_sub()
3004 int ret = 0; in mon_addfile()
3007 GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, 0, in mon_addfile()
3030 if (kn->dir.subdirs <= 1) in mon_rmdir_one_subdir()
3050 snc_mode = r->mon_scope == RESCTRL_L3_NODE; in rmdir_mondata_subdir_allrdtgrp()
3051 sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci->id : d->hdr.id); in rmdir_mondata_subdir_allrdtgrp()
3053 sprintf(subname, "mon_sub_%s_%02d", r->name, d->hdr.id); in rmdir_mondata_subdir_allrdtgrp()
3056 mon_rmdir_one_subdir(prgrp->mon.mon_data_kn, name, subname); in rmdir_mondata_subdir_allrdtgrp()
3058 list_for_each_entry(crgrp, &prgrp->mon.crdtgrp_list, mon.crdtgrp_list) in rmdir_mondata_subdir_allrdtgrp()
3059 mon_rmdir_one_subdir(crgrp->mon.mon_data_kn, name, subname); in rmdir_mondata_subdir_allrdtgrp()
3067 struct rmid_read rr = {0}; in mon_add_all_files()
3072 if (WARN_ON(list_empty(&r->evt_list))) in mon_add_all_files()
3073 return -EPERM; in mon_add_all_files()
3075 priv.u.rid = r->rid; in mon_add_all_files()
3076 priv.u.domid = do_sum ? d->ci->id : d->hdr.id; in mon_add_all_files()
3078 list_for_each_entry(mevt, &r->evt_list, list) { in mon_add_all_files()
3079 priv.u.evtid = mevt->evtid; in mon_add_all_files()
3080 ret = mon_addfile(kn, mevt->name, priv.priv); in mon_add_all_files()
3084 if (!do_sum && is_mbm_event(mevt->evtid)) in mon_add_all_files()
3085 mon_event_read(&rr, r, d, prgrp, &d->hdr.cpu_mask, mevt->evtid, true); in mon_add_all_files()
3088 return 0; in mon_add_all_files()
3098 int ret = 0; in mkdir_mondata_subdir()
3102 snc_mode = r->mon_scope == RESCTRL_L3_NODE; in mkdir_mondata_subdir()
3103 sprintf(name, "mon_%s_%02d", r->name, snc_mode ? d->ci->id : d->hdr.id); in mkdir_mondata_subdir()
3112 kn = kernfs_create_dir(parent_kn, name, parent_kn->mode, prgrp); in mkdir_mondata_subdir()
3125 sprintf(name, "mon_sub_%s_%02d", r->name, d->hdr.id); in mkdir_mondata_subdir()
3126 ckn = kernfs_create_dir(kn, name, parent_kn->mode, prgrp); in mkdir_mondata_subdir()
3128 ret = -EINVAL; in mkdir_mondata_subdir()
3142 return 0; in mkdir_mondata_subdir()
3161 parent_kn = prgrp->mon.mon_data_kn; in mkdir_mondata_subdir_allrdtgrp()
3164 head = &prgrp->mon.crdtgrp_list; in mkdir_mondata_subdir_allrdtgrp()
3165 list_for_each_entry(crgrp, head, mon.crdtgrp_list) { in mkdir_mondata_subdir_allrdtgrp()
3166 parent_kn = crgrp->mon.mon_data_kn; in mkdir_mondata_subdir_allrdtgrp()
3179 /* Walking r->domains, ensure it can't race with cpuhp */ in mkdir_mondata_subdir_alldom()
3182 list_for_each_entry(dom, &r->mon_domains, hdr.list) { in mkdir_mondata_subdir_alldom()
3188 return 0; in mkdir_mondata_subdir_alldom()
3236 return 0; in mkdir_mondata_all()
3244 * cbm_ensure_valid - Enforce validity on provided CBM
3260 unsigned int cbm_len = r->cache.cbm_len; in cbm_ensure_valid()
3265 return 0; in cbm_ensure_valid()
3271 bitmap_clear(&val, zero_bit, cbm_len - zero_bit); in cbm_ensure_valid()
3279 * all shareable and unused bits. All-zero CBM is invalid.
3284 enum resctrl_conf_type peer_type = resctrl_peer_type(s->conf_type); in __init_one_rdt_domain()
3285 enum resctrl_conf_type t = s->conf_type; in __init_one_rdt_domain()
3287 struct rdt_resource *r = s->res; in __init_one_rdt_domain()
3288 u32 used_b = 0, unused_b = 0; in __init_one_rdt_domain()
3294 cfg = &d->staged_config[t]; in __init_one_rdt_domain()
3295 cfg->have_new_ctrl = false; in __init_one_rdt_domain()
3296 cfg->new_ctrl = r->cache.shareable_bits; in __init_one_rdt_domain()
3297 used_b = r->cache.shareable_bits; in __init_one_rdt_domain()
3298 for (i = 0; i < closids_supported(); i++) { in __init_one_rdt_domain()
3313 if (resctrl_arch_get_cdp_enabled(r->rid)) in __init_one_rdt_domain()
3317 peer_ctl = 0; in __init_one_rdt_domain()
3319 s->conf_type); in __init_one_rdt_domain()
3322 cfg->new_ctrl |= ctrl_val | peer_ctl; in __init_one_rdt_domain()
3325 if (d->plr && d->plr->cbm > 0) in __init_one_rdt_domain()
3326 used_b |= d->plr->cbm; in __init_one_rdt_domain()
3327 unused_b = used_b ^ (BIT_MASK(r->cache.cbm_len) - 1); in __init_one_rdt_domain()
3328 unused_b &= BIT_MASK(r->cache.cbm_len) - 1; in __init_one_rdt_domain()
3329 cfg->new_ctrl |= unused_b; in __init_one_rdt_domain()
3334 cfg->new_ctrl = cbm_ensure_valid(cfg->new_ctrl, r); in __init_one_rdt_domain()
3337 * bitmap_weight() does not access out-of-bound memory. in __init_one_rdt_domain()
3339 tmp_cbm = cfg->new_ctrl; in __init_one_rdt_domain()
3340 if (bitmap_weight(&tmp_cbm, r->cache.cbm_len) < r->cache.min_cbm_bits) { in __init_one_rdt_domain()
3341 rdt_last_cmd_printf("No space on %s:%d\n", s->name, d->hdr.id); in __init_one_rdt_domain()
3342 return -ENOSPC; in __init_one_rdt_domain()
3344 cfg->have_new_ctrl = true; in __init_one_rdt_domain()
3346 return 0; in __init_one_rdt_domain()
3364 list_for_each_entry(d, &s->res->ctrl_domains, hdr.list) { in rdtgroup_init_cat()
3366 if (ret < 0) in rdtgroup_init_cat()
3370 return 0; in rdtgroup_init_cat()
3379 list_for_each_entry(d, &r->ctrl_domains, hdr.list) { in rdtgroup_init_mba()
3381 d->mbps_val[closid] = MBA_MAX_MBPS; in rdtgroup_init_mba()
3385 cfg = &d->staged_config[CDP_NONE]; in rdtgroup_init_mba()
3386 cfg->new_ctrl = r->default_ctrl; in rdtgroup_init_mba()
3387 cfg->have_new_ctrl = true; in rdtgroup_init_mba()
3396 int ret = 0; in rdtgroup_init_alloc()
3401 r = s->res; in rdtgroup_init_alloc()
3402 if (r->rid == RDT_RESOURCE_MBA || in rdtgroup_init_alloc()
3403 r->rid == RDT_RESOURCE_SMBA) { in rdtgroup_init_alloc()
3404 rdtgroup_init_mba(r, rdtgrp->closid); in rdtgroup_init_alloc()
3408 ret = rdtgroup_init_cat(s, rdtgrp->closid); in rdtgroup_init_alloc()
3409 if (ret < 0) in rdtgroup_init_alloc()
3413 ret = resctrl_arch_update_domains(r, rdtgrp->closid); in rdtgroup_init_alloc()
3414 if (ret < 0) { in rdtgroup_init_alloc()
3421 rdtgrp->mode = RDT_MODE_SHAREABLE; in rdtgroup_init_alloc()
3433 return 0; in mkdir_rdt_prepare_rmid_alloc()
3435 ret = alloc_rmid(rdtgrp->closid); in mkdir_rdt_prepare_rmid_alloc()
3436 if (ret < 0) { in mkdir_rdt_prepare_rmid_alloc()
3440 rdtgrp->mon.rmid = ret; in mkdir_rdt_prepare_rmid_alloc()
3442 ret = mkdir_mondata_all(rdtgrp->kn, rdtgrp, &rdtgrp->mon.mon_data_kn); in mkdir_rdt_prepare_rmid_alloc()
3445 free_rmid(rdtgrp->closid, rdtgrp->mon.rmid); in mkdir_rdt_prepare_rmid_alloc()
3449 return 0; in mkdir_rdt_prepare_rmid_alloc()
3455 free_rmid(rgrp->closid, rgrp->mon.rmid); in mkdir_rdt_prepare_rmid_free()
3463 unsigned long files = 0; in mkdir_rdt_prepare()
3469 ret = -ENODEV; in mkdir_rdt_prepare()
3474 (prdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || in mkdir_rdt_prepare()
3475 prdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)) { in mkdir_rdt_prepare()
3476 ret = -EINVAL; in mkdir_rdt_prepare()
3477 rdt_last_cmd_puts("Pseudo-locking in progress\n"); in mkdir_rdt_prepare()
3484 ret = -ENOSPC; in mkdir_rdt_prepare()
3489 rdtgrp->mon.parent = prdtgrp; in mkdir_rdt_prepare()
3490 rdtgrp->type = rtype; in mkdir_rdt_prepare()
3491 INIT_LIST_HEAD(&rdtgrp->mon.crdtgrp_list); in mkdir_rdt_prepare()
3500 rdtgrp->kn = kn; in mkdir_rdt_prepare()
3533 return 0; in mkdir_rdt_prepare()
3536 kernfs_put(rdtgrp->kn); in mkdir_rdt_prepare()
3537 kernfs_remove(rdtgrp->kn); in mkdir_rdt_prepare()
3547 kernfs_remove(rgrp->kn); in mkdir_rdt_prepare_clean()
3566 prgrp = rdtgrp->mon.parent; in rdtgroup_mkdir_mon()
3567 rdtgrp->closid = prgrp->closid; in rdtgroup_mkdir_mon()
3575 kernfs_activate(rdtgrp->kn); in rdtgroup_mkdir_mon()
3581 list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); in rdtgroup_mkdir_mon()
3604 kn = rdtgrp->kn; in rdtgroup_mkdir_ctrl_mon()
3606 if (ret < 0) { in rdtgroup_mkdir_ctrl_mon()
3611 ret = 0; in rdtgroup_mkdir_ctrl_mon()
3613 rdtgrp->closid = closid; in rdtgroup_mkdir_ctrl_mon()
3619 kernfs_activate(rdtgrp->kn); in rdtgroup_mkdir_ctrl_mon()
3622 if (ret < 0) in rdtgroup_mkdir_ctrl_mon()
3625 list_add(&rdtgrp->rdtgroup_list, &rdt_all_groups); in rdtgroup_mkdir_ctrl_mon()
3638 rdtgrp->mba_mbps_event = mba_mbps_default_event; in rdtgroup_mkdir_ctrl_mon()
3644 list_del(&rdtgrp->rdtgroup_list); in rdtgroup_mkdir_ctrl_mon()
3657 * We allow creating mon groups only with in a directory called "mon_groups"
3662 * 2. The mon group itself should "not" be named "mon_groups".
3668 return (!strcmp(kn->name, "mon_groups") && in is_mon_groups()
3677 return -EINVAL; in rdtgroup_mkdir()
3694 return -EPERM; in rdtgroup_mkdir()
3699 struct rdtgroup *prdtgrp = rdtgrp->mon.parent; in rdtgroup_rmdir_mon()
3706 for_each_cpu(cpu, &rdtgrp->cpu_mask) in rdtgroup_rmdir_mon()
3707 per_cpu(pqr_state.default_rmid, cpu) = prdtgrp->mon.rmid; in rdtgroup_rmdir_mon()
3712 cpumask_or(tmpmask, tmpmask, &rdtgrp->cpu_mask); in rdtgroup_rmdir_mon()
3715 rdtgrp->flags = RDT_DELETED; in rdtgroup_rmdir_mon()
3716 free_rmid(rdtgrp->closid, rdtgrp->mon.rmid); in rdtgroup_rmdir_mon()
3721 WARN_ON(list_empty(&prdtgrp->mon.crdtgrp_list)); in rdtgroup_rmdir_mon()
3722 list_del(&rdtgrp->mon.crdtgrp_list); in rdtgroup_rmdir_mon()
3724 kernfs_remove(rdtgrp->kn); in rdtgroup_rmdir_mon()
3726 return 0; in rdtgroup_rmdir_mon()
3731 rdtgrp->flags = RDT_DELETED; in rdtgroup_ctrl_remove()
3732 list_del(&rdtgrp->rdtgroup_list); in rdtgroup_ctrl_remove()
3734 kernfs_remove(rdtgrp->kn); in rdtgroup_ctrl_remove()
3735 return 0; in rdtgroup_ctrl_remove()
3747 &rdtgroup_default.cpu_mask, &rdtgrp->cpu_mask); in rdtgroup_rmdir_ctrl()
3750 for_each_cpu(cpu, &rdtgrp->cpu_mask) { in rdtgroup_rmdir_ctrl()
3752 per_cpu(pqr_state.default_rmid, cpu) = rdtgroup_default.mon.rmid; in rdtgroup_rmdir_ctrl()
3759 cpumask_or(tmpmask, tmpmask, &rdtgrp->cpu_mask); in rdtgroup_rmdir_ctrl()
3762 free_rmid(rdtgrp->closid, rdtgrp->mon.rmid); in rdtgroup_rmdir_ctrl()
3763 closid_free(rdtgrp->closid); in rdtgroup_rmdir_ctrl()
3772 return 0; in rdtgroup_rmdir_ctrl()
3777 struct kernfs_node *parent_kn = kn->parent; in rdtgroup_rmdir()
3780 int ret = 0; in rdtgroup_rmdir()
3783 return -ENOMEM; in rdtgroup_rmdir()
3787 ret = -EPERM; in rdtgroup_rmdir()
3795 * If the rdtgroup is a mon group and parent directory in rdtgroup_rmdir()
3796 * is a valid "mon_groups" directory, remove the mon group. in rdtgroup_rmdir()
3798 if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn && in rdtgroup_rmdir()
3800 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || in rdtgroup_rmdir()
3801 rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { in rdtgroup_rmdir()
3806 } else if (rdtgrp->type == RDTMON_GROUP && in rdtgroup_rmdir()
3807 is_mon_groups(parent_kn, kn->name)) { in rdtgroup_rmdir()
3810 ret = -EPERM; in rdtgroup_rmdir()
3820 * mongrp_reparent() - replace parent CTRL_MON group of a MON group
3821 * @rdtgrp: the MON group whose parent should be replaced
3825 * Replaces the parent CTRL_MON group for a MON group, resulting in all member
3833 struct rdtgroup *prdtgrp = rdtgrp->mon.parent; in mongrp_reparent()
3835 WARN_ON(rdtgrp->type != RDTMON_GROUP); in mongrp_reparent()
3836 WARN_ON(new_prdtgrp->type != RDTCTRL_GROUP); in mongrp_reparent()
3838 /* Nothing to do when simply renaming a MON group. */ in mongrp_reparent()
3842 WARN_ON(list_empty(&prdtgrp->mon.crdtgrp_list)); in mongrp_reparent()
3843 list_move_tail(&rdtgrp->mon.crdtgrp_list, in mongrp_reparent()
3844 &new_prdtgrp->mon.crdtgrp_list); in mongrp_reparent()
3846 rdtgrp->mon.parent = new_prdtgrp; in mongrp_reparent()
3847 rdtgrp->closid = new_prdtgrp->closid; in mongrp_reparent()
3866 return -ENOENT; in rdtgroup_rename()
3883 ret = -EPERM; in rdtgroup_rename()
3887 if ((rdtgrp->flags & RDT_DELETED) || (new_prdtgrp->flags & RDT_DELETED)) { in rdtgroup_rename()
3888 ret = -ENOENT; in rdtgroup_rename()
3892 if (rdtgrp->type != RDTMON_GROUP || !kn->parent || in rdtgroup_rename()
3893 !is_mon_groups(kn->parent, kn->name)) { in rdtgroup_rename()
3894 rdt_last_cmd_puts("Source must be a MON group\n"); in rdtgroup_rename()
3895 ret = -EPERM; in rdtgroup_rename()
3901 ret = -EPERM; in rdtgroup_rename()
3906 * If the MON group is monitoring CPUs, the CPUs must be assigned to the in rdtgroup_rename()
3910 if (!cpumask_empty(&rdtgrp->cpu_mask) && in rdtgroup_rename()
3911 rdtgrp->mon.parent != new_prdtgrp) { in rdtgroup_rename()
3912 rdt_last_cmd_puts("Cannot move a MON group that monitors CPUs\n"); in rdtgroup_rename()
3913 ret = -EPERM; in rdtgroup_rename()
3923 ret = -ENOMEM; in rdtgroup_rename()
3960 return 0; in rdtgroup_show_options()
3979 ctx->kfc.root = rdt_root; in rdtgroup_setup_root()
3982 return 0; in rdtgroup_setup_root()
3996 rdtgroup_default.mon.rmid = RESCTRL_RESERVED_RMID; in rdtgroup_setup_default()
3998 INIT_LIST_HEAD(&rdtgroup_default.mon.crdtgrp_list); in rdtgroup_setup_default()
4007 bitmap_free(d->rmid_busy_llc); in domain_destroy_mon_state()
4008 kfree(d->mbm_total); in domain_destroy_mon_state()
4009 kfree(d->mbm_local); in domain_destroy_mon_state()
4016 if (supports_mba_mbps() && r->rid == RDT_RESOURCE_MBA) in resctrl_offline_ctrl_domain()
4034 cancel_delayed_work(&d->mbm_over); in resctrl_offline_mon_domain()
4038 * decrement rmid->ebusy. There is no way to know in resctrl_offline_mon_domain()
4045 cancel_delayed_work(&d->cqm_limbo); in resctrl_offline_mon_domain()
4059 d->rmid_busy_llc = bitmap_zalloc(idx_limit, GFP_KERNEL); in domain_setup_mon_state()
4060 if (!d->rmid_busy_llc) in domain_setup_mon_state()
4061 return -ENOMEM; in domain_setup_mon_state()
4064 tsize = sizeof(*d->mbm_total); in domain_setup_mon_state()
4065 d->mbm_total = kcalloc(idx_limit, tsize, GFP_KERNEL); in domain_setup_mon_state()
4066 if (!d->mbm_total) { in domain_setup_mon_state()
4067 bitmap_free(d->rmid_busy_llc); in domain_setup_mon_state()
4068 return -ENOMEM; in domain_setup_mon_state()
4072 tsize = sizeof(*d->mbm_local); in domain_setup_mon_state()
4073 d->mbm_local = kcalloc(idx_limit, tsize, GFP_KERNEL); in domain_setup_mon_state()
4074 if (!d->mbm_local) { in domain_setup_mon_state()
4075 bitmap_free(d->rmid_busy_llc); in domain_setup_mon_state()
4076 kfree(d->mbm_total); in domain_setup_mon_state()
4077 return -ENOMEM; in domain_setup_mon_state()
4081 return 0; in domain_setup_mon_state()
4086 int err = 0; in resctrl_online_ctrl_domain()
4090 if (supports_mba_mbps() && r->rid == RDT_RESOURCE_MBA) { in resctrl_online_ctrl_domain()
4111 INIT_DELAYED_WORK(&d->mbm_over, mbm_handle_overflow); in resctrl_online_mon_domain()
4117 INIT_DELAYED_WORK(&d->cqm_limbo, cqm_handle_limbo); in resctrl_online_mon_domain()
4146 list_for_each_entry(cr, &r->mon.crdtgrp_list, mon.crdtgrp_list) { in clear_childcpus()
4147 if (cpumask_test_and_clear_cpu(cpu, &cr->cpu_mask)) in clear_childcpus()
4160 if (cpumask_test_and_clear_cpu(cpu, &rdtgrp->cpu_mask)) { in resctrl_offline_cpu()
4166 if (!l3->mon_capable) in resctrl_offline_cpu()
4171 if (is_mbm_enabled() && cpu == d->mbm_work_cpu) { in resctrl_offline_cpu()
4172 cancel_delayed_work(&d->mbm_over); in resctrl_offline_cpu()
4173 mbm_setup_overflow_handler(d, 0, cpu); in resctrl_offline_cpu()
4175 if (is_llc_occupancy_enabled() && cpu == d->cqm_work_cpu && in resctrl_offline_cpu()
4177 cancel_delayed_work(&d->cqm_limbo); in resctrl_offline_cpu()
4178 cqm_setup_limbo_handler(d, 0, cpu); in resctrl_offline_cpu()
4187 * rdtgroup_init - rdtgroup initialization
4192 * Return: 0 on success or -errno
4196 int ret = 0; in rdtgroup_init()
4219 * during the debugfs directory creation also &sb->s_type->i_mutex_key in rdtgroup_init()
4220 * (the lockdep class of inode->i_rwsem). Other filesystem in rdtgroup_init()
4222 * &sb->s_type->i_mutex_key --> &mm->mmap_lock in rdtgroup_init()
4223 * During mmap(), called with &mm->mmap_lock, the rdtgroup_mutex in rdtgroup_init()
4225 * &mm->mmap_lock --> rdtgroup_mutex for the latter that can cause in rdtgroup_init()
4234 return 0; in rdtgroup_init()