From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Frans Pop <elendil@planet.nl>, Zhang Rui <rui.zhang@intel.com>,
Len Brown <lenb@kernel.org>, "Rafael J. Wysocki" <rjw@sisk.pl>,
Rusty Russell <rusty@rustcorp.com.au>
Subject: [patch 50/71] ACPI processor: force throttling state when BIOS returns incorrect value
Date: Fri, 04 Sep 2009 17:14:25 -0700 [thread overview]
Message-ID: <20090905001455.060330272@mini.kroah.org> (raw)
In-Reply-To: <20090905001824.GA18171@kroah.com>
[-- Attachment #1: acpi-processor-force-throttling-state-when-bios-returns-incorrect-value.patch --]
[-- Type: text/plain, Size: 7138 bytes --]
2.6.30-stable review patch. If anyone has any objections, please let us know.
------------------
From: Frans Pop <elendil@planet.nl>
commit 2a908002c7b1b666616103e9df2419b38d7c6f1f upstream.
If the BIOS reports an invalid throttling state (which seems to be
fairly common after system boot), a reset is done to state T0.
Because of a check in acpi_processor_get_throttling_ptc(), the reset
never actually gets executed, which results in the error reoccurring
on every access of for example /proc/acpi/processor/CPU0/throttling.
Add a 'force' option to acpi_processor_set_throttling() to ensure
the reset really takes effect.
Addresses http://bugzilla.kernel.org/show_bug.cgi?id=13389
This patch, together with the next one, fixes a regression introduced in
2.6.30, listed on the regression list. They have been available for 2.5
months now in bugzilla, but have not been picked up, despite various
reminders and without any reason given.
Google shows that numerous people are hitting this issue. The issue is in
itself relatively minor, but the bug in the code is clear.
The patches have been in all my kernels and today testing has shown that
throttling works correctly with the patches applied when the system
overheats (http://bugzilla.kernel.org/show_bug.cgi?id=13918#c14).
Signed-off-by: Frans Pop <elendil@planet.nl>
Acked-by: Zhang Rui <rui.zhang@intel.com>
Cc: Len Brown <lenb@kernel.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/acpi/processor_thermal.c | 6 +++---
drivers/acpi/processor_throttling.c | 26 ++++++++++++++------------
include/acpi/processor.h | 5 +++--
3 files changed, 20 insertions(+), 17 deletions(-)
--- a/drivers/acpi/processor_thermal.c
+++ b/drivers/acpi/processor_thermal.c
@@ -66,7 +66,7 @@ static int acpi_processor_apply_limit(st
if (pr->limit.thermal.tx > tx)
tx = pr->limit.thermal.tx;
- result = acpi_processor_set_throttling(pr, tx);
+ result = acpi_processor_set_throttling(pr, tx, false);
if (result)
goto end;
}
@@ -421,12 +421,12 @@ processor_set_cur_state(struct thermal_c
if (state <= max_pstate) {
if (pr->flags.throttling && pr->throttling.state)
- result = acpi_processor_set_throttling(pr, 0);
+ result = acpi_processor_set_throttling(pr, 0, false);
cpufreq_set_cur_state(pr->id, state);
} else {
cpufreq_set_cur_state(pr->id, max_pstate);
result = acpi_processor_set_throttling(pr,
- state - max_pstate);
+ state - max_pstate, false);
}
return result;
}
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -62,7 +62,8 @@ struct throttling_tstate {
#define THROTTLING_POSTCHANGE (2)
static int acpi_processor_get_throttling(struct acpi_processor *pr);
-int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
+int acpi_processor_set_throttling(struct acpi_processor *pr,
+ int state, bool force);
static int acpi_processor_update_tsd_coord(void)
{
@@ -361,7 +362,7 @@ int acpi_processor_tstate_has_changed(st
*/
target_state = throttling_limit;
}
- return acpi_processor_set_throttling(pr, target_state);
+ return acpi_processor_set_throttling(pr, target_state, false);
}
/*
@@ -842,7 +843,7 @@ static int acpi_processor_get_throttling
ACPI_WARNING((AE_INFO,
"Invalid throttling state, reset"));
state = 0;
- ret = acpi_processor_set_throttling(pr, state);
+ ret = acpi_processor_set_throttling(pr, state, true);
if (ret)
return ret;
}
@@ -915,7 +916,7 @@ static int acpi_processor_get_fadt_info(
}
static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,
- int state)
+ int state, bool force)
{
u32 value = 0;
u32 duty_mask = 0;
@@ -930,7 +931,7 @@ static int acpi_processor_set_throttling
if (!pr->flags.throttling)
return -ENODEV;
- if (state == pr->throttling.state)
+ if (!force && (state == pr->throttling.state))
return 0;
if (state < pr->throttling_platform_limit)
@@ -988,7 +989,7 @@ static int acpi_processor_set_throttling
}
static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
- int state)
+ int state, bool force)
{
int ret;
acpi_integer value;
@@ -1002,7 +1003,7 @@ static int acpi_processor_set_throttling
if (!pr->flags.throttling)
return -ENODEV;
- if (state == pr->throttling.state)
+ if (!force && (state == pr->throttling.state))
return 0;
if (state < pr->throttling_platform_limit)
@@ -1018,7 +1019,8 @@ static int acpi_processor_set_throttling
return 0;
}
-int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
+int acpi_processor_set_throttling(struct acpi_processor *pr,
+ int state, bool force)
{
cpumask_var_t saved_mask;
int ret = 0;
@@ -1070,7 +1072,7 @@ int acpi_processor_set_throttling(struct
/* FIXME: use work_on_cpu() */
set_cpus_allowed_ptr(current, cpumask_of(pr->id));
ret = p_throttling->acpi_processor_set_throttling(pr,
- t_state.target_state);
+ t_state.target_state, force);
} else {
/*
* When the T-state coordination is SW_ALL or HW_ALL,
@@ -1103,7 +1105,7 @@ int acpi_processor_set_throttling(struct
set_cpus_allowed_ptr(current, cpumask_of(i));
ret = match_pr->throttling.
acpi_processor_set_throttling(
- match_pr, t_state.target_state);
+ match_pr, t_state.target_state, force);
}
}
/*
@@ -1201,7 +1203,7 @@ int acpi_processor_get_throttling_info(s
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Disabling throttling (was T%d)\n",
pr->throttling.state));
- result = acpi_processor_set_throttling(pr, 0);
+ result = acpi_processor_set_throttling(pr, 0, false);
if (result)
goto end;
}
@@ -1307,7 +1309,7 @@ static ssize_t acpi_processor_write_thro
if (strcmp(tmpbuf, charp) != 0)
return -EINVAL;
- result = acpi_processor_set_throttling(pr, state_val);
+ result = acpi_processor_set_throttling(pr, state_val, false);
if (result)
return result;
--- a/include/acpi/processor.h
+++ b/include/acpi/processor.h
@@ -174,7 +174,7 @@ struct acpi_processor_throttling {
cpumask_var_t shared_cpu_map;
int (*acpi_processor_get_throttling) (struct acpi_processor * pr);
int (*acpi_processor_set_throttling) (struct acpi_processor * pr,
- int state);
+ int state, bool force);
u32 address;
u8 duty_offset;
@@ -320,7 +320,8 @@ static inline int acpi_processor_ppc_has
/* in processor_throttling.c */
int acpi_processor_tstate_has_changed(struct acpi_processor *pr);
int acpi_processor_get_throttling_info(struct acpi_processor *pr);
-extern int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
+extern int acpi_processor_set_throttling(struct acpi_processor *pr,
+ int state, bool force);
extern const struct file_operations acpi_processor_throttling_fops;
extern void acpi_processor_throttling_init(void);
/* in processor_idle.c */
next prev parent reply other threads:[~2009-09-05 0:27 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090905001335.106974681@mini.kroah.org>
2009-09-05 0:18 ` [patch 00/71] 2.6.30.6-stable review Greg KH
2009-09-05 0:13 ` [patch 01/71] ehea: Fix napi list corruption on ifconfig down Greg KH
2009-09-05 0:13 ` [patch 02/71] poll/select: initialize triggered field of struct poll_wqueues Greg KH
2009-09-05 0:13 ` [patch 03/71] Make bitmask and operators return a result code Greg KH
2009-09-05 0:13 ` [patch 04/71] x86: dont send an IPI to the empty set of CPUs Greg KH
2009-09-05 0:13 ` [patch 05/71] x86: dont call ->send_IPI_mask() with an empty mask Greg KH
2009-09-05 0:13 ` [patch 06/71] mm: build_zonelists(): move clear node_load[] to __build_all_zonelists() Greg KH
2009-09-05 0:13 ` [patch 07/71] rt2x00: fix memory corruption in rf cache, add a sanity check Greg KH
2009-09-05 0:13 ` [patch 08/71] mac80211: fix panic when splicing unprepared TIDs Greg KH
2009-09-05 0:13 ` [patch 09/71] Re-introduce page mapping check in mark_buffer_dirty() Greg KH
2009-09-05 0:13 ` [patch 10/71] mm: fix hugetlb bug due to user_shm_unlock call Greg KH
2009-09-05 0:13 ` [patch 11/71] ima: hashing large files bug fix Greg KH
2009-09-05 0:13 ` [patch 12/71] kernel_read: redefine offset type Greg KH
2009-09-05 0:13 ` [patch 13/71] tracing: Fix too large stack usage in do_one_initcall() Greg KH
2009-09-05 0:13 ` [patch 14/71] sound: pcm_lib: fix unsorted list constraint handling Greg KH
2009-09-05 0:13 ` [patch 15/71] clone(): fix race between copy_process() and de_thread() Greg KH
2009-09-05 0:13 ` [patch 16/71] wmi: fix kernel panic when stack protection enabled Greg KH
2009-09-05 0:13 ` [patch 17/71] SUNRPC: Fix rpc_task_force_reencode Greg KH
2009-09-05 0:13 ` [patch 18/71] ALSA: hda - Fix MacBookPro 3,1/4,1 quirk with ALC889A Greg KH
2009-09-05 0:13 ` [patch 19/71] KVM: take mmu_lock when updating a deleted slot Greg KH
2009-09-05 0:13 ` [patch 20/71] KVM: x86: check for cr3 validity in mmu_alloc_roots Greg KH
2009-09-05 0:13 ` [patch 21/71] KVM: MMU: protect kvm_mmu_change_mmu_pages with mmu_lock Greg KH
2009-09-05 0:13 ` [patch 22/71] KVM: MMU: do not free active mmu pages in free_mmu_pages() Greg KH
2009-09-05 0:13 ` [patch 23/71] KVM: Introduce {set/get}_interrupt_shadow() Greg KH
2009-09-05 0:13 ` [patch 24/71] KVM: Deal with interrupt shadow state for emulated instructions Greg KH
2009-09-05 0:14 ` [patch 25/71] KVM: MMU: Use different shadows when EFER.NXE changes Greg KH
2009-09-05 0:14 ` [patch 26/71] KVM: x86: Ignore reads to EVNTSEL MSRs Greg KH
2009-09-05 0:14 ` [patch 27/71] KVM: Ignore reads to K7 " Greg KH
2009-09-05 0:14 ` [patch 28/71] KVM: Fix cpuid feature misreporting Greg KH
2009-09-05 0:14 ` [patch 29/71] KVM: x86: verify MTRR/PAT validity Greg KH
2009-09-05 0:14 ` [patch 30/71] KVM: SVM: force new asid on vcpu migration Greg KH
2009-09-05 0:14 ` [patch 31/71] KVM: MMU: handle n_free_mmu_pages > n_alloc_mmu_pages in kvm_mmu_change_mmu_pages Greg KH
2009-09-05 0:14 ` [patch 32/71] [stable] [PATCH 14/16] KVM: MMU: limit rmap chain length Greg KH
2009-09-05 0:14 ` [patch 33/71] KVM: fix ack not being delivered when msi present Greg KH
2009-09-05 0:14 ` [patch 34/71] KVM: Fix KVM_GET_MSR_INDEX_LIST Greg KH
2009-09-05 0:14 ` [patch 35/71] iwl3945: fix rfkill switch Greg KH
2009-09-05 0:14 ` [patch 36/71] iwlagn: do not send key clear commands when rfkill enabled Greg KH
2009-09-05 0:14 ` [patch 37/71] libata: OCZ Vertex cant do HPA Greg KH
2009-09-05 0:14 ` [patch 38/71] SCSI: mpt2sas: Introduced check for enclosure_handle to avoid crash Greg KH
2009-09-05 0:14 ` [patch 39/71] SCSI: mpt2sas: Expander fix oops saying "Already part of another port" Greg KH
2009-09-05 0:14 ` [patch 40/71] SCSI: mpt2sas: Raid 10 Value is showing as Raid 1E in /va/log/messages Greg KH
2009-09-05 0:14 ` [patch 41/71] SCSI: mpt2sas: Excessive log info causes sas iounit page time out Greg KH
2009-09-05 0:14 ` [patch 42/71] SCSI: mpt2sas: fix infinite loop inside config request Greg KH
2009-09-05 0:14 ` [patch 43/71] SCSI: mpt2sas: fix crash due to Watchdog is active while OS in standby mode Greg KH
2009-09-05 0:14 ` [patch 44/71] SCSI: mpt2sas: fix oops because drv data points to NULL on resume from hibernate Greg KH
2009-09-05 0:14 ` [patch 45/71] [SCSI] mpt2sas: fix config request and diag reset deadlock Greg KH
2009-09-05 0:14 ` [patch 46/71] do_sigaltstack: avoid copying stack_t as a structure to user space Greg KH
2009-09-05 0:14 ` [patch 47/71] Bug Fix arch/ia64/kernel/pci-dma.c: fix recursive dma_supported() call in iommu_dma_supported() Greg KH
2009-09-05 0:14 ` [patch 48/71] x86, amd: Dont probe for extended APIC ID if APICs are disabled Greg KH
2009-09-05 0:14 ` [patch 49/71] ocfs2: Initialize the cluster were writing to in a non-sparse extend Greg KH
2009-09-05 0:14 ` Greg KH [this message]
2009-09-05 0:14 ` [patch 51/71] vfs: fix inode_init_always calling convention Greg KH
2009-09-05 0:14 ` [patch 52/71] vfs: add __destroy_inode Greg KH
2009-09-05 0:14 ` [patch 53/71] xfs: fix freeing of inodes not yet added to the inode cache Greg KH
2009-09-05 0:14 ` [patch 54/71] xfs: fix spin_is_locked assert on uni-processor builds Greg KH
2009-09-05 0:14 ` [patch 55/71] gspca - ov534: Fix ov772x Greg KH
2009-09-05 0:14 ` [patch 56/71] kthreads: fix kthread_create() vs kthread_stop() race Greg KH
2009-09-05 0:14 ` [patch 57/71] ipv6: Fix commit 63d9950b08184e6531adceb65f64b429909cc101 (ipv6: Make v4-mapped bindings consistent with IPv4) Greg KH
2009-09-05 0:14 ` [patch 58/71] USB: fix the clear_tt_buffer interface Greg KH
2009-09-05 0:14 ` [patch 59/71] USB: EHCI: use the new " Greg KH
2009-09-05 0:14 ` [patch 60/71] USB: EHCI: fix two new bugs related to Clear-TT-Buffer Greg KH
2009-09-05 0:14 ` [patch 61/71] powerpc/ps3: Add missing check for PS3 to rtc-ps3 platform device registration Greg KH
2009-09-05 0:14 ` [patch 62/71] ipv4: make ip_append_data() handle NULL routing table Greg KH
2009-09-05 0:14 ` [patch 63/71] ar9170: fix read & write outside array bounds Greg KH
2009-09-05 0:14 ` [patch 64/71] xenfb: connect to backend before registering fb Greg KH
2009-09-05 0:14 ` [patch 65/71] can: Fix raw_getname() leak Greg KH
2009-09-05 0:14 ` [patch 66/71] irda: Fix irda_getname() leak Greg KH
2009-09-05 0:14 ` [patch 67/71] appletalk: fix atalk_getname() leak Greg KH
2009-09-05 0:14 ` [patch 68/71] netrom: Fix nr_getname() leak Greg KH
2009-09-05 0:14 ` [patch 69/71] econet: Fix econet_getname() leak Greg KH
2009-09-05 0:14 ` [patch 70/71] rose: Fix rose_getname() leak Greg KH
2009-09-05 0:14 ` [patch 71/71] NET: llc, zero sockaddr_llc struct Greg KH
2009-09-05 4:54 ` [patch 00/71] 2.6.30.6-stable review Grant Coady
2009-09-05 14:48 ` Greg KH
2009-09-08 19:23 ` [Stable-review] " Luis R. Rodriguez
2009-09-09 22:44 ` Greg KH
2009-09-10 0:21 ` Luis R. Rodriguez
2009-09-10 3:00 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090905001455.060330272@mini.kroah.org \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=elendil@planet.nl \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@sisk.pl \
--cc=rui.zhang@intel.com \
--cc=rusty@rustcorp.com.au \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox