mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge tag 'x86_cache_for_6.7_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 resource control updates from Borislav Petkov: - Add support for non-contiguous capacity bitmasks being added to Intel's CAT implementation - Other improvements to resctrl code: better configuration, simplifications, debugging support, fixes * tag 'x86_cache_for_6.7_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/resctrl: Display RMID of resource group x86/resctrl: Add support for the files of MON groups only x86/resctrl: Display CLOSID for resource group x86/resctrl: Introduce "-o debug" mount option x86/resctrl: Move default group file creation to mount x86/resctrl: Unwind properly from rdt_enable_ctx() x86/resctrl: Rename rftype flags for consistency x86/resctrl: Simplify rftype flag definitions x86/resctrl: Add multiple tasks to the resctrl group at once Documentation/x86: Document resctrl's new sparse_masks x86/resctrl: Add sparse_masks file in info x86/resctrl: Enable non-contiguous CBMs in Intel CAT x86/resctrl: Rename arch_has_sparse_bitmaps x86/resctrl: Fix remaining kernel-doc warnings
This commit is contained in:
@@ -152,6 +152,7 @@ static inline void cache_alloc_hsw_probe(void)
|
||||
r->cache.cbm_len = 20;
|
||||
r->cache.shareable_bits = 0xc0000;
|
||||
r->cache.min_cbm_bits = 2;
|
||||
r->cache.arch_has_sparse_bitmasks = false;
|
||||
r->alloc_capable = true;
|
||||
|
||||
rdt_alloc_capable = true;
|
||||
@@ -267,15 +268,18 @@ static void rdt_get_cache_alloc_cfg(int idx, struct rdt_resource *r)
|
||||
{
|
||||
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||
union cpuid_0x10_1_eax eax;
|
||||
union cpuid_0x10_x_ecx ecx;
|
||||
union cpuid_0x10_x_edx edx;
|
||||
u32 ebx, ecx;
|
||||
u32 ebx;
|
||||
|
||||
cpuid_count(0x00000010, idx, &eax.full, &ebx, &ecx, &edx.full);
|
||||
cpuid_count(0x00000010, idx, &eax.full, &ebx, &ecx.full, &edx.full);
|
||||
hw_res->num_closid = edx.split.cos_max + 1;
|
||||
r->cache.cbm_len = eax.split.cbm_len + 1;
|
||||
r->default_ctrl = BIT_MASK(eax.split.cbm_len + 1) - 1;
|
||||
r->cache.shareable_bits = ebx & r->default_ctrl;
|
||||
r->data_width = (r->cache.cbm_len + 3) / 4;
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
r->cache.arch_has_sparse_bitmasks = ecx.split.noncont;
|
||||
r->alloc_capable = true;
|
||||
}
|
||||
|
||||
@@ -872,7 +876,6 @@ static __init void rdt_init_res_defs_intel(void)
|
||||
|
||||
if (r->rid == RDT_RESOURCE_L3 ||
|
||||
r->rid == RDT_RESOURCE_L2) {
|
||||
r->cache.arch_has_sparse_bitmaps = false;
|
||||
r->cache.arch_has_per_cpu_cfg = false;
|
||||
r->cache.min_cbm_bits = 1;
|
||||
} else if (r->rid == RDT_RESOURCE_MBA) {
|
||||
@@ -892,7 +895,7 @@ static __init void rdt_init_res_defs_amd(void)
|
||||
|
||||
if (r->rid == RDT_RESOURCE_L3 ||
|
||||
r->rid == RDT_RESOURCE_L2) {
|
||||
r->cache.arch_has_sparse_bitmaps = true;
|
||||
r->cache.arch_has_sparse_bitmasks = true;
|
||||
r->cache.arch_has_per_cpu_cfg = true;
|
||||
r->cache.min_cbm_bits = 0;
|
||||
} else if (r->rid == RDT_RESOURCE_MBA) {
|
||||
|
||||
@@ -87,10 +87,12 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,
|
||||
|
||||
/*
|
||||
* Check whether a cache bit mask is valid.
|
||||
* For Intel the SDM says:
|
||||
* Please note that all (and only) contiguous '1' combinations
|
||||
* are allowed (e.g. FFFFH, 0FF0H, 003CH, etc.).
|
||||
* Additionally Haswell requires at least two bits set.
|
||||
* On Intel CPUs, non-contiguous 1s value support is indicated by CPUID:
|
||||
* - CPUID.0x10.1:ECX[3]: L3 non-contiguous 1s value supported if 1
|
||||
* - CPUID.0x10.2:ECX[3]: L2 non-contiguous 1s value supported if 1
|
||||
*
|
||||
* Haswell does not support a non-contiguous 1s value and additionally
|
||||
* requires at least two bits set.
|
||||
* AMD allows non-contiguous bitmasks.
|
||||
*/
|
||||
static bool cbm_validate(char *buf, u32 *data, struct rdt_resource *r)
|
||||
@@ -113,8 +115,8 @@ static bool cbm_validate(char *buf, u32 *data, struct rdt_resource *r)
|
||||
first_bit = find_first_bit(&val, cbm_len);
|
||||
zero_bit = find_next_zero_bit(&val, cbm_len, first_bit);
|
||||
|
||||
/* Are non-contiguous bitmaps allowed? */
|
||||
if (!r->cache.arch_has_sparse_bitmaps &&
|
||||
/* Are non-contiguous bitmasks allowed? */
|
||||
if (!r->cache.arch_has_sparse_bitmasks &&
|
||||
(find_next_bit(&val, cbm_len, zero_bit) < cbm_len)) {
|
||||
rdt_last_cmd_printf("The mask %lx has non-consecutive 1-bits\n", val);
|
||||
return false;
|
||||
|
||||
@@ -59,6 +59,7 @@ struct rdt_fs_context {
|
||||
bool enable_cdpl2;
|
||||
bool enable_cdpl3;
|
||||
bool enable_mba_mbps;
|
||||
bool enable_debug;
|
||||
};
|
||||
|
||||
static inline struct rdt_fs_context *rdt_fc2context(struct fs_context *fc)
|
||||
@@ -243,18 +244,17 @@ struct rdtgroup {
|
||||
*/
|
||||
#define RFTYPE_INFO BIT(0)
|
||||
#define RFTYPE_BASE BIT(1)
|
||||
#define RF_CTRLSHIFT 4
|
||||
#define RF_MONSHIFT 5
|
||||
#define RF_TOPSHIFT 6
|
||||
#define RFTYPE_CTRL BIT(RF_CTRLSHIFT)
|
||||
#define RFTYPE_MON BIT(RF_MONSHIFT)
|
||||
#define RFTYPE_TOP BIT(RF_TOPSHIFT)
|
||||
#define RFTYPE_CTRL BIT(4)
|
||||
#define RFTYPE_MON BIT(5)
|
||||
#define RFTYPE_TOP BIT(6)
|
||||
#define RFTYPE_RES_CACHE BIT(8)
|
||||
#define RFTYPE_RES_MB BIT(9)
|
||||
#define RF_CTRL_INFO (RFTYPE_INFO | RFTYPE_CTRL)
|
||||
#define RF_MON_INFO (RFTYPE_INFO | RFTYPE_MON)
|
||||
#define RF_TOP_INFO (RFTYPE_INFO | RFTYPE_TOP)
|
||||
#define RF_CTRL_BASE (RFTYPE_BASE | RFTYPE_CTRL)
|
||||
#define RFTYPE_DEBUG BIT(10)
|
||||
#define RFTYPE_CTRL_INFO (RFTYPE_INFO | RFTYPE_CTRL)
|
||||
#define RFTYPE_MON_INFO (RFTYPE_INFO | RFTYPE_MON)
|
||||
#define RFTYPE_TOP_INFO (RFTYPE_INFO | RFTYPE_TOP)
|
||||
#define RFTYPE_CTRL_BASE (RFTYPE_BASE | RFTYPE_CTRL)
|
||||
#define RFTYPE_MON_BASE (RFTYPE_BASE | RFTYPE_MON)
|
||||
|
||||
/* List of all resource groups */
|
||||
extern struct list_head rdt_all_groups;
|
||||
@@ -270,7 +270,7 @@ void __exit rdtgroup_exit(void);
|
||||
* @mode: Access mode
|
||||
* @kf_ops: File operations
|
||||
* @flags: File specific RFTYPE_FLAGS_* flags
|
||||
* @fflags: File specific RF_* or RFTYPE_* flags
|
||||
* @fflags: File specific RFTYPE_* flags
|
||||
* @seq_show: Show content of the file
|
||||
* @write: Write to the file
|
||||
*/
|
||||
@@ -492,6 +492,15 @@ union cpuid_0x10_3_eax {
|
||||
unsigned int full;
|
||||
};
|
||||
|
||||
/* CPUID.(EAX=10H, ECX=ResID).ECX */
|
||||
union cpuid_0x10_x_ecx {
|
||||
struct {
|
||||
unsigned int reserved:3;
|
||||
unsigned int noncont:1;
|
||||
} split;
|
||||
unsigned int full;
|
||||
};
|
||||
|
||||
/* CPUID.(EAX=10H, ECX=ResID).EDX */
|
||||
union cpuid_0x10_x_edx {
|
||||
struct {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user