RE: [PATCH] nvme/pci: Use host managed power state for suspend

From: Mario.Limonciello
Date: Mon May 13 2019 - 11:07:20 EST

> -----Original Message-----
> From: Keith Busch <kbusch@xxxxxxxxxx>
> Sent: Monday, May 13, 2019 9:55 AM
> To: Limonciello, Mario
> Cc: hch@xxxxxx; keith.busch@xxxxxxxxx; sagi@xxxxxxxxxxx; linux-
> nvme@xxxxxxxxxxxxxxxxxxx; rafael@xxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; linux-
> pm@xxxxxxxxxxxxxxx; kai.heng.feng@xxxxxxxxxxxxx
> Subject: Re: [PATCH] nvme/pci: Use host managed power state for suspend
> On Mon, May 13, 2019 at 02:43:43PM +0000, Mario.Limonciello@xxxxxxxx wrote:
> > > Well, it sounds like your partners device does not work properly in this
> > > case. There is nothing in the NVMe spec that says queues should be
> > > torn down for deep power states, and that whole idea seems rather
> > > counter productive to low-latency suspend/resume cycles.
> >
> > Well I've got a thought, quoting the NVME spec:
> > "After a successful completion of a Set Features command for this feature, the
> controller shall be in the
> > Power State specified. If enabled, autonomous power state transitions continue
> to occur from the new state."
> >
> > If APST is enabled on this disk, what is to stop an autonomous reverse
> > transition from queue activity on the way down?
> Regardless of whether APST is enabled or not, the controller may
> autonomously transition out of a host requested low power state in
> response to host activity. Exiting a low power state should mean some
> other task is actively using the device, and if that's the case, why are
> you trying to enter a low power state in the first place? Alternatively,
> if host activity really is idle, then why is the device autonomously
> leaving the requested state?

This system power state - suspend to idle is going to freeze threads.
But we're talking a multi threaded kernel. Can't there be a timing problem going
on then too? With a disk flush being active in one task and the other task trying
to put the disk into the deepest power state. If you don't freeze the queues how
can you guarantee that didn't happen?