函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

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) {}