forked from Mirrors/opensbi
		
	lib: sbi_ipi: Process self-IPIs in sbi_ipi_send()
An IPI sent to the local hart can be processed directly instead of triggering the IPI device. This is more efficient, and it avoids a deadlock when the .sync callback is defined. Since interrupts are disabled while handling an ecall, the IPI would not get delivered until the next mret, but sbi_ipi_sync() is called before then. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Xiang W <wxjstz@126.com>
This commit is contained in:
		
				
					committed by
					
						
						Anup Patel
					
				
			
			
				
	
			
			
			
						parent
						
							a894187e28
						
					
				
				
					commit
					446fa65eb5
				
			@@ -60,6 +60,14 @@ static int sbi_ipi_send(struct sbi_scratch *scratch, u32 remote_hartindex,
 | 
			
		||||
				      remote_hartindex, data);
 | 
			
		||||
		if (ret != SBI_IPI_UPDATE_SUCCESS)
 | 
			
		||||
			return ret;
 | 
			
		||||
	} else if (scratch == remote_scratch) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * IPI events with an update() callback are expected to return
 | 
			
		||||
		 * SBI_IPI_UPDATE_BREAK for self-IPIs. For other events, check
 | 
			
		||||
		 * for self-IPI and execute the callback directly here.
 | 
			
		||||
		 */
 | 
			
		||||
		ipi_ops->process(scratch);
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user