From mboxrd@z Thu Jan 1 00:00:00 1970 From: Roman Kagan Subject: Re: [PATCH v2 2/5] KVM: x86: hyperv: introduce vp_index_to_vcpu_idx mapping Date: Fri, 29 Jun 2018 13:11:36 +0300 Message-ID: <20180629101134.GA15656@rkaganb.sw.ru> References: <20180628135313.17468-1-vkuznets@redhat.com> <20180628135313.17468-3-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org, x86@kernel.org, Paolo Bonzini , Radim =?utf-8?B?S3LEjW3DocWZ?= , "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , "Michael Kelley (EOSG)" , Mohammed Gamal , Cathy Avery , Wanpeng Li , linux-kernel@vger.kernel.org To: Vitaly Kuznetsov Return-path: Content-Disposition: inline In-Reply-To: <20180628135313.17468-3-vkuznets@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org On Thu, Jun 28, 2018 at 03:53:10PM +0200, Vitaly Kuznetsov wrote: > While it is easy to get VP index from vCPU index the reverse task is hard. > Basically, to solve it we have to walk all vCPUs checking if their VP index > matches. For hypercalls like HvFlushVirtualAddress{List,Space}* and the > upcoming HvSendSyntheticClusterIpi* where a single CPU may be specified in > the whole set this is obviously sub-optimal. > > As VP index can be set to anything <= U32_MAX by userspace using plain > [0..MAX_VP_INDEX] array is not a viable option. Use condensed sorted > array with logarithmic search complexity instead. Use RCU to make read > access as fast as possible and maintain atomicity of updates. Quoting TLFS 5.0C section 7.8.1: > Virtual processors are identified by using an index (VP index). The > maximum number of virtual processors per partition supported by the > current implementation of the hypervisor can be obtained through CPUID > leaf 0x40000005. A virtual processor index must be less than the > maximum number of virtual processors per partition. so this is a dense index, and VP_INDEX >= KVM_MAX_VCPUS is invalid. I think we're better off enforcing this in kvm_hv_set_msr and keep the translation simple. If the algorithm in get_vcpu_by_vpidx is not good enough (and yes it can be made to return NULL early on vpidx >= KVM_MAX_VCPUS instead of taking the slow path) then a simple index array of KVM_MAX_VCPUS entries should certainly do. Roman.