This source file includes following definitions.
- rdt_fc2context
- is_llc_occupancy_enabled
- is_mbm_total_enabled
- is_mbm_local_enabled
- is_mbm_enabled
- is_mbm_event
1
2 #ifndef _ASM_X86_RESCTRL_INTERNAL_H
3 #define _ASM_X86_RESCTRL_INTERNAL_H
4
5 #include <linux/sched.h>
6 #include <linux/kernfs.h>
7 #include <linux/fs_context.h>
8 #include <linux/jump_label.h>
9
10 #define MSR_IA32_L3_QOS_CFG 0xc81
11 #define MSR_IA32_L2_QOS_CFG 0xc82
12 #define MSR_IA32_L3_CBM_BASE 0xc90
13 #define MSR_IA32_L2_CBM_BASE 0xd10
14 #define MSR_IA32_MBA_THRTL_BASE 0xd50
15 #define MSR_IA32_MBA_BW_BASE 0xc0000200
16
17 #define MSR_IA32_QM_CTR 0x0c8e
18 #define MSR_IA32_QM_EVTSEL 0x0c8d
19
20 #define L3_QOS_CDP_ENABLE 0x01ULL
21
22 #define L2_QOS_CDP_ENABLE 0x01ULL
23
24
25
26
27
28 #define QOS_L3_OCCUP_EVENT_ID 0x01
29 #define QOS_L3_MBM_TOTAL_EVENT_ID 0x02
30 #define QOS_L3_MBM_LOCAL_EVENT_ID 0x03
31
32 #define CQM_LIMBOCHECK_INTERVAL 1000
33
34 #define MBM_CNTR_WIDTH 24
35 #define MBM_OVERFLOW_INTERVAL 1000
36 #define MAX_MBA_BW 100u
37 #define MBA_IS_LINEAR 0x4
38 #define MBA_MAX_MBPS U32_MAX
39 #define MAX_MBA_BW_AMD 0x800
40
41 #define RMID_VAL_ERROR BIT_ULL(63)
42 #define RMID_VAL_UNAVAIL BIT_ULL(62)
43
44
45 struct rdt_fs_context {
46 struct kernfs_fs_context kfc;
47 bool enable_cdpl2;
48 bool enable_cdpl3;
49 bool enable_mba_mbps;
50 };
51
52 static inline struct rdt_fs_context *rdt_fc2context(struct fs_context *fc)
53 {
54 struct kernfs_fs_context *kfc = fc->fs_private;
55
56 return container_of(kfc, struct rdt_fs_context, kfc);
57 }
58
59 DECLARE_STATIC_KEY_FALSE(rdt_enable_key);
60 DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
61
62
63
64
65
66
67 struct mon_evt {
68 u32 evtid;
69 char *name;
70 struct list_head list;
71 };
72
73
74
75
76
77
78
79 union mon_data_bits {
80 void *priv;
81 struct {
82 unsigned int rid : 10;
83 unsigned int evtid : 8;
84 unsigned int domid : 14;
85 } u;
86 };
87
88 struct rmid_read {
89 struct rdtgroup *rgrp;
90 struct rdt_domain *d;
91 int evtid;
92 bool first;
93 u64 val;
94 };
95
96 extern unsigned int resctrl_cqm_threshold;
97 extern bool rdt_alloc_capable;
98 extern bool rdt_mon_capable;
99 extern unsigned int rdt_mon_features;
100
101 enum rdt_group_type {
102 RDTCTRL_GROUP = 0,
103 RDTMON_GROUP,
104 RDT_NUM_GROUP,
105 };
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 enum rdtgrp_mode {
126 RDT_MODE_SHAREABLE = 0,
127 RDT_MODE_EXCLUSIVE,
128 RDT_MODE_PSEUDO_LOCKSETUP,
129 RDT_MODE_PSEUDO_LOCKED,
130
131
132 RDT_NUM_MODES,
133 };
134
135
136
137
138
139
140
141
142 struct mongroup {
143 struct kernfs_node *mon_data_kn;
144 struct rdtgroup *parent;
145 struct list_head crdtgrp_list;
146 u32 rmid;
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 struct pseudo_lock_region {
172 struct rdt_resource *r;
173 struct rdt_domain *d;
174 u32 cbm;
175 wait_queue_head_t lock_thread_wq;
176 int thread_done;
177 int cpu;
178 unsigned int line_size;
179 unsigned int size;
180 void *kmem;
181 unsigned int minor;
182 struct dentry *debugfs_dir;
183 struct list_head pm_reqs;
184 };
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201 struct rdtgroup {
202 struct kernfs_node *kn;
203 struct list_head rdtgroup_list;
204 u32 closid;
205 struct cpumask cpu_mask;
206 int flags;
207 atomic_t waitcount;
208 enum rdt_group_type type;
209 struct mongroup mon;
210 enum rdtgrp_mode mode;
211 struct pseudo_lock_region *plr;
212 };
213
214
215 #define RDT_DELETED 1
216
217
218 #define RFTYPE_FLAGS_CPUS_LIST 1
219
220
221
222
223 #define RFTYPE_INFO BIT(0)
224 #define RFTYPE_BASE BIT(1)
225 #define RF_CTRLSHIFT 4
226 #define RF_MONSHIFT 5
227 #define RF_TOPSHIFT 6
228 #define RFTYPE_CTRL BIT(RF_CTRLSHIFT)
229 #define RFTYPE_MON BIT(RF_MONSHIFT)
230 #define RFTYPE_TOP BIT(RF_TOPSHIFT)
231 #define RFTYPE_RES_CACHE BIT(8)
232 #define RFTYPE_RES_MB BIT(9)
233 #define RF_CTRL_INFO (RFTYPE_INFO | RFTYPE_CTRL)
234 #define RF_MON_INFO (RFTYPE_INFO | RFTYPE_MON)
235 #define RF_TOP_INFO (RFTYPE_INFO | RFTYPE_TOP)
236 #define RF_CTRL_BASE (RFTYPE_BASE | RFTYPE_CTRL)
237
238
239 extern struct list_head rdt_all_groups;
240
241 extern int max_name_width, max_data_width;
242
243 int __init rdtgroup_init(void);
244 void __exit rdtgroup_exit(void);
245
246
247
248
249
250
251
252
253
254
255
256 struct rftype {
257 char *name;
258 umode_t mode;
259 struct kernfs_ops *kf_ops;
260 unsigned long flags;
261 unsigned long fflags;
262
263 int (*seq_show)(struct kernfs_open_file *of,
264 struct seq_file *sf, void *v);
265
266
267
268
269
270 ssize_t (*write)(struct kernfs_open_file *of,
271 char *buf, size_t nbytes, loff_t off);
272 };
273
274
275
276
277
278
279
280
281
282
283
284 struct mbm_state {
285 u64 chunks;
286 u64 prev_msr;
287 u64 chunks_bw;
288 u64 prev_bw_msr;
289 u32 prev_bw;
290 u32 delta_bw;
291 bool delta_comp;
292 };
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315 struct rdt_domain {
316 struct list_head list;
317 int id;
318 struct cpumask cpu_mask;
319 unsigned long *rmid_busy_llc;
320 struct mbm_state *mbm_total;
321 struct mbm_state *mbm_local;
322 struct delayed_work mbm_over;
323 struct delayed_work cqm_limbo;
324 int mbm_work_cpu;
325 int cqm_work_cpu;
326 u32 *ctrl_val;
327 u32 *mbps_val;
328 u32 new_ctrl;
329 bool have_new_ctrl;
330 struct pseudo_lock_region *plr;
331 };
332
333
334
335
336
337
338
339 struct msr_param {
340 struct rdt_resource *res;
341 int low;
342 int high;
343 };
344
345
346
347
348
349
350
351
352
353
354
355
356 struct rdt_cache {
357 unsigned int cbm_len;
358 unsigned int min_cbm_bits;
359 unsigned int cbm_idx_mult;
360 unsigned int cbm_idx_offset;
361 unsigned int shareable_bits;
362 };
363
364
365
366
367
368
369
370
371
372
373
374 struct rdt_membw {
375 u32 max_delay;
376 u32 min_bw;
377 u32 bw_gran;
378 u32 delay_linear;
379 bool mba_sc;
380 u32 *mb_map;
381 };
382
383 static inline bool is_llc_occupancy_enabled(void)
384 {
385 return (rdt_mon_features & (1 << QOS_L3_OCCUP_EVENT_ID));
386 }
387
388 static inline bool is_mbm_total_enabled(void)
389 {
390 return (rdt_mon_features & (1 << QOS_L3_MBM_TOTAL_EVENT_ID));
391 }
392
393 static inline bool is_mbm_local_enabled(void)
394 {
395 return (rdt_mon_features & (1 << QOS_L3_MBM_LOCAL_EVENT_ID));
396 }
397
398 static inline bool is_mbm_enabled(void)
399 {
400 return (is_mbm_total_enabled() || is_mbm_local_enabled());
401 }
402
403 static inline bool is_mbm_event(int e)
404 {
405 return (e >= QOS_L3_MBM_TOTAL_EVENT_ID &&
406 e <= QOS_L3_MBM_LOCAL_EVENT_ID);
407 }
408
409 struct rdt_parse_data {
410 struct rdtgroup *rdtgrp;
411 char *buf;
412 };
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438 struct rdt_resource {
439 int rid;
440 bool alloc_enabled;
441 bool mon_enabled;
442 bool alloc_capable;
443 bool mon_capable;
444 char *name;
445 int num_closid;
446 int cache_level;
447 u32 default_ctrl;
448 unsigned int msr_base;
449 void (*msr_update) (struct rdt_domain *d, struct msr_param *m,
450 struct rdt_resource *r);
451 int data_width;
452 struct list_head domains;
453 struct rdt_cache cache;
454 struct rdt_membw membw;
455 const char *format_str;
456 int (*parse_ctrlval)(struct rdt_parse_data *data,
457 struct rdt_resource *r,
458 struct rdt_domain *d);
459 bool (*cbm_validate)(char *buf, u32 *data, struct rdt_resource *r);
460 struct list_head evt_list;
461 int num_rmid;
462 unsigned int mon_scale;
463 unsigned long fflags;
464 };
465
466 int parse_cbm(struct rdt_parse_data *data, struct rdt_resource *r,
467 struct rdt_domain *d);
468 int parse_bw_intel(struct rdt_parse_data *data, struct rdt_resource *r,
469 struct rdt_domain *d);
470 int parse_bw_amd(struct rdt_parse_data *data, struct rdt_resource *r,
471 struct rdt_domain *d);
472
473 extern struct mutex rdtgroup_mutex;
474
475 extern struct rdt_resource rdt_resources_all[];
476 extern struct rdtgroup rdtgroup_default;
477 DECLARE_STATIC_KEY_FALSE(rdt_alloc_enable_key);
478
479 extern struct dentry *debugfs_resctrl;
480
481 enum {
482 RDT_RESOURCE_L3,
483 RDT_RESOURCE_L3DATA,
484 RDT_RESOURCE_L3CODE,
485 RDT_RESOURCE_L2,
486 RDT_RESOURCE_L2DATA,
487 RDT_RESOURCE_L2CODE,
488 RDT_RESOURCE_MBA,
489
490
491 RDT_NUM_RESOURCES,
492 };
493
494 #define for_each_rdt_resource(r) \
495 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
496 r++)
497
498 #define for_each_capable_rdt_resource(r) \
499 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
500 r++) \
501 if (r->alloc_capable || r->mon_capable)
502
503 #define for_each_alloc_capable_rdt_resource(r) \
504 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
505 r++) \
506 if (r->alloc_capable)
507
508 #define for_each_mon_capable_rdt_resource(r) \
509 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
510 r++) \
511 if (r->mon_capable)
512
513 #define for_each_alloc_enabled_rdt_resource(r) \
514 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
515 r++) \
516 if (r->alloc_enabled)
517
518 #define for_each_mon_enabled_rdt_resource(r) \
519 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
520 r++) \
521 if (r->mon_enabled)
522
523
524 union cpuid_0x10_1_eax {
525 struct {
526 unsigned int cbm_len:5;
527 } split;
528 unsigned int full;
529 };
530
531
532 union cpuid_0x10_3_eax {
533 struct {
534 unsigned int max_delay:12;
535 } split;
536 unsigned int full;
537 };
538
539
540 union cpuid_0x10_x_edx {
541 struct {
542 unsigned int cos_max:16;
543 } split;
544 unsigned int full;
545 };
546
547 void rdt_last_cmd_clear(void);
548 void rdt_last_cmd_puts(const char *s);
549 void rdt_last_cmd_printf(const char *fmt, ...);
550
551 void rdt_ctrl_update(void *arg);
552 struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn);
553 void rdtgroup_kn_unlock(struct kernfs_node *kn);
554 int rdtgroup_kn_mode_restrict(struct rdtgroup *r, const char *name);
555 int rdtgroup_kn_mode_restore(struct rdtgroup *r, const char *name,
556 umode_t mask);
557 struct rdt_domain *rdt_find_domain(struct rdt_resource *r, int id,
558 struct list_head **pos);
559 ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
560 char *buf, size_t nbytes, loff_t off);
561 int rdtgroup_schemata_show(struct kernfs_open_file *of,
562 struct seq_file *s, void *v);
563 bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
564 unsigned long cbm, int closid, bool exclusive);
565 unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct rdt_domain *d,
566 unsigned long cbm);
567 enum rdtgrp_mode rdtgroup_mode_by_closid(int closid);
568 int rdtgroup_tasks_assigned(struct rdtgroup *r);
569 int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
570 int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
571 bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_domain *d, unsigned long cbm);
572 bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_domain *d);
573 int rdt_pseudo_lock_init(void);
574 void rdt_pseudo_lock_release(void);
575 int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
576 void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
577 struct rdt_domain *get_domain_from_cpu(int cpu, struct rdt_resource *r);
578 int update_domains(struct rdt_resource *r, int closid);
579 int closids_supported(void);
580 void closid_free(int closid);
581 int alloc_rmid(void);
582 void free_rmid(u32 rmid);
583 int rdt_get_mon_l3_config(struct rdt_resource *r);
584 void mon_event_count(void *info);
585 int rdtgroup_mondata_show(struct seq_file *m, void *arg);
586 void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
587 unsigned int dom_id);
588 void mkdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
589 struct rdt_domain *d);
590 void mon_event_read(struct rmid_read *rr, struct rdt_domain *d,
591 struct rdtgroup *rdtgrp, int evtid, int first);
592 void mbm_setup_overflow_handler(struct rdt_domain *dom,
593 unsigned long delay_ms);
594 void mbm_handle_overflow(struct work_struct *work);
595 bool is_mba_sc(struct rdt_resource *r);
596 void setup_default_ctrlval(struct rdt_resource *r, u32 *dc, u32 *dm);
597 u32 delay_bw_map(unsigned long bw, struct rdt_resource *r);
598 void cqm_setup_limbo_handler(struct rdt_domain *dom, unsigned long delay_ms);
599 void cqm_handle_limbo(struct work_struct *work);
600 bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d);
601 void __check_limbo(struct rdt_domain *d, bool force_free);
602 bool cbm_validate_intel(char *buf, u32 *data, struct rdt_resource *r);
603 bool cbm_validate_amd(char *buf, u32 *data, struct rdt_resource *r);
604 void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
605
606 #endif