From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752311AbbKPTwh (ORCPT ); Mon, 16 Nov 2015 14:52:37 -0500 Received: from frisell.zx2c4.com ([192.95.5.64]:47833 "EHLO frisell.zx2c4.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752221AbbKPTwd (ORCPT ); Mon, 16 Nov 2015 14:52:33 -0500 MIME-Version: 1.0 Date: Mon, 16 Nov 2015 20:52:28 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: irq_fpu_usable() is false in ndo_start_xmit() for UDP packets From: "Jason A. Donenfeld" To: Netdev , LKML Cc: David Miller Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi David & Folks, I have a virtual device driver that does some fancy processing of packets in ndo_start_xmit before forwarding them onward out of a tunnel elsewhere. In order to make that fancy processing fast, I have AVX and AVX2 implementations. This means I need to use the FPU. So, I do the usual pattern found throughout the kernel: if (!irq_fpu_usable()) generic_c(...); else { kernel_fpu_begin(); optimized_avx(...); kernel_fpu_end(); } This works fine with, say, iperf3 in TCP mode. The AVX performance is great. However, when using iperf3 in UDP mode, irq_fpu_usable() is mostly false! I added a dump_stack() call to see why, except nothing looks strange; the initial call in the stack trace is entry_SYSCALL_64_fastpath. Why would irq_fpu_usable() return false when we're in a syscall? Doesn't that mean this is in process context? So, I find this a bit disturbing. If anybody has an explanation, and a way to work around it, I'd be quite happy. Or, simply if there is a debugging technique you'd recommend, I'd be happy to try something and report back. Thanks, Jason