Kernel 2.6.14 konečně vyřešil můj problém s memory leakem kdesi v ACPI, takže nezbylo než upgradovat :-). Ovšem nvidiacký modul se poté zuřivě bránil suspendu do paměti, přestože to dříve fungovalo.
Samozřejmě řešení je jednoduché, stačí se podívat, jaké eventy se posílají:
/*
* There are 4 important states driver can be in:
* ON -- driver is working
* FREEZE -- stop operations and apply whatever policy is applicable to a
* suspended driver of that class, freeze queues for block like IDE
* does, drop packets for ethernet, etc... stop DMA engine too etc...
* so a consistent image can be saved; but do not power any hardware
* down.
* SUSPEND - like FREEZE, but hardware is doing as much powersaving as
* possible. Roughly pci D3.
*
* Unfortunately, current drivers only recognize numeric values 0 (ON) and 3
* (SUSPEND). We'll need to fix the drivers. So yes, putting 3 to all different
* defines is intentional, and will go away as soon as drivers are fixed. Also
* note that typedef is neccessary, we'll probably want to switch to
* typedef struct pm_message_t { int event; int flags; } pm_message_t
* or something similar soon.
*/
A příslušně opravit nvidiácké zdrojáky:
--- orig/nv/nv.c 2005-07-19 01:58:40.000000000 +0200
+++ mod/nv/nv.c 2005-11-15 15:28:46.500089000 +0100
@@ -3624,12 +3624,13 @@
switch (state)
{
- case PM_SUSPEND_MEM:
+ case PM_EVENT_SUSPEND:
+ case PM_EVENT_FREEZE:
nv_printf(NV_DBG_INFO, "NVRM: ACPI: received suspend event\n");
status = rm_power_management(nv, 0, NV_PM_ACPI_STANDBY);
break;
- case PM_SUSPEND_ON:
+ case PM_EVENT_ON:
nv_printf(NV_DBG_INFO, "NVRM: ACPI: received resume event\n");
status = rm_power_management(nv, 0, NV_PM_ACPI_RESUME);
break;