From: Marc Zyngier <maz@kernel.org>
To: Yuan Yao <yuan.yao@linux.intel.com>
Cc: isaku.yamahata@intel.com, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
Sean Christopherson <seanjc@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Will Deacon <will@kernel.org>,
isaku.yamahata@gmail.com, Kai Huang <kai.huang@intel.com>,
Chao Gao <chao.gao@intel.com>,
Atish Patra <atishp@atishpatra.org>,
Shaokun Zhang <zhangshaokun@hisilicon.com>,
Qi Liu <liuqi115@huawei.com>, John Garry <john.garry@huawei.com>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
Huang Ying <ying.huang@intel.com>,
Huacai Chen <chenhuacai@kernel.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
Borislav Petkov <bp@alien8.de>
Subject: Re: [PATCH v3 10/22] KVM: Drop kvm_count_lock and instead protect kvm_usage_count with kvm_lock
Date: Tue, 06 Sep 2022 07:32:22 +0100 [thread overview]
Message-ID: <87pmg9ui6h.wl-maz@kernel.org> (raw)
In-Reply-To: <20220906024643.ti66dw2y6m6jgch2@yy-desk-7060>
On Tue, 06 Sep 2022 03:46:43 +0100,
Yuan Yao <yuan.yao@linux.intel.com> wrote:
>
> On Thu, Sep 01, 2022 at 07:17:45PM -0700, isaku.yamahata@intel.com wrote:
> > From: Isaku Yamahata <isaku.yamahata@intel.com>
> >
> > Because kvm_count_lock unnecessarily complicates the KVM locking convention
> > Drop kvm_count_lock and instead protect kvm_usage_count with kvm_lock for
> > simplicity.
> >
> > Opportunistically add some comments on locking.
> >
> > Suggested-by: Sean Christopherson <seanjc@google.com>
> > Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
> > ---
> > Documentation/virt/kvm/locking.rst | 14 +++++-------
> > virt/kvm/kvm_main.c | 34 ++++++++++++++++++++----------
> > 2 files changed, 28 insertions(+), 20 deletions(-)
> >
> > diff --git a/Documentation/virt/kvm/locking.rst b/Documentation/virt/kvm/locking.rst
> > index 845a561629f1..8957e32aa724 100644
> > --- a/Documentation/virt/kvm/locking.rst
> > +++ b/Documentation/virt/kvm/locking.rst
> > @@ -216,15 +216,11 @@ time it will be set using the Dirty tracking mechanism described above.
> > :Type: mutex
> > :Arch: any
> > :Protects: - vm_list
> > -
> > -``kvm_count_lock``
> > -^^^^^^^^^^^^^^^^^^
> > -
> > -:Type: raw_spinlock_t
> > -:Arch: any
> > -:Protects: - hardware virtualization enable/disable
> > -:Comment: 'raw' because hardware enabling/disabling must be atomic /wrt
> > - migration.
> > + - kvm_usage_count
> > + - hardware virtualization enable/disable
> > +:Comment: Use cpus_read_lock() for hardware virtualization enable/disable
> > + because hardware enabling/disabling must be atomic /wrt
> > + migration. The lock order is cpus lock => kvm_lock.
> >
> > ``kvm->mn_invalidate_lock``
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> > index fc55447c4dba..082d5dbc8d7f 100644
> > --- a/virt/kvm/kvm_main.c
> > +++ b/virt/kvm/kvm_main.c
> > @@ -100,7 +100,6 @@ EXPORT_SYMBOL_GPL(halt_poll_ns_shrink);
> > */
> >
> > DEFINE_MUTEX(kvm_lock);
> > -static DEFINE_RAW_SPINLOCK(kvm_count_lock);
> > LIST_HEAD(vm_list);
> >
> > static cpumask_var_t cpus_hardware_enabled;
> > @@ -4996,6 +4995,8 @@ static void hardware_enable_nolock(void *caller_name)
> > int cpu = raw_smp_processor_id();
> > int r;
> >
> > + WARN_ON_ONCE(preemptible());
>
> This looks incorrect, it may triggers everytime when online CPU.
> Because patch 7 moved CPUHP_AP_KVM_STARTING *AFTER*
> CPUHP_AP_ONLINE_IDLE as CPUHP_AP_KVM_ONLINE, then cpuhp_thread_fun()
> runs the new CPUHP_AP_KVM_ONLINE in *non-atomic* context:
>
> cpuhp_thread_fun(unsigned int cpu) {
> ...
> if (cpuhp_is_atomic_state(state)) {
> local_irq_disable();
> st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
> local_irq_enable();
>
> WARN_ON_ONCE(st->result);
> } else {
> st->result = cpuhp_invoke_callback(cpu, state, bringup, st->node, &st->last);
> }
> ...
> }
>
> static bool cpuhp_is_atomic_state(enum cpuhp_state state)
> {
> return CPUHP_AP_IDLE_DEAD <= state && state < CPUHP_AP_ONLINE;
> }
>
> The hardware_enable_nolock() now is called in 2 cases:
> 1. in atomic context by on_each_cpu().
> 2. From non-atomic context by CPU hotplug thread.
>
> so how about "WARN_ONCE(preemptible() && cpu_active(cpu))" ?
I suspect similar changes must be applied to the arm64 side (though
I'm still looking for a good definition of cpu_active()).
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-09-06 6:32 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-02 2:17 [PATCH v3 00/22] KVM: hardware enable/disable reorganize isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 01/22] KVM: x86: Drop kvm_user_return_msr_cpu_online() isaku.yamahata
2022-09-05 1:59 ` Chao Gao
2022-09-05 5:30 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 02/22] KVM: x86: Use this_cpu_ptr() instead of per_cpu_ptr(smp_processor_id()) isaku.yamahata
2022-09-05 5:35 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 03/22] KVM: x86: Move check_processor_compatibility from init ops to runtime ops isaku.yamahata
2022-09-05 5:42 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 04/22] Partially revert "KVM: Pass kvm_init()'s opaque param to additional arch funcs" isaku.yamahata
2022-09-05 5:48 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 05/22] KVM: Provide more information in kernel log if hardware enabling fails isaku.yamahata
2022-09-05 5:56 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 06/22] KVM: arm64: Simplify the CPUHP logic isaku.yamahata
2022-09-05 7:05 ` Yuan Yao
2022-09-05 9:29 ` Marc Zyngier
2022-09-05 12:39 ` Marc Zyngier
2022-09-07 15:12 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 07/22] KVM: Rename and move CPUHP_AP_KVM_STARTING to ONLINE section isaku.yamahata
2022-09-05 7:49 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 08/22] KVM: Do compatibility checks on hotplugged CPUs isaku.yamahata
2022-09-06 1:25 ` Yuan Yao
2022-09-02 2:17 ` [PATCH v3 09/22] KVM: Do processor compatibility check on resume isaku.yamahata
2022-09-05 8:40 ` Yuan Yao
2022-09-05 9:27 ` Yuan Yao
2022-09-08 18:21 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 10/22] KVM: Drop kvm_count_lock and instead protect kvm_usage_count with kvm_lock isaku.yamahata
2022-09-06 2:46 ` Yuan Yao
2022-09-06 6:32 ` Marc Zyngier [this message]
2022-09-06 21:44 ` Isaku Yamahata
2022-09-08 18:24 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 11/22] KVM: Add arch hooks for PM events with empty stub isaku.yamahata
2022-09-06 6:25 ` Yuan Yao
2022-09-08 19:11 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 12/22] KVM: x86: Move TSC fixup logic to KVM arch resume callback isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 13/22] KVM: Add arch hook when VM is added/deleted isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 14/22] KVM: Move out KVM arch PM hooks and hardware enable/disable logic isaku.yamahata
2022-09-06 7:43 ` Yuan Yao
2022-09-08 19:15 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 15/22] KVM: kvm_arch.c: Remove _nolock post fix isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 16/22] KVM: kvm_arch.c: Remove a global variable, hardware_enable_failed isaku.yamahata
2022-09-07 5:56 ` Yuan Yao
2022-09-08 22:51 ` Isaku Yamahata
2022-09-02 2:17 ` [PATCH v3 17/22] KVM: x86: Duplicate arch callbacks related to pm events isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 18/22] KVM: Eliminate kvm_arch_post_init_vm() isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 19/22] KVM: x86: Delete kvm_arch_hardware_enable/disable() isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 20/22] KVM: Add config to not compile kvm_arch.c isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 21/22] RFC: KVM: x86: Remove cpus_hardware_enabled and related sanity check isaku.yamahata
2022-09-02 2:17 ` [PATCH v3 22/22] RFC: KVM: " isaku.yamahata
2022-09-05 15:38 ` [PATCH v3 00/22] KVM: hardware enable/disable reorganize Marc Zyngier
2022-09-06 22:25 ` Isaku Yamahata
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87pmg9ui6h.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=atishp@atishpatra.org \
--cc=bp@alien8.de \
--cc=chao.gao@intel.com \
--cc=chenhuacai@kernel.org \
--cc=daniel.lezcano@linaro.org \
--cc=dave.hansen@linux.intel.com \
--cc=isaku.yamahata@gmail.com \
--cc=isaku.yamahata@intel.com \
--cc=john.garry@huawei.com \
--cc=kai.huang@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=liuqi115@huawei.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=ying.huang@intel.com \
--cc=yuan.yao@linux.intel.com \
--cc=zhangshaokun@hisilicon.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.