Re: [PATCH v6 00/16] x86/mtrr: fix handling with PAT but without MTRR

Juergen Gross
2023-06-01T06:39:38Z

[-- Attachment #1.1.1: Type: text/plain, Size: 8740 bytes --]

On 31.05.23 19:48, Borislav Petkov wrote:
> On Wed, May 31, 2023 at 04:20:08PM +0200, Juergen Gross wrote:
>> One other note: why does mtrr_cleanup() think that using 8 instead of 6
>> variable MTRRs would be an "optimal setting"?
>
> Maybe the more extensive debug output below would help answer that...

Above question isn't answered, but it at least tells me that the plan was
to write MTRR values as seen on the original kernel.

Looking into the issue with that information in mind.

>
>> IMO it should replace the original setup only in case it is using _less_
>> MTRRs than before.
>
> Right.

I'll look into that later, unless my question below will be answered with
"yes".

>
>> Additionally I believe mtrr_cleanup() would make much more sense if it
>> wouldn't be __init, but being usable when trying to add additional MTRRs
>> in the running system in case we run out of MTRRs.
>>
>> It should probably be based on the new MTRR map anyway...
>
> So I'm not really sure we really care about adding additional MTRRs.

Does this translate to: "we should remove that cleanup crap"? I'd be
positive to that. :-)

> There probably is a use case which does that but I haven't seen one yet
> - MTRRs are all legacy crap to me.

I think there are still a few drivers using them. No idea how often
those drivers are in use, though.

>
> Btw, one more patch ontop:
>
> ---
> From: "Borislav Petkov (AMD)" <bp@alien8.de>
> Date: Wed, 31 May 2023 19:23:34 +0200
> Subject: [PATCH] x86/mtrr: Unify debugging printing
>
> Put all the debugging output behind "mtrr=debug" and get rid of
> "mtrr_cleanup_debug" which wasn't even documented anywhere.
>
> No functional changes.
>
> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>

Reviewed-by: Juergen Gross <jgross@suse.com>

Juergen

> ---
> arch/x86/kernel/cpu/mtrr/cleanup.c | 59 ++++++++++++------------------
> arch/x86/kernel/cpu/mtrr/generic.c | 2 +-
> arch/x86/kernel/cpu/mtrr/mtrr.c | 5 +--
> arch/x86/kernel/cpu/mtrr/mtrr.h | 3 ++
> 4 files changed, 29 insertions(+), 40 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/mtrr/cleanup.c b/arch/x86/kernel/cpu/mtrr/cleanup.c
> index ed5f84c20ac2..18cf79d6e2c5 100644
> --- a/arch/x86/kernel/cpu/mtrr/cleanup.c
> +++ b/arch/x86/kernel/cpu/mtrr/cleanup.c
> @@ -55,9 +55,6 @@ static int __initdata nr_range;
>
> static struct var_mtrr_range_state __initdata range_state[RANGE_NUM];
>
> -static int __initdata debug_print;
> -#define Dprintk(x...) do { if (debug_print) pr_debug(x); } while (0)
> -
> #define BIOS_BUG_MSG \
> "WARNING: BIOS bug: VAR MTRR %d contains strange UC entry under 1M, check with your system vendor!\n"
>
> @@ -79,12 +76,11 @@ x86_get_mtrr_mem_range(struct range *range, int nr_range,
> nr_range = add_range_with_merge(range, RANGE_NUM, nr_range,
> base, base + size);
> }
> - if (debug_print) {
> - pr_debug("After WB checking\n");
> - for (i = 0; i < nr_range; i++)
> - pr_debug("MTRR MAP PFN: %016llx - %016llx\n",
> - range[i].start, range[i].end);
> - }
> +
> + Dprintk("After WB checking\n");
> + for (i = 0; i < nr_range; i++)
> + Dprintk("MTRR MAP PFN: %016llx - %016llx\n",
> + range[i].start, range[i].end);
>
> /* Take out UC ranges: */
> for (i = 0; i < num_var_ranges; i++) {
> @@ -112,24 +108,22 @@ x86_get_mtrr_mem_range(struct range *range, int nr_range,
> subtract_range(range, RANGE_NUM, extra_remove_base,
> extra_remove_base + extra_remove_size);
>
> - if (debug_print) {
> - pr_debug("After UC checking\n");
> - for (i = 0; i < RANGE_NUM; i++) {
> - if (!range[i].end)
> - continue;
> - pr_debug("MTRR MAP PFN: %016llx - %016llx\n",
> - range[i].start, range[i].end);
> - }
> + Dprintk("After UC checking\n");
> + for (i = 0; i < RANGE_NUM; i++) {
> + if (!range[i].end)
> + continue;
> +
> + Dprintk("MTRR MAP PFN: %016llx - %016llx\n",
> + range[i].start, range[i].end);
> }
>
> /* sort the ranges */
> nr_range = clean_sort_range(range, RANGE_NUM);
> - if (debug_print) {
> - pr_debug("After sorting\n");
> - for (i = 0; i < nr_range; i++)
> - pr_debug("MTRR MAP PFN: %016llx - %016llx\n",
> - range[i].start, range[i].end);
> - }
> +
> + Dprintk("After sorting\n");
> + for (i = 0; i < nr_range; i++)
> + Dprintk("MTRR MAP PFN: %016llx - %016llx\n",
> + range[i].start, range[i].end);
>
> return nr_range;
> }
> @@ -164,13 +158,6 @@ static int __init enable_mtrr_cleanup_setup(char *str)
> }
> early_param("enable_mtrr_cleanup", enable_mtrr_cleanup_setup);
>
> -static int __init mtrr_cleanup_debug_setup(char *str)
> -{
> - debug_print = 1;
> - return 0;
> -}
> -early_param("mtrr_cleanup_debug", mtrr_cleanup_debug_setup);
> -
> static void __init
> set_var_mtrr(unsigned int reg, unsigned long basek, unsigned long sizek,
> unsigned char type)
> @@ -267,7 +254,7 @@ range_to_mtrr(unsigned int reg, unsigned long range_startk,
> align = max_align;
>
> sizek = 1UL << align;
> - if (debug_print) {
> + if (mtrr_debug) {
> char start_factor = 'K', size_factor = 'K';
> unsigned long start_base, size_base;
>
> @@ -542,7 +529,7 @@ static void __init print_out_mtrr_range_state(void)
> start_base = to_size_factor(start_base, &start_factor);
> type = range_state[i].type;
>
> - pr_debug("reg %d, base: %ld%cB, range: %ld%cB, type %s\n",
> + Dprintk("reg %d, base: %ld%cB, range: %ld%cB, type %s\n",
> i, start_base, start_factor,
> size_base, size_factor,
> (type == MTRR_TYPE_UNCACHABLE) ? "UC" :
> @@ -714,7 +701,7 @@ int __init mtrr_cleanup(void)
> return 0;
>
> /* Print original var MTRRs at first, for debugging: */
> - pr_debug("original variable MTRRs\n");
> + Dprintk("original variable MTRRs\n");
> print_out_mtrr_range_state();
>
> memset(range, 0, sizeof(range));
> @@ -746,7 +733,7 @@ int __init mtrr_cleanup(void)
>
> if (!result[i].bad) {
> set_var_mtrr_all();
> - pr_debug("New variable MTRRs\n");
> + Dprintk("New variable MTRRs\n");
> print_out_mtrr_range_state();
> return 1;
> }
> @@ -766,7 +753,7 @@ int __init mtrr_cleanup(void)
>
> mtrr_calc_range_state(chunk_size, gran_size,
> x_remove_base, x_remove_size, i);
> - if (debug_print) {
> + if (mtrr_debug) {
> mtrr_print_out_one_result(i);
> pr_info("\n");
> }
> @@ -790,7 +777,7 @@ int __init mtrr_cleanup(void)
> gran_size <<= 10;
> x86_setup_var_mtrrs(range, nr_range, chunk_size, gran_size);
> set_var_mtrr_all();
> - pr_debug("New variable MTRRs\n");
> + Dprintk("New variable MTRRs\n");
> print_out_mtrr_range_state();
> return 1;
> } else {
> diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
> index e5c5192d8a28..58a3848435c4 100644
> --- a/arch/x86/kernel/cpu/mtrr/generic.c
> +++ b/arch/x86/kernel/cpu/mtrr/generic.c
> @@ -41,7 +41,7 @@ struct cache_map {
> u64 fixed:1;
> };
>
> -static bool mtrr_debug;
> +bool mtrr_debug;
>
> static int __init mtrr_param_setup(char *str)
> {
> diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.c b/arch/x86/kernel/cpu/mtrr/mtrr.c
> index ec8670bb5d88..767bf1c71aad 100644
> --- a/arch/x86/kernel/cpu/mtrr/mtrr.c
> +++ b/arch/x86/kernel/cpu/mtrr/mtrr.c
> @@ -332,7 +332,7 @@ static int mtrr_check(unsigned long base, unsigned long size)
> {
> if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
> pr_warn("size and base must be multiples of 4 kiB\n");
> - pr_debug("size: 0x%lx base: 0x%lx\n", size, base);
> + Dprintk("size: 0x%lx base: 0x%lx\n", size, base);
> dump_stack();
> return -1;
> }
> @@ -423,8 +423,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
> }
> }
> if (reg < 0) {
> - pr_debug("no MTRR for %lx000,%lx000 found\n",
> - base, size);
> + Dprintk("no MTRR for %lx000,%lx000 found\n", base, size);
> goto out;
> }
> }
> diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.h b/arch/x86/kernel/cpu/mtrr/mtrr.h
> index 8385d7d3a865..5655f253d929 100644
> --- a/arch/x86/kernel/cpu/mtrr/mtrr.h
> +++ b/arch/x86/kernel/cpu/mtrr/mtrr.h
> @@ -10,6 +10,9 @@
> #define MTRR_CHANGE_MASK_VARIABLE 0x02
> #define MTRR_CHANGE_MASK_DEFTYPE 0x04
>
> +extern bool mtrr_debug;
> +#define Dprintk(x...) do { if (mtrr_debug) pr_info(x); } while (0)
> +
> extern unsigned int mtrr_usage_table[MTRR_MAX_VAR_RANGES];
>
> struct mtrr_ops {

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]