From patchwork Fri Nov 14 15:43:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 5307741 Return-Path: X-Original-To: patchwork-linux-crypto@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id DCD1DC11AC for ; Fri, 14 Nov 2014 15:43:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0945A20131 for ; Fri, 14 Nov 2014 15:43:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B4B6620123 for ; Fri, 14 Nov 2014 15:43:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965584AbaKNPn2 (ORCPT ); Fri, 14 Nov 2014 10:43:28 -0500 Received: from helcar.apana.org.au ([209.40.204.226]:60992 "EHLO helcar.apana.org.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965015AbaKNPn2 (ORCPT ); Fri, 14 Nov 2014 10:43:28 -0500 Received: from gondolin.me.apana.org.au ([192.168.0.6]) by fornost.hengli.com.au with esmtp (Exim 4.80 #3 (Debian)) id 1XpJ1u-0006Bt-0f; Sat, 15 Nov 2014 02:43:22 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 4.80) (envelope-from ) id 1XpJ1n-00047F-EO; Fri, 14 Nov 2014 23:43:15 +0800 Date: Fri, 14 Nov 2014 23:43:15 +0800 From: Herbert Xu To: "H. Peter Anvin" , Suresh Siddha , Ard Biesheuvel , Linux Crypto Mailing List , Linux Kernel Mailing List Cc: Steffen Klassert , Ming Liu Subject: simd: Allow simd use in kernel threads with softirqs disabled Message-ID: <20141114154315.GA15771@gondor.apana.org.au> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP While working on the cryptd request reordering problem, I noticed an anomaly where kernel threads are normally allowed to use simd per may_use_simd, but as soon as you disable softirqs, they suddenly lose that ability for no good reason. The problem is that in_interrupt does not distinguish between softirq processing and simply having softirqs disabled. This patch creates a new helper in_serving_interrupt which makes that distinction. It then uses this in all current implementations of may_use_simd. Signed-off-by: Herbert Xu Thanks, diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index a9a4229..6cdaa852 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c @@ -63,7 +63,7 @@ static inline bool interrupted_user_mode(void) */ bool irq_fpu_usable(void) { - return !in_interrupt() || + return !in_serving_interrupt() || interrupted_user_mode() || interrupted_kernel_fpu_idle(); } diff --git a/include/asm-generic/simd.h b/include/asm-generic/simd.h index f57eb7b..74e0b05 100644 --- a/include/asm-generic/simd.h +++ b/include/asm-generic/simd.h @@ -10,5 +10,5 @@ */ static __must_check inline bool may_use_simd(void) { - return !in_interrupt(); + return !in_serving_interrupt(); } diff --git a/include/linux/preempt_mask.h b/include/linux/preempt_mask.h index dbeec4d..18f3b46 100644 --- a/include/linux/preempt_mask.h +++ b/include/linux/preempt_mask.h @@ -65,6 +65,8 @@ #define in_softirq() (softirq_count()) #define in_interrupt() (irq_count()) #define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) +#define in_serving_interrupt() (irq_count() & (HARDIRQ_MASK | \ + SOFTIRQ_OFFSET | NMI_MASK)) /* * Are we in NMI context?