On Tue, Mar 28, 2023 at 03:16:36PM +0000, Jeremi Piotrowski wrote: > The PSP IRQ is edge-triggered (MSI or MSI-X) in all cases supported by > the psp module so clear the interrupt status register early in the > handler to prevent missed interrupts. sev_irq_handler() calls wake_up() > on a wait queue, which can result in a new command being submitted from > a different CPU. This then races with the clearing of isr and can result > in missed interrupts. A missed interrupt results in a command waiting > until it times out, which results in the psp being declared dead. > > This is unlikely on bare metal, but has been observed when running > virtualized. In the cases where this is observed, sev->cmdresp_reg has > PSP_CMDRESP_RESP set which indicates that the command was processed > correctly but no interrupt was asserted. > > The full sequence of events looks like this: > > CPU 1: submits SEV cmd #1 > CPU 1: calls wait_event_timeout() > CPU 0: enters psp_irq_handler() > CPU 0: calls sev_handler()->wake_up() > CPU 1: wakes up; finishes processing cmd #1 > CPU 1: submits SEV cmd #2 > CPU 1: calls wait_event_timeout() > PSP: finishes processing cmd #2; interrupt status is still set; no interrupt > CPU 0: clears intsts > CPU 0: exits psp_irq_handler() > CPU 1: wait_event_timeout() times out; psp_dead=true > > Fixes: 200664d5237f ("crypto: ccp: Add Secure Encrypted Virtualization (SEV) command support") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Jeremi Piotrowski <jpiotrowski@xxxxxxxxxxxxxxxxxxx> > --- > drivers/crypto/ccp/psp-dev.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) Patch applied. Thanks. -- Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt