Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f039b754 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen
Browse files

[PATCH] x86: Don't use MWAIT on AMD Family 10



It doesn't put the CPU into deeper sleep states, so it's better to use the standard
idle loop to save power. But allow to reenable it anyways for benchmarking.

I also removed the obsolete idle=halt on i386

Cc: andreas.herrmann@amd.com

Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent c169859d
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -695,8 +695,15 @@ and is between 256 and 4096 characters. It is defined in the file
	idebus=		[HW] (E)IDE subsystem - VLB/PCI bus speed
	idebus=		[HW] (E)IDE subsystem - VLB/PCI bus speed
			See Documentation/ide.txt.
			See Documentation/ide.txt.


	idle=		[HW]
	idle=		[X86]
			Format: idle=poll or idle=halt
			Format: idle=poll or idle=mwait
			Poll forces a polling idle loop that can slightly improves the performance
			of waking up a idle CPU, but will use a lot of power and make the system
			run hot. Not recommended.
			idle=mwait. On systems which support MONITOR/MWAIT but the kernel chose
			to not use it because it doesn't save as much power as a normal idle
			loop use the MONITOR/MWAIT idle loop anyways. Performance should be the same
			as idle=poll.


	ignore_loglevel	[KNL]
	ignore_loglevel	[KNL]
			Ignore loglevel setting - this will print /all/
			Ignore loglevel setting - this will print /all/
+5 −0
Original line number Original line Diff line number Diff line
@@ -53,6 +53,8 @@ static __cpuinit int amd_apic_timer_broken(void)
	return 0;
	return 0;
}
}


int force_mwait __cpuinitdata;

static void __cpuinit init_amd(struct cpuinfo_x86 *c)
static void __cpuinit init_amd(struct cpuinfo_x86 *c)
{
{
	u32 l, h;
	u32 l, h;
@@ -275,6 +277,9 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)


	if (amd_apic_timer_broken())
	if (amd_apic_timer_broken())
		set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability);
		set_bit(X86_FEATURE_LAPIC_TIMER_BROKEN, c->x86_capability);

	if (c->x86 == 0x10 && !force_mwait)
		clear_bit(X86_FEATURE_MWAIT, c->x86_capability);
}
}


static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size)
static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size)
+8 −9
Original line number Original line Diff line number Diff line
@@ -274,23 +274,22 @@ void __devinit select_idle_routine(const struct cpuinfo_x86 *c)


static int __init idle_setup(char *str)
static int __init idle_setup(char *str)
{
{
	if (!strncmp(str, "poll", 4)) {
	if (!strcmp(str, "poll")) {
		printk("using polling idle threads.\n");
		printk("using polling idle threads.\n");
		pm_idle = poll_idle;
		pm_idle = poll_idle;
#ifdef CONFIG_X86_SMP
#ifdef CONFIG_X86_SMP
		if (smp_num_siblings > 1)
		if (smp_num_siblings > 1)
			printk("WARNING: polling idle and HT enabled, performance may degrade.\n");
			printk("WARNING: polling idle and HT enabled, performance may degrade.\n");
#endif
#endif
	} else if (!strncmp(str, "halt", 4)) {
	} else if (!strcmp(str, "mwait"))
		printk("using halt in idle threads.\n");
		force_mwait = 1;
		pm_idle = default_idle;
	else
	}
		return -1;


	boot_option_idle_override = 1;
	boot_option_idle_override = 1;
	return 1;
	return 0;
}
}

early_param("idle", idle_setup);
__setup("idle=", idle_setup);


void show_regs(struct pt_regs * regs)
void show_regs(struct pt_regs * regs)
{
{
+7 −5
Original line number Original line Diff line number Diff line
@@ -288,16 +288,18 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)


static int __init idle_setup (char *str)
static int __init idle_setup (char *str)
{
{
	if (!strncmp(str, "poll", 4)) {
	if (!strcmp(str, "poll")) {
		printk("using polling idle threads.\n");
		printk("using polling idle threads.\n");
		pm_idle = poll_idle;
		pm_idle = poll_idle;
	}
	} else if (!strcmp(str, "mwait"))
		force_mwait = 1;
	else
		return -1;


	boot_option_idle_override = 1;
	boot_option_idle_override = 1;
	return 1;
	return 0;
}
}

early_param("idle", idle_setup);
__setup("idle=", idle_setup);


/* Prints also some state that isn't saved in the pt_regs */ 
/* Prints also some state that isn't saved in the pt_regs */ 
void __show_regs(struct pt_regs * regs)
void __show_regs(struct pt_regs * regs)
+6 −0
Original line number Original line Diff line number Diff line
@@ -79,6 +79,8 @@ int bootloader_type;


unsigned long saved_video_mode;
unsigned long saved_video_mode;


int force_mwait __cpuinitdata;

/* 
/* 
 * Early DMI memory
 * Early DMI memory
 */
 */
@@ -604,6 +606,10 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)


	/* RDTSC can be speculated around */
	/* RDTSC can be speculated around */
	clear_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
	clear_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);

	/* Family 10 doesn't support C states in MWAIT so don't use it */
	if (c->x86 == 0x10 && !force_mwait)
		clear_bit(X86_FEATURE_MWAIT, &c->x86_capability);
}
}


static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
Loading