Re: Uhhuh. NMI received for unknown reason 2c on CPU 0.

From: Rafael J. Wysocki
Date: Sat Feb 02 2013 - 17:58:46 EST


On Thursday, January 31, 2013 02:10:34 PM Borislav Petkov wrote:
> On Thu, Jan 31, 2013 at 02:12:58PM +0100, Rafael J. Wysocki wrote:
> > Yes, there are two bugs in e1000e, it appears. Konstantin's
> > patch [2/5] fixes one of them, but the other one has to be fixed
> > differently.
> >
> > Boris, would you be able to test a couple of e1000e patches for me?
>
> Sure, send them on. You can add 2/5 in the mix too.

There you go.

The [2/5] is at: https://patchwork.kernel.org/patch/2001211/

The other two are attached. I suppose the ordering doesn't matter.

Thanks,
Rafael


--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.---
drivers/net/ethernet/intel/e1000e/netdev.c | 1 +
drivers/pci/pci.c | 1 +
drivers/pci/pci.h | 1 -
include/linux/pci.h | 1 +
4 files changed, 3 insertions(+), 1 deletion(-)

Index: linux-pm/drivers/pci/pci.c
===================================================================
--- linux-pm.orig/drivers/pci/pci.c
+++ linux-pm/drivers/pci/pci.c
@@ -1840,6 +1840,7 @@ int pci_finish_runtime_suspend(struct pc

return error;
}
+EXPORT_SYMBOL_GPL(pci_finish_runtime_suspend);

/**
* pci_dev_run_wake - Check if device can generate run-time wake-up events.
Index: linux-pm/drivers/pci/pci.h
===================================================================
--- linux-pm.orig/drivers/pci/pci.h
+++ linux-pm/drivers/pci/pci.h
@@ -64,7 +64,6 @@ extern int pci_set_platform_pm(struct pc
extern void pci_update_current_state(struct pci_dev *dev, pci_power_t state);
extern void pci_power_up(struct pci_dev *dev);
extern void pci_disable_enabled_device(struct pci_dev *dev);
-extern int pci_finish_runtime_suspend(struct pci_dev *dev);
extern int __pci_pme_wakeup(struct pci_dev *dev, void *ign);
extern void pci_wakeup_bus(struct pci_bus *bus);
extern void pci_config_pm_runtime_get(struct pci_dev *dev);
Index: linux-pm/include/linux/pci.h
===================================================================
--- linux-pm.orig/include/linux/pci.h
+++ linux-pm/include/linux/pci.h
@@ -936,6 +936,7 @@ int pci_back_from_sleep(struct pci_dev *
bool pci_dev_run_wake(struct pci_dev *dev);
bool pci_check_pme_status(struct pci_dev *dev);
void pci_pme_wakeup_bus(struct pci_bus *bus);
+int pci_finish_runtime_suspend(struct pci_dev *dev);

static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
bool enable)
Index: linux-pm/drivers/net/ethernet/intel/e1000e/netdev.c
===================================================================
--- linux-pm.orig/drivers/net/ethernet/intel/e1000e/netdev.c
+++ linux-pm/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -5696,6 +5696,7 @@ static int e1000_runtime_suspend(struct
bool wake;

__e1000_shutdown(pdev, &wake, true);
+ pci_finish_runtime_suspend(pdev);
}

return 0;
---
drivers/pci/pci-driver.c | 4 ++++
1 file changed, 4 insertions(+)

Index: linux-pm/drivers/pci/pci-driver.c
===================================================================
--- linux-pm.orig/drivers/pci/pci-driver.c
+++ linux-pm/drivers/pci/pci-driver.c
@@ -628,6 +628,7 @@ static int pci_pm_suspend(struct device
goto Fixup;
}

+ pci_dev->state_saved = false;
if (pm->suspend) {
pci_power_t prev = pci_dev->current_state;
int error;
@@ -774,6 +775,7 @@ static int pci_pm_freeze(struct device *
return 0;
}

+ pci_dev->state_saved = false;
if (pm->freeze) {
int error;

@@ -862,6 +864,7 @@ static int pci_pm_poweroff(struct device
goto Fixup;
}

+ pci_dev->state_saved = false;
if (pm->poweroff) {
int error;

@@ -987,6 +990,7 @@ static int pci_pm_runtime_suspend(struct
if (!pm || !pm->runtime_suspend)
return -ENOSYS;

+ pci_dev->state_saved = false;
pci_dev->no_d3cold = false;
error = pm->runtime_suspend(dev);
suspend_report_result(pm->runtime_suspend, error);