From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752296AbdAZL0n (ORCPT ); Thu, 26 Jan 2017 06:26:43 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34339 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751037AbdAZL0l (ORCPT ); Thu, 26 Jan 2017 06:26:41 -0500 From: Ingo Molnar To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Andy Lutomirski , Borislav Petkov , Dave Hansen , Fenghua Yu , "H . Peter Anvin" , Linus Torvalds , Oleg Nesterov , Peter Zijlstra , Rik van Riel , Thomas Gleixner , Yu-cheng Yu Subject: [PATCH 0/7] x86/fpu: Simplify the FPU state machine Date: Thu, 26 Jan 2017 12:26:22 +0100 Message-Id: <1485429989-23340-1-git-send-email-mingo@kernel.org> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now that the lazy FPU switching code has been removed this series capitalizes on the simpler FPU context switching machinery and simplifies the x86 FPU handling state machine code. The new code relies on just two obvious fields, ::fpstate_active and ::fpregs_cached: /* * Highest level per task FPU state data structure that * contains the FPU register state plus various FPU * state fields: */ struct fpu { /* * @fpstate_active: * * This flag indicates whether this context is active: if the task * is not running then we can restore from this context, if the task * is running then we should save into this context. */ unsigned char fpstate_active; /* * @fpregs_cached: * * This flag tells us whether this context is loaded into a CPU * right now. * * This is set to 0 if a task is migrated to another CPU. */ unsigned char fpregs_cached; /* * @state: * * In-memory copy of all FPU registers that we save/restore * over context switches. If the task is using the FPU then * the registers in the FPU are more recent than this state * copy. If the task context-switches away then they get * saved here and represent the FPU state. */ union fpregs_state state; /* * WARNING: 'state' is dynamically-sized. Do not put * anything after it here. */ }; In particular ::last_cpu is replaced by a single ::fpregs_cached field (which is invalidated on migration), plus ::fpregs_state is gone. There's some code size reduction: 7 files changed, 41 insertions(+), 87 deletions(-) ... and the code is a lot more obvious now as well, I think. Lightly tested. The code can also be fetched from: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git WIP.x86/fpu Thanks, Ingo Ingo Molnar (7): x86/fpu: Simplify the fpu->last_cpu logic and rename it to fpu->fpregs_cached x86/fpu: Simplify fpu->fpregs_active use x86/fpu: Make the fpu state change in fpu__clear() scheduler-atomic x86/fpu: Split the state handling in fpu__drop() x86/fpu: Change fpu->fpregs_active users to fpu->fpstate_active x86/fpu: Decouple fpregs_activate()/fpregs_deactivate() from fpu->fpregs_active x86/fpu: Remove struct fpu::fpregs_active arch/x86/include/asm/fpu/internal.h | 42 ++++++++++-------------------------------- arch/x86/include/asm/fpu/types.h | 37 +++++-------------------------------- arch/x86/include/asm/switch_to.h | 10 ++++++++++ arch/x86/include/asm/trace/fpu.h | 5 +---- arch/x86/kernel/fpu/core.c | 29 ++++++++++++++++------------- arch/x86/kernel/fpu/signal.c | 9 +++++---- arch/x86/mm/pkeys.c | 3 +-- drivers/lguest/x86/core.c | 2 +- kernel/sched/core.c | 2 ++ kernel/sched/sched.h | 8 ++++++++ 10 files changed, 59 insertions(+), 88 deletions(-)