From: David Vrabel <david.vrabel@citrix.com>
To: David Vrabel <david.vrabel@citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"x86@kernel.org" <x86@kernel.org>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH] x86/xen: avoid updating TLS descriptors if they haven't changed
Date: Thu, 14 Jun 2012 15:52:19 +0100 [thread overview]
Message-ID: <4FD9FAA3.6090303@citrix.com> (raw)
In-Reply-To: <1339088494-23528-1-git-send-email-david.vrabel@citrix.com>
On 07/06/12 18:01, David Vrabel wrote:
> From: David Vrabel <david.vrabel@citrix.com>
>
> When switching tasks in a Xen PV guest, avoid updating the TLS
> descriptors if they haven't changed. This improves the speed of
> context switches by almost 10% as much of the time the descriptors are
> the same or only one is different.
>
> The descriptors written into the GDT by Xen are modified from the
> values passed in the update_descriptor hypercall so we keep shadow
> copies of the three TLS descriptors to compare against.
>
> lmbench3 test Before After Improvement
> --------------------------------------------
> lat_ctx -s 32 24 7.19 6.52 9%
> lat_pipe 12.56 11.66 7%
>
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> ---
> I note that the comment in asm/desc_defs.h says the 'a' and 'b' fields
> in desc_struct as deprecated but there seems to be no suitable
> alternatives.
ping? Any opinion on this patch from the x86 side? If it's okay can we
get an ack so Konrad can take the patch via his tree.
Thanks.
David
> ---
> arch/x86/xen/enlighten.c | 30 +++++++++++++++++++++++++++---
> 1 files changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> index e74df95..18e14af 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -124,6 +124,19 @@ struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info;
> */
> static int have_vcpu_info_placement = 1;
>
> +struct tls_descs {
> + struct desc_struct desc[3];
> +};
> +
> +/*
> + * Updating the 3 TLS descriptors in the GDT on every task switch is
> + * surprisingly expensive so we avoid updating them if they haven't
> + * changed. Since Xen writes different descriptors than the one
> + * passed in the update_descriptor hypercall we keep shadow copies to
> + * compare against.
> + */
> +static DEFINE_PER_CPU(struct tls_descs, shadow_tls_desc);
> +
> static void clamp_max_cpus(void)
> {
> #ifdef CONFIG_SMP
> @@ -535,9 +548,20 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
> static void load_TLS_descriptor(struct thread_struct *t,
> unsigned int cpu, unsigned int i)
> {
> - struct desc_struct *gdt = get_cpu_gdt_table(cpu);
> - xmaddr_t maddr = arbitrary_virt_to_machine(&gdt[GDT_ENTRY_TLS_MIN+i]);
> - struct multicall_space mc = __xen_mc_entry(0);
> + struct desc_struct *shadow = &per_cpu(shadow_tls_desc, cpu).desc[i];
> + struct desc_struct *gdt;
> + xmaddr_t maddr;
> + struct multicall_space mc;
> +
> + if (shadow->a == t->tls_array[i].a && shadow->b == t->tls_array[i].b)
> + return;
> +
> + shadow->a = t->tls_array[i].a;
> + shadow->b = t->tls_array[i].b;
> +
> + gdt = get_cpu_gdt_table(cpu);
> + maddr = arbitrary_virt_to_machine(&gdt[GDT_ENTRY_TLS_MIN+i]);
> + mc = __xen_mc_entry(0);
>
> MULTI_update_descriptor(mc.mc, maddr.maddr, t->tls_array[i]);
> }
next prev parent reply other threads:[~2012-06-14 14:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-07 17:01 [PATCH] x86/xen: avoid updating TLS descriptors if they haven't changed David Vrabel
2012-06-14 14:52 ` David Vrabel [this message]
2012-06-14 16:49 ` Konrad Rzeszutek Wilk
2012-06-14 18:05 ` David Vrabel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FD9FAA3.6090303@citrix.com \
--to=david.vrabel@citrix.com \
--cc=hpa@zytor.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).