Commit 7f4f3b14 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull rust trace event support from Steven Rostedt:
 "Allow Rust code to have trace events

  Trace events is a popular way to debug what is happening inside the
  kernel or just to find out what is happening. Rust code is being added
  to the Linux kernel but it currently does not support the tracing
  infrastructure. Add support of trace events inside Rust code"

* tag 'trace-rust-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  rust: jump_label: skip formatting generated file
  jump_label: rust: pass a mut ptr to `static_key_count`
  samples: rust: fix `rust_print` build making it a combined module
  rust: add arch_static_branch
  jump_label: adjust inline asm to be consistent
  rust: samples: add tracepoint to Rust sample
  rust: add tracepoint support
  rust: add static_branch_unlikely for static_key_false
parents 36843bfb 8af7a501
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20348,6 +20348,7 @@ C: zulip://rust-for-linux.zulipchat.com
P:	https://rust-for-linux.com/contributing
T:	git https://github.com/Rust-for-Linux/linux.git rust-next
F:	Documentation/rust/
F:	include/trace/events/rust_sample.h
F:	rust/
F:	samples/rust/
F:	scripts/*rust*
+9 −5
Original line number Diff line number Diff line
@@ -9,13 +9,17 @@

#define JUMP_LABEL_NOP_SIZE 4

/* This macro is also expanded on the Rust side. */
#define ARCH_STATIC_BRANCH_ASM(key, label)		\
	"1:\n\t"					\
	WASM(nop) "\n\t"				\
	".pushsection __jump_table,  \"aw\"\n\t"	\
	".word 1b, " label ", " key "\n\t"		\
	".popsection\n\t"				\

static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
{
	asm goto("1:\n\t"
		 WASM(nop) "\n\t"
		 ".pushsection __jump_table,  \"aw\"\n\t"
		 ".word 1b, %l[l_yes], %c0\n\t"
		 ".popsection\n\t"
	asm goto(ARCH_STATIC_BRANCH_ASM("%c0", "%l[l_yes]")
		 : :  "i" (&((char *)key)[branch]) :  : l_yes);

	return false;
+13 −7
Original line number Diff line number Diff line
@@ -19,10 +19,14 @@
#define JUMP_TABLE_ENTRY(key, label)			\
	".pushsection	__jump_table, \"aw\"\n\t"	\
	".align		3\n\t"				\
	".long		1b - ., %l["#label"] - .\n\t"	\
	".quad		%c0 - .\n\t"			\
	".popsection\n\t"				\
	:  :  "i"(key) :  : label
	".long		1b - ., " label " - .\n\t"	\
	".quad		" key " - .\n\t"		\
	".popsection\n\t"

/* This macro is also expanded on the Rust side. */
#define ARCH_STATIC_BRANCH_ASM(key, label)		\
	"1:	nop\n\t"				\
	JUMP_TABLE_ENTRY(key, label)

static __always_inline bool arch_static_branch(struct static_key * const key,
					       const bool branch)
@@ -30,8 +34,8 @@ static __always_inline bool arch_static_branch(struct static_key * const key,
	char *k = &((char *)key)[branch];

	asm goto(
		"1:	nop					\n\t"
		JUMP_TABLE_ENTRY(k, l_yes)
		ARCH_STATIC_BRANCH_ASM("%c0", "%l[l_yes]")
		:  :  "i"(k) :  : l_yes
		);

	return false;
@@ -43,9 +47,11 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke
						    const bool branch)
{
	char *k = &((char *)key)[branch];

	asm goto(
		"1:	b		%l[l_yes]		\n\t"
		JUMP_TABLE_ENTRY(k, l_yes)
		JUMP_TABLE_ENTRY("%c0", "%l[l_yes]")
		:  :  "i"(k) :  : l_yes
		);
	return false;
l_yes:
+10 −6
Original line number Diff line number Diff line
@@ -13,18 +13,22 @@

#define JUMP_LABEL_NOP_SIZE	4

#define JUMP_TABLE_ENTRY				\
/* This macro is also expanded on the Rust side. */
#define JUMP_TABLE_ENTRY(key, label)			\
	 ".pushsection	__jump_table, \"aw\"	\n\t"	\
	 ".align	3			\n\t"	\
	 ".long		1b - ., %l[l_yes] - .	\n\t"	\
	 ".quad		%0 - .			\n\t"	\
	 ".long		1b - ., " label " - .	\n\t"	\
	 ".quad		" key " - .		\n\t"	\
	 ".popsection				\n\t"

#define ARCH_STATIC_BRANCH_ASM(key, label)		\
	"1:	nop				\n\t"	\
	JUMP_TABLE_ENTRY(key, label)

static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch)
{
	asm goto(
		"1:	nop			\n\t"
		JUMP_TABLE_ENTRY
		ARCH_STATIC_BRANCH_ASM("%0", "%l[l_yes]")
		:  :  "i"(&((char *)key)[branch]) :  : l_yes);

	return false;
@@ -37,7 +41,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke
{
	asm goto(
		"1:	b	%l[l_yes]	\n\t"
		JUMP_TABLE_ENTRY
		JUMP_TABLE_ENTRY("%0", "%l[l_yes]")
		:  :  "i"(&((char *)key)[branch]) :  : l_yes);

	return false;
+28 −22
Original line number Diff line number Diff line
@@ -16,21 +16,28 @@

#define JUMP_LABEL_NOP_SIZE 4

#define JUMP_TABLE_ENTRY(key, label)			\
	".pushsection	__jump_table, \"aw\"	\n\t"	\
	".align		" RISCV_LGPTR "		\n\t"	\
	".long		1b - ., " label " - .	\n\t"	\
	"" RISCV_PTR "	" key " - .		\n\t"	\
	".popsection				\n\t"

/* This macro is also expanded on the Rust side. */
#define ARCH_STATIC_BRANCH_ASM(key, label)		\
	"	.align		2		\n\t"	\
	"	.option push			\n\t"	\
	"	.option norelax			\n\t"	\
	"	.option norvc			\n\t"	\
	"1:	nop				\n\t"	\
	"	.option pop			\n\t"	\
	JUMP_TABLE_ENTRY(key, label)

static __always_inline bool arch_static_branch(struct static_key * const key,
					       const bool branch)
{
	asm goto(
		"	.align		2			\n\t"
		"	.option push				\n\t"
		"	.option norelax				\n\t"
		"	.option norvc				\n\t"
		"1:	nop					\n\t"
		"	.option pop				\n\t"
		"	.pushsection	__jump_table, \"aw\"	\n\t"
		"	.align		" RISCV_LGPTR "		\n\t"
		"	.long		1b - ., %l[label] - .	\n\t"
		"	" RISCV_PTR "	%0 - .			\n\t"
		"	.popsection				\n\t"
		ARCH_STATIC_BRANCH_ASM("%0", "%l[label]")
		:  :  "i"(&((char *)key)[branch]) :  : label);

	return false;
@@ -38,21 +45,20 @@ static __always_inline bool arch_static_branch(struct static_key * const key,
	return true;
}

#define ARCH_STATIC_BRANCH_JUMP_ASM(key, label)		\
	"	.align		2		\n\t"	\
	"	.option push			\n\t"	\
	"	.option norelax			\n\t"	\
	"	.option norvc			\n\t"	\
	"1:	j	" label "		\n\t" \
	"	.option pop			\n\t"	\
	JUMP_TABLE_ENTRY(key, label)

static __always_inline bool arch_static_branch_jump(struct static_key * const key,
						    const bool branch)
{
	asm goto(
		"	.align		2			\n\t"
		"	.option push				\n\t"
		"	.option norelax				\n\t"
		"	.option norvc				\n\t"
		"1:	j		%l[label]		\n\t"
		"	.option pop				\n\t"
		"	.pushsection	__jump_table, \"aw\"	\n\t"
		"	.align		" RISCV_LGPTR "		\n\t"
		"	.long		1b - ., %l[label] - .	\n\t"
		"	" RISCV_PTR "	%0 - .			\n\t"
		"	.popsection				\n\t"
		ARCH_STATIC_BRANCH_JUMP_ASM("%0", "%l[label]")
		:  :  "i"(&((char *)key)[branch]) :  : label);

	return false;
Loading