* Nathan Lynch <nath...@linux.ibm.com> [2021-09-28 16:41:46]: > Add comments more clearly documenting that this function determines whether > hypervisor-level preemption of the VM has occurred. > > Signed-off-by: Nathan Lynch <nath...@linux.ibm.com>
Looks good to me. Reviewed-by: Srikar Dronamraju <sri...@linux.vnet.ibm.com> > --- > arch/powerpc/include/asm/paravirt.h | 22 ++++++++++++++++++---- > 1 file 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; > -- > 2.31.1 > -- Thanks and Regards Srikar Dronamraju