Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: ccp - Fix SNP panic notifier unregistration

Panic notifiers are invoked with RCU read lock held and when the
SNP panic notifier tries to unregister itself from the panic
notifier callback itself it causes a deadlock as notifier
unregistration does RCU synchronization.

Code flow for SNP panic notifier:
snp_shutdown_on_panic() ->
__sev_firmware_shutdown() ->
__sev_snp_shutdown_locked() ->
atomic_notifier_chain_unregister(.., &snp_panic_notifier)

Fix SNP panic notifier to unregister itself during SNP shutdown
only if panic is not in progress.

Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: stable@vger.kernel.org
Fixes: 19860c3274fb ("crypto: ccp - Register SNP panic notifier only if SNP is enabled")
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Ashish Kalra and committed by
Herbert Xu
ab8b9fd3 f5ad93ff

+8 -2
+8 -2
drivers/crypto/ccp/sev-dev.c
··· 1787 1787 sev->snp_initialized = false; 1788 1788 dev_dbg(sev->dev, "SEV-SNP firmware shutdown\n"); 1789 1789 1790 - atomic_notifier_chain_unregister(&panic_notifier_list, 1791 - &snp_panic_notifier); 1790 + /* 1791 + * __sev_snp_shutdown_locked() deadlocks when it tries to unregister 1792 + * itself during panic as the panic notifier is called with RCU read 1793 + * lock held and notifier unregistration does RCU synchronization. 1794 + */ 1795 + if (!panic) 1796 + atomic_notifier_chain_unregister(&panic_notifier_list, 1797 + &snp_panic_notifier); 1792 1798 1793 1799 /* Reset TMR size back to default */ 1794 1800 sev_es_tmr_size = SEV_TMR_SIZE;