Received: by 2002:a05:7412:419a:b0:f3:1519:9f41 with SMTP id i26csp3657728rdh; Mon, 27 Nov 2023 23:15:43 -0800 (PST) X-Google-Smtp-Source: AGHT+IGX8DWRb7+1QsD245dgC/r7AUshOfxavL8cEhL2i4GtHEgufZMRnTn+N9UWHYe9fG5SQsvV X-Received: by 2002:a05:6a20:9147:b0:17b:1f76:86ee with SMTP id x7-20020a056a20914700b0017b1f7686eemr23134103pzc.16.1701155743369; Mon, 27 Nov 2023 23:15:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701155743; cv=none; d=google.com; s=arc-20160816; b=qcTvL4Dlkmi1h3hBql7Pd3bb1bhxAu2dR9VxZ2OxI1LCO3961K9HcOL0j5M/96cY2p O5l2ihZERtCmHF1S6zLar132IINbfYnkgVxtaUJ+n6si57jQC7HzQkOhC1Qdl2ogLXbu j91ja5gJcJJBEzA865/+PPAVnknLqmIJjNCv8fD+qOMFxjJVj8A15L0D2p3eYP5kKSod NOYYmralPgN1Cf/nk1gF3a7jyuo9S08bnRNvNvGtk64Xk14MtaqWl9plFVS2qh20saly sS5qQ9T930rrOctj5RHVZlH/2G22z2w4qB0A2PHKpTUmyIAW4cJ+43/Npd8fpQRjgy2X 9oOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id:dkim-signature; bh=oIjdl3fBpy+pRgJdQZh+6AD6ZC1o3LqUiZRk3i0+Pa8=; fh=0JE/s9melwQrHIwHj7I58Itp5rDesgOPWrDm6iWtl/s=; b=zdYUfEOWVytBAPS81qOT2ww1jAeuGy1QJXsD3FCb5/tQHHHul+y6436JO1p95VTNFz HyBWD4zM3D/e9TnUnQ7KTPdG6Mzs4nw8T8m2FMeEgap/UNdvbKaTQeOoNQKC6eZ/muG+ mC+SHWHTzK5g88TMw+z7/zd1nyYgj2SlRvSr4O9vU1AR9Z0WJf2juTfWrv1ZPJWnaANn sAHHQmMbiM9AAsss/AOaaskXz74tM8K9WV7kmBNultIS/PTM+ZQyMt8vGH59uh/J3s9U vnNoHRt2+WajY6bBYA+HDYodSsfx87TpxfkfSy/d8W4KNTtjuVEE0R6ZpNRIqmcZpPWg awEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QhmFDNpk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id q1-20020a056a00088100b006c31b7deccesi12259930pfj.106.2023.11.27.23.15.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 23:15:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QhmFDNpk; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 23E6D8072A01; Mon, 27 Nov 2023 23:15:22 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343764AbjK1HPA (ORCPT + 99 others); Tue, 28 Nov 2023 02:15:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57132 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231858AbjK1HO7 (ORCPT ); Tue, 28 Nov 2023 02:14:59 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 513A4D4B for ; Mon, 27 Nov 2023 23:15:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1701155704; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oIjdl3fBpy+pRgJdQZh+6AD6ZC1o3LqUiZRk3i0+Pa8=; b=QhmFDNpkgEbvCwpdtJB8eRJObprETWdO/oo0wtrL35ljHd/p1D3V3k8z2lhEr3tcFcwb4m /uJCGvYRSypLHhdD1j/oZ85W9o3AH9l0zLa19pDda0SKsmj5PPxXTEdvP3HQhc0G/EA+9s SsjsNs+JGYV9W3GwjFfw2P5UVfZxcvY= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-663-cvKStjaONHGL1vZso5dbSA-1; Tue, 28 Nov 2023 02:15:02 -0500 X-MC-Unique: cvKStjaONHGL1vZso5dbSA-1 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-333063a304fso1037957f8f.3 for ; Mon, 27 Nov 2023 23:15:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701155701; x=1701760501; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=oIjdl3fBpy+pRgJdQZh+6AD6ZC1o3LqUiZRk3i0+Pa8=; b=uQmlHr0JBNMXU5mySEAavgM8lAisN++8V08CRHsgj0BbAXT8p2bP1O9CjloS+6JmSl +NlFmQNb7q8iP1QFMH/ftyKk9+KY0RfFw25eg5VtECkdv7GJvxwWUhDsyi6y4wQMme+b Okcm4oPOkVfmISS0fTxN1a2X7VMpir/Rzk4rnPCM+PJi+1KtgkeMASqzUWOqxalWGps6 tUYGDADlK1vmrnguqZdVcfFiloxiluW08vzERR1cRFGEcNk4iy+dVQ1bEZV75OoLR2LQ MMnCPqN9J7YbsK2BLkccAgeHUSS6V4uGkx57CBQuuRQcCtHaMN35L9uzEklv1K0ddiWi aP9Q== X-Gm-Message-State: AOJu0Yyrr2DSMhAghuTjPEg31f+PVRbHN7SrA7KbfH2xPL9iUh9ayyoL PvBA4N1/qn0K0JAonBKc9okmoQKlFPghwdGiARY7x5HDqknaxqFO4KGe2f12vxc2/BPeGjl8oJ7 vcS3PkOWau2cyh64MVn+/hjBe X-Received: by 2002:adf:e692:0:b0:332:c3bf:600e with SMTP id r18-20020adfe692000000b00332c3bf600emr9680291wrm.18.1701155701306; Mon, 27 Nov 2023 23:15:01 -0800 (PST) X-Received: by 2002:adf:e692:0:b0:332:c3bf:600e with SMTP id r18-20020adfe692000000b00332c3bf600emr9680278wrm.18.1701155700918; Mon, 27 Nov 2023 23:15:00 -0800 (PST) Received: from starship ([77.137.131.4]) by smtp.gmail.com with ESMTPSA id d4-20020a05600c3ac400b0040b3e79bad3sm10993732wms.40.2023.11.27.23.14.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 23:15:00 -0800 (PST) Message-ID: <9249b4b84f7b84da2ea21fbbbabf35f22e5d9f2f.camel@redhat.com> Subject: Re: [RFC 06/33] KVM: x86: hyper-v: Introduce VTL awareness to Hyper-V's PV-IPIs From: Maxim Levitsky To: Nicolas Saenz Julienne , kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-hyperv@vger.kernel.org, pbonzini@redhat.com, seanjc@google.com, vkuznets@redhat.com, anelkz@amazon.com, graf@amazon.com, dwmw@amazon.co.uk, jgowans@amazon.com, corbert@lwn.net, kys@microsoft.com, haiyangz@microsoft.com, decui@microsoft.com, x86@kernel.org, linux-doc@vger.kernel.org Date: Tue, 28 Nov 2023 09:14:58 +0200 In-Reply-To: <20231108111806.92604-7-nsaenz@amazon.com> References: <20231108111806.92604-1-nsaenz@amazon.com> <20231108111806.92604-7-nsaenz@amazon.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.36.5 (3.36.5-2.fc32) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 27 Nov 2023 23:15:22 -0800 (PST) On Wed, 2023-11-08 at 11:17 +0000, Nicolas Saenz Julienne wrote: > HVCALL_SEND_IPI and HVCALL_SEND_IPI_EX allow targeting specific a > specific VTL. Honour the requests. > > Signed-off-by: Nicolas Saenz Julienne > --- > arch/x86/kvm/hyperv.c | 24 +++++++++++++++++------- > arch/x86/kvm/trace.h | 20 ++++++++++++-------- > include/asm-generic/hyperv-tlfs.h | 6 ++++-- > 3 files changed, 33 insertions(+), 17 deletions(-) > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index d4b1b53ea63d..2cf430f6ddd8 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -2230,7 +2230,7 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) > } > > static void kvm_hv_send_ipi_to_many(struct kvm *kvm, u32 vector, > - u64 *sparse_banks, u64 valid_bank_mask) > + u64 *sparse_banks, u64 valid_bank_mask, int vtl) > { > struct kvm_lapic_irq irq = { > .delivery_mode = APIC_DM_FIXED, > @@ -2245,6 +2245,9 @@ static void kvm_hv_send_ipi_to_many(struct kvm *kvm, u32 vector, > valid_bank_mask, sparse_banks)) > continue; > > + if (kvm_hv_get_active_vtl(vcpu) != vtl) > + continue; Do I understand correctly that this is a temporary limitation? In other words, can a vCPU running in VTL1 send an IPI to a vCPU running VTL0, forcing the target vCPU to do async switch to VTL1? I think that this is possible. If we go with my suggestion to use apic namespaces and/or with multiple VMs per VTLs, then I imagine it like that: In-kernel hyperv IPI emulation works as it does currently as long as the IPI's VTL matches the VTL which is assigned to the vCPU, and if it doesn't, it should result in a userspace VM exit. I do think that we will need KVM to know a vCPU VTL anyway, however we might get away (or have to if we go with multiple VMs approach) with having explicit mapping between all KVM's vCPUs which emulate a single VM's vCPU. Best regards, Maxim Levitsky > + > /* We fail only when APIC is disabled */ > kvm_apic_set_irq(vcpu, &irq, NULL); > } > @@ -2257,13 +2260,19 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) > struct kvm *kvm = vcpu->kvm; > struct hv_send_ipi_ex send_ipi_ex; > struct hv_send_ipi send_ipi; > + union hv_input_vtl *in_vtl; > u64 valid_bank_mask; > u32 vector; > bool all_cpus; > + u8 vtl; > + > + /* VTL is at the same offset on both IPI types */ > + in_vtl = &send_ipi.in_vtl; > + vtl = in_vtl->use_target_vtl ? in_vtl->target_vtl : kvm_hv_get_active_vtl(vcpu); > > if (hc->code == HVCALL_SEND_IPI) { > if (!hc->fast) { > - if (unlikely(kvm_read_guest(kvm, hc->ingpa, &send_ipi, > + if (unlikely(kvm_vcpu_read_guest(vcpu, hc->ingpa, &send_ipi, > sizeof(send_ipi)))) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > sparse_banks[0] = send_ipi.cpu_mask; > @@ -2278,10 +2287,10 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) > all_cpus = false; > valid_bank_mask = BIT_ULL(0); > > - trace_kvm_hv_send_ipi(vector, sparse_banks[0]); > + trace_kvm_hv_send_ipi(vector, sparse_banks[0], vtl); > } else { > if (!hc->fast) { > - if (unlikely(kvm_read_guest(kvm, hc->ingpa, &send_ipi_ex, > + if (unlikely(kvm_vcpu_read_guest(vcpu, hc->ingpa, &send_ipi_ex, > sizeof(send_ipi_ex)))) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > } else { > @@ -2292,7 +2301,8 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) > > trace_kvm_hv_send_ipi_ex(send_ipi_ex.vector, > send_ipi_ex.vp_set.format, > - send_ipi_ex.vp_set.valid_bank_mask); > + send_ipi_ex.vp_set.valid_bank_mask, > + vtl); > > vector = send_ipi_ex.vector; > valid_bank_mask = send_ipi_ex.vp_set.valid_bank_mask; > @@ -2322,9 +2332,9 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > > if (all_cpus) > - kvm_hv_send_ipi_to_many(kvm, vector, NULL, 0); > + kvm_hv_send_ipi_to_many(kvm, vector, NULL, 0, vtl); > else > - kvm_hv_send_ipi_to_many(kvm, vector, sparse_banks, valid_bank_mask); > + kvm_hv_send_ipi_to_many(kvm, vector, sparse_banks, valid_bank_mask, vtl); > > ret_success: > return HV_STATUS_SUCCESS; > diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h > index 83843379813e..ab8839c47bc7 100644 > --- a/arch/x86/kvm/trace.h > +++ b/arch/x86/kvm/trace.h > @@ -1606,42 +1606,46 @@ TRACE_EVENT(kvm_hv_flush_tlb_ex, > * Tracepoints for kvm_hv_send_ipi. > */ > TRACE_EVENT(kvm_hv_send_ipi, > - TP_PROTO(u32 vector, u64 processor_mask), > - TP_ARGS(vector, processor_mask), > + TP_PROTO(u32 vector, u64 processor_mask, u8 vtl), > + TP_ARGS(vector, processor_mask, vtl), > > TP_STRUCT__entry( > __field(u32, vector) > __field(u64, processor_mask) > + __field(u8, vtl) > ), > > TP_fast_assign( > __entry->vector = vector; > __entry->processor_mask = processor_mask; > + __entry->vtl = vtl; > ), > > - TP_printk("vector %x processor_mask 0x%llx", > - __entry->vector, __entry->processor_mask) > + TP_printk("vector %x processor_mask 0x%llx vtl %d", > + __entry->vector, __entry->processor_mask, __entry->vtl) > ); > > TRACE_EVENT(kvm_hv_send_ipi_ex, > - TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask), > - TP_ARGS(vector, format, valid_bank_mask), > + TP_PROTO(u32 vector, u64 format, u64 valid_bank_mask, u8 vtl), > + TP_ARGS(vector, format, valid_bank_mask, vtl), > > TP_STRUCT__entry( > __field(u32, vector) > __field(u64, format) > __field(u64, valid_bank_mask) > + __field(u8, vtl) > ), > > TP_fast_assign( > __entry->vector = vector; > __entry->format = format; > __entry->valid_bank_mask = valid_bank_mask; > + __entry->vtl = vtl; > ), > > - TP_printk("vector %x format %llx valid_bank_mask 0x%llx", > + TP_printk("vector %x format %llx valid_bank_mask 0x%llx vtl %d", > __entry->vector, __entry->format, > - __entry->valid_bank_mask) > + __entry->valid_bank_mask, __entry->vtl) > ); > > TRACE_EVENT(kvm_pv_tlb_flush, > diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h > index 0e7643c1ef01..40d7dc793c03 100644 > --- a/include/asm-generic/hyperv-tlfs.h > +++ b/include/asm-generic/hyperv-tlfs.h > @@ -424,14 +424,16 @@ struct hv_vpset { > /* HvCallSendSyntheticClusterIpi hypercall */ > struct hv_send_ipi { > u32 vector; > - u32 reserved; > + union hv_input_vtl in_vtl; > + u8 reserved[3]; > u64 cpu_mask; > } __packed; > > /* HvCallSendSyntheticClusterIpiEx hypercall */ > struct hv_send_ipi_ex { > u32 vector; > - u32 reserved; > + union hv_input_vtl in_vtl; > + u8 reserved[3]; > struct hv_vpset vp_set; > } __packed; >