Received: by 10.192.165.148 with SMTP id m20csp291493imm; Thu, 3 May 2018 20:31:56 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrDtK2c2GmYgS3Sp+LUHvqmt6YoENnWckXY3ux6qqwQXmaf3bLm0aKZxP6GYoBWNu8MzPyW X-Received: by 2002:a17:902:4303:: with SMTP id i3-v6mr27085707pld.394.1525404715973; Thu, 03 May 2018 20:31:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525404715; cv=none; d=google.com; s=arc-20160816; b=keHqvBon3zQuB8QcGS+lcTsuhG28n6Vp+ma3ZshwXkbgusM08KZrB6obqMwW5OScEU Ai5Ez3MP2z9hHoBPIP/IxYjUiinjnJ0b4U9B5Jh3os12DMLXS9E8v45BLh1DDmIg0mEQ 7Zsa5uiYbWZdMz53JEjQKIGc32VhWruID67AkRHoNencWM4TzNdBkTvuk8Yelkv05JAN yV6IJvCj5cUzKLF7KlNgmmWSwIgdywg3vI1HnogbSwwCyfW0ojlImkP3H6Ca6CubELH6 rd7hbfw7nF9HnzavYMyeNMqBHhKk+vQGshmSmSJBiaYGmMjU62baLh/fh1YDVA6XPTrH 8Rtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject :smtp-origin-cluster:cc:to:smtp-origin-hostname:from :smtp-origin-hostprefix:dkim-signature:arc-authentication-results; bh=HdvC8a6r7RuiuOd9gsdowDFam9SGx3G13TfVpYu7bco=; b=eIIryObN2gv+Ur+D+/xdA5VdArlX9GAuYl76Y/oQ92ZsBX/DXgUEHwHFcv5LgatzLS lKVIvySIgrDLAdloT5rYd7k5Shj+wxdgW0cYL4eFshHYRxoTTcqlQWK3b5AtoK0nu9Jx iTDshmRz2vsoSpeNlfX5/f5KgSGt7petcwQH7aKuy3cJJ0TwItQctZfIq/QIV7DiRzf4 f1XzRNn+qldO/nsxXazqp30wBmYNn4+gtyQY9eAm3xjjZMa8wznH50BgvXKiAf+kBdHI tjax8Zlu8LWNtnzfzNJ3p6XKekdt0kxbYfq++Gy0QrPe3VXSHDwWlU/ZQMJc8ABUGVEf vi6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fb.com header.s=facebook header.b=Zu/CRnax; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=fb.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 95-v6si778600plc.383.2018.05.03.20.31.42; Thu, 03 May 2018 20:31:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@fb.com header.s=facebook header.b=Zu/CRnax; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=fb.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751382AbeEDDbX (ORCPT + 99 others); Thu, 3 May 2018 23:31:23 -0400 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:45798 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751236AbeEDDbW (ORCPT ); Thu, 3 May 2018 23:31:22 -0400 Received: from pps.filterd (m0001255.ppops.net [127.0.0.1]) by mx0b-00082601.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w443RGhh015008 for ; Thu, 3 May 2018 20:31:21 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : mime-version : content-type; s=facebook; bh=HdvC8a6r7RuiuOd9gsdowDFam9SGx3G13TfVpYu7bco=; b=Zu/CRnaxMgv95iFuLMvCOJvKr1NoANulP4wJJHHSTBHMco5HQBKSllkrrreqQKS9hH1x Wg5iQ24ujKGxFSNyp2HSa8/AMtPGHyjzzHm1pdyM4ayTwjB2OUXqHdU/LWOiVroh7TSj 6bF8eoC3U1kHu/jvs78sSgWbEEfSipuoAIo= Received: from mail.thefacebook.com ([199.201.64.23]) by mx0b-00082601.pphosted.com with ESMTP id 2hr8ngh01y-2 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 03 May 2018 20:31:21 -0700 Received: from mx-out.facebook.com (192.168.52.123) by PRN-CHUB12.TheFacebook.com (192.168.16.22) with Microsoft SMTP Server id 14.3.319.2; Thu, 3 May 2018 20:31:19 -0700 Received: by devbig474.prn1.facebook.com (Postfix, from userid 128203) id 99D66E415D5; Thu, 3 May 2018 20:31:19 -0700 (PDT) Smtp-Origin-Hostprefix: devbig From: Yonghong Song Smtp-Origin-Hostname: devbig474.prn1.facebook.com To: , , , , , , , CC: Smtp-Origin-Cluster: prn1c29 Subject: [PATCH bpf v3] x86/cpufeature: bpf hack for clang not supporting asm goto Date: Thu, 3 May 2018 20:31:19 -0700 Message-ID: <20180504033119.2130788-1-yhs@fb.com> X-Mailer: git-send-email 2.9.5 X-FB-Internal: Safe MIME-Version: 1.0 Content-Type: text/plain X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-05-03_10:,, signatures=0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit d0266046ad54 ("x86: Remove FAST_FEATURE_TESTS") removed X86_FAST_FEATURE_TESTS and make macro static_cpu_has() always use __always_inline function _static_cpu_has() funciton. The static_cpu_has() uses gcc feature asm goto construct, which is not supported by clang. Issues ====== Currently, for BPF programs written in C, the only widely-supported compiler is clang. Because of clang lacking support of asm goto construct, if you try to compile bpf programs under samples/bpf/, $ make -j20 && make headers_install && make samples/bpf/ you will see a lot of failures like below: clang -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include \ -I/home/yhs/work/bpf-next/arch/x86/include \ -I./arch/x86/include/generated -I/home/yhs/work/bpf-next/include \ -I./include -I/home/yhs/work/bpf-next/arch/x86/include/uapi \ -I./arch/x86/include/generated/uapi \ -I/home/yhs/work/bpf-next/include/uapi -I./include/generated/uapi \ -include /home/yhs/work/bpf-next/include/linux/kconfig.h -Isamples/bpf \ -I/home/yhs/work/bpf-next/tools/testing/selftests/bpf/ \ -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \ -D__TARGET_ARCH_x86 -Wno-compare-distinct-pointer-types \ -Wno-gnu-variable-sized-type-not-at-end \ -Wno-address-of-packed-member -Wno-tautological-compare \ -Wno-unknown-warning-option \ -O2 -emit-llvm -c /home/yhs/work/bpf-next/samples/bpf/xdp_redirect_cpu_kern.c \ -o -| llc -march=bpf -filetype=obj -o samples/bpf/xdp_redirect_cpu_kern.o In file included from /home/yhs/work/bpf-next/samples/bpf/xdp_redirect_cpu_kern.c:10: In file included from /home/yhs/work/bpf-next/include/uapi/linux/in.h:24: In file included from /home/yhs/work/bpf-next/include/linux/socket.h:8: In file included from /home/yhs/work/bpf-next/include/linux/uio.h:13: In file included from /home/yhs/work/bpf-next/include/linux/thread_info.h:38: In file included from /home/yhs/work/bpf-next/arch/x86/include/asm/thread_info.h:53: /home/yhs/work/bpf-next/arch/x86/include/asm/cpufeature.h:150:2: error: 'asm goto' constructs are not supported yet asm_volatile_goto("1: jmp 6f\n" ^ /home/yhs/work/bpf-next/include/linux/compiler-gcc.h:296:42: note: expanded from macro 'asm_volatile_goto' #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ^ 1 error generated. ... In file included from /home/yhs/work/bpf-next/samples/bpf/tracex4_kern.c:7: In file included from /home/yhs/work/bpf-next/include/linux/ptrace.h:6: In file included from /home/yhs/work/bpf-next/include/linux/sched.h:14: In file included from /home/yhs/work/bpf-next/include/linux/pid.h:5: In file included from /home/yhs/work/bpf-next/include/linux/rculist.h:11: In file included from /home/yhs/work/bpf-next/include/linux/rcupdate.h:40: In file included from /home/yhs/work/bpf-next/include/linux/preempt.h:81: In file included from /home/yhs/work/bpf-next/arch/x86/include/asm/preempt.h:7: In file included from /home/yhs/work/bpf-next/include/linux/thread_info.h:38: In file included from /home/yhs/work/bpf-next/arch/x86/include/asm/thread_info.h:53: /home/yhs/work/bpf-next/arch/x86/include/asm/cpufeature.h:150:2: error: 'asm goto' constructs are not supported yet ... In the above, bpf compilation looks like below clang -target ... -emit-llvm -c -o - | llc -march=bpf ... The clang compilation targets the native architecture and generates the LLVM IR bytecode, and the llc compilation takes the IR bytecode and generates bpf instructions. If kernel header files accessed by bpf program have asm goto construct, e.g., arch/x86/include/asm/cpufeature.h, the "clang -target ..." compilation will fail as clang does not support asm goto yet. Solution ========= The solution proposed in this patch does not need user space change. When the kernel detects the compiler has asm goto support, it sets CC_HAVE_ASM_GOTO, the patch added the additional marco definition __NO_CLANG_BPF_HACK. In arch/x86/include/asm/cpufeature.h, the asm goto construct is accessed only if __NO_CLANG_BPF_HACK is defined. This should not impact kernel compilation functionality since for x86, we have ifndef CC_HAVE_ASM_GOTO $(error Compiler lacks asm-goto support.) endif So __NO_CLANG_BPF_HACK should be always defined during kernel compilation targeting x86. User space code which compiles bpf program does not have __NO_CLANG_BPF_HACK defined so it will go to alternate path which avoids asm goto. This approach is preferred since the already deployed bcc scripts, or any other bpf applicaitons utilizing LLVM JIT compilation functionality, will continue work with the new kernel without re-compilation and re-deployment. Note that this is a hack in the kernel to workaround bpf compilation issue. The hack will be removed once clang starts to support asm goto. Fixes: d0266046ad54 ("x86: Remove FAST_FEATURE_TESTS") Suggested-by: Alexei Starovoitov Signed-off-by: Yonghong Song --- Makefile | 1 + arch/x86/include/asm/cpufeature.h | 5 +++++ 2 files changed, 6 insertions(+) Changelog: v2 -> v3: . Changed macro name from NO_BPF_WORKAROUND to __NO_CLANG_BPF_HACK. Explained the solution in more details. v1 -> v2: . Use NO_BPF_WORKAROUND macro instead of CC_HAVE_ASM_GOTO to make it explicit that this is a workaround. Peter, Could you take a look at this patch revision and give your opinion? More and more people hit this issue and have to manually work around it. It would be good if this can be resolved soon. Thanks! diff --git a/Makefile b/Makefile index 83b6c54..cfd8759 100644 --- a/Makefile +++ b/Makefile @@ -504,6 +504,7 @@ export RETPOLINE_CFLAGS ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y) CC_HAVE_ASM_GOTO := 1 KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO + KBUILD_CFLAGS += -D__NO_CLANG_BPF_HACK KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO endif diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index b27da96..42edd5d 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -140,6 +140,8 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit); #define setup_force_cpu_bug(bit) setup_force_cpu_cap(bit) +/* this macro is a temporary hack for bpf until clang gains asm-goto support */ +#ifdef __NO_CLANG_BPF_HACK /* * Static testing of CPU features. Used the same as boot_cpu_has(). * These will statically patch the target code for additional @@ -195,6 +197,9 @@ static __always_inline __pure bool _static_cpu_has(u16 bit) boot_cpu_has(bit) : \ _static_cpu_has(bit) \ ) +#else +#define static_cpu_has(bit) boot_cpu_has(bit) +#endif #define cpu_has_bug(c, bit) cpu_has(c, (bit)) #define set_cpu_bug(c, bit) set_cpu_cap(c, (bit)) -- 2.9.5