From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45099) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avIEg-0007Ik-LU for qemu-devel@nongnu.org; Wed, 27 Apr 2016 01:42:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1avIEd-0005m3-F8 for qemu-devel@nongnu.org; Wed, 27 Apr 2016 01:42:06 -0400 Date: Wed, 27 Apr 2016 15:43:12 +1000 From: David Gibson Message-ID: <20160427054312.GA18476@voom.redhat.com> References: <146167806458.25026.1889940221577609401.stgit@bahia.huguette.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="uAKRQypu60I7Lcqm" Content-Disposition: inline In-Reply-To: <146167806458.25026.1889940221577609401.stgit@bahia.huguette.org> Subject: Re: [Qemu-devel] [PATCH] PPC/KVM: early validation of vcpu id List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Greg Kurz Cc: Paolo Bonzini , Alexander Graf , qemu-ppc@nongnu.org, qemu-devel@nongnu.org --uAKRQypu60I7Lcqm Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Apr 26, 2016 at 03:41:04PM +0200, Greg Kurz wrote: > The KVM API restricts vcpu ids to be < KVM_CAP_MAX_VCPUS. On PowerPC > targets, depending on the number of threads per core in the host and > in the guest, some topologies do generate higher vcpu ids actually. > When this happens, QEMU bails out with the following error: >=20 > kvm_init_vcpu failed: Invalid argument >=20 > The KVM_CREATE_VCPU ioctl has several EINVAL return paths, so it is > not possible to fully disambiguate. >=20 > This patch adds a check in the code that computes vcpu ids, so that > we can detect the error earlier, and print a friendlier message instead > of calling KVM_CREATE_VCPU with an obviously bogus vcpu id. >=20 > Signed-off-by: Greg Kurz Applied to ppc-for-2.7, thanks. I'm still kicking myself for doing the SMT / cpu ids that way way back when. Should have just had a "SET_SMT" ioctl() and allocated the cpu ids sequentially. Too clever by half :( > --- > include/sysemu/kvm.h | 2 ++ > kvm-all.c | 6 ++++++ > target-ppc/translate_init.c | 8 ++++++++ > 3 files changed, 16 insertions(+) >=20 > diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h > index 0e18f15c9493..27bf50ef379e 100644 > --- a/include/sysemu/kvm.h > +++ b/include/sysemu/kvm.h > @@ -344,6 +344,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s); > =20 > int kvm_arch_init_vcpu(CPUState *cpu); > =20 > +bool kvm_vcpu_id_is_valid(int vcpu_id); > + > /* Returns VCPU ID to be used on KVM_CREATE_VCPU ioctl() */ > unsigned long kvm_arch_vcpu_id(CPUState *cpu); > =20 > diff --git a/kvm-all.c b/kvm-all.c > index e7b66df197fd..3625a3e07457 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1459,6 +1459,12 @@ static int kvm_max_vcpus(KVMState *s) > return (ret) ? ret : kvm_recommended_vcpus(s); > } > =20 > +bool kvm_vcpu_id_is_valid(int vcpu_id) > +{ > + KVMState *s =3D KVM_STATE(current_machine->accelerator); > + return vcpu_id >=3D 0 && vcpu_id < kvm_max_vcpus(s); > +} > + > static int kvm_init(MachineState *ms) > { > MachineClass *mc =3D MACHINE_GET_CLASS(ms); > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c > index f51572552bc2..6c89b18a05f9 100644 > --- a/target-ppc/translate_init.c > +++ b/target-ppc/translate_init.c > @@ -9247,6 +9247,14 @@ static void ppc_cpu_realizefn(DeviceState *dev, Er= ror **errp) > #if !defined(CONFIG_USER_ONLY) > cpu->cpu_dt_id =3D (cs->cpu_index / smp_threads) * max_smt > + (cs->cpu_index % smp_threads); > + > + if (kvm_enabled() && !kvm_vcpu_id_is_valid(cpu->cpu_dt_id)) { > + error_setg(errp, "Can't create CPU with id %d in KVM", cpu->cpu_= dt_id); > + error_append_hint(errp, "Adjust the number of cpus to %d " > + "or try to raise the number of threads per cor= e\n", > + cpu->cpu_dt_id * smp_threads / max_smt); > + return; > + } > #endif > =20 > if (tcg_enabled()) { >=20 --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --uAKRQypu60I7Lcqm Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXIFFwAAoJEGw4ysog2bOS8CMQAKHlfrYUEz3DqTWtYzNl11Ii gX7e8t5694iVdetthhCWtK+Vpy0vD1lfnceph3JMgR8LRFMywpwMF4J3203ByOqJ myHuVfSG0UAh01U4X/uC3wkX/mipD9xuHzU1jKgCl2YSNXgjxveELhOtaaudZhS1 jVnQXA4Gu4N0vN2P+ochTS2FMF/aUsstnUkJf69OxigwDFCPS2rykJEa1mCHiIpB 0hurpf/STcx/sTVYTltCQS9yEaOm8OL9NJEX11Ucs05qpBO3b8zeq+sgwOFMZ8mj IUB0nZH+5s+QyDZdBz4NcQ9tOaOU2I3RaagtyCsaQAfcrgv2xXtDqLIgWk+Q8nJz vzYkTy2PAox/QixzrA8azwN/lmc6BDDApogVQ5zd3Ql9lns1zzePDOF2YmV01wUp 8Fo05Uv4hAGw208CDFtilBvsn+WurXwJGGiD9agTEo9kNn2bMJK5PloObr8kOLIU u43R7x/krU6QzxBa0nu4qQjn7JMfd7QwIAzypPCHO5uZPsj52120ZNxci+6MAVOo y4Ql8oq6BnDZa581upzjKAYkdnefifxefTbeqyRFhFCEEtoEnNprY/Ke6RnQqAbe 8rioGo9pC70rmnK+gCv0FVPt0RNqKBsBeg+RBRkXtkORjQycK6dJJk3wC1QbQBz+ nO8gY45gBHFhYl9Q4Gay =IIk8 -----END PGP SIGNATURE----- --uAKRQypu60I7Lcqm--