fs/resctrl/rdtgroup.c
Source file repositories/reference/linux-study-clean/fs/resctrl/rdtgroup.c
File Facts
- System
- Linux kernel
- Corpus path
fs/resctrl/rdtgroup.c- Extension
.c- Size
- 117143 bytes
- Lines
- 4680
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/cpu.hlinux/debugfs.hlinux/fs.hlinux/fs_parser.hlinux/sysfs.hlinux/kernfs.hlinux/once.hlinux/resctrl.hlinux/seq_buf.hlinux/seq_file.hlinux/sched/task.hlinux/slab.hlinux/user_namespace.huapi/linux/magic.hinternal.h
Detected Declarations
enum rdt_paramfunction rdt_last_cmd_clearfunction rdt_last_cmd_putsfunction rdt_last_cmd_printffunction rdt_staged_configs_clearfunction for_each_alloc_capable_rdt_resourcefunction resctrl_is_mbm_enabledfunction closids_supportedfunction closid_initfunction closid_exitfunction closid_allocfunction closid_freefunction closid_allocatedfunction closid_alloc_fixedfunction rdtgroup_mode_by_closidfunction list_for_each_entryfunction rdtgroup_kn_set_ugidfunction rdtgroup_add_filefunction rdtgroup_seqfile_showfunction rdtgroup_file_writefunction is_cpu_listfunction rdtgroup_cpus_showfunction update_closid_rmidfunction cpus_mon_writefunction list_for_each_entryfunction cpumask_rdtgrp_clearfunction cpus_ctrl_writefunction list_for_each_entryfunction rdtgroup_cpus_writefunction rdtgroup_kn_unlockfunction _update_task_closid_rmidfunction update_task_closid_rmidfunction task_in_rdtgroupfunction __rdtgroup_move_taskfunction is_closid_matchfunction is_rmid_matchfunction rdtgroup_tasks_assignedfunction rdtgroup_task_write_permissionfunction rdtgroup_move_taskfunction rdtgroup_tasks_writefunction show_rdt_tasksfunction rdtgroup_tasks_showfunction rdtgroup_closid_showfunction rdtgroup_rmid_showfunction proc_resctrl_showfunction list_for_each_entryfunction list_for_each_entryfunction rdt_last_cmd_status_show
Annotated Snippet
resctrl_is_mon_event_enabled(QOS_L3_OCCUP_EVENT_ID)) {
cleanest_closid = resctrl_find_cleanest_closid();
if (cleanest_closid < 0)
return cleanest_closid;
closid = cleanest_closid;
} else {
closid = find_first_bit(closid_free_map, closid_free_map_len);
if (closid == closid_free_map_len)
return -ENOSPC;
}
__clear_bit(closid, closid_free_map);
return closid;
}
void closid_free(int closid)
{
lockdep_assert_held(&rdtgroup_mutex);
__set_bit(closid, closid_free_map);
}
/**
* closid_allocated - test if provided closid is in use
* @closid: closid to be tested
*
* Return: true if @closid is currently associated with a resource group,
* false if @closid is free
*/
bool closid_allocated(unsigned int closid)
{
lockdep_assert_held(&rdtgroup_mutex);
return !test_bit(closid, closid_free_map);
}
bool closid_alloc_fixed(u32 closid)
{
return __test_and_clear_bit(closid, closid_free_map);
}
/**
* rdtgroup_mode_by_closid - Return mode of resource group with closid
* @closid: closid if the resource group
*
* Each resource group is associated with a @closid. Here the mode
* of a resource group can be queried by searching for it using its closid.
*
* Return: mode as &enum rdtgrp_mode of resource group with closid @closid
*/
enum rdtgrp_mode rdtgroup_mode_by_closid(int closid)
{
struct rdtgroup *rdtgrp;
list_for_each_entry(rdtgrp, &rdt_all_groups, rdtgroup_list) {
if (rdtgrp->closid == closid)
return rdtgrp->mode;
}
return RDT_NUM_MODES;
}
static const char * const rdt_mode_str[] = {
[RDT_MODE_SHAREABLE] = "shareable",
[RDT_MODE_EXCLUSIVE] = "exclusive",
[RDT_MODE_PSEUDO_LOCKSETUP] = "pseudo-locksetup",
[RDT_MODE_PSEUDO_LOCKED] = "pseudo-locked",
};
/**
* rdtgroup_mode_str - Return the string representation of mode
* @mode: the resource group mode as &enum rdtgroup_mode
*
* Return: string representation of valid mode, "unknown" otherwise
*/
static const char *rdtgroup_mode_str(enum rdtgrp_mode mode)
{
if (mode < RDT_MODE_SHAREABLE || mode >= RDT_NUM_MODES)
return "unknown";
return rdt_mode_str[mode];
}
/* set uid and gid of rdtgroup dirs and files to that of the creator */
static int rdtgroup_kn_set_ugid(struct kernfs_node *kn)
{
struct iattr iattr = { .ia_valid = ATTR_UID | ATTR_GID,
.ia_uid = current_fsuid(),
.ia_gid = current_fsgid(), };
Annotation
- Immediate include surface: `linux/cpu.h`, `linux/debugfs.h`, `linux/fs.h`, `linux/fs_parser.h`, `linux/sysfs.h`, `linux/kernfs.h`, `linux/once.h`, `linux/resctrl.h`.
- Detected declarations: `enum rdt_param`, `function rdt_last_cmd_clear`, `function rdt_last_cmd_puts`, `function rdt_last_cmd_printf`, `function rdt_staged_configs_clear`, `function for_each_alloc_capable_rdt_resource`, `function resctrl_is_mbm_enabled`, `function closids_supported`, `function closid_init`, `function closid_exit`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.