This is where you are wrong. Maybe not wrong in principle, but wrong
in practice -- the kernel's present suspend-to-RAM (or just "suspend")
implementation is _very_ different from C-states (or just "idle").
The primary difference is that the kernel can be forced into suspend
even when the system isn't idle. In particular, it may be in the
middle of processing a potential wakeup event -- and the current design
gives the PM core no way to know if that is so. This is a weakness
that in-kernel suspend blockers fix.
With C-states this can't happen. If the CPU goes into a deeper C-state
then ipso facto it isn't busy processing anything, much less a wakeup
event.
Now maybe this difference is a bad thing, and the whole PM
suspend/hibernate infrastructure should be rewritten. But the fact,
remains, that's how it works now. And it can't be changed easily or
quickly.
Alan Stern
--