Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp5264475imm; Sun, 22 Jul 2018 17:49:16 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfkJ64KUyReAeCqvnE8L06Az/pcEzcoLIY7l68jcsoBkMSaAp59DxWAUdvJQid1fz9Rn5yg X-Received: by 2002:a63:2013:: with SMTP id g19-v6mr10194018pgg.68.1532306956893; Sun, 22 Jul 2018 17:49:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532306956; cv=none; d=google.com; s=arc-20160816; b=WJXV4cKseleuREp6qHM6C/T/I2srMZh7DtlKyzak8G29M2K2Z5Y8U9B0mJY7WLWqaD vJbHxm/Y7W3WbZgS+M5I6DkQxNdoNeQeh18O3yGNqPuiBMyrbVcnD1cau7JyqR6ZqrAY z9VhagJ3HT5dUDNF9n2oHw+KNP1ZU+CIacToewFHzk5A6846EwtPjTKKIegj7fSPp7a4 7RZgZwlWiM5dulRx53BmGwVooqr5uHuW3I2j9bcGl9jXvpn+1POHdiNApElXJxvn8PyK L8WCVGa9JpPYFkTnTcAUWHzYVPhssNU08KEjaPBByCxr0BYKlFrnTIPhjvEnyBlhfJu6 sRzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=V7zwJ0ywobsjSZWTW9QqXuo56/lwfNePcwyAd8m7TDU=; b=fpotUlVtCLPtuRjkjs6gvE30vWuQv0okbomabMDVNRYssLNu12pkXhj1UOh1kv167d jDagMJSXsH05qWdmeIU1C+a4VaG3hDpuEyNU0wjscLxf2pWy10O9X9d1p5V54GZnOGXY 52Tg2y+3zRWXjG+35g81/l74JqRTOfyY3knx7oASk7zZjofeNLr9k3e4JFeA8o5NZw1m ppaqULQ1jr+OCLpAMyygWdN24BGNtvvFSRW7mbu+eqIHFKqLP3Tz3iC7sm94tuHamOJ0 2BeLVG9qDvOPAcRgbie3QvYahNdVymA51cuSw0bKxBMz4u47rOHr1t1NsUEfGejUo+8D XoIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KTfNN6xE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 64-v6si7665813pgd.509.2018.07.22.17.48.51; Sun, 22 Jul 2018 17:49:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=KTfNN6xE; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387743AbeGWBq3 (ORCPT + 99 others); Sun, 22 Jul 2018 21:46:29 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:43668 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731287AbeGWBq2 (ORCPT ); Sun, 22 Jul 2018 21:46:28 -0400 Received: by mail-pg1-f195.google.com with SMTP id v13-v6so10958557pgr.10; Sun, 22 Jul 2018 17:47:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=V7zwJ0ywobsjSZWTW9QqXuo56/lwfNePcwyAd8m7TDU=; b=KTfNN6xEISypEnZ5qj5Rw5zpUOGpoP/YkcmLiOXfSHlPM6qJuaMOz4xAENHZcT3kgR o56jlseOxCKLo0kv4mxBacVbDcZfn5C9MlR/XPzHeF0YEvhcVJ6Ry9p+dkGUujHrJ8cC /fihnOOGg8DI3BiwOXHBCyOVDtQXPeVA9DcKODQQPdVEldDTQDu71OO2hXfGhkBeYNWQ G5Mc4UtVUwXeNtHP4M2tb6T9lpklmjsIaKl4qzvi2Phg/VvorHO4pKbV+q8AOCs94+oN BvX+3QzdbzhOYp6ejvp4S+mlHSZS24K4ZYAZ/PNasiIrxQmVhajvXpylU9j/euXLV4Be icqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=V7zwJ0ywobsjSZWTW9QqXuo56/lwfNePcwyAd8m7TDU=; b=Vq7Td5VQ+4D3NC0gX+hyk52l4ihEBeudbSyY9iV+6C5/Z36SNPcB7+m7i7rclQvdjn yO+XJ+t5ow4t7zqS8H0X8SJ5AlhX5MfmkmGIwAlLQmJS/Em45Qt0BRQ3pox9UV0ko3MK 1o/1igSFeI7XBDLf8gFDEQAqxXncTCsMqVSnI1gnUsiOtSrQBH+gHWXr8OWz54z+94M+ jWuwIO+dYAO/f/bhdP1lBC+DbEbDFIhXhFEXz3I27CQR2F5fvjJnj+favokxMjwi4QFa x6HxJCxOBtoZnD91cT2mgYp0pheB7TkLrE+0CDJosg3A29d+iKeVUr+9LFFpMTvLFBdR L2AQ== X-Gm-Message-State: AOUpUlG9q6YNGBfGs8ckzj4ejuxznCOhuM4azXEO9WEqg0wbf6LJz8uJ VtMIkv1xINVS+MgfrKD4hJAW1u4L X-Received: by 2002:a62:384:: with SMTP id 126-v6mr10995711pfd.11.1532306872328; Sun, 22 Jul 2018 17:47:52 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id e82-v6sm11646069pfk.87.2018.07.22.17.47.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 22 Jul 2018 17:47:51 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Vitaly Kuznetsov Subject: [PATCH v4 RESEND 4/6] KVM: X86: Implement PV IPIs send hypercall Date: Mon, 23 Jul 2018 08:47:37 +0800 Message-Id: <1532306859-31166-5-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1532306859-31166-1-git-send-email-wanpengli@tencent.com> References: <1532306859-31166-1-git-send-email-wanpengli@tencent.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li Using hypercall to send IPIs by one vmexit instead of one by one for xAPIC/x2APIC physical mode and one vmexit per-cluster for x2APIC cluster mode. Intel guest can enter x2apic cluster mode when interrupt remmaping is enabled in qemu, however, latest AMD EPYC still just supports xapic mode which can get great improvement by Exit-less IPIs. This patchset lets a guest which sends multicast IPIs at most can handle 128 vCPUs per hypercall on 64-bit machines and 64 vCPUs per hypercall on 32-bit machines. Hardware: Xeon Skylake 2.5GHz, 2 sockets, 40 cores, 80 threads, the VM is 80 vCPUs, IPI microbenchmark(https://lkml.org/lkml/2017/12/19/141): x2apic cluster mode, vanilla Dry-run: 0, 2392199 ns Self-IPI: 6907514, 15027589 ns Normal IPI: 223910476, 251301666 ns Broadcast IPI: 0, 9282161150 ns Broadcast lock: 0, 8812934104 ns x2apic cluster mode, pv-ipi Dry-run: 0, 2449341 ns Self-IPI: 6720360, 15028732 ns Normal IPI: 228643307, 255708477 ns Broadcast IPI: 0, 7572293590 ns => 22% performance boost Broadcast lock: 0, 8316124651 ns x2apic physical mode, vanilla Dry-run: 0, 3135933 ns Self-IPI: 8572670, 17901757 ns Normal IPI: 226444334, 255421709 ns Broadcast IPI: 0, 19845070887 ns Broadcast lock: 0, 19827383656 ns x2apic physical mode, pv-ipi Dry-run: 0, 2446381 ns Self-IPI: 6788217, 15021056 ns Normal IPI: 219454441, 249583458 ns Broadcast IPI: 0, 7806540019 ns => 154% performance boost Broadcast lock: 0, 9143618799 ns Cc: Paolo Bonzini Cc: Radim Krčmář Cc: Vitaly Kuznetsov Signed-off-by: Wanpeng Li --- Documentation/virtual/kvm/hypercalls.txt | 17 ++++++++++++++ arch/x86/kvm/x86.c | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/Documentation/virtual/kvm/hypercalls.txt b/Documentation/virtual/kvm/hypercalls.txt index a890529..912b877 100644 --- a/Documentation/virtual/kvm/hypercalls.txt +++ b/Documentation/virtual/kvm/hypercalls.txt @@ -121,3 +121,20 @@ compute the CLOCK_REALTIME for its clock, at the same instant. Returns KVM_EOPNOTSUPP if the host does not use TSC clocksource, or if clock type is different than KVM_CLOCK_PAIRING_WALLCLOCK. + +6. KVM_HC_SEND_IPI +------------------------ +Architecture: x86 +Status: active +Purpose: Hypercall used to send IPIs. + +a0: ipi_bitmap low 64 bits +a1: ipi_bitmap high 64 bits +a2: the lowest APIC ID in bitmap +a3: APIC ICR + +The hypercall lets a guest send multicast IPIs at most can handle +128 vCPUs per hypercall on 64-bit machines and 64 vCPUs per hypercall +on 32-bit machines. + +Returns 0 if successfully delivery the IPIs and 1 if discarded. diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2b812b3..016c7e2 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6691,6 +6691,41 @@ static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned long flags, int apicid) kvm_irq_delivery_to_apic(kvm, NULL, &lapic_irq, NULL); } +/* + * Return 0 if successfully added and 1 if discarded. + */ +static int kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low, + unsigned long ipi_bitmap_high, int min, int vector, int op_64_bit) +{ + int i; + struct kvm_apic_map *map; + struct kvm_vcpu *vcpu; + struct kvm_lapic_irq irq = { + .delivery_mode = APIC_DM_FIXED, + .vector = vector, + }; + + rcu_read_lock(); + map = rcu_dereference(kvm->arch.apic_map); + + for_each_set_bit(i, &ipi_bitmap_low, BITS_PER_LONG) { + vcpu = map->phys_map[min + i]->vcpu; + if (!kvm_apic_set_irq(vcpu, &irq, NULL)) + return 1; + } + + if (op_64_bit) { + for_each_set_bit(i, &ipi_bitmap_high, BITS_PER_LONG) { + vcpu = map->phys_map[min + i + BITS_PER_LONG]->vcpu; + if (!kvm_apic_set_irq(vcpu, &irq, NULL)) + return 1; + } + } + + rcu_read_unlock(); + return 0; +} + void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu) { vcpu->arch.apicv_active = false; @@ -6739,6 +6774,9 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) case KVM_HC_CLOCK_PAIRING: ret = kvm_pv_clock_pairing(vcpu, a0, a1); break; + case KVM_HC_SEND_IPI: + ret = kvm_pv_send_ipi(vcpu->kvm, a0, a1, a2, a3, op_64_bit); + break; #endif default: ret = -KVM_ENOSYS; -- 2.7.4