All of lore.kernel.org
 help / color / mirror / Atom feed
* perf test LLVM & clang 6 failing
@ 2017-11-24 14:47 Arnaldo Carvalho de Melo
  2017-11-24 15:16 ` Daniel Borkmann
  0 siblings, 1 reply; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-24 14:47 UTC (permalink / raw)
  To: Wang Nan
  Cc: Alexei Starovoitov, Daniel Borkmann, Adrian Hunter, David Ahern,
	Jiri Olsa, Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List

FYI, just noticed, recently updated clang to version 6, from its
upstream git repo.

root@jouet ~]# perf test -v LLVM
37: LLVM search and compile                               :
37.1: Basic BPF llvm compile                              :
--- start ---
test child forked, pid 5255
Kernel build dir is set to /lib/modules/4.14.0+/build
set env: KBUILD_DIR=/lib/modules/4.14.0+/build
unset env: KBUILD_OPTS
include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: NR_CPUS=4
set env: LINUX_VERSION_CODE=0x40e00
set env: CLANG_EXEC=/usr/local/bin/clang
set env: CLANG_OPTIONS=-xc 
set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: WORKING_DIR=/lib/modules/4.14.0+/build
set env: CLANG_SOURCE=-
llvm compiling command template: echo '/*
 * bpf-script-example.c
 * Test basic LLVM building
 */
#ifndef LINUX_VERSION_CODE
# error Need LINUX_VERSION_CODE
# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
#endif
#define BPF_ANY 0
#define BPF_MAP_TYPE_ARRAY 2
#define BPF_FUNC_map_lookup_elem 1
#define BPF_FUNC_map_update_elem 2

static void *(*bpf_map_lookup_elem)(void *map, void *key) =
	(void *) BPF_FUNC_map_lookup_elem;
static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
	(void *) BPF_FUNC_map_update_elem;

struct bpf_map_def {
	unsigned int type;
	unsigned int key_size;
	unsigned int value_size;
	unsigned int max_entries;
};

#define SEC(NAME) __attribute__((section(NAME), used))
struct bpf_map_def SEC("maps") flip_table = {
	.type = BPF_MAP_TYPE_ARRAY,
	.key_size = sizeof(int),
	.value_size = sizeof(int),
	.max_entries = 1,
};

SEC("func=SyS_epoll_wait")
int bpf_func__SyS_epoll_wait(void *ctx)
{
	int ind =0;
	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
	int new_flag;
	if (!flag)
		return 0;
	/* flip flag and store back */
	new_flag = !*flag;
	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
	return new_flag;
}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
test child finished with 0
---- end ----
LLVM search and compile subtest 0: Ok
37.2: kbuild searching                                    :
--- start ---
test child forked, pid 5728
Kernel build dir is set to /lib/modules/4.14.0+/build
set env: KBUILD_DIR=/lib/modules/4.14.0+/build
unset env: KBUILD_OPTS
include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: NR_CPUS=4
set env: LINUX_VERSION_CODE=0x40e00
set env: CLANG_EXEC=/usr/local/bin/clang
set env: CLANG_OPTIONS=-xc 
set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: WORKING_DIR=/lib/modules/4.14.0+/build
set env: CLANG_SOURCE=-
llvm compiling command template: echo '/*
 * bpf-script-test-kbuild.c
 * Test include from kernel header
 */
#ifndef LINUX_VERSION_CODE
# error Need LINUX_VERSION_CODE
# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
#endif
#define SEC(NAME) __attribute__((section(NAME), used))

#include <uapi/linux/fs.h>
#include <uapi/asm/ptrace.h>

SEC("func=vfs_llseek")
int bpf_func__vfs_llseek(void *ctx)
{
	return 0;
}

char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
In file included from <stdin>:12:
In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
In file included from /home/acme/git/linux/include/linux/compiler.h:237:
In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
/home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
register unsigned long current_stack_pointer asm(_ASM_SP);
                                                 ^
/home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
#define _ASM_SP         __ASM_REG(sp)
                        ^
/home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
#define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
                               ^
/home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
                            ^
/home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
# define __ASM_FORM_RAW(x)     #x
                               ^
<scratch space>:4:1: note: expanded from here
"esp"
^
1 error generated.
ERROR:	unable to compile -
Hint:	Check error message shown above.
Hint:	You can also pre-compile it into .o using:
     		clang -target bpf -O2 -c -
     	with proper -I and -D options.
Failed to compile test case: 'kbuild searching'
test child finished with -1
---- end ----
LLVM search and compile subtest 1: FAILED!
37.3: Compile source for BPF prologue generation          :
--- force skipped ---
LLVM search and compile subtest 2: Skip
37.4: Compile source for BPF relocation                   :
--- force skipped ---
LLVM search and compile subtest 3: Skip
[root@jouet ~]# clang -v
clang version 6.0.0 (http://llvm.org/git/clang.git 56cc8f8880db2ebc433eeb6b6a707c101467a186) (http://llvm.org/git/llvm.git 3656d83960a4f3fedf6d8f19043abf52379f78c3)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
[root@jouet ~]#

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-24 14:47 perf test LLVM & clang 6 failing Arnaldo Carvalho de Melo
@ 2017-11-24 15:16 ` Daniel Borkmann
  2017-11-24 19:09   ` Arnaldo Carvalho de Melo
  2017-11-27 17:04   ` Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 15+ messages in thread
From: Daniel Borkmann @ 2017-11-24 15:16 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Wang Nan
  Cc: Alexei Starovoitov, Adrian Hunter, David Ahern, Jiri Olsa,
	Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List, yhs

[ +Yonghong ]

On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> FYI, just noticed, recently updated clang to version 6, from its
> upstream git repo.

Do you recall what was your LLVM version prior to this where it was
working fine? (Wild guess from below would be the BPF inline asm
support that was added recently to LLVM (2865ab6996) vs asm() used
in headers included in the stdin header causing trouble due to arch
mixup?)

> root@jouet ~]# perf test -v LLVM
> 37: LLVM search and compile                               :
> 37.1: Basic BPF llvm compile                              :
> --- start ---
> test child forked, pid 5255
> Kernel build dir is set to /lib/modules/4.14.0+/build
> set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> unset env: KBUILD_OPTS
> include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> set env: NR_CPUS=4
> set env: LINUX_VERSION_CODE=0x40e00
> set env: CLANG_EXEC=/usr/local/bin/clang
> set env: CLANG_OPTIONS=-xc 
> set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> set env: WORKING_DIR=/lib/modules/4.14.0+/build
> set env: CLANG_SOURCE=-
> llvm compiling command template: echo '/*
>  * bpf-script-example.c
>  * Test basic LLVM building
>  */
> #ifndef LINUX_VERSION_CODE
> # error Need LINUX_VERSION_CODE
> # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> #endif
> #define BPF_ANY 0
> #define BPF_MAP_TYPE_ARRAY 2
> #define BPF_FUNC_map_lookup_elem 1
> #define BPF_FUNC_map_update_elem 2
> 
> static void *(*bpf_map_lookup_elem)(void *map, void *key) =
> 	(void *) BPF_FUNC_map_lookup_elem;
> static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
> 	(void *) BPF_FUNC_map_update_elem;
> 
> struct bpf_map_def {
> 	unsigned int type;
> 	unsigned int key_size;
> 	unsigned int value_size;
> 	unsigned int max_entries;
> };
> 
> #define SEC(NAME) __attribute__((section(NAME), used))
> struct bpf_map_def SEC("maps") flip_table = {
> 	.type = BPF_MAP_TYPE_ARRAY,
> 	.key_size = sizeof(int),
> 	.value_size = sizeof(int),
> 	.max_entries = 1,
> };
> 
> SEC("func=SyS_epoll_wait")
> int bpf_func__SyS_epoll_wait(void *ctx)
> {
> 	int ind =0;
> 	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
> 	int new_flag;
> 	if (!flag)
> 		return 0;
> 	/* flip flag and store back */
> 	new_flag = !*flag;
> 	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
> 	return new_flag;
> }
> char _license[] SEC("license") = "GPL";
> int _version SEC("version") = LINUX_VERSION_CODE;
> ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> test child finished with 0
> ---- end ----
> LLVM search and compile subtest 0: Ok
> 37.2: kbuild searching                                    :
> --- start ---
> test child forked, pid 5728
> Kernel build dir is set to /lib/modules/4.14.0+/build
> set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> unset env: KBUILD_OPTS
> include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> set env: NR_CPUS=4
> set env: LINUX_VERSION_CODE=0x40e00
> set env: CLANG_EXEC=/usr/local/bin/clang
> set env: CLANG_OPTIONS=-xc 
> set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> set env: WORKING_DIR=/lib/modules/4.14.0+/build
> set env: CLANG_SOURCE=-
> llvm compiling command template: echo '/*
>  * bpf-script-test-kbuild.c
>  * Test include from kernel header
>  */
> #ifndef LINUX_VERSION_CODE
> # error Need LINUX_VERSION_CODE
> # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> #endif
> #define SEC(NAME) __attribute__((section(NAME), used))
> 
> #include <uapi/linux/fs.h>
> #include <uapi/asm/ptrace.h>
> 
> SEC("func=vfs_llseek")
> int bpf_func__vfs_llseek(void *ctx)
> {
> 	return 0;
> }
> 
> char _license[] SEC("license") = "GPL";
> int _version SEC("version") = LINUX_VERSION_CODE;
> ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> In file included from <stdin>:12:
> In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
> In file included from /home/acme/git/linux/include/linux/compiler.h:237:
> In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
> In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
> /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
> register unsigned long current_stack_pointer asm(_ASM_SP);
>                                                  ^
> /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
> #define _ASM_SP         __ASM_REG(sp)
>                         ^
> /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
> #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
>                                ^
> /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
> # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
>                             ^
> /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
> # define __ASM_FORM_RAW(x)     #x
>                                ^
> <scratch space>:4:1: note: expanded from here
> "esp"
> ^
> 1 error generated.
> ERROR:	unable to compile -
> Hint:	Check error message shown above.
> Hint:	You can also pre-compile it into .o using:
>      		clang -target bpf -O2 -c -
>      	with proper -I and -D options.
> Failed to compile test case: 'kbuild searching'
> test child finished with -1
> ---- end ----
> LLVM search and compile subtest 1: FAILED!
> 37.3: Compile source for BPF prologue generation          :
> --- force skipped ---
> LLVM search and compile subtest 2: Skip
> 37.4: Compile source for BPF relocation                   :
> --- force skipped ---
> LLVM search and compile subtest 3: Skip
> [root@jouet ~]# clang -v
> clang version 6.0.0 (http://llvm.org/git/clang.git 56cc8f8880db2ebc433eeb6b6a707c101467a186) (http://llvm.org/git/llvm.git 3656d83960a4f3fedf6d8f19043abf52379f78c3)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
> InstalledDir: /usr/local/bin
> Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> Candidate multilib: .;@m64
> Candidate multilib: 32;@m32
> Selected multilib: .;@m64
> [root@jouet ~]#
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-24 15:16 ` Daniel Borkmann
@ 2017-11-24 19:09   ` Arnaldo Carvalho de Melo
  2017-11-26  6:29     ` Yonghong Song
  2017-11-27 17:04   ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-24 19:09 UTC (permalink / raw)
  To: Daniel Borkmann
  Cc: Wang Nan, Alexei Starovoitov, Adrian Hunter, David Ahern,
	Jiri Olsa, Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List,
	yhs

Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> [ +Yonghong ]
> 
> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > FYI, just noticed, recently updated clang to version 6, from its
> > upstream git repo.
> 
> Do you recall what was your LLVM version prior to this where it was
> working fine? (Wild guess from below would be the BPF inline asm

IIRC it was 4.0

> support that was added recently to LLVM (2865ab6996) vs asm() used
> in headers included in the stdin header causing trouble due to arch
> mixup?)
> 
> > root@jouet ~]# perf test -v LLVM
> > 37: LLVM search and compile                               :
> > 37.1: Basic BPF llvm compile                              :
> > --- start ---
> > test child forked, pid 5255
> > Kernel build dir is set to /lib/modules/4.14.0+/build
> > set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> > unset env: KBUILD_OPTS
> > include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> > set env: NR_CPUS=4
> > set env: LINUX_VERSION_CODE=0x40e00
> > set env: CLANG_EXEC=/usr/local/bin/clang
> > set env: CLANG_OPTIONS=-xc 
> > set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> > set env: WORKING_DIR=/lib/modules/4.14.0+/build
> > set env: CLANG_SOURCE=-
> > llvm compiling command template: echo '/*
> >  * bpf-script-example.c
> >  * Test basic LLVM building
> >  */
> > #ifndef LINUX_VERSION_CODE
> > # error Need LINUX_VERSION_CODE
> > # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> > #endif
> > #define BPF_ANY 0
> > #define BPF_MAP_TYPE_ARRAY 2
> > #define BPF_FUNC_map_lookup_elem 1
> > #define BPF_FUNC_map_update_elem 2
> > 
> > static void *(*bpf_map_lookup_elem)(void *map, void *key) =
> > 	(void *) BPF_FUNC_map_lookup_elem;
> > static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
> > 	(void *) BPF_FUNC_map_update_elem;
> > 
> > struct bpf_map_def {
> > 	unsigned int type;
> > 	unsigned int key_size;
> > 	unsigned int value_size;
> > 	unsigned int max_entries;
> > };
> > 
> > #define SEC(NAME) __attribute__((section(NAME), used))
> > struct bpf_map_def SEC("maps") flip_table = {
> > 	.type = BPF_MAP_TYPE_ARRAY,
> > 	.key_size = sizeof(int),
> > 	.value_size = sizeof(int),
> > 	.max_entries = 1,
> > };
> > 
> > SEC("func=SyS_epoll_wait")
> > int bpf_func__SyS_epoll_wait(void *ctx)
> > {
> > 	int ind =0;
> > 	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
> > 	int new_flag;
> > 	if (!flag)
> > 		return 0;
> > 	/* flip flag and store back */
> > 	new_flag = !*flag;
> > 	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
> > 	return new_flag;
> > }
> > char _license[] SEC("license") = "GPL";
> > int _version SEC("version") = LINUX_VERSION_CODE;
> > ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> > test child finished with 0
> > ---- end ----
> > LLVM search and compile subtest 0: Ok
> > 37.2: kbuild searching                                    :
> > --- start ---
> > test child forked, pid 5728
> > Kernel build dir is set to /lib/modules/4.14.0+/build
> > set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> > unset env: KBUILD_OPTS
> > include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> > set env: NR_CPUS=4
> > set env: LINUX_VERSION_CODE=0x40e00
> > set env: CLANG_EXEC=/usr/local/bin/clang
> > set env: CLANG_OPTIONS=-xc 
> > set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
> > set env: WORKING_DIR=/lib/modules/4.14.0+/build
> > set env: CLANG_SOURCE=-
> > llvm compiling command template: echo '/*
> >  * bpf-script-test-kbuild.c
> >  * Test include from kernel header
> >  */
> > #ifndef LINUX_VERSION_CODE
> > # error Need LINUX_VERSION_CODE
> > # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> > #endif
> > #define SEC(NAME) __attribute__((section(NAME), used))
> > 
> > #include <uapi/linux/fs.h>
> > #include <uapi/asm/ptrace.h>
> > 
> > SEC("func=vfs_llseek")
> > int bpf_func__vfs_llseek(void *ctx)
> > {
> > 	return 0;
> > }
> > 
> > char _license[] SEC("license") = "GPL";
> > int _version SEC("version") = LINUX_VERSION_CODE;
> > ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> > In file included from <stdin>:12:
> > In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
> > In file included from /home/acme/git/linux/include/linux/compiler.h:237:
> > In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
> > In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
> > register unsigned long current_stack_pointer asm(_ASM_SP);
> >                                                  ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
> > #define _ASM_SP         __ASM_REG(sp)
> >                         ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
> > #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
> >                                ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
> > # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
> >                             ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
> > # define __ASM_FORM_RAW(x)     #x
> >                                ^
> > <scratch space>:4:1: note: expanded from here
> > "esp"
> > ^
> > 1 error generated.
> > ERROR:	unable to compile -
> > Hint:	Check error message shown above.
> > Hint:	You can also pre-compile it into .o using:
> >      		clang -target bpf -O2 -c -
> >      	with proper -I and -D options.
> > Failed to compile test case: 'kbuild searching'
> > test child finished with -1
> > ---- end ----
> > LLVM search and compile subtest 1: FAILED!
> > 37.3: Compile source for BPF prologue generation          :
> > --- force skipped ---
> > LLVM search and compile subtest 2: Skip
> > 37.4: Compile source for BPF relocation                   :
> > --- force skipped ---
> > LLVM search and compile subtest 3: Skip
> > [root@jouet ~]# clang -v
> > clang version 6.0.0 (http://llvm.org/git/clang.git 56cc8f8880db2ebc433eeb6b6a707c101467a186) (http://llvm.org/git/llvm.git 3656d83960a4f3fedf6d8f19043abf52379f78c3)
> > Target: x86_64-unknown-linux-gnu
> > Thread model: posix
> > InstalledDir: /usr/local/bin
> > Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> > Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> > Candidate multilib: .;@m64
> > Candidate multilib: 32;@m32
> > Selected multilib: .;@m64
> > [root@jouet ~]#
> > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-24 19:09   ` Arnaldo Carvalho de Melo
@ 2017-11-26  6:29     ` Yonghong Song
  0 siblings, 0 replies; 15+ messages in thread
From: Yonghong Song @ 2017-11-26  6:29 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Daniel Borkmann
  Cc: Wang Nan, Alexei Starovoitov, Adrian Hunter, David Ahern,
	Jiri Olsa, Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List



On 11/24/17 11:09 AM, Arnaldo Carvalho de Melo wrote:
> Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
>> [ +Yonghong ]
>>
>> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
>>> FYI, just noticed, recently updated clang to version 6, from its
>>> upstream git repo.
>>
>> Do you recall what was your LLVM version prior to this where it was
>> working fine? (Wild guess from below would be the BPF inline asm
> 
> IIRC it was 4.0

I tried the following example (the almost the same one as the failed
compilation one before except a few SEC(...) marking which should not
impact the result):

$ cat bpf_prog.c
#include <uapi/linux/fs.h>
#include <uapi/asm/ptrace.h>

int bpf_func__vfs_llseek(void *ctx)
{
         return 0;
}
$ cat run.sh
KERNEL_INC_OPTIONS="-nostdinc -isystem 
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include 
-I/home/yhs/work/net-next/arch/x86/include 
-I/home/yhs/work/linux-bld/arch/x86/include 
-I/home/yhs/work/net-next/include -I/home/yhs/work/linux-bld/include 
-I/home/yhs/work/net-next/arch/x86/include/uapi 
-I/home/yhs/work/linux-bld/arch/x86/include/generated/uapi 
-I/home/yhs/work/net-next/include/uapi 
-I/home/yhs/work/linux-bld/include/generated/uapi -include 
/home/yhs/work/net-next/include/linux/kconfig.h"

clang -D__KERNEL__ -D__NR_CPUS__=4 -xc \
       $KERNEL_INC_OPTIONS \
       -Wno-unused-value -Wno-pointer-sign \
       -c bpf_prog.c -O2 -target bpf
$

You can actually get KERNEL_INC_OPTIONS by compiling kernel samples/bpf.

This program failed at both llvm 4.0 and latest trunk (6.0).

The same symptom:
In file included from bpf_prog.c:2:
In file included from 
/home/yhs/work/net-next/arch/x86/include/uapi/asm/ptrace.h:5:
In file included from /home/yhs/work/net-next/include/linux/compiler.h:237:
In file included from 
/home/yhs/work/net-next/arch/x86/include/asm/barrier.h:5:
In file included from 
/home/yhs/work/net-next/arch/x86/include/asm/alternative.h:10:
/home/yhs/work/net-next/arch/x86/include/asm/asm.h:145:50: error: 
unknown register name 'esp' in asm
register unsigned long current_stack_pointer asm(_ASM_SP);
                                                  ^
/home/yhs/work/net-next/arch/x86/include/asm/asm.h:44:18: note: expanded 
from macro '_ASM_SP'
#define _ASM_SP         __ASM_REG(sp)

I suggest that you use the same compilation process as
samples/bpf and tools/testing/selftests/bpf:

$ cat run1.sh
KERNEL_INC_OPTIONS="-nostdinc -isystem 
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include 
-I/home/yhs/work/net-next/arch/x86/include 
-I/home/yhs/work/linux-bld/arch/x86/include 
-I/home/yhs/work/net-next/include -I/home/yhs/work/linux-bld/include 
-I/home/yhs/work/net-next/arch/x86/include/uapi 
-I/home/yhs/work/linux-bld/arch/x86/include/generated/uapi 
-I/home/yhs/work/net-next/include/uapi 
-I/home/yhs/work/linux-bld/include/generated/uapi -include 
/home/yhs/work/net-next/include/linux/kconfig.h"

clang -D__KERNEL__ -D__NR_CPUS__=4 -xc \
       $KERNEL_INC_OPTIONS \
       -Wno-unused-value -Wno-pointer-sign \
       -c bpf_prog.c -O2 -emit-llvm -S
llc -filetype=obj -march=bpf bpf_prog.ll
$

This is especially true if you are doing tracing there ptrace.h may be 
included in your header files.

The "clang" compiler will be able to handle host inline asm properly and
filter out functions which uses host inline asm's. If any file-level
inline asms are still left (e.g., arm64), the llvm 6.0 should be able
to handle this but not llvm 4.0.

> 
>> support that was added recently to LLVM (2865ab6996) vs asm() used
>> in headers included in the stdin header causing trouble due to arch
>> mixup?)
>>
>>> root@jouet ~]# perf test -v LLVM
>>> 37: LLVM search and compile                               :
>>> 37.1: Basic BPF llvm compile                              :
>>> --- start ---
>>> test child forked, pid 5255
>>> Kernel build dir is set to /lib/modules/4.14.0+/build
>>> set env: KBUILD_DIR=/lib/modules/4.14.0+/build
>>> unset env: KBUILD_OPTS
>>> include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
>>> set env: NR_CPUS=4
>>> set env: LINUX_VERSION_CODE=0x40e00
>>> set env: CLANG_EXEC=/usr/local/bin/clang
>>> set env: CLANG_OPTIONS=-xc
>>> set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
>>> set env: WORKING_DIR=/lib/modules/4.14.0+/build
>>> set env: CLANG_SOURCE=-
>>> llvm compiling command template: echo '/*
>>>   * bpf-script-example.c
>>>   * Test basic LLVM building
>>>   */
>>> #ifndef LINUX_VERSION_CODE
>>> # error Need LINUX_VERSION_CODE
>>> # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
>>> #endif
>>> #define BPF_ANY 0
>>> #define BPF_MAP_TYPE_ARRAY 2
>>> #define BPF_FUNC_map_lookup_elem 1
>>> #define BPF_FUNC_map_update_elem 2
>>>
>>> static void *(*bpf_map_lookup_elem)(void *map, void *key) =
>>> 	(void *) BPF_FUNC_map_lookup_elem;
>>> static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
>>> 	(void *) BPF_FUNC_map_update_elem;
>>>
>>> struct bpf_map_def {
>>> 	unsigned int type;
>>> 	unsigned int key_size;
>>> 	unsigned int value_size;
>>> 	unsigned int max_entries;
>>> };
>>>
>>> #define SEC(NAME) __attribute__((section(NAME), used))
>>> struct bpf_map_def SEC("maps") flip_table = {
>>> 	.type = BPF_MAP_TYPE_ARRAY,
>>> 	.key_size = sizeof(int),
>>> 	.value_size = sizeof(int),
>>> 	.max_entries = 1,
>>> };
>>>
>>> SEC("func=SyS_epoll_wait")
>>> int bpf_func__SyS_epoll_wait(void *ctx)
>>> {
>>> 	int ind =0;
>>> 	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
>>> 	int new_flag;
>>> 	if (!flag)
>>> 		return 0;
>>> 	/* flip flag and store back */
>>> 	new_flag = !*flag;
>>> 	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
>>> 	return new_flag;
>>> }
>>> char _license[] SEC("license") = "GPL";
>>> int _version SEC("version") = LINUX_VERSION_CODE;
>>> ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
>>> test child finished with 0
>>> ---- end ----
>>> LLVM search and compile subtest 0: Ok
>>> 37.2: kbuild searching                                    :
>>> --- start ---
>>> test child forked, pid 5728
>>> Kernel build dir is set to /lib/modules/4.14.0+/build
>>> set env: KBUILD_DIR=/lib/modules/4.14.0+/build
>>> unset env: KBUILD_OPTS
>>> include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
>>> set env: NR_CPUS=4
>>> set env: LINUX_VERSION_CODE=0x40e00
>>> set env: CLANG_EXEC=/usr/local/bin/clang
>>> set env: CLANG_OPTIONS=-xc
>>> set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
>>> set env: WORKING_DIR=/lib/modules/4.14.0+/build
>>> set env: CLANG_SOURCE=-
>>> llvm compiling command template: echo '/*
>>>   * bpf-script-test-kbuild.c
>>>   * Test include from kernel header
>>>   */
>>> #ifndef LINUX_VERSION_CODE
>>> # error Need LINUX_VERSION_CODE
>>> # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
>>> #endif
>>> #define SEC(NAME) __attribute__((section(NAME), used))
>>>
>>> #include <uapi/linux/fs.h>
>>> #include <uapi/asm/ptrace.h>
>>>
>>> SEC("func=vfs_llseek")
>>> int bpf_func__vfs_llseek(void *ctx)
>>> {
>>> 	return 0;
>>> }
>>>
>>> char _license[] SEC("license") = "GPL";
>>> int _version SEC("version") = LINUX_VERSION_CODE;
>>> ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
>>> In file included from <stdin>:12:
>>> In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
>>> In file included from /home/acme/git/linux/include/linux/compiler.h:237:
>>> In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
>>> In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
>>> /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
>>> register unsigned long current_stack_pointer asm(_ASM_SP);
>>>                                                   ^
>>> /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
>>> #define _ASM_SP         __ASM_REG(sp)
>>>                          ^
>>> /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
>>> #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
>>>                                 ^
>>> /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
>>> # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
>>>                              ^
>>> /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
>>> # define __ASM_FORM_RAW(x)     #x
>>>                                 ^
>>> <scratch space>:4:1: note: expanded from here
>>> "esp"
>>> ^
>>> 1 error generated.
>>> ERROR:	unable to compile -
>>> Hint:	Check error message shown above.
>>> Hint:	You can also pre-compile it into .o using:
>>>       		clang -target bpf -O2 -c -
>>>       	with proper -I and -D options.
>>> Failed to compile test case: 'kbuild searching'
>>> test child finished with -1
>>> ---- end ----
>>> LLVM search and compile subtest 1: FAILED!
>>> 37.3: Compile source for BPF prologue generation          :
>>> --- force skipped ---
>>> LLVM search and compile subtest 2: Skip
>>> 37.4: Compile source for BPF relocation                   :
>>> --- force skipped ---
>>> LLVM search and compile subtest 3: Skip
>>> [root@jouet ~]# clang -v
>>> clang version 6.0.0 (https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_git_clang.git&d=DwIBAg&c=5VD0RTtNlTh3ycd41b3MUw&r=DA8e1B5r073vIqRrFz7MRA&m=z5qVLSWJOX6g2fVdnv6PkJEj6w9ZeuUbyGZiXHbXR8o&s=e4qbhCUq0iI5gnbkZLhFvoo0HDFpRyIjElZsWLCJlZc&e= 56cc8f8880db2ebc433eeb6b6a707c101467a186) (https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_git_llvm.git&d=DwIBAg&c=5VD0RTtNlTh3ycd41b3MUw&r=DA8e1B5r073vIqRrFz7MRA&m=z5qVLSWJOX6g2fVdnv6PkJEj6w9ZeuUbyGZiXHbXR8o&s=1kpNkh0Slwca73HtsdX4NxJzsEM5vRjayUu-GQldnU8&e= 3656d83960a4f3fedf6d8f19043abf52379f78c3)
>>> Target: x86_64-unknown-linux-gnu
>>> Thread model: posix
>>> InstalledDir: /usr/local/bin
>>> Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
>>> Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
>>> Candidate multilib: .;@m64
>>> Candidate multilib: 32;@m32
>>> Selected multilib: .;@m64
>>> [root@jouet ~]#
>>>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-24 15:16 ` Daniel Borkmann
  2017-11-24 19:09   ` Arnaldo Carvalho de Melo
@ 2017-11-27 17:04   ` Arnaldo Carvalho de Melo
  2017-11-27 19:11     ` Yonghong Song
  1 sibling, 1 reply; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-27 17:04 UTC (permalink / raw)
  To: Daniel Borkmann
  Cc: Josh Poimboeuf, Wang Nan, Alexei Starovoitov, Adrian Hunter,
	David Ahern, Jiri Olsa, Ingo Molnar, Namhyung Kim,
	Linux Kernel Mailing List, yhs

Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> [ +Yonghong ]

+ Josh
 
> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > FYI, just noticed, recently updated clang to version 6, from its
> > upstream git repo.
> 
> Do you recall what was your LLVM version prior to this where it was
> working fine? (Wild guess from below would be the BPF inline asm
> support that was added recently to LLVM (2865ab6996) vs asm() used
> in headers included in the stdin header causing trouble due to arch
> mixup?)

So, if I go to the cset just before:

commit f5caf621ee357279e759c0911daf6d55c7d36f03
Author: Josh Poimboeuf <jpoimboe@redhat.com>
Date:   Wed Sep 20 16:24:33 2017 -0500

    x86/asm: Fix inline asm call constraints for Clang
---

'perf test LLVM' works again:

[root@jouet ~]# perf test LLVM
37: LLVM search and compile                               :
37.1: Basic BPF llvm compile                              : Ok
37.2: kbuild searching                                    : Ok
37.3: Compile source for BPF prologue generation          : Ok
37.4: Compile source for BPF relocation                   : Ok
[root@jouet ~]#

I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
targetted to v4.15, uses kernel headers and if I go to just before
f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
with 6.0, built from sources.

'perf test BPF' breaks for another reason, needs another investigation,
maybe you guys can spot something changed recently in that area:

libbpf: failed to create map (name: 'flip_table'): Invalid argument
libbpf: failed to load object '[basic_bpf_test]'

Complete logs up to this error are below, I'll go read Yonghong message
to see if I can get the 'perf test LLVM' case fixed.

- Arnaldo

[root@jouet ~]# perf test BPF
39: BPF filter                                            :
39.1: Basic BPF filtering                                 : FAILED!
39.2: BPF pinning                                         : Skip
39.3: BPF prologue generation                             : Skip
39.4: BPF relocation checker                              : Skip
[root@jouet ~]# perf test -v BPF
39: BPF filter                                            :
39.1: Basic BPF filtering                                 :
--- start ---
test child forked, pid 3541
Kernel build dir is set to /lib/modules/4.14.0+/build
set env: KBUILD_DIR=/lib/modules/4.14.0+/build
unset env: KBUILD_OPTS
include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: NR_CPUS=4
set env: LINUX_VERSION_CODE=0x40e00
set env: CLANG_EXEC=/usr/lib64/ccache/clang
set env: CLANG_OPTIONS=-xc 
set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h 
set env: WORKING_DIR=/lib/modules/4.14.0+/build
set env: CLANG_SOURCE=-
llvm compiling command template: echo '/*
 * bpf-script-example.c
 * Test basic LLVM building
 */
#ifndef LINUX_VERSION_CODE
# error Need LINUX_VERSION_CODE
# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
#endif
#define BPF_ANY 0
#define BPF_MAP_TYPE_ARRAY 2
#define BPF_FUNC_map_lookup_elem 1
#define BPF_FUNC_map_update_elem 2

static void *(*bpf_map_lookup_elem)(void *map, void *key) =
	(void *) BPF_FUNC_map_lookup_elem;
static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
	(void *) BPF_FUNC_map_update_elem;

struct bpf_map_def {
	unsigned int type;
	unsigned int key_size;
	unsigned int value_size;
	unsigned int max_entries;
};

#define SEC(NAME) __attribute__((section(NAME), used))
struct bpf_map_def SEC("maps") flip_table = {
	.type = BPF_MAP_TYPE_ARRAY,
	.key_size = sizeof(int),
	.value_size = sizeof(int),
	.max_entries = 1,
};

SEC("func=SyS_epoll_wait")
int bpf_func__SyS_epoll_wait(void *ctx)
{
	int ind =0;
	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
	int new_flag;
	if (!flag)
		return 0;
	/* flip flag and store back */
	new_flag = !*flag;
	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
	return new_flag;
}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
libbpf: loading object '[basic_bpf_test]' from buffer
libbpf: section .strtab, size 120, link 0, flags 0, type=3
libbpf: section .text, size 0, link 0, flags 6, type=1
libbpf: section func=SyS_epoll_wait, size 200, link 0, flags 6, type=1
libbpf: found program func=SyS_epoll_wait
libbpf: section .relfunc=SyS_epoll_wait, size 32, link 8, flags 0, type=9
libbpf: section maps, size 16, link 0, flags 3, type=1
libbpf: section license, size 4, link 0, flags 3, type=1
libbpf: license of [basic_bpf_test] is GPL
libbpf: section version, size 4, link 0, flags 3, type=1
libbpf: kernel version of [basic_bpf_test] is 40e00
libbpf: section .symtab, size 168, link 1, flags 0, type=2
libbpf: maps in [basic_bpf_test]: 1 maps in 16 bytes
libbpf: map 0 is "flip_table"
libbpf: collecting relocating info for: 'func=SyS_epoll_wait'
libbpf: relocation: insn_idx=4
libbpf: relocation: find map 0 (flip_table) for insn 4
libbpf: relocation: insn_idx=18
libbpf: relocation: find map 0 (flip_table) for insn 18
bpf: config program 'func=SyS_epoll_wait'
symbol:SyS_epoll_wait file:(null) line:0 offset:0 return:0 lazy:(null)
bpf: config 'func=SyS_epoll_wait' is ok
Looking at the vmlinux_path (8 entries long)
Using /lib/modules/4.14.0+/build/vmlinux for symbols
Open Debuginfo file: /lib/modules/4.14.0+/build/vmlinux
Try to find probe point from debuginfo.
Matched function: SyS_epoll_wait [2e5a9be]
found inline addr: 0xffffffff812af256
Probe point found: compat_SyS_epoll_pwait+150
found inline addr: 0xffffffff812af037
Probe point found: SyS_epoll_pwait+135
found inline addr: 0xffffffff812aeed0
Probe point found: SyS_epoll_wait+0
Found 3 probe_trace_events.
Opening /sys/kernel/debug/tracing//kprobe_events write=1
Writing event: p:perf_bpf_probe/func _text+2814550
Writing event: p:perf_bpf_probe/func_1 _text+2814007
Writing event: p:perf_bpf_probe/func_2 _text+2813648
libbpf: failed to create map (name: 'flip_table'): Invalid argument
libbpf: failed to load object '[basic_bpf_test]'
bpf: load objects failed
Failed to add events selected by BPF

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 17:04   ` Arnaldo Carvalho de Melo
@ 2017-11-27 19:11     ` Yonghong Song
  2017-11-27 19:34       ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 15+ messages in thread
From: Yonghong Song @ 2017-11-27 19:11 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Daniel Borkmann
  Cc: Josh Poimboeuf, Wang Nan, Alexei Starovoitov, Adrian Hunter,
	David Ahern, Jiri Olsa, Ingo Molnar, Namhyung Kim,
	Linux Kernel Mailing List



On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
>> [ +Yonghong ]
> 
> + Josh
>   
>> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
>>> FYI, just noticed, recently updated clang to version 6, from its
>>> upstream git repo.
>>
>> Do you recall what was your LLVM version prior to this where it was
>> working fine? (Wild guess from below would be the BPF inline asm
>> support that was added recently to LLVM (2865ab6996) vs asm() used
>> in headers included in the stdin header causing trouble due to arch
>> mixup?)
> 
> So, if I go to the cset just before:
> 
> commit f5caf621ee357279e759c0911daf6d55c7d36f03
> Author: Josh Poimboeuf <jpoimboe@redhat.com>
> Date:   Wed Sep 20 16:24:33 2017 -0500
> 
>      x86/asm: Fix inline asm call constraints for Clang
> ---
> 
> 'perf test LLVM' works again:
> 
> [root@jouet ~]# perf test LLVM
> 37: LLVM search and compile                               :
> 37.1: Basic BPF llvm compile                              : Ok
> 37.2: kbuild searching                                    : Ok
> 37.3: Compile source for BPF prologue generation          : Ok
> 37.4: Compile source for BPF relocation                   : Ok
> [root@jouet ~]#
> 
> I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> targetted to v4.15, uses kernel headers and if I go to just before
> f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> with 6.0, built from sources.

This patch introduced a module level inline assembly.

...
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -132,4 +132,15 @@
  /* For C file, we already have NOKPROBE_SYMBOL macro */
  #endif

+#ifndef __ASSEMBLY__
+/*
+ * This output constraint should be used for any inline asm which has a 
"call"
+ * instruction.  Otherwise the asm may be inserted before the frame pointer
+ * gets set up by the containing function.  If you forget to do this, 
objtool
+ * may print a "call without frame pointer save/setup" warning.
+ */
+register unsigned int __asm_call_sp asm("esp");
+#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
+#endif
...

This will cause "clang ... -target bpf ..." failure since 4.0 does not 
have bpf inline asm support and 6.0 does not recognize the register 'esp'.

> 
> 'perf test BPF' breaks for another reason, needs another investigation,
> maybe you guys can spot something changed recently in that area:
> 
> libbpf: failed to create map (name: 'flip_table'): Invalid argument
> libbpf: failed to load object '[basic_bpf_test]'

Not sure whether this is the root cause or not, but the below section name
    SEC("func=SyS_epoll_wait")
is not a good one.
If it is used to represent the program name in the kernel, the kernel 
will reject it with invalid argument since it contains "=".

> 
> Complete logs up to this error are below, I'll go read Yonghong message
> to see if I can get the 'perf test LLVM' case fixed.
> 
> - Arnaldo
> 
> [root@jouet ~]# perf test BPF
> 39: BPF filter                                            :
> 39.1: Basic BPF filtering                                 : FAILED!
> 39.2: BPF pinning                                         : Skip
> 39.3: BPF prologue generation                             : Skip
> 39.4: BPF relocation checker                              : Skip
> [root@jouet ~]# perf test -v BPF
> 39: BPF filter                                            :
> 39.1: Basic BPF filtering                                 :
> --- start ---
> test child forked, pid 3541
> Kernel build dir is set to /lib/modules/4.14.0+/build
> set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> unset env: KBUILD_OPTS
> include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> set env: NR_CPUS=4
> set env: LINUX_VERSION_CODE=0x40e00
> set env: CLANG_EXEC=/usr/lib64/ccache/clang
> set env: CLANG_OPTIONS=-xc
> set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> set env: WORKING_DIR=/lib/modules/4.14.0+/build
> set env: CLANG_SOURCE=-
> llvm compiling command template: echo '/*
>   * bpf-script-example.c
>   * Test basic LLVM building
>   */
> #ifndef LINUX_VERSION_CODE
> # error Need LINUX_VERSION_CODE
> # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> #endif
> #define BPF_ANY 0
> #define BPF_MAP_TYPE_ARRAY 2
> #define BPF_FUNC_map_lookup_elem 1
> #define BPF_FUNC_map_update_elem 2
> 
> static void *(*bpf_map_lookup_elem)(void *map, void *key) =
> 	(void *) BPF_FUNC_map_lookup_elem;
> static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
> 	(void *) BPF_FUNC_map_update_elem;
> 
> struct bpf_map_def {
> 	unsigned int type;
> 	unsigned int key_size;
> 	unsigned int value_size;
> 	unsigned int max_entries;
> };
> 
> #define SEC(NAME) __attribute__((section(NAME), used))
> struct bpf_map_def SEC("maps") flip_table = {
> 	.type = BPF_MAP_TYPE_ARRAY,
> 	.key_size = sizeof(int),
> 	.value_size = sizeof(int),
> 	.max_entries = 1,
> };
> 
> SEC("func=SyS_epoll_wait")
> int bpf_func__SyS_epoll_wait(void *ctx)
> {
> 	int ind =0;
> 	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
> 	int new_flag;
> 	if (!flag)
> 		return 0;
> 	/* flip flag and store back */
> 	new_flag = !*flag;
> 	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
> 	return new_flag;
> }
> char _license[] SEC("license") = "GPL";
> int _version SEC("version") = LINUX_VERSION_CODE;
> ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> libbpf: loading object '[basic_bpf_test]' from buffer
> libbpf: section .strtab, size 120, link 0, flags 0, type=3
> libbpf: section .text, size 0, link 0, flags 6, type=1
> libbpf: section func=SyS_epoll_wait, size 200, link 0, flags 6, type=1
> libbpf: found program func=SyS_epoll_wait
> libbpf: section .relfunc=SyS_epoll_wait, size 32, link 8, flags 0, type=9
> libbpf: section maps, size 16, link 0, flags 3, type=1
> libbpf: section license, size 4, link 0, flags 3, type=1
> libbpf: license of [basic_bpf_test] is GPL
> libbpf: section version, size 4, link 0, flags 3, type=1
> libbpf: kernel version of [basic_bpf_test] is 40e00
> libbpf: section .symtab, size 168, link 1, flags 0, type=2
> libbpf: maps in [basic_bpf_test]: 1 maps in 16 bytes
> libbpf: map 0 is "flip_table"
> libbpf: collecting relocating info for: 'func=SyS_epoll_wait'
> libbpf: relocation: insn_idx=4
> libbpf: relocation: find map 0 (flip_table) for insn 4
> libbpf: relocation: insn_idx=18
> libbpf: relocation: find map 0 (flip_table) for insn 18
> bpf: config program 'func=SyS_epoll_wait'
> symbol:SyS_epoll_wait file:(null) line:0 offset:0 return:0 lazy:(null)
> bpf: config 'func=SyS_epoll_wait' is ok
> Looking at the vmlinux_path (8 entries long)
> Using /lib/modules/4.14.0+/build/vmlinux for symbols
> Open Debuginfo file: /lib/modules/4.14.0+/build/vmlinux
> Try to find probe point from debuginfo.
> Matched function: SyS_epoll_wait [2e5a9be]
> found inline addr: 0xffffffff812af256
> Probe point found: compat_SyS_epoll_pwait+150
> found inline addr: 0xffffffff812af037
> Probe point found: SyS_epoll_pwait+135
> found inline addr: 0xffffffff812aeed0
> Probe point found: SyS_epoll_wait+0
> Found 3 probe_trace_events.
> Opening /sys/kernel/debug/tracing//kprobe_events write=1
> Writing event: p:perf_bpf_probe/func _text+2814550
> Writing event: p:perf_bpf_probe/func_1 _text+2814007
> Writing event: p:perf_bpf_probe/func_2 _text+2813648
> libbpf: failed to create map (name: 'flip_table'): Invalid argument
> libbpf: failed to load object '[basic_bpf_test]'
> bpf: load objects failed
> Failed to add events selected by BPF
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 19:11     ` Yonghong Song
@ 2017-11-27 19:34       ` Arnaldo Carvalho de Melo
  2017-11-27 19:57         ` Josh Poimboeuf
  2017-11-27 20:05         ` perf test LLVM & clang 6 failing Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-27 19:34 UTC (permalink / raw)
  To: Yonghong Song
  Cc: Daniel Borkmann, Josh Poimboeuf, Wang Nan, Alexei Starovoitov,
	Adrian Hunter, David Ahern, Jiri Olsa, Ingo Molnar, Namhyung Kim,
	Linux Kernel Mailing List

Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
> On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> > Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> > > [ +Yonghong ]
> > 
> > + Josh
> > > On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > > > FYI, just noticed, recently updated clang to version 6, from its
> > > > upstream git repo.
> > > 
> > > Do you recall what was your LLVM version prior to this where it was
> > > working fine? (Wild guess from below would be the BPF inline asm
> > > support that was added recently to LLVM (2865ab6996) vs asm() used
> > > in headers included in the stdin header causing trouble due to arch
> > > mixup?)
> > 
> > So, if I go to the cset just before:
> > 
> > commit f5caf621ee357279e759c0911daf6d55c7d36f03
> > Author: Josh Poimboeuf <jpoimboe@redhat.com>
> > Date:   Wed Sep 20 16:24:33 2017 -0500
> > 
> >      x86/asm: Fix inline asm call constraints for Clang
> > ---
> > 
> > 'perf test LLVM' works again:
> > 
> > [root@jouet ~]# perf test LLVM
> > 37: LLVM search and compile                               :
> > 37.1: Basic BPF llvm compile                              : Ok
> > 37.2: kbuild searching                                    : Ok
> > 37.3: Compile source for BPF prologue generation          : Ok
> > 37.4: Compile source for BPF relocation                   : Ok
> > [root@jouet ~]#
> > 
> > I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> > targetted to v4.15, uses kernel headers and if I go to just before
> > f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> > with 6.0, built from sources.
> 
> This patch introduced a module level inline assembly.
> 
> ...
> --- a/arch/x86/include/asm/asm.h
> +++ b/arch/x86/include/asm/asm.h
> @@ -132,4 +132,15 @@
>  /* For C file, we already have NOKPROBE_SYMBOL macro */
>  #endif
> 
> +#ifndef __ASSEMBLY__
> +/*
> + * This output constraint should be used for any inline asm which has a
> "call"
> + * instruction.  Otherwise the asm may be inserted before the frame pointer
> + * gets set up by the containing function.  If you forget to do this,
> objtool
> + * may print a "call without frame pointer save/setup" warning.
> + */
> +register unsigned int __asm_call_sp asm("esp");
> +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
> +#endif
> ...
> 
> This will cause "clang ... -target bpf ..." failure since 4.0 does not have
> bpf inline asm support and 6.0 does not recognize the register 'esp'.

Ok, explains the problem then, Josh, ideas on how to proceed here?
 
> > 'perf test BPF' breaks for another reason, needs another investigation,
> > maybe you guys can spot something changed recently in that area:
> > 
> > libbpf: failed to create map (name: 'flip_table'): Invalid argument
> > libbpf: failed to load object '[basic_bpf_test]'


So, I noticed that any maps are failing, I'll go dig, but may be some
new security tightening, even running as root, this was working
recently, was even part of our discussion on the bpf_probe_read_str()
trouble with clang's optimizer:

[root@jouet bpf]# cat open.c
#include "bpf.h"

SEC("prog=do_sys_open filename")
int prog(void *ctx, int err, char *filename_ptr)
{
	char filename[128];
	int len = bpf_probe_read_str(filename, sizeof(filename), filename_ptr); 
	if (len > 0) {
		if (len == 1)
			perf_event_output(ctx, &__bpf_stdout__, BPF_F_CURRENT_CPU, filename, len);
		else if (len < 128)
			perf_event_output(ctx, &__bpf_stdout__, BPF_F_CURRENT_CPU, filename, len);
        }
	return 1;
}
[root@jouet bpf]#
<SNIP>
Found 1 probe_trace_events.
Opening /sys/kernel/debug/tracing//kprobe_events write=1
Writing event: p:perf_bpf_probe/prog _text+2493856 filename=%si:x64
In map_prologue, ntevs=1
mapping[0]=0
libbpf: failed to create map (name: '__bpf_stdout__'): Invalid argument
libbpf: failed to load object 'open.c'
bpf: load objects failed
event syntax error: 'open.c'
                     \___ Operation not permitted
<SNIP>

Using 'perf ftrace' to trace just 'perf trace':

[root@jouet bpf]# perf ftrace -G SyS_bpf perf trace -v -e open.c,open cat /tmp/somefile 2> /dev/null
 0)               |  SyS_bpf() {
 0)               |    capable() {
 0)               |      ns_capable_common() {
 0)               |        security_capable() {
 0)   0.045 us    |          cap_capable();
 0)               |          selinux_capable() {
 0)   0.274 us    |            cred_has_capability();
 0)   0.518 us    |          }
 0)   1.464 us    |        }
 0)   1.783 us    |      }
 0)   2.130 us    |    }
 0)   0.458 us    |    check_uarg_tail_zero();
 0)               |    __check_object_size() {
 0)   0.046 us    |      __virt_addr_valid();
 0)   0.040 us    |      check_stack_object();
 0)   0.510 us    |    }
 0)   4.161 us    |  }
[root@jouet bpf]#

/me goes to look at SyS_bpf() in this kernel... (4.14.0+).

- Arnaldo

 
> Not sure whether this is the root cause or not, but the below section name
>    SEC("func=SyS_epoll_wait")
> is not a good one.
> If it is used to represent the program name in the kernel, the kernel will
> reject it with invalid argument since it contains "=".

I forgot the details about this one, but this has been working like that
for quite a while, I'll check if something new happened here...
 
> > 
> > Complete logs up to this error are below, I'll go read Yonghong message
> > to see if I can get the 'perf test LLVM' case fixed.
> > 
> > - Arnaldo
> > 
> > [root@jouet ~]# perf test BPF
> > 39: BPF filter                                            :
> > 39.1: Basic BPF filtering                                 : FAILED!
> > 39.2: BPF pinning                                         : Skip
> > 39.3: BPF prologue generation                             : Skip
> > 39.4: BPF relocation checker                              : Skip
> > [root@jouet ~]# perf test -v BPF
> > 39: BPF filter                                            :
> > 39.1: Basic BPF filtering                                 :
> > --- start ---
> > test child forked, pid 3541
> > Kernel build dir is set to /lib/modules/4.14.0+/build
> > set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> > unset env: KBUILD_OPTS
> > include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: NR_CPUS=4
> > set env: LINUX_VERSION_CODE=0x40e00
> > set env: CLANG_EXEC=/usr/lib64/ccache/clang
> > set env: CLANG_OPTIONS=-xc
> > set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: WORKING_DIR=/lib/modules/4.14.0+/build
> > set env: CLANG_SOURCE=-
> > llvm compiling command template: echo '/*
> >   * bpf-script-example.c
> >   * Test basic LLVM building
> >   */
> > #ifndef LINUX_VERSION_CODE
> > # error Need LINUX_VERSION_CODE
> > # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> > #endif
> > #define BPF_ANY 0
> > #define BPF_MAP_TYPE_ARRAY 2
> > #define BPF_FUNC_map_lookup_elem 1
> > #define BPF_FUNC_map_update_elem 2
> > 
> > static void *(*bpf_map_lookup_elem)(void *map, void *key) =
> > 	(void *) BPF_FUNC_map_lookup_elem;
> > static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
> > 	(void *) BPF_FUNC_map_update_elem;
> > 
> > struct bpf_map_def {
> > 	unsigned int type;
> > 	unsigned int key_size;
> > 	unsigned int value_size;
> > 	unsigned int max_entries;
> > };
> > 
> > #define SEC(NAME) __attribute__((section(NAME), used))
> > struct bpf_map_def SEC("maps") flip_table = {
> > 	.type = BPF_MAP_TYPE_ARRAY,
> > 	.key_size = sizeof(int),
> > 	.value_size = sizeof(int),
> > 	.max_entries = 1,
> > };
> > 
> > SEC("func=SyS_epoll_wait")
> > int bpf_func__SyS_epoll_wait(void *ctx)
> > {
> > 	int ind =0;
> > 	int *flag = bpf_map_lookup_elem(&flip_table, &ind);
> > 	int new_flag;
> > 	if (!flag)
> > 		return 0;
> > 	/* flip flag and store back */
> > 	new_flag = !*flag;
> > 	bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
> > 	return new_flag;
> > }
> > char _license[] SEC("license") = "GPL";
> > int _version SEC("version") = LINUX_VERSION_CODE;
> > ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> > libbpf: loading object '[basic_bpf_test]' from buffer
> > libbpf: section .strtab, size 120, link 0, flags 0, type=3
> > libbpf: section .text, size 0, link 0, flags 6, type=1
> > libbpf: section func=SyS_epoll_wait, size 200, link 0, flags 6, type=1
> > libbpf: found program func=SyS_epoll_wait
> > libbpf: section .relfunc=SyS_epoll_wait, size 32, link 8, flags 0, type=9
> > libbpf: section maps, size 16, link 0, flags 3, type=1
> > libbpf: section license, size 4, link 0, flags 3, type=1
> > libbpf: license of [basic_bpf_test] is GPL
> > libbpf: section version, size 4, link 0, flags 3, type=1
> > libbpf: kernel version of [basic_bpf_test] is 40e00
> > libbpf: section .symtab, size 168, link 1, flags 0, type=2
> > libbpf: maps in [basic_bpf_test]: 1 maps in 16 bytes
> > libbpf: map 0 is "flip_table"
> > libbpf: collecting relocating info for: 'func=SyS_epoll_wait'
> > libbpf: relocation: insn_idx=4
> > libbpf: relocation: find map 0 (flip_table) for insn 4
> > libbpf: relocation: insn_idx=18
> > libbpf: relocation: find map 0 (flip_table) for insn 18
> > bpf: config program 'func=SyS_epoll_wait'
> > symbol:SyS_epoll_wait file:(null) line:0 offset:0 return:0 lazy:(null)
> > bpf: config 'func=SyS_epoll_wait' is ok
> > Looking at the vmlinux_path (8 entries long)
> > Using /lib/modules/4.14.0+/build/vmlinux for symbols
> > Open Debuginfo file: /lib/modules/4.14.0+/build/vmlinux
> > Try to find probe point from debuginfo.
> > Matched function: SyS_epoll_wait [2e5a9be]
> > found inline addr: 0xffffffff812af256
> > Probe point found: compat_SyS_epoll_pwait+150
> > found inline addr: 0xffffffff812af037
> > Probe point found: SyS_epoll_pwait+135
> > found inline addr: 0xffffffff812aeed0
> > Probe point found: SyS_epoll_wait+0
> > Found 3 probe_trace_events.
> > Opening /sys/kernel/debug/tracing//kprobe_events write=1
> > Writing event: p:perf_bpf_probe/func _text+2814550
> > Writing event: p:perf_bpf_probe/func_1 _text+2814007
> > Writing event: p:perf_bpf_probe/func_2 _text+2813648
> > libbpf: failed to create map (name: 'flip_table'): Invalid argument
> > libbpf: failed to load object '[basic_bpf_test]'
> > bpf: load objects failed
> > Failed to add events selected by BPF
> > 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 19:34       ` Arnaldo Carvalho de Melo
@ 2017-11-27 19:57         ` Josh Poimboeuf
  2017-11-27 21:45           ` Matthias Kaehlcke
  2017-11-27 20:05         ` perf test LLVM & clang 6 failing Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 15+ messages in thread
From: Josh Poimboeuf @ 2017-11-27 19:57 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Yonghong Song, Daniel Borkmann, Wang Nan, Alexei Starovoitov,
	Adrian Hunter, David Ahern, Jiri Olsa, Ingo Molnar, Namhyung Kim,
	Linux Kernel Mailing List, Andrey Ryabinin, Matthias Kaehlcke

On Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
> > On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> > > Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> > > > [ +Yonghong ]
> > > 
> > > + Josh
> > > > On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > > > > FYI, just noticed, recently updated clang to version 6, from its
> > > > > upstream git repo.
> > > > 
> > > > Do you recall what was your LLVM version prior to this where it was
> > > > working fine? (Wild guess from below would be the BPF inline asm
> > > > support that was added recently to LLVM (2865ab6996) vs asm() used
> > > > in headers included in the stdin header causing trouble due to arch
> > > > mixup?)
> > > 
> > > So, if I go to the cset just before:
> > > 
> > > commit f5caf621ee357279e759c0911daf6d55c7d36f03
> > > Author: Josh Poimboeuf <jpoimboe@redhat.com>
> > > Date:   Wed Sep 20 16:24:33 2017 -0500
> > > 
> > >      x86/asm: Fix inline asm call constraints for Clang
> > > ---
> > > 
> > > 'perf test LLVM' works again:
> > > 
> > > [root@jouet ~]# perf test LLVM
> > > 37: LLVM search and compile                               :
> > > 37.1: Basic BPF llvm compile                              : Ok
> > > 37.2: kbuild searching                                    : Ok
> > > 37.3: Compile source for BPF prologue generation          : Ok
> > > 37.4: Compile source for BPF relocation                   : Ok
> > > [root@jouet ~]#
> > > 
> > > I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> > > targetted to v4.15, uses kernel headers and if I go to just before
> > > f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> > > with 6.0, built from sources.
> > 
> > This patch introduced a module level inline assembly.
> > 
> > ...
> > --- a/arch/x86/include/asm/asm.h
> > +++ b/arch/x86/include/asm/asm.h
> > @@ -132,4 +132,15 @@
> >  /* For C file, we already have NOKPROBE_SYMBOL macro */
> >  #endif
> > 
> > +#ifndef __ASSEMBLY__
> > +/*
> > + * This output constraint should be used for any inline asm which has a
> > "call"
> > + * instruction.  Otherwise the asm may be inserted before the frame pointer
> > + * gets set up by the containing function.  If you forget to do this,
> > objtool
> > + * may print a "call without frame pointer save/setup" warning.
> > + */
> > +register unsigned int __asm_call_sp asm("esp");
> > +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
> > +#endif
> > ...
> > 
> > This will cause "clang ... -target bpf ..." failure since 4.0 does not have
> > bpf inline asm support and 6.0 does not recognize the register 'esp'.
> 
> Ok, explains the problem then, Josh, ideas on how to proceed here?

The original change to add the global inline asm:

  5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")

was done to support clang in the first place.  Before that change, a
clang-built kernel didn't even boot.  So I'm a bit perplexed by the fact
that this change would be causing clang problems, since it was done to
fix clang in the first place.

Adding Andrey and Matthias, maybe they can help clarify things.

-- 
Josh

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 19:34       ` Arnaldo Carvalho de Melo
  2017-11-27 19:57         ` Josh Poimboeuf
@ 2017-11-27 20:05         ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-27 20:05 UTC (permalink / raw)
  To: Yonghong Song
  Cc: Daniel Borkmann, Josh Poimboeuf, Wang Nan, Alexei Starovoitov,
	Adrian Hunter, David Ahern, Jiri Olsa, Ingo Molnar, Namhyung Kim,
	Linux Kernel Mailing List

Em Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo escreveu:
> So, I noticed that any maps are failing, I'll go dig, but may be some
> new security tightening, even running as root, this was working
> recently, was even part of our discussion on the bpf_probe_read_str()
> trouble with clang's optimizer:
> 
> [root@jouet bpf]# cat open.c
> #include "bpf.h"
> 
> SEC("prog=do_sys_open filename")
> int prog(void *ctx, int err, char *filename_ptr)
> {
> 	char filename[128];
> 	int len = bpf_probe_read_str(filename, sizeof(filename), filename_ptr); 
> 	if (len > 0) {
> 		if (len == 1)
> 			perf_event_output(ctx, &__bpf_stdout__, BPF_F_CURRENT_CPU, filename, len);
> 		else if (len < 128)
> 			perf_event_output(ctx, &__bpf_stdout__, BPF_F_CURRENT_CPU, filename, len);
>         }
> 	return 1;
> }
> [root@jouet bpf]#
> <SNIP>
> Found 1 probe_trace_events.
> Opening /sys/kernel/debug/tracing//kprobe_events write=1
> Writing event: p:perf_bpf_probe/prog _text+2493856 filename=%si:x64
> In map_prologue, ntevs=1
> mapping[0]=0
> libbpf: failed to create map (name: '__bpf_stdout__'): Invalid argument
> libbpf: failed to load object 'open.c'
> bpf: load objects failed
> event syntax error: 'open.c'
>                      \___ Operation not permitted
> <SNIP>
> 
> Using 'perf ftrace' to trace just 'perf trace':
> 
> [root@jouet bpf]# perf ftrace -G SyS_bpf perf trace -v -e open.c,open cat /tmp/somefile 2> /dev/null
>  0)               |  SyS_bpf() {
>  0)               |    capable() {
>  0)               |      ns_capable_common() {
>  0)               |        security_capable() {
>  0)   0.045 us    |          cap_capable();
>  0)               |          selinux_capable() {
>  0)   0.274 us    |            cred_has_capability();
>  0)   0.518 us    |          }
>  0)   1.464 us    |        }
>  0)   1.783 us    |      }
>  0)   2.130 us    |    }
>  0)   0.458 us    |    check_uarg_tail_zero();
>  0)               |    __check_object_size() {
>  0)   0.046 us    |      __virt_addr_valid();
>  0)   0.040 us    |      check_stack_object();
>  0)   0.510 us    |    }
>  0)   4.161 us    |  }
> [root@jouet bpf]#
> 
> /me goes to look at SyS_bpf() in this kernel... (4.14.0+).

Tracing 'perf trace' with 'perf trace' we see:

# perf trace -e bpf perf trace -e open.c,open cat /tmp/somefile
<SNIP traced 'perf trace' error messages>
  0.000 ( 0.015 ms): perf/16767 bpf(cmd: MAP_CREATE, uattr: 0x7ffc3c8c7ac0, size: 72) = -1 EINVAL Invalid argument
#

Humm,

# perf probe check_stack_object%return 'ret=$retval'
Added new event:
  probe:check_stack_object (on check_stack_object%return with ret=$retval)

You can now use it in all perf tools, such as:

	perf record -e probe:check_stack_object -aR sleep 1

#

# perf trace -e bpf,probe:check* perf trace -e open.c,open cat /tmp/somefile
<SNIP lots of check_stack_object calls returning 0x0)
  4626.779 ( 0.004 ms): perf/31498 bpf(cmd: MAP_CREATE, uattr: 0x7fff7dbbaab0, size: 72                  ) ...
  4626.784 (         ): probe:check_stack_object:(ffffffffb625ec30 <- ffffffffb625ed1f) ret=0x2)
  4626.779 ( 0.006 ms): perf/31498  ... [continued]: bpf()) = -1 EINVAL Invalid argument
<SNIP lots of check_stack_object calls returning 0x0)

check_stack_object returning 0x2 means GOOD_STACK, 0x0 means
NOT_STACK...

- Arnaldo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 19:57         ` Josh Poimboeuf
@ 2017-11-27 21:45           ` Matthias Kaehlcke
  2017-11-28  1:19             ` Yonghong Song
  2017-11-28 17:55             ` Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 15+ messages in thread
From: Matthias Kaehlcke @ 2017-11-27 21:45 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: Arnaldo Carvalho de Melo, Yonghong Song, Daniel Borkmann,
	Wang Nan, Alexei Starovoitov, Adrian Hunter, David Ahern,
	Jiri Olsa, Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List,
	Andrey Ryabinin

El Mon, Nov 27, 2017 at 01:57:56PM -0600 Josh Poimboeuf ha dit:

> On Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
> > > On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> > > > Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> > > > > [ +Yonghong ]
> > > > 
> > > > + Josh
> > > > > On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > > > > > FYI, just noticed, recently updated clang to version 6, from its
> > > > > > upstream git repo.
> > > > > 
> > > > > Do you recall what was your LLVM version prior to this where it was
> > > > > working fine? (Wild guess from below would be the BPF inline asm
> > > > > support that was added recently to LLVM (2865ab6996) vs asm() used
> > > > > in headers included in the stdin header causing trouble due to arch
> > > > > mixup?)
> > > > 
> > > > So, if I go to the cset just before:
> > > > 
> > > > commit f5caf621ee357279e759c0911daf6d55c7d36f03
> > > > Author: Josh Poimboeuf <jpoimboe@redhat.com>
> > > > Date:   Wed Sep 20 16:24:33 2017 -0500
> > > > 
> > > >      x86/asm: Fix inline asm call constraints for Clang
> > > > ---
> > > > 
> > > > 'perf test LLVM' works again:
> > > > 
> > > > [root@jouet ~]# perf test LLVM
> > > > 37: LLVM search and compile                               :
> > > > 37.1: Basic BPF llvm compile                              : Ok
> > > > 37.2: kbuild searching                                    : Ok
> > > > 37.3: Compile source for BPF prologue generation          : Ok
> > > > 37.4: Compile source for BPF relocation                   : Ok
> > > > [root@jouet ~]#
> > > > 
> > > > I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> > > > targetted to v4.15, uses kernel headers and if I go to just before
> > > > f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> > > > with 6.0, built from sources.
> > > 
> > > This patch introduced a module level inline assembly.
> > > 
> > > ...
> > > --- a/arch/x86/include/asm/asm.h
> > > +++ b/arch/x86/include/asm/asm.h
> > > @@ -132,4 +132,15 @@
> > >  /* For C file, we already have NOKPROBE_SYMBOL macro */
> > >  #endif
> > > 
> > > +#ifndef __ASSEMBLY__
> > > +/*
> > > + * This output constraint should be used for any inline asm which has a
> > > "call"
> > > + * instruction.  Otherwise the asm may be inserted before the frame pointer
> > > + * gets set up by the containing function.  If you forget to do this,
> > > objtool
> > > + * may print a "call without frame pointer save/setup" warning.
> > > + */
> > > +register unsigned int __asm_call_sp asm("esp");
> > > +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
> > > +#endif
> > > ...
> > > 
> > > This will cause "clang ... -target bpf ..." failure since 4.0 does not have
> > > bpf inline asm support and 6.0 does not recognize the register 'esp'.
> > 
> > Ok, explains the problem then, Josh, ideas on how to proceed here?
> 
> The original change to add the global inline asm:
> 
>   5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
> 
> was done to support clang in the first place.  Before that change, a
> clang-built kernel didn't even boot.  So I'm a bit perplexed by the fact
> that this change would be causing clang problems, since it was done to
> fix clang in the first place.
> 
> Adding Andrey and Matthias, maybe they can help clarify things.

Indeed the change was needed to boot on x86.

I know next to nothing about BPF, if I understand correctly the error
is generated when compiling for the BPF "architecture" not for x86. In
this process x86 assembly headers are included, one of which contains
the declaration of the register variable, in an register that exists
on x86, but not BPS.

I guess the first questions is whether the x86 asm headers should/need
to be included when compiling for BPF. If this needed/can not be
easily avoided one option could be to put the declaration within an
ifdef __x86_64__ block.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 21:45           ` Matthias Kaehlcke
@ 2017-11-28  1:19             ` Yonghong Song
  2017-11-28 17:55             ` Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: Yonghong Song @ 2017-11-28  1:19 UTC (permalink / raw)
  To: Matthias Kaehlcke, Josh Poimboeuf
  Cc: Arnaldo Carvalho de Melo, Daniel Borkmann, Wang Nan,
	Alexei Starovoitov, Adrian Hunter, David Ahern, Jiri Olsa,
	Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List,
	Andrey Ryabinin



On 11/27/17 1:45 PM, Matthias Kaehlcke wrote:
> El Mon, Nov 27, 2017 at 01:57:56PM -0600 Josh Poimboeuf ha dit:
> 
>> On Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo wrote:
>>> Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
>>>> On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
>>>>> Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
>>>>>> [ +Yonghong ]
>>>>>
>>>>> + Josh
>>>>>> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
>>>>>>> FYI, just noticed, recently updated clang to version 6, from its
>>>>>>> upstream git repo.
>>>>>>
>>>>>> Do you recall what was your LLVM version prior to this where it was
>>>>>> working fine? (Wild guess from below would be the BPF inline asm
>>>>>> support that was added recently to LLVM (2865ab6996) vs asm() used
>>>>>> in headers included in the stdin header causing trouble due to arch
>>>>>> mixup?)
>>>>>
>>>>> So, if I go to the cset just before:
>>>>>
>>>>> commit f5caf621ee357279e759c0911daf6d55c7d36f03
>>>>> Author: Josh Poimboeuf <jpoimboe@redhat.com>
>>>>> Date:   Wed Sep 20 16:24:33 2017 -0500
>>>>>
>>>>>       x86/asm: Fix inline asm call constraints for Clang
>>>>> ---
>>>>>
>>>>> 'perf test LLVM' works again:
>>>>>
>>>>> [root@jouet ~]# perf test LLVM
>>>>> 37: LLVM search and compile                               :
>>>>> 37.1: Basic BPF llvm compile                              : Ok
>>>>> 37.2: kbuild searching                                    : Ok
>>>>> 37.3: Compile source for BPF prologue generation          : Ok
>>>>> 37.4: Compile source for BPF relocation                   : Ok
>>>>> [root@jouet ~]#
>>>>>
>>>>> I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
>>>>> targetted to v4.15, uses kernel headers and if I go to just before
>>>>> f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
>>>>> with 6.0, built from sources.
>>>>
>>>> This patch introduced a module level inline assembly.
>>>>
>>>> ...
>>>> --- a/arch/x86/include/asm/asm.h
>>>> +++ b/arch/x86/include/asm/asm.h
>>>> @@ -132,4 +132,15 @@
>>>>   /* For C file, we already have NOKPROBE_SYMBOL macro */
>>>>   #endif
>>>>
>>>> +#ifndef __ASSEMBLY__
>>>> +/*
>>>> + * This output constraint should be used for any inline asm which has a
>>>> "call"
>>>> + * instruction.  Otherwise the asm may be inserted before the frame pointer
>>>> + * gets set up by the containing function.  If you forget to do this,
>>>> objtool
>>>> + * may print a "call without frame pointer save/setup" warning.
>>>> + */
>>>> +register unsigned int __asm_call_sp asm("esp");
>>>> +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
>>>> +#endif
>>>> ...
>>>>
>>>> This will cause "clang ... -target bpf ..." failure since 4.0 does not have
>>>> bpf inline asm support and 6.0 does not recognize the register 'esp'.
>>>
>>> Ok, explains the problem then, Josh, ideas on how to proceed here?
>>
>> The original change to add the global inline asm:
>>
>>    5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
>>
>> was done to support clang in the first place.  Before that change, a
>> clang-built kernel didn't even boot.  So I'm a bit perplexed by the fact
>> that this change would be causing clang problems, since it was done to
>> fix clang in the first place.
>>
>> Adding Andrey and Matthias, maybe they can help clarify things.
> 
> Indeed the change was needed to boot on x86.
> 
> I know next to nothing about BPF, if I understand correctly the error
> is generated when compiling for the BPF "architecture" not for x86. In
> this process x86 assembly headers are included, one of which contains
> the declaration of the register variable, in an register that exists
> on x86, but not BPS.
> 
> I guess the first questions is whether the x86 asm headers should/need
> to be included when compiling for BPF. If this needed/can not be
> easily avoided one option could be to put the declaration within an
> ifdef __x86_64__ block.

There is a way to do this. You can use the similar mechanism to
the one in linux:samples/bpf and linux:tools/testing/selftests/bpf.

Basically, you first do:
   clang ... -O2 -emit-llvm -S prog.c <=== this uses x86_64 as the 
default target
   llc -march=bpf -filetype=obj prog.ll <=== this uses bpf target
This should work.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-27 21:45           ` Matthias Kaehlcke
  2017-11-28  1:19             ` Yonghong Song
@ 2017-11-28 17:55             ` Arnaldo Carvalho de Melo
  2017-11-28 17:59               ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-28 17:55 UTC (permalink / raw)
  To: Matthias Kaehlcke
  Cc: Josh Poimboeuf, Yonghong Song, Daniel Borkmann, Wang Nan,
	Alexei Starovoitov, Adrian Hunter, David Ahern, Jiri Olsa,
	Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List,
	Andrey Ryabinin

Em Mon, Nov 27, 2017 at 01:45:21PM -0800, Matthias Kaehlcke escreveu:
> El Mon, Nov 27, 2017 at 01:57:56PM -0600 Josh Poimboeuf ha dit:
> 
> > On Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo wrote:
> > > Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
> > > > On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> > > > > Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> > > > > > [ +Yonghong ]
> > > > > 
> > > > > + Josh
> > > > > > On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > > > > > > FYI, just noticed, recently updated clang to version 6, from its
> > > > > > > upstream git repo.
> > > > > > 
> > > > > > Do you recall what was your LLVM version prior to this where it was
> > > > > > working fine? (Wild guess from below would be the BPF inline asm
> > > > > > support that was added recently to LLVM (2865ab6996) vs asm() used
> > > > > > in headers included in the stdin header causing trouble due to arch
> > > > > > mixup?)
> > > > > 
> > > > > So, if I go to the cset just before:
> > > > > 
> > > > > commit f5caf621ee357279e759c0911daf6d55c7d36f03
> > > > > Author: Josh Poimboeuf <jpoimboe@redhat.com>
> > > > > Date:   Wed Sep 20 16:24:33 2017 -0500
> > > > > 
> > > > >      x86/asm: Fix inline asm call constraints for Clang
> > > > > ---
> > > > > 
> > > > > 'perf test LLVM' works again:
> > > > > 
> > > > > [root@jouet ~]# perf test LLVM
> > > > > 37: LLVM search and compile                               :
> > > > > 37.1: Basic BPF llvm compile                              : Ok
> > > > > 37.2: kbuild searching                                    : Ok
> > > > > 37.3: Compile source for BPF prologue generation          : Ok
> > > > > 37.4: Compile source for BPF relocation                   : Ok
> > > > > [root@jouet ~]#
> > > > > 
> > > > > I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> > > > > targetted to v4.15, uses kernel headers and if I go to just before
> > > > > f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> > > > > with 6.0, built from sources.
> > > > 
> > > > This patch introduced a module level inline assembly.
> > > > 
> > > > ...
> > > > --- a/arch/x86/include/asm/asm.h
> > > > +++ b/arch/x86/include/asm/asm.h
> > > > @@ -132,4 +132,15 @@
> > > >  /* For C file, we already have NOKPROBE_SYMBOL macro */
> > > >  #endif
> > > > 
> > > > +#ifndef __ASSEMBLY__
> > > > +/*
> > > > + * This output constraint should be used for any inline asm which has a
> > > > "call"
> > > > + * instruction.  Otherwise the asm may be inserted before the frame pointer
> > > > + * gets set up by the containing function.  If you forget to do this,
> > > > objtool
> > > > + * may print a "call without frame pointer save/setup" warning.
> > > > + */
> > > > +register unsigned int __asm_call_sp asm("esp");
> > > > +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
> > > > +#endif
> > > > ...
> > > > 
> > > > This will cause "clang ... -target bpf ..." failure since 4.0 does not have
> > > > bpf inline asm support and 6.0 does not recognize the register 'esp'.
> > > 
> > > Ok, explains the problem then, Josh, ideas on how to proceed here?
> > 
> > The original change to add the global inline asm:
> > 
> >   5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
> > 
> > was done to support clang in the first place.  Before that change, a
> > clang-built kernel didn't even boot.  So I'm a bit perplexed by the fact
> > that this change would be causing clang problems, since it was done to
> > fix clang in the first place.
> > 
> > Adding Andrey and Matthias, maybe they can help clarify things.
> 
> Indeed the change was needed to boot on x86.
> 
> I know next to nothing about BPF, if I understand correctly the error
> is generated when compiling for the BPF "architecture" not for x86. In
> this process x86 assembly headers are included, one of which contains
> the declaration of the register variable, in an register that exists
> on x86, but not BPS.
> 
> I guess the first questions is whether the x86 asm headers should/need
> to be included when compiling for BPF. If this needed/can not be
> easily avoided one option could be to put the declaration within an
> ifdef __x86_64__ block.

Right, unsure if this is the way to go, but fixes the problem here:

diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 219faaec51df..d180d573fd38 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -136,6 +136,8 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#if defined(__i386__) || defined(__x86_64__)
+/* bpf target builds also include these headers */
 /*
  * This output constraint should be used for any inline asm which has a "call"
  * instruction.  Otherwise the asm may be inserted before the frame pointer
@@ -145,5 +147,6 @@
 register unsigned long current_stack_pointer asm(_ASM_SP);
 #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
 #endif
+#endif
 
 #endif /* _ASM_X86_ASM_H */

[root@jouet ~]# perf test LLVM
37: LLVM search and compile                               :
37.1: Basic BPF llvm compile                              : Ok
37.2: kbuild searching                                    : Ok
37.3: Compile source for BPF prologue generation          : Ok
37.4: Compile source for BPF relocation                   : Ok
[root@jouet ~]#

Is there any define clang generates for the bpf target?

- Arnaldo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: perf test LLVM & clang 6 failing
  2017-11-28 17:55             ` Arnaldo Carvalho de Melo
@ 2017-11-28 17:59               ` Arnaldo Carvalho de Melo
  2017-12-06 16:44                 ` [tip:perf/core] x86/asm: Allow again using asm.h when building for the 'bpf' clang target tip-bot for Arnaldo Carvalho de Melo
  2017-12-18 17:17                 ` [tip:perf/urgent] " tip-bot for Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 15+ messages in thread
From: Arnaldo Carvalho de Melo @ 2017-11-28 17:59 UTC (permalink / raw)
  To: Matthias Kaehlcke
  Cc: Josh Poimboeuf, Yonghong Song, Daniel Borkmann, Wang Nan,
	Alexei Starovoitov, Adrian Hunter, David Ahern, Jiri Olsa,
	Ingo Molnar, Namhyung Kim, Linux Kernel Mailing List,
	Andrey Ryabinin

Em Tue, Nov 28, 2017 at 02:55:53PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Mon, Nov 27, 2017 at 01:45:21PM -0800, Matthias Kaehlcke escreveu:
> > El Mon, Nov 27, 2017 at 01:57:56PM -0600 Josh Poimboeuf ha dit:
> > > On Mon, Nov 27, 2017 at 04:34:25PM -0300, Arnaldo Carvalho de Melo wrote:
> > > > Em Mon, Nov 27, 2017 at 11:11:56AM -0800, Yonghong Song escreveu:
> > > > > On 11/27/17 9:04 AM, Arnaldo Carvalho de Melo wrote:
> > > > > > Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> > > > > > > [ +Yonghong ]

> > > > > > + Josh
> > > > > > > On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > > > > > > > FYI, just noticed, recently updated clang to version 6, from its
> > > > > > > > upstream git repo.

> > > > > > > Do you recall what was your LLVM version prior to this where it was
> > > > > > > working fine? (Wild guess from below would be the BPF inline asm
> > > > > > > support that was added recently to LLVM (2865ab6996) vs asm() used
> > > > > > > in headers included in the stdin header causing trouble due to arch
> > > > > > > mixup?)

> > > > > > So, if I go to the cset just before:

> > > > > > commit f5caf621ee357279e759c0911daf6d55c7d36f03
> > > > > > Author: Josh Poimboeuf <jpoimboe@redhat.com>
> > > > > > Date:   Wed Sep 20 16:24:33 2017 -0500

> > > > > >      x86/asm: Fix inline asm call constraints for Clang
> > > > > > ---

> > > > > > 'perf test LLVM' works again:

> > > > > > [root@jouet ~]# perf test LLVM
> > > > > > 37: LLVM search and compile                               :
> > > > > > 37.1: Basic BPF llvm compile                              : Ok
> > > > > > 37.2: kbuild searching                                    : Ok
> > > > > > 37.3: Compile source for BPF prologue generation          : Ok
> > > > > > 37.4: Compile source for BPF relocation                   : Ok
> > > > > > [root@jouet ~]#

> > > > > > I.e. 'perf test LLVM' built from what is in my acme/perf/urgent branch,
> > > > > > targetted to v4.15, uses kernel headers and if I go to just before
> > > > > > f5caf621ee, it works again, both with clang from fedora26 (4.0.1) and
> > > > > > with 6.0, built from sources.

> > > > > This patch introduced a module level inline assembly.

> > > > > ...
> > > > > --- a/arch/x86/include/asm/asm.h
> > > > > +++ b/arch/x86/include/asm/asm.h
> > > > > @@ -132,4 +132,15 @@
> > > > >  /* For C file, we already have NOKPROBE_SYMBOL macro */
> > > > >  #endif

> > > > > +#ifndef __ASSEMBLY__
> > > > > +/*
> > > > > + * This output constraint should be used for any inline asm which has a
> > > > > "call"
> > > > > + * instruction.  Otherwise the asm may be inserted before the frame pointer
> > > > > + * gets set up by the containing function.  If you forget to do this,
> > > > > objtool
> > > > > + * may print a "call without frame pointer save/setup" warning.
> > > > > + */
> > > > > +register unsigned int __asm_call_sp asm("esp");
> > > > > +#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp)
> > > > > +#endif
> > > > > ...
> > > > > 
> > > > > This will cause "clang ... -target bpf ..." failure since 4.0 does not have
> > > > > bpf inline asm support and 6.0 does not recognize the register 'esp'.

> > > > Ok, explains the problem then, Josh, ideas on how to proceed here?

> > > The original change to add the global inline asm:

> > >   5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")

> > > was done to support clang in the first place.  Before that change, a
> > > clang-built kernel didn't even boot.  So I'm a bit perplexed by the fact
> > > that this change would be causing clang problems, since it was done to
> > > fix clang in the first place.

> > > Adding Andrey and Matthias, maybe they can help clarify things.

> > Indeed the change was needed to boot on x86.

> > I know next to nothing about BPF, if I understand correctly the error
> > is generated when compiling for the BPF "architecture" not for x86. In
> > this process x86 assembly headers are included, one of which contains
> > the declaration of the register variable, in an register that exists
> > on x86, but not BPS.

> > I guess the first questions is whether the x86 asm headers should/need
> > to be included when compiling for BPF. If this needed/can not be
> > easily avoided one option could be to put the declaration within an
> > ifdef __x86_64__ block.

> Right, unsure if this is the way to go, but fixes the problem here:

> +++ b/arch/x86/include/asm/asm.h
> @@ -136,6 +136,8 @@
>  #endif
>  
>  #ifndef __ASSEMBLY__
> +#if defined(__i386__) || defined(__x86_64__)
> +/* bpf target builds also include these headers */
>  /*
>   * This output constraint should be used for any inline asm which has a "call"
>   * instruction.  Otherwise the asm may be inserted before the frame pointer
> @@ -145,5 +147,6 @@
>  register unsigned long current_stack_pointer asm(_ASM_SP);
>  #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
>  #endif
> +#endif
  
>  #endif /* _ASM_X86_ASM_H */
 
> [root@jouet ~]# perf test LLVM
> 37: LLVM search and compile                               :
> 37.1: Basic BPF llvm compile                              : Ok
> 37.2: kbuild searching                                    : Ok
> 37.3: Compile source for BPF prologue generation          : Ok
> 37.4: Compile source for BPF relocation                   : Ok
> [root@jouet ~]#
 
> Is there any define clang generates for the bpf target?

Yes, __BPF__

https://clang.llvm.org/doxygen/BPF_8cpp_source.html

So, new patch:

diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 219faaec51df..386a6900e206 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -136,6 +136,7 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#ifndef __BPF__
 /*
  * This output constraint should be used for any inline asm which has a "call"
  * instruction.  Otherwise the asm may be inserted before the frame pointer
@@ -145,5 +146,6 @@
 register unsigned long current_stack_pointer asm(_ASM_SP);
 #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
 #endif
+#endif
 
 #endif /* _ASM_X86_ASM_H */

[root@jouet ~]# perf test LLVM
37: LLVM search and compile                               :
37.1: Basic BPF llvm compile                              : Ok
37.2: kbuild searching                                    : Ok
37.3: Compile source for BPF prologue generation          : Ok
37.4: Compile source for BPF relocation                   : Ok
[root@jouet ~]# 

This last one looks better, no? Alexei? Daniel?

- Arnaldo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [tip:perf/core] x86/asm: Allow again using asm.h when building for the 'bpf' clang target
  2017-11-28 17:59               ` Arnaldo Carvalho de Melo
@ 2017-12-06 16:44                 ` tip-bot for Arnaldo Carvalho de Melo
  2017-12-18 17:17                 ` [tip:perf/urgent] " tip-bot for Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2017-12-06 16:44 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, alexei.starovoitov, namhyung, daniel, yhs,
	wangnan0, hpa, glider, mingo, jpoimboe, tglx, peterz, mka,
	adrian.hunter, arnd, miguel.bernal.marin, torvalds, luto, acme,
	dsahern, aryabinin, jolsa, dvyukov

Commit-ID:  c343bade301dfe608e86b034cbabed3c0d5a50f5
Gitweb:     https://git.kernel.org/tip/c343bade301dfe608e86b034cbabed3c0d5a50f5
Author:     Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 4 Dec 2017 13:08:47 -0300
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 5 Dec 2017 15:43:55 -0300

x86/asm: Allow again using asm.h when building for the 'bpf' clang target

Up to f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
we were able to use x86 headers to build to the 'bpf' clang target, as
done by the BPF code in tools/perf/.

With that commit, we ended up with following failure for 'perf test LLVM', this
is because "clang ... -target bpf ..." fails since 4.0 does not have bpf inline
asm support and 6.0 does not recognize the register 'esp', fix it by guarding
that part with an #ifndef __BPF__, that is defined by clang when building to
the "bpf" target.

  # perf test -v LLVM
  37: LLVM search and compile                               :
  37.1: Basic BPF llvm compile                              :
  --- start ---
  test child forked, pid 25526
  Kernel build dir is set to /lib/modules/4.14.0+/build
  set env: KBUILD_DIR=/lib/modules/4.14.0+/build
  unset env: KBUILD_OPTS
  include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: NR_CPUS=4
  set env: LINUX_VERSION_CODE=0x40e00
  set env: CLANG_EXEC=/usr/local/bin/clang
  set env: CLANG_OPTIONS=-xc
  set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: WORKING_DIR=/lib/modules/4.14.0+/build
  set env: CLANG_SOURCE=-
  llvm compiling command template: echo '/*
   * bpf-script-example.c
   * Test basic LLVM building
   */
  #ifndef LINUX_VERSION_CODE
  # error Need LINUX_VERSION_CODE
  # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
  #endif
  #define BPF_ANY 0
  #define BPF_MAP_TYPE_ARRAY 2
  #define BPF_FUNC_map_lookup_elem 1
  #define BPF_FUNC_map_update_elem 2

  static void *(*bpf_map_lookup_elem)(void *map, void *key) =
	  (void *) BPF_FUNC_map_lookup_elem;
  static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
	  (void *) BPF_FUNC_map_update_elem;

  struct bpf_map_def {
	  unsigned int type;
	  unsigned int key_size;
	  unsigned int value_size;
	  unsigned int max_entries;
  };

  #define SEC(NAME) __attribute__((section(NAME), used))
  struct bpf_map_def SEC("maps") flip_table = {
	  .type = BPF_MAP_TYPE_ARRAY,
	  .key_size = sizeof(int),
	  .value_size = sizeof(int),
	  .max_entries = 1,
  };

  SEC("func=SyS_epoll_wait")
  int bpf_func__SyS_epoll_wait(void *ctx)
  {
	  int ind =0;
	  int *flag = bpf_map_lookup_elem(&flip_table, &ind);
	  int new_flag;
	  if (!flag)
		  return 0;
	  /* flip flag and store back */
	  new_flag = !*flag;
	  bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
	  return new_flag;
  }
  char _license[] SEC("license") = "GPL";
  int _version SEC("version") = LINUX_VERSION_CODE;
  ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
  test child finished with 0
  ---- end ----
  LLVM search and compile subtest 0: Ok
  37.2: kbuild searching                                    :
  --- start ---
  test child forked, pid 25950
  Kernel build dir is set to /lib/modules/4.14.0+/build
  set env: KBUILD_DIR=/lib/modules/4.14.0+/build
  unset env: KBUILD_OPTS
  include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: NR_CPUS=4
  set env: LINUX_VERSION_CODE=0x40e00
  set env: CLANG_EXEC=/usr/local/bin/clang
  set env: CLANG_OPTIONS=-xc
  set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: WORKING_DIR=/lib/modules/4.14.0+/build
  set env: CLANG_SOURCE=-
  llvm compiling command template: echo '/*
   * bpf-script-test-kbuild.c
   * Test include from kernel header
   */
  #ifndef LINUX_VERSION_CODE
  # error Need LINUX_VERSION_CODE
  # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
  #endif
  #define SEC(NAME) __attribute__((section(NAME), used))

  #include <uapi/linux/fs.h>
  #include <uapi/asm/ptrace.h>

  SEC("func=vfs_llseek")
  int bpf_func__vfs_llseek(void *ctx)
  {
	  return 0;
  }

  char _license[] SEC("license") = "GPL";
  int _version SEC("version") = LINUX_VERSION_CODE;
  ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
  In file included from <stdin>:12:
  In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
  In file included from /home/acme/git/linux/include/linux/compiler.h:242:
  In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
  In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
  /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
  register unsigned long current_stack_pointer asm(_ASM_SP);
                                                   ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
  #define _ASM_SP         __ASM_REG(sp)
                          ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
  #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
                                 ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
  # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
                              ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
  # define __ASM_FORM_RAW(x)     #x
                                 ^
  <scratch space>:4:1: note: expanded from here
  "esp"
  ^
  1 error generated.
  ERROR:	unable to compile -
  Hint:	Check error message shown above.
  Hint:	You can also pre-compile it into .o using:
     		  clang -target bpf -O2 -c -
     	  with proper -I and -D options.
  Failed to compile test case: 'kbuild searching'
  test child finished with -1
  ---- end ----
  LLVM search and compile subtest 1: FAILED!

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthias Kaehlcke <mka@chromium.org>
Cc: Miguel Bernal Marin <miguel.bernal.marin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Yonghong Song <yhs@fb.com>
Link: https://lkml.kernel.org/r/20171128175948.GL3298@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 arch/x86/include/asm/asm.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 219faae..386a690 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -136,6 +136,7 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#ifndef __BPF__
 /*
  * This output constraint should be used for any inline asm which has a "call"
  * instruction.  Otherwise the asm may be inserted before the frame pointer
@@ -145,5 +146,6 @@
 register unsigned long current_stack_pointer asm(_ASM_SP);
 #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
 #endif
+#endif
 
 #endif /* _ASM_X86_ASM_H */

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [tip:perf/urgent] x86/asm: Allow again using asm.h when building for the 'bpf' clang target
  2017-11-28 17:59               ` Arnaldo Carvalho de Melo
  2017-12-06 16:44                 ` [tip:perf/core] x86/asm: Allow again using asm.h when building for the 'bpf' clang target tip-bot for Arnaldo Carvalho de Melo
@ 2017-12-18 17:17                 ` tip-bot for Arnaldo Carvalho de Melo
  1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Arnaldo Carvalho de Melo @ 2017-12-18 17:17 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, linux-kernel, wangnan0, arnd, yhs, peterz, hpa, torvalds,
	luto, adrian.hunter, aryabinin, dsahern, mka, dvyukov, daniel,
	jolsa, namhyung, acme, glider, alexei.starovoitov, mingo,
	jpoimboe, miguel.bernal.marin

Commit-ID:  ca26cffa4e4aaeb09bb9e308f95c7835cb149248
Gitweb:     https://git.kernel.org/tip/ca26cffa4e4aaeb09bb9e308f95c7835cb149248
Author:     Arnaldo Carvalho de Melo <acme@redhat.com>
AuthorDate: Mon, 4 Dec 2017 13:08:47 -0300
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 18 Dec 2017 11:56:22 -0300

x86/asm: Allow again using asm.h when building for the 'bpf' clang target

Up to f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang")
we were able to use x86 headers to build to the 'bpf' clang target, as
done by the BPF code in tools/perf/.

With that commit, we ended up with following failure for 'perf test LLVM', this
is because "clang ... -target bpf ..." fails since 4.0 does not have bpf inline
asm support and 6.0 does not recognize the register 'esp', fix it by guarding
that part with an #ifndef __BPF__, that is defined by clang when building to
the "bpf" target.

  # perf test -v LLVM
  37: LLVM search and compile                               :
  37.1: Basic BPF llvm compile                              :
  --- start ---
  test child forked, pid 25526
  Kernel build dir is set to /lib/modules/4.14.0+/build
  set env: KBUILD_DIR=/lib/modules/4.14.0+/build
  unset env: KBUILD_OPTS
  include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: NR_CPUS=4
  set env: LINUX_VERSION_CODE=0x40e00
  set env: CLANG_EXEC=/usr/local/bin/clang
  set env: CLANG_OPTIONS=-xc
  set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: WORKING_DIR=/lib/modules/4.14.0+/build
  set env: CLANG_SOURCE=-
  llvm compiling command template: echo '/*
   * bpf-script-example.c
   * Test basic LLVM building
   */
  #ifndef LINUX_VERSION_CODE
  # error Need LINUX_VERSION_CODE
  # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
  #endif
  #define BPF_ANY 0
  #define BPF_MAP_TYPE_ARRAY 2
  #define BPF_FUNC_map_lookup_elem 1
  #define BPF_FUNC_map_update_elem 2

  static void *(*bpf_map_lookup_elem)(void *map, void *key) =
	  (void *) BPF_FUNC_map_lookup_elem;
  static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
	  (void *) BPF_FUNC_map_update_elem;

  struct bpf_map_def {
	  unsigned int type;
	  unsigned int key_size;
	  unsigned int value_size;
	  unsigned int max_entries;
  };

  #define SEC(NAME) __attribute__((section(NAME), used))
  struct bpf_map_def SEC("maps") flip_table = {
	  .type = BPF_MAP_TYPE_ARRAY,
	  .key_size = sizeof(int),
	  .value_size = sizeof(int),
	  .max_entries = 1,
  };

  SEC("func=SyS_epoll_wait")
  int bpf_func__SyS_epoll_wait(void *ctx)
  {
	  int ind =0;
	  int *flag = bpf_map_lookup_elem(&flip_table, &ind);
	  int new_flag;
	  if (!flag)
		  return 0;
	  /* flip flag and store back */
	  new_flag = !*flag;
	  bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
	  return new_flag;
  }
  char _license[] SEC("license") = "GPL";
  int _version SEC("version") = LINUX_VERSION_CODE;
  ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
  test child finished with 0
  ---- end ----
  LLVM search and compile subtest 0: Ok
  37.2: kbuild searching                                    :
  --- start ---
  test child forked, pid 25950
  Kernel build dir is set to /lib/modules/4.14.0+/build
  set env: KBUILD_DIR=/lib/modules/4.14.0+/build
  unset env: KBUILD_OPTS
  include option is set to  -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: NR_CPUS=4
  set env: LINUX_VERSION_CODE=0x40e00
  set env: CLANG_EXEC=/usr/local/bin/clang
  set env: CLANG_OPTIONS=-xc
  set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated  -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
  set env: WORKING_DIR=/lib/modules/4.14.0+/build
  set env: CLANG_SOURCE=-
  llvm compiling command template: echo '/*
   * bpf-script-test-kbuild.c
   * Test include from kernel header
   */
  #ifndef LINUX_VERSION_CODE
  # error Need LINUX_VERSION_CODE
  # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
  #endif
  #define SEC(NAME) __attribute__((section(NAME), used))

  #include <uapi/linux/fs.h>
  #include <uapi/asm/ptrace.h>

  SEC("func=vfs_llseek")
  int bpf_func__vfs_llseek(void *ctx)
  {
	  return 0;
  }

  char _license[] SEC("license") = "GPL";
  int _version SEC("version") = LINUX_VERSION_CODE;
  ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
  In file included from <stdin>:12:
  In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
  In file included from /home/acme/git/linux/include/linux/compiler.h:242:
  In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
  In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
  /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
  register unsigned long current_stack_pointer asm(_ASM_SP);
                                                   ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
  #define _ASM_SP         __ASM_REG(sp)
                          ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
  #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
                                 ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
  # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
                              ^
  /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
  # define __ASM_FORM_RAW(x)     #x
                                 ^
  <scratch space>:4:1: note: expanded from here
  "esp"
  ^
  1 error generated.
  ERROR:	unable to compile -
  Hint:	Check error message shown above.
  Hint:	You can also pre-compile it into .o using:
     		  clang -target bpf -O2 -c -
     	  with proper -I and -D options.
  Failed to compile test case: 'kbuild searching'
  test child finished with -1
  ---- end ----
  LLVM search and compile subtest 1: FAILED!

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matthias Kaehlcke <mka@chromium.org>
Cc: Miguel Bernal Marin <miguel.bernal.marin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Yonghong Song <yhs@fb.com>
Link: https://lkml.kernel.org/r/20171128175948.GL3298@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 arch/x86/include/asm/asm.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 219faae..386a690 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -136,6 +136,7 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#ifndef __BPF__
 /*
  * This output constraint should be used for any inline asm which has a "call"
  * instruction.  Otherwise the asm may be inserted before the frame pointer
@@ -145,5 +146,6 @@
 register unsigned long current_stack_pointer asm(_ASM_SP);
 #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
 #endif
+#endif
 
 #endif /* _ASM_X86_ASM_H */

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2017-12-18 17:26 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-24 14:47 perf test LLVM & clang 6 failing Arnaldo Carvalho de Melo
2017-11-24 15:16 ` Daniel Borkmann
2017-11-24 19:09   ` Arnaldo Carvalho de Melo
2017-11-26  6:29     ` Yonghong Song
2017-11-27 17:04   ` Arnaldo Carvalho de Melo
2017-11-27 19:11     ` Yonghong Song
2017-11-27 19:34       ` Arnaldo Carvalho de Melo
2017-11-27 19:57         ` Josh Poimboeuf
2017-11-27 21:45           ` Matthias Kaehlcke
2017-11-28  1:19             ` Yonghong Song
2017-11-28 17:55             ` Arnaldo Carvalho de Melo
2017-11-28 17:59               ` Arnaldo Carvalho de Melo
2017-12-06 16:44                 ` [tip:perf/core] x86/asm: Allow again using asm.h when building for the 'bpf' clang target tip-bot for Arnaldo Carvalho de Melo
2017-12-18 17:17                 ` [tip:perf/urgent] " tip-bot for Arnaldo Carvalho de Melo
2017-11-27 20:05         ` perf test LLVM & clang 6 failing Arnaldo Carvalho de Melo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.