Re: [tip:x86/cpu] x86/cpu: Strip any /proc/ cpuinfo model name field whitespace

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Why?!

We are taking about 48 bytes run once per cpu.  It isn't worth it to optimize, in fact the extra code size hurts more.

On May 28, 2015 5:58:19 AM PDT, Borislav Petkov <bp@xxxxxxxxx> wrote:
>On Thu, May 28, 2015 at 01:32:29PM +0200, Borislav Petkov wrote:
>> +	while (*p) {
>> +		/* Note the last non-whitespace index */
>> +		if (!isspace(*p))
>> +			s = q;
>> +
>> +		*q++ = *p++;
>
>This should be optimized to not copy if there's no preceding whitespace
>and p == q:
>
>From: Borislav Petkov <bp@xxxxxxx>
>Date: Tue, 26 May 2015 10:28:17 +0200
>Subject: [PATCH] x86/cpu: Trim model id whitespace
>
>We did try trimming whitespace surrounding the 'model name' field
>in /proc/cpuinfo since reportedly some userspace uses it in string
>comparisons and there were discrepancies:
>
>[thetango@prarit ~]# grep "^model name" /proc/cpuinfo | uniq -c | sed
>'s/\ /_/g'
>  ______1_model_name      :_AMD_Opteron(TM)_Processor_6272
>_____63_model_name     
>:_AMD_Opteron(TM)_Processor_6272_________________
>
>However, there were issues with overlapping buffers, string sizes and
>non-byte-sized copies in the previous proposed solutions; see Link tags
>below for the whole farce.
>
>So, instead of diddling with this more, let's simply extend what was
>there originally with trimming any present trailing whitespace. Final
>result is really simple and obvious.
>
>Testing with the most insane model IDs qemu can generate, looks good:
>
>  .model_id = "            My funny model ID CPU          ",
>  ______4_model_name      :_My_funny_model_ID_CPU
>
>  .model_id = "My funny model ID CPU          ",
>  ______4_model_name      :_My_funny_model_ID_CPU
>
>  .model_id = "            My funny model ID CPU",
>  ______4_model_name      :_My_funny_model_ID_CPU
>
>  .model_id = "            ",
>  ______4_model_name      :__
>
>  .model_id = "",
>  ______4_model_name      :_15/02
>
>Cc: Andy Lutomirski <luto@xxxxxxxxxxxxxx>
>Cc: Brian Gerst <brgerst@xxxxxxxxx>
>Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
>Cc: Denys Vlasenko <dvlasenk@xxxxxxxxxx>
>Cc: Fenghua Yu <fenghua.yu@xxxxxxxxx>
>Cc: H. Peter Anvin <hpa@xxxxxxxxx>
>Cc: Igor Mammedov <imammedo@xxxxxxxxxx>
>Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
>Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
>Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
>Link:
>http://lkml.kernel.org/r/1432050210-32036-1-git-send-email-prarit@xxxxxxxxxx
>Link:
>http://lkml.kernel.org/r/1432628901-18044-15-git-send-email-bp@xxxxxxxxx
>Signed-off-by: Borislav Petkov <bp@xxxxxxx>
>---
> arch/x86/kernel/cpu/common.c | 27 ++++++++++++++++++++++-----
> 1 file changed, 22 insertions(+), 5 deletions(-)
>
>diff --git a/arch/x86/kernel/cpu/common.c
>b/arch/x86/kernel/cpu/common.c
>index 41a8e9cb30bc..18120a33a2c1 100644
>--- a/arch/x86/kernel/cpu/common.c
>+++ b/arch/x86/kernel/cpu/common.c
>@@ -5,6 +5,7 @@
> #include <linux/module.h>
> #include <linux/percpu.h>
> #include <linux/string.h>
>+#include <linux/ctype.h>
> #include <linux/delay.h>
> #include <linux/sched.h>
> #include <linux/init.h>
>@@ -419,6 +420,7 @@ static const struct cpu_dev
>*cpu_devs[X86_VENDOR_NUM] = {};
> static void get_model_name(struct cpuinfo_x86 *c)
> {
> 	unsigned int *v;
>+	char *p, *q, *s;
> 
> 	if (c->extended_cpuid_level < 0x80000004)
> 		return;
>@@ -429,11 +431,26 @@ static void get_model_name(struct cpuinfo_x86 *c)
> 	cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
> 	c->x86_model_id[48] = 0;
> 
>-	/*
>-	 * Remove leading whitespace on Intel processors and trailing
>-	 * whitespace on AMD processors.
>-	 */
>-	memmove(c->x86_model_id, strim(c->x86_model_id), 48);
>+	/* Trim whitespace */
>+	p = q = s = &c->x86_model_id[0];
>+
>+	while (*p == ' ')
>+		p++;
>+
>+	while (*p) {
>+		/* Note the last non-whitespace index: */
>+		if (!isspace(*p))
>+			s = q;
>+
>+		/* Only copy if p advanced due to whitespace: */
>+		if (p != q)
>+			*q = *p;
>+
>+		p++;
>+		q++;
>+	}
>+
>+	*(s + 1) = '\0';
> }
> 
> void cpu_detect_cache_sizes(struct cpuinfo_x86 *c)

-- 
Sent from my mobile phone.  Please pardon brevity and lack of formatting.
--
To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Stable Commits]     [Linux Stable Kernel]     [Linux Kernel]     [Linux USB Devel]     [Linux Video &Media]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux