Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936978AbdDZUdl (ORCPT ); Wed, 26 Apr 2017 16:33:41 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56496 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967264AbdDZUdG (ORCPT ); Wed, 26 Apr 2017 16:33:06 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4FE2FC04BD2B Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=rkrcmar@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 4FE2FC04BD2B From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Christoffer Dall , Andrew Jones , Marc Zyngier , Paolo Bonzini , Christian Borntraeger , Cornelia Huck , James Hogan , Paul Mackerras Subject: [PATCH v2 5/9] KVM: perform a wake_up in kvm_make_all_cpus_request Date: Wed, 26 Apr 2017 22:32:23 +0200 Message-Id: <20170426203227.12321-6-rkrcmar@redhat.com> In-Reply-To: <20170426203227.12321-1-rkrcmar@redhat.com> References: <20170426203227.12321-1-rkrcmar@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 26 Apr 2017 20:33:06 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1371 Lines: 42 We want to have kvm_make_all_cpus_request() to be an optmized version of kvm_for_each_vcpu(i, vcpu, kvm) { kvm_make_request(vcpu, request); kvm_vcpu_kick(vcpu); } and kvm_vcpu_kick() wakes up the target vcpu. We know which requests do not need the wake up and use it to optimize the loop. Thanks to that, this patch doesn't change the behavior of current users (the all don't need the wake up) and only prepares for future where the wake up is going to be needed. I think that most requests do not need the wake up, so we would flip the bit then. kvm_vcpu_kick() will get this condition after it is merged with kvm_make_request() because we currently don't know which request is being kicked. Signed-off-by: Radim Krčmář --- virt/kvm/kvm_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e5d52b46b531..3772f7dcc72d 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -186,6 +186,9 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req) /* Set ->requests bit before we read ->mode. */ smp_mb__after_atomic(); + if (!(req & KVM_REQUEST_NO_WAKEUP)) + kvm_vcpu_wake_up(vcpu); + if (cpus != NULL && cpu != -1 && cpu != me && kvm_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE) cpumask_set_cpu(cpu, cpus); -- 2.12.2