Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757193Ab2B1S3W (ORCPT ); Tue, 28 Feb 2012 13:29:22 -0500 Received: from mx1.redhat.com ([209.132.183.28]:15522 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752587Ab2B1S3U (ORCPT ); Tue, 28 Feb 2012 13:29:20 -0500 Message-ID: <4F4D1CEF.20107@redhat.com> Date: Tue, 28 Feb 2012 20:29:03 +0200 From: Avi Kivity User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20111222 Thunderbird/9.0 MIME-Version: 1.0 To: Linus Torvalds CC: "H. Peter Anvin" , Josh Boyer , Jongman Heo , Thomas Gleixner , Ingo Molnar , x86@kernel.org, Linux Kernel Mailing List , KVM list Subject: Re: [PATCH 2/2] i387: split up into exported and internal interfaces References: <4F42FE08.5020309@zytor.com> <4F43DB69.9060509@zytor.com> <4F440945.1020904@zytor.com> <4F4CB89C.4060500@redhat.com> <4F4D0D18.4060409@redhat.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2739 Lines: 63 On 02/28/2012 08:08 PM, Linus Torvalds wrote: > On Tue, Feb 28, 2012 at 9:37 AM, Linus Torvalds > wrote: > > > > So where's the comment about why you actually own and control CR0.TS, > > and nobody else does? > > So what I think KVM should strive for (but I really don't know the > code, so maybe there are good reasons why it is impossible) is to just > never touch TS at all, and let the core kernel code do it all for you. Which TS? With kvm (restricting ourselves to vmx at this moment) there are three versions lying around: CR0.TS, GUEST_CR0.TS (which is loaded by the cpu during entry into the guest) and HOST_CR0.TS (which is loaded by the cpu during guest exit). GUEST_CR0.TS is actually a combination of the guest's virtualized CR0.TS, and a flag that says whether the guest fpu is loaded or not. HOST_CR0 is basically a cached CR0, but as it's expensive to change it, we don't want to reflect CR0.TS into HOST_CR0.TS. > When you need access to the FPU, let the core code just handle it for > you. Let it trap and restore the state. When you get scheduled away, > let the core code just set TS, because you really can't touch the FP > state again. > > IOW, just do the FP operations you do within the thread you are. Never > touch TS at all, just don't worry about it. Worry about your own > internal FP state machine, but don't interact with the "global" kernel > TS state machine. I can't avoid touching it. On exit vmx will set it for me. I can atomically copy CR0.TS into HOST_CR0.TS, but that's expensive. Maybe we should just virtualize it into a percpu variable. Should speed up the non-kvm case as well since read_cr0() is likely not very fast. > You can't do a lot better than that, I think. Especially now that we > do the lazy restore, we can schedule between two tasks and if only one > of them actually uses the FPU, we won't bother with extraneous state > restores. Ah, this is a new bit, I'll have to study it. > The one exception I can think of is that if you are loading totally > *new* FP state, and you think that TS is likely to be set, instead of > trapping (and loading the old state in the trap handling) only to > return to load the *new* state, we could expose a helper for that > situation. It would look something like > > user_fpu_begin(); > fpu_restore_checking(newfpustate); > > and it would avoid the trap when loading the new state. > -- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/