From patchwork Mon Jul 22 13:22:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 11052365 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0E059912 for ; Mon, 22 Jul 2019 13:24:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EFBCF28445 for ; Mon, 22 Jul 2019 13:24:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DFEC02849B; Mon, 22 Jul 2019 13:24:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6626428445 for ; Mon, 22 Jul 2019 13:24:55 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hpYHC-00086v-BG; Mon, 22 Jul 2019 13:22:50 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hpYHB-00086q-8Q for xen-devel@lists.xenproject.org; Mon, 22 Jul 2019 13:22:49 +0000 X-Inumbo-ID: cb7c9b06-ac83-11e9-8980-bc764e045a96 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id cb7c9b06-ac83-11e9-8980-bc764e045a96; Mon, 22 Jul 2019 13:22:47 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 317B7B123; Mon, 22 Jul 2019 13:22:46 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Mon, 22 Jul 2019 15:22:44 +0200 Message-Id: <20190722132244.893-1-jgross@suse.com> X-Mailer: git-send-email 2.16.4 Subject: [Xen-devel] [PATCH] x86: optimize loading of GDT at context switch X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Andrew Cooper , Wei Liu , Jan Beulich , =?utf-8?q?Roger_Pau_Monn=C3=A9?= MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Instead of dynamically decide whether the previous vcpu was using full or default GDT just add a percpu variable for that purpose. This at once removes the need for testing vcpu_ids to differ twice. This change improves performance by 0.5% - 1% on my test machine when doing parallel compilation. Signed-off-by: Juergen Gross Reviewed-by: Jan Beulich --- This patch was originally part of my core scheduling series, but it neither depends on any patch of that series, nor does any patch of the series depend on this one, so I'm sending it on its own. I have removed latching the need_full_gdt(nd) value in a local variable as it has shown to impact performance very slightly in a bad way. --- xen/arch/x86/cpu/common.c | 3 +++ xen/arch/x86/domain.c | 14 ++++++++------ xen/include/asm-x86/desc.h | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 1db96d959c..b0bb9292fd 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -49,6 +49,8 @@ unsigned int vaddr_bits __read_mostly = VADDR_BITS; static unsigned int cleared_caps[NCAPINTS]; static unsigned int forced_caps[NCAPINTS]; +DEFINE_PER_CPU(bool, full_gdt_loaded); + void __init setup_clear_cpu_cap(unsigned int cap) { const uint32_t *dfs; @@ -756,6 +758,7 @@ void load_system_tables(void) offsetof(struct tss_struct, __cacheline_filler) - 1, SYS_DESC_tss_busy); + per_cpu(full_gdt_loaded, cpu) = false; lgdt(&gdtr); lidt(&idtr); ltr(TSS_ENTRY << 3); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index ea55160887..353a6e24fb 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1670,7 +1670,7 @@ static void update_xen_slot_in_full_gdt(const struct vcpu *v, unsigned int cpu) : per_cpu(compat_gdt_table_l1e, cpu)); } -static void load_full_gdt(const struct vcpu *v) +static void load_full_gdt(const struct vcpu *v, unsigned int cpu) { struct desc_ptr gdt_desc = { .limit = LAST_RESERVED_GDT_BYTE, @@ -1678,6 +1678,8 @@ static void load_full_gdt(const struct vcpu *v) }; lgdt(&gdt_desc); + + per_cpu(full_gdt_loaded, cpu) = true; } static void load_default_gdt(unsigned int cpu) @@ -1689,6 +1691,8 @@ static void load_default_gdt(unsigned int cpu) }; lgdt(&gdt_desc); + + per_cpu(full_gdt_loaded, cpu) = false; } static void __context_switch(void) @@ -1739,8 +1743,7 @@ static void __context_switch(void) if ( need_full_gdt(nd) ) update_xen_slot_in_full_gdt(n, cpu); - - if ( need_full_gdt(pd) && + if ( per_cpu(full_gdt_loaded, cpu) && ((p->vcpu_id != n->vcpu_id) || !need_full_gdt(nd)) ) load_default_gdt(cpu); @@ -1753,9 +1756,8 @@ static void __context_switch(void) svm_load_segs(0, 0, 0, 0, 0, 0, 0); #endif - if ( need_full_gdt(nd) && - ((p->vcpu_id != n->vcpu_id) || !need_full_gdt(pd)) ) - load_full_gdt(n); + if ( need_full_gdt(nd) && !per_cpu(full_gdt_loaded, cpu) ) + load_full_gdt(n, cpu); if ( pd != nd ) cpumask_clear_cpu(cpu, pd->dirty_cpumask); diff --git a/xen/include/asm-x86/desc.h b/xen/include/asm-x86/desc.h index e565727dc0..c011c03ae2 100644 --- a/xen/include/asm-x86/desc.h +++ b/xen/include/asm-x86/desc.h @@ -210,6 +210,7 @@ DECLARE_PER_CPU(l1_pgentry_t, gdt_table_l1e); extern seg_desc_t boot_cpu_compat_gdt_table[]; DECLARE_PER_CPU(seg_desc_t *, compat_gdt_table); DECLARE_PER_CPU(l1_pgentry_t, compat_gdt_table_l1e); +DECLARE_PER_CPU(bool, full_gdt_loaded); extern void load_TR(void);