Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751843AbdHRPWf (ORCPT ); Fri, 18 Aug 2017 11:22:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19058 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750967AbdHRPWd (ORCPT ); Fri, 18 Aug 2017 11:22:33 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9F4975F7BE Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=dvlasenk@redhat.com Subject: Re: [PATCH] KVM: SVM: refactor avic VM ID allocation To: Paolo Bonzini , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Suravee Suthikulpanit References: <20170811201158.24715-1-dvlasenk@redhat.com> <20170815201159.GC5975@flask> Cc: Joerg Roedel , tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org From: Denys Vlasenko Message-ID: <4ca2cb8a-3743-fe42-2542-797493fd819f@redhat.com> Date: Fri, 18 Aug 2017 17:22:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 18 Aug 2017 15:22:33 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2275 Lines: 62 On 08/17/2017 04:33 PM, Paolo Bonzini wrote: > On 15/08/2017 22:12, Radim Krčmář wrote: >> 2017-08-11 22:11+0200, Denys Vlasenko: >>> With lightly tweaked defconfig: >>> >>> text data bss dec hex filename >>> 11259661 5109408 2981888 19350957 12745ad vmlinux.before >>> 11259661 5109408 884736 17253805 10745ad vmlinux.after >>> >>> Only compile-tested. >>> >>> Signed-off-by: Denys Vlasenko >>> Cc: Joerg Roedel >>> Cc: pbonzini@redhat.com >>> Cc: rkrcmar@redhat.com >>> Cc: tglx@linutronix.de >>> Cc: mingo@redhat.com >>> Cc: hpa@zytor.com >>> Cc: x86@kernel.org >>> Cc: kvm@vger.kernel.org >>> Cc: linux-kernel@vger.kernel.org >>> --- >> >> Ah, I suspected my todo wasn't this short; thanks for the patch! >> >>> @@ -1468,6 +1433,22 @@ static int avic_vm_init(struct kvm *kvm) >>> clear_page(page_address(l_page)); >>> >>> spin_lock_irqsave(&svm_vm_data_hash_lock, flags); >>> + again: >>> + vm_id = next_vm_id = (next_vm_id + 1) & AVIC_VM_ID_MASK; >>> + if (vm_id == 0) { /* id is 1-based, zero is not okay */ >> >> Suravee, did the reserved zero mean something? >> >>> + next_vm_id_wrapped = 1; >>> + goto again; >>> + } >>> + /* Is it still in use? Only possible if wrapped at least once */ >>> + if (next_vm_id_wrapped) { >>> + hash_for_each_possible(svm_vm_data_hash, ka, hnode, vm_id) { >>> + struct kvm *k2 = container_of(ka, struct kvm, arch); >>> + struct kvm_arch *vd2 = &k2->arch; >>> + if (vd2->avic_vm_id == vm_id) >>> + goto again; >> >> Although hitting the case where all 2^24 ids are already used is >> practically impossible, I don't like the loose end ... > > I think even the case where 2^16 ids are used deserves a medal. Why > don't we just make the bitmap 8 KiB and call it a day? :) Well, the RAM is cheap, but a 4-byte variable is still thousands of times smaller than a 8K bitmap. Since a 256 element hash table is used here, you need to have ~one hundred VMs to start seeing (very small) degradation in speed of creation of new VMs compared to bitmap approach, and that is only after 16777216 VMs were created since reboot. If you want to spend RAM on speeding this up, you can increase hash table size instead. That would speed up avic_ga_log_notifier() too.