Received: by 10.223.185.111 with SMTP id b44csp348850wrg; Fri, 9 Mar 2018 06:05:34 -0800 (PST) X-Google-Smtp-Source: AG47ELuSNZs2iB+SEVfPmTfYgFBKW5sCBwLmvcNpzgOrNIPYmJDIOJfIymwpRZwnrygGW3LG1wYM X-Received: by 2002:a17:902:ba95:: with SMTP id k21-v6mr28353167pls.111.1520604334769; Fri, 09 Mar 2018 06:05:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520604334; cv=none; d=google.com; s=arc-20160816; b=GVEeByIBrg+d62tP9eS7Yp2FKhVh4WsDcMAfUDOJ+DutsvsowuAoSkP30urpyyfhIj a/mTIluTSc+O9eliFOdpLiuP0V0hMfGzaSbrEBVGfwPB0qwFYn1kCzZ5oi70t5MNdIc3 GeraIfBimS4JtsLnkNYztu4dW8aNr8JhogM6ApZOFCCYCuFksZZj8kwRbblykqkhDzc1 tTa6JpX+akMuOzD7CMck2aU7L7hwy1CnbKvyVZ3+4qzsZFGKKIy7Vz6XyCkoFaR9efJt QVlhED7opABQnusW4fGEfKOgACSxXb+TNk4hc5cUGqs+AuXmd/YYLhSEau6yGhG6Ngd/ EsOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=NVHWxTiF55fHHz07jJvNtWaD99GlkOMyKfDtxlx9+RI=; b=wVJj1PaOeFEgXUG0DjJwPc74K+Eu3qFHcdq8mBAbPVNmaqkXNbrMv7PbTvPs/TXwAx 1ABP4SLAldwuUQE9kzACyiLQusSghyAu3Yoz7kLlESqKyxDUe58vTzv7UzNvW9u4XFJ5 KXxLdz3Kik8OULzt381Ywov6e+Ar3vZffoypLZiVcHkSbBd8wyT85lsXMUdKvEmGltXl 4njtHFLF7c/fGq4oaS5vFApsLNRvdMyj4a2GSQLBAx1HDoI09SECY3pgp4618tk7z7Xg ryxDBkDeBogg8FaCu7HPTLQ5qqcld+IoJCHhihLpTBorOymvKlrrDXXU/ZMXr9eMatke 9tvg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h3-v6si910808plb.725.2018.03.09.06.05.17; Fri, 09 Mar 2018 06:05:34 -0800 (PST) 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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932144AbeCIODE (ORCPT + 99 others); Fri, 9 Mar 2018 09:03:04 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:35204 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932116AbeCIODB (ORCPT ); Fri, 9 Mar 2018 09:03:01 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B27018D746; Fri, 9 Mar 2018 14:03:00 +0000 (UTC) Received: from vitty.brq.redhat.com (unknown [10.43.2.155]) by smtp.corp.redhat.com (Postfix) with ESMTP id E305B215CDAA; Fri, 9 Mar 2018 14:02:58 +0000 (UTC) From: Vitaly Kuznetsov To: kvm@vger.kernel.org Cc: x86@kernel.org, Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , "Michael Kelley (EOSG)" , Mohammed Gamal , Cathy Avery , Bandan Das , linux-kernel@vger.kernel.org Subject: [PATCH v3 4/7] x86/hyper-v: allocate and use Virtual Processor Assist Pages Date: Fri, 9 Mar 2018 15:02:46 +0100 Message-Id: <20180309140249.2840-5-vkuznets@redhat.com> In-Reply-To: <20180309140249.2840-1-vkuznets@redhat.com> References: <20180309140249.2840-1-vkuznets@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 09 Mar 2018 14:03:00 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Fri, 09 Mar 2018 14:03:00 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'vkuznets@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Virtual Processor Assist Pages usage allows us to do optimized EOI processing for APIC, enable Enlightened VMCS support in KVM and more. struct hv_vp_assist_page is defined according to the Hyper-V TLFS v5.0b. Signed-off-by: Vitaly Kuznetsov --- Changes since v1: move HV_X64_ENLIGHTENED_VMCS_RECOMMENDED definition to this patch --- arch/x86/hyperv/hv_init.c | 33 +++++++++++++++++++++++++++++++++ arch/x86/include/asm/hyperv-tlfs.h | 13 +++++++++++++ arch/x86/include/asm/mshyperv.h | 10 ++++++++++ 3 files changed, 56 insertions(+) diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index 4b82bc206929..2e0c0351c5f8 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -88,6 +88,9 @@ EXPORT_SYMBOL_GPL(hyperv_cs); u32 *hv_vp_index; EXPORT_SYMBOL_GPL(hv_vp_index); +struct hv_vp_assist_page **hv_vp_assist_page; +EXPORT_SYMBOL_GPL(hv_vp_assist_page); + u32 hv_max_vp_index; static int hv_cpu_init(unsigned int cpu) @@ -101,6 +104,23 @@ static int hv_cpu_init(unsigned int cpu) if (msr_vp_index > hv_max_vp_index) hv_max_vp_index = msr_vp_index; + if (!hv_vp_assist_page) + return 0; + + if (!hv_vp_assist_page[smp_processor_id()]) + hv_vp_assist_page[smp_processor_id()] = + __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL); + + if (hv_vp_assist_page[smp_processor_id()]) { + u64 val; + + val = vmalloc_to_pfn(hv_vp_assist_page[smp_processor_id()]); + val = (val << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) | + HV_X64_MSR_VP_ASSIST_PAGE_ENABLE; + + wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, val); + } + return 0; } @@ -198,6 +218,12 @@ static int hv_cpu_die(unsigned int cpu) struct hv_reenlightenment_control re_ctrl; unsigned int new_cpu; + if (hv_vp_assist_page && hv_vp_assist_page[cpu]) { + wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, 0); + vfree(hv_vp_assist_page[cpu]); + hv_vp_assist_page[cpu] = NULL; + } + if (hv_reenlightenment_cb == NULL) return 0; @@ -241,6 +267,13 @@ void hyperv_init(void) if (!hv_vp_index) return; + hv_vp_assist_page = kcalloc(num_possible_cpus(), + sizeof(*hv_vp_assist_page), GFP_KERNEL); + if (!hv_vp_assist_page) { + ms_hyperv.hints &= ~HV_X64_ENLIGHTENED_VMCS_RECOMMENDED; + return; + } + if (cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/hyperv_init:online", hv_cpu_init, hv_cpu_die) < 0) goto free_vp_index; diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h index 5c0d8fab87a3..3d0fba18ab4c 100644 --- a/arch/x86/include/asm/hyperv-tlfs.h +++ b/arch/x86/include/asm/hyperv-tlfs.h @@ -156,6 +156,9 @@ /* Recommend using the newer ExProcessorMasks interface */ #define HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED (1 << 11) +/* Recommend using enlightened VMCS */ +#define HV_X64_ENLIGHTENED_VMCS_RECOMMENDED (1 << 14) + /* * Crash notification flag. */ @@ -469,6 +472,16 @@ struct hv_timer_message_payload { __u64 delivery_time; /* When the message was delivered */ }; +/* Define virtual processor assist page structure. */ +struct hv_vp_assist_page { + __u32 apic_assist; + __u32 reserved; + __u64 vtl_control[2]; + __u64 nested_enlightenments_control[2]; + __u32 enlighten_vmentry; + __u64 current_nested_vmcs; +}; + #define HV_STIMER_ENABLE (1ULL << 0) #define HV_STIMER_PERIODIC (1ULL << 1) #define HV_STIMER_LAZY (1ULL << 2) diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 38cfbe9a5794..dcb40567b35e 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -218,6 +218,12 @@ static inline u64 hv_do_rep_hypercall(u16 code, u16 rep_count, u16 varhead_size, */ extern u32 *hv_vp_index; extern u32 hv_max_vp_index; +extern struct hv_vp_assist_page **hv_vp_assist_page; + +static inline struct hv_vp_assist_page *hv_get_vp_assist_page(unsigned int cpu) +{ + return hv_vp_assist_page[cpu]; +} /** * hv_cpu_number_to_vp_number() - Map CPU to VP. @@ -254,6 +260,10 @@ static inline void hyperv_setup_mmu_ops(void) {} static inline void set_hv_tscchange_cb(void (*cb)(void)) {} static inline void clear_hv_tscchange_cb(void) {} static inline void hyperv_stop_tsc_emulation(void) {}; +static inline struct hv_vp_assist_page *hv_get_vp_assist_page(unsigned int cpu) +{ + return NULL; +} #endif /* CONFIG_HYPERV */ #ifdef CONFIG_HYPERV_TSCPAGE -- 2.14.3