diff options
| author | Nathan Lynch <nathanl@linux.ibm.com> | 2021-09-29 00:41:46 +0300 | 
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2021-10-08 16:15:59 +0300 | 
| commit | 799f9b51db688608b50e630a57bee5f699b268ca (patch) | |
| tree | ca40b391cb900daa36f373636be6dffda6d96903 | |
| parent | 56537faf8821e361d739fc5ff58c9c40f54a1d4c (diff) | |
| download | linux-799f9b51db688608b50e630a57bee5f699b268ca.tar.xz | |
powerpc/paravirt: vcpu_is_preempted() commentary
Add comments more clearly documenting that this function determines whether
hypervisor-level preemption of the VM has occurred.
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210928214147.312412-2-nathanl@linux.ibm.com
| -rw-r--r-- | arch/powerpc/include/asm/paravirt.h | 22 | 
1 files changed, 18 insertions, 4 deletions
| diff --git a/arch/powerpc/include/asm/paravirt.h b/arch/powerpc/include/asm/paravirt.h index bcb7b5f917be..39f173961f6a 100644 --- a/arch/powerpc/include/asm/paravirt.h +++ b/arch/powerpc/include/asm/paravirt.h @@ -21,7 +21,7 @@ static inline bool is_shared_processor(void)  	return static_branch_unlikely(&shared_processor);  } -/* If bit 0 is set, the cpu has been preempted */ +/* If bit 0 is set, the cpu has been ceded, conferred, or preempted */  static inline u32 yield_count_of(int cpu)  {  	__be32 yield_count = READ_ONCE(lppaca_of(cpu).yield_count); @@ -92,6 +92,19 @@ static inline void prod_cpu(int cpu)  #define vcpu_is_preempted vcpu_is_preempted  static inline bool vcpu_is_preempted(int cpu)  { +	/* +	 * The dispatch/yield bit alone is an imperfect indicator of +	 * whether the hypervisor has dispatched @cpu to run on a physical +	 * processor. When it is clear, @cpu is definitely not preempted. +	 * But when it is set, it means only that it *might* be, subject to +	 * other conditions. So we check other properties of the VM and +	 * @cpu first, resorting to the yield count last. +	 */ + +	/* +	 * Hypervisor preemption isn't possible in dedicated processor +	 * mode by definition. +	 */  	if (!is_shared_processor())  		return false; @@ -100,9 +113,10 @@ static inline bool vcpu_is_preempted(int cpu)  		int first_cpu = cpu_first_thread_sibling(smp_processor_id());  		/* -		 * Preemption can only happen at core granularity. This CPU -		 * is not preempted if one of the CPU of this core is not -		 * preempted. +		 * The PowerVM hypervisor dispatches VMs on a whole core +		 * basis. So we know that a thread sibling of the local CPU +		 * cannot have been preempted by the hypervisor, even if it +		 * has called H_CONFER, which will set the yield bit.  		 */  		if (cpu_first_thread_sibling(cpu) == first_cpu)  			return false; | 
