lkml.org 
[lkml]   [2020]   [Oct]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/4] powerpc/paravirt: Use is_kvm_guest in vcpu_is_preempted
    Date
    If its a shared lpar but not a KVM guest, then see if the vCPU is
    related to the calling vCPU. On PowerVM, only cores can be preempted.
    So if one vCPU is a non-preempted state, we can decipher that all other
    vCPUs sharing the same core are in non-preempted state.

    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>
    Cc: LKML <linux-kernel@vger.kernel.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Nathan Lynch <nathanl@linux.ibm.com>
    Cc: Gautham R Shenoy <ego@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Valentin Schneider <valentin.schneider@arm.com>
    Cc: Juri Lelli <juri.lelli@redhat.com>
    Cc: Waiman Long <longman@redhat.com>
    Cc: Phil Auld <pauld@redhat.com>
    ---
    arch/powerpc/include/asm/paravirt.h | 18 ++++++++++++++++++
    1 file changed, 18 insertions(+)

    diff --git a/arch/powerpc/include/asm/paravirt.h b/arch/powerpc/include/asm/paravirt.h
    index 9362c94fe3aa..edc08f04aef7 100644
    --- a/arch/powerpc/include/asm/paravirt.h
    +++ b/arch/powerpc/include/asm/paravirt.h
    @@ -10,6 +10,9 @@
    #endif

    #ifdef CONFIG_PPC_SPLPAR
    +#include <asm/kvm_guest.h>
    +#include <asm/cputhreads.h>
    +
    DECLARE_STATIC_KEY_FALSE(shared_processor);

    static inline bool is_shared_processor(void)
    @@ -74,6 +77,21 @@ static inline bool vcpu_is_preempted(int cpu)
    {
    if (!is_shared_processor())
    return false;
    +
    +#ifdef CONFIG_PPC_SPLPAR
    + if (!is_kvm_guest()) {
    + 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.
    + */
    + if (cpu_first_thread_sibling(cpu) == first_cpu)
    + return false;
    + }
    +#endif
    +
    if (yield_count_of(cpu) & 1)
    return true;
    return false;
    --
    2.18.4
    \
     
     \ /
      Last update: 2020-10-28 22:34    [W:5.804 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site