lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <6700dc14-98fa-232d-5f8c-68a418849671@suse.com>
Date:   Thu, 1 Jun 2023 08:39:17 +0200
From:   Juergen Gross <jgross@...e.com>
To:     Borislav Petkov <bp@...en8.de>
Cc:     linux-kernel@...r.kernel.org, x86@...nel.org,
        linux-hyperv@...r.kernel.org, linux-doc@...r.kernel.org,
        mikelley@...rosoft.com, Thomas Gleixner <tglx@...utronix.de>,
        Ingo Molnar <mingo@...hat.com>,
        Dave Hansen <dave.hansen@...ux.intel.com>,
        "H. Peter Anvin" <hpa@...or.com>,
        "K. Y. Srinivasan" <kys@...rosoft.com>,
        Haiyang Zhang <haiyangz@...rosoft.com>,
        Wei Liu <wei.liu@...nel.org>, Dexuan Cui <decui@...rosoft.com>,
        Boris Ostrovsky <boris.ostrovsky@...cle.com>,
        xen-devel@...ts.xenproject.org, Jonathan Corbet <corbet@....net>,
        Andy Lutomirski <luto@...nel.org>,
        Peter Zijlstra <peterz@...radead.org>
Subject: Re: [PATCH v6 00/16] x86/mtrr: fix handling with PAT but without MTRR

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@...en8.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@...en8.de>

Reviewed-by: Juergen Gross <jgross@...e.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 {


Download attachment "OpenPGP_0xB0DE9DD628BF132F.asc" of type "application/pgp-keys" (3099 bytes)

Download attachment "OpenPGP_signature" of type "application/pgp-signature" (496 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ