Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754159AbcCIVql (ORCPT ); Wed, 9 Mar 2016 16:46:41 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52948 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750872AbcCIVqf (ORCPT ); Wed, 9 Mar 2016 16:46:35 -0500 Date: Wed, 9 Mar 2016 22:46:30 +0100 From: Radim =?utf-8?B?S3LEjW3DocWZ?= To: Suravee Suthikulpanit Cc: pbonzini@redhat.com, joro@8bytes.org, bp@alien8.de, gleb@kernel.org, alex.williamson@redhat.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, wei@redhat.com, sherry.hurwitz@amd.com Subject: Re: [PART1 RFC v2 10/10] svm: Manage vcpu load/unload when enable AVIC Message-ID: <20160309214629.GE19459@potion.brq.redhat.com> References: <1457124368-2025-1-git-send-email-Suravee.Suthikulpanit@amd.com> <1457124368-2025-11-git-send-email-Suravee.Suthikulpanit@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1457124368-2025-11-git-send-email-Suravee.Suthikulpanit@amd.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1563 Lines: 40 2016-03-04 14:46-0600, Suravee Suthikulpanit: > From: Suravee Suthikulpanit > > When a vcpu is loaded/unloaded to a physical core, we need to update > information in the Physical APIC-ID table accordingly. > > Signed-off-by: Suravee Suthikulpanit > --- > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > @@ -1508,6 +1510,146 @@ static int avic_vcpu_init(struct kvm *kvm, struct vcpu_svm *svm, int id) > +static inline int > +avic_update_iommu(struct kvm_vcpu *vcpu, int cpu, phys_addr_t pa, bool r) > +{ > + if (!kvm_arch_has_assigned_device(vcpu->kvm)) > + return 0; > + > + /* TODO: We will hook up with IOMMU API at later time */ (It'd be best to drop avic_update_iommu from this series and introduce it when merging iommu support.) > + return 0; > +} > + > +static int avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu, bool is_load) This function does a lot and there is only one thing that must be done in svm_vcpu_load: change host physical APIC ID if the CPU changed. The rest can be done elsewhere: - is_running when blocking. - kb_pg_ptr when the pointer changes = only on initialization? - valid when the kb_pg_ptr is valid = always for existing VCPUs? > +static int avic_set_running(struct kvm_vcpu *vcpu, bool is_run) avic_set_running should get address of the entry and write is_run to it. (No need to touch avic_bk_page, h_phy_apic_id or do bound checks.) I think you can cache the physical apic id table entry in *vcpu, so both functions are going to be very simple.