函数源码 |
Source File:arch\x86\include\asm\resctrl_sched.h |
Create Date:2022-07-27 08:28:58 |
首页 | Copyright©Brick |
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | #endif /* _ASM_X86_SWITCH_TO_H */ #include <asm/vm86.h> #include <asm/resctrl_sched.h> /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_X86_RESCTRL_SCHED_H #define _ASM_X86_RESCTRL_SCHED_H #ifdef CONFIG_X86_CPU_RESCTRL #include <linux/sched.h> #include <linux/jump_label.h> #define IA32_PQR_ASSOC 0x0c8f /** * struct resctrl_pqr_state - State cache for the PQR MSR * @cur_rmid: The cached Resource Monitoring ID * @cur_closid: The cached Class Of Service ID * @default_rmid: The user assigned Resource Monitoring ID * @default_closid: The user assigned cached Class Of Service ID * * The upper 32 bits of IA32_PQR_ASSOC contain closid and the * lower 10 bits rmid. The update to IA32_PQR_ASSOC always * contains both parts, so we need to cache them. This also * stores the user configured per cpu CLOSID and RMID. * * The cache also helps to avoid pointless updates if the value does * not change. */ struct resctrl_pqr_state { u32 cur_rmid; u32 cur_closid; u32 default_rmid; u32 default_closid; }; DECLARE_PER_CPU( struct resctrl_pqr_state, pqr_state); DECLARE_STATIC_KEY_FALSE(rdt_enable_key); DECLARE_STATIC_KEY_FALSE(rdt_alloc_enable_key); DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key); /* * __resctrl_sched_in() - Writes the task's CLOSid/RMID to IA32_PQR_MSR * * Following considerations are made so that this has minimal impact * on scheduler hot path: * - This will stay as no-op unless we are running on an Intel SKU * which supports resource control or monitoring and we enable by * mounting the resctrl file system. * - Caches the per cpu CLOSid/RMID values and does the MSR write only * when a task with a different CLOSid/RMID is scheduled in. * - We allocate RMIDs/CLOSids globally in order to keep this as * simple as possible. * Must be called with preemption disabled. */ static void __resctrl_sched_in( void ) { struct resctrl_pqr_state *state = this_cpu_ptr(&pqr_state); u32 closid = state->default_closid; u32 rmid = state->default_rmid; /* * If this task has a closid/rmid assigned, use it. * Else use the closid/rmid assigned to this cpu. */ if (static_branch_likely(&rdt_alloc_enable_key)) { if (current->closid) closid = current->closid; } if (static_branch_likely(&rdt_mon_enable_key)) { if (current->rmid) rmid = current->rmid; } if (closid != state->cur_closid || rmid != state->cur_rmid) { state->cur_closid = closid; state->cur_rmid = rmid; wrmsr(IA32_PQR_ASSOC, rmid, closid); } } static inline void resctrl_sched_in( void ) { if (static_branch_likely(&rdt_enable_key)) __resctrl_sched_in(); } #else static inline void resctrl_sched_in( void ) {} |