Anyone already tried to backport the latest ASPM kernel patch to 6.2?
After going from CentOS 5.7 to 6.2, a lot of things turned out to be
much better, but there are also quite some regressions. The most obvious
one is power consumption on my notebook. It was notably lower before.
The ASPM issue introduced in 2.6.38 was widely reported and discussed,
and the 6.2 kernel has exacatly this code as a backport.
if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {
printk(KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it
");
- pcie_clear_aspm();
pcie_no_aspm();
}
-static int aspm_disabled, aspm_force, aspm_clear_state;
+static int aspm_disabled, aspm_force;
static bool aspm_support_enabled = true;
static DEFINE_MUTEX(aspm_lock);
static LIST_HEAD(link_list);
@@ -500,9 +500,6 @@
int pos;
u32 reg32;
- if (aspm_clear_state)
- return -EINVAL;
-
/*
* Some functions in a slot might not all be PCIe functions,
* very strange. Disable ASPM for the whole slot
@@ -574,9 +571,6 @@
pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
return;
- if (aspm_disabled && !aspm_clear_state)
- return;
-
/* VIA has a strange chipset, root port is under a bridge */
if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT &&
pdev->bus->self)
@@ -608,7 +602,7 @@
* the BIOS's expectation, we'll do so once pci_enable_device() is
* called.
*/
- if (aspm_policy != POLICY_POWERSAVE || aspm_clear_state) {
+ if (aspm_policy != POLICY_POWERSAVE) {
pcie_config_aspm_path(link);
pcie_set_clkpm(link, policy_to_clkpm_state(link));
}
@@ -649,8 +643,7 @@
struct pci_dev *parent = pdev->bus->self;
struct pcie_link_state *link, *root, *parent_link;
- if ((aspm_disabled && !aspm_clear_state) || !pdev->is_pcie ||
- !parent || !parent->link_state)
+ if (!pdev->is_pcie || !parent || !parent->link_state)
return;
if ((parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT) &&
(parent->pcie_type != PCI_EXP_TYPE_DOWNSTREAM))
@@ -712,13 +705,18 @@
* pci_disable_link_state - disable pci device's link state, so the link will
* never enter specific states
*/
-static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem)
+static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem,
+ bool force)
{
struct pci_dev *parent = pdev->bus->self;
struct pcie_link_state *link;
- if (aspm_disabled || !pdev->is_pcie)
+ if (aspm_disabled && !force)
+ return;
+
+ if (!pdev->is_pcie)
return;
+
if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
pdev->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
parent = pdev;
@@ -746,16 +744,31 @@
+void pcie_clear_aspm(struct pci_bus *bus)
+{
+ struct pci_dev *child;
+
+ /*
+ * Clear any ASPM setup that the firmware has carried out on this bus
+ */
+ list_for_each_entry(child, &bus->devices, bus_list) {
+ __pci_disable_link_state(child, PCIE_LINK_STATE_L0S |
+ PCIE_LINK_STATE_L1 |
+ PCIE_LINK_STATE_CLKPM,
+ false, true);
+ }
+}
+
static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp)
{
int i;
@@ -907,6 +920,7 @@
static int __init pcie_aspm_disable(char *str)
{
if (!strcmp(str, "off")) {
+ aspm_policy = POLICY_DEFAULT;
aspm_disabled = 1;
aspm_support_enabled = false;
printk(KERN_INFO "PCIe ASPM is disabled
");
@@ -919,16 +933,18 @@
__setup("pcie_aspm=", pcie_aspm_disable);
-void pcie_clear_aspm(void)
-{
- if (!aspm_force)
- aspm_clear_state = 1;
-}
-
void pcie_no_aspm(void)
{
- if (!aspm_force)
+ /*
+ * Disabling ASPM is intended to prevent the kernel from modifying
+ * existing hardware state, not to clear existing state. To that end:
+ * (a) set policy to POLICY_DEFAULT in order to avoid changing state
+ * (b) prevent userspace from changing policy
+ */
+ if (!aspm_force) {
+ aspm_policy = POLICY_DEFAULT;
aspm_disabled = 1;
+ }
}
Anyone already tried to backport the latest ASPM kernel patch to 6.2?
On 12-02-12 23:57, Michael Lampe wrote:
> After going from CentOS 5.7 to 6.2, a lot of things turned out to be
> much better, but there are also quite some regressions. The most obvious
> one is power consumption on my notebook. It was notably lower before.
>
> The ASPM issue introduced in 2.6.38 was widely reported and discussed,
> and the 6.2 kernel has exacatly this code as a backport.
>
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=2f671e2dbff6eb5ef4e2600adbe c550c13b8fe72
>
>
> So I started to experiment with the upstream patch:
>
> http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=commitdiff;h=3c076351c4027a56d5005a39 a0b518a4ba393ce2;hp=69166fbf02c7a21745013f2de037bf 7af26e4279
>
>
> To make it apply, one needs to change 'pci_is_pcie(pdev)' into
> 'pdev->is_pcie'. One also needs to fiddle a little with the first chunk.
>
> I came up with the patch attached, but unfortunately the new kernel
> showed no improvement. Most probably I got something wrong.
>
> Anyone else here who tried this or is interested in sorting this out?
Iirc to enable ASPM on Fedora the kernel must be booted with
pcie_aspm=force. Maybe you need to use that option too? For more info
see:
http://www.phoronix.com/scan.php?page=article&item=linux_aspm_solution&num =1
Regards,
Patrick
_______________________________________________
CentOS mailing list
CentOS@centos.org
http://lists.centos.org/mailman/listinfo/centos