Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rseq: Implement sys_rseq_slice_yield()

Provide a new syscall which has the only purpose to yield the CPU after the
kernel granted a time slice extension.

sched_yield() is not suitable for that because it unconditionally
schedules, but the end of the time slice extension is not required to
schedule when the task was already preempted. This also allows to have a
strict check for termination to catch user space invoking random syscalls
including sched_yield() from a time slice extension region.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20251215155708.929634896@linutronix.de

authored by

Thomas Gleixner and committed by
Peter Zijlstra
99d25920 28621ec2

+46 -1
+1
arch/alpha/kernel/syscalls/syscall.tbl
··· 510 510 578 common file_getattr sys_file_getattr 511 511 579 common file_setattr sys_file_setattr 512 512 580 common listns sys_listns 513 + 581 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/arm/tools/syscall.tbl
··· 485 485 468 common file_getattr sys_file_getattr 486 486 469 common file_setattr sys_file_setattr 487 487 470 common listns sys_listns 488 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/arm64/tools/syscall_32.tbl
··· 482 482 468 common file_getattr sys_file_getattr 483 483 469 common file_setattr sys_file_setattr 484 484 470 common listns sys_listns 485 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/m68k/kernel/syscalls/syscall.tbl
··· 470 470 468 common file_getattr sys_file_getattr 471 471 469 common file_setattr sys_file_setattr 472 472 470 common listns sys_listns 473 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/microblaze/kernel/syscalls/syscall.tbl
··· 476 476 468 common file_getattr sys_file_getattr 477 477 469 common file_setattr sys_file_setattr 478 478 470 common listns sys_listns 479 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/mips/kernel/syscalls/syscall_n32.tbl
··· 409 409 468 n32 file_getattr sys_file_getattr 410 410 469 n32 file_setattr sys_file_setattr 411 411 470 n32 listns sys_listns 412 + 471 n32 rseq_slice_yield sys_rseq_slice_yield
+1
arch/mips/kernel/syscalls/syscall_n64.tbl
··· 385 385 468 n64 file_getattr sys_file_getattr 386 386 469 n64 file_setattr sys_file_setattr 387 387 470 n64 listns sys_listns 388 + 471 n64 rseq_slice_yield sys_rseq_slice_yield
+1
arch/mips/kernel/syscalls/syscall_o32.tbl
··· 458 458 468 o32 file_getattr sys_file_getattr 459 459 469 o32 file_setattr sys_file_setattr 460 460 470 o32 listns sys_listns 461 + 471 o32 rseq_slice_yield sys_rseq_slice_yield
+1
arch/parisc/kernel/syscalls/syscall.tbl
··· 469 469 468 common file_getattr sys_file_getattr 470 470 469 common file_setattr sys_file_setattr 471 471 470 common listns sys_listns 472 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/powerpc/kernel/syscalls/syscall.tbl
··· 561 561 468 common file_getattr sys_file_getattr 562 562 469 common file_setattr sys_file_setattr 563 563 470 common listns sys_listns 564 + 471 nospu rseq_slice_yield sys_rseq_slice_yield
+1
arch/s390/kernel/syscalls/syscall.tbl
··· 397 397 468 common file_getattr sys_file_getattr 398 398 469 common file_setattr sys_file_setattr 399 399 470 common listns sys_listns 400 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/sh/kernel/syscalls/syscall.tbl
··· 474 474 468 common file_getattr sys_file_getattr 475 475 469 common file_setattr sys_file_setattr 476 476 470 common listns sys_listns 477 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/sparc/kernel/syscalls/syscall.tbl
··· 516 516 468 common file_getattr sys_file_getattr 517 517 469 common file_setattr sys_file_setattr 518 518 470 common listns sys_listns 519 + 471 common rseq_slice_yield sys_rseq_slice_yield
+1
arch/x86/entry/syscalls/syscall_32.tbl
··· 476 476 468 i386 file_getattr sys_file_getattr 477 477 469 i386 file_setattr sys_file_setattr 478 478 470 i386 listns sys_listns 479 + 471 i386 rseq_slice_yield sys_rseq_slice_yield
+1
arch/x86/entry/syscalls/syscall_64.tbl
··· 395 395 468 common file_getattr sys_file_getattr 396 396 469 common file_setattr sys_file_setattr 397 397 470 common listns sys_listns 398 + 471 common rseq_slice_yield sys_rseq_slice_yield 398 399 399 400 # 400 401 # Due to a historical design error, certain syscalls are numbered differently
+1
arch/xtensa/kernel/syscalls/syscall.tbl
··· 441 441 468 common file_getattr sys_file_getattr 442 442 469 common file_setattr sys_file_setattr 443 443 470 common listns sys_listns 444 + 471 common rseq_slice_yield sys_rseq_slice_yield
+2
include/linux/rseq_types.h
··· 89 89 /** 90 90 * struct rseq_slice - Status information for rseq time slice extension 91 91 * @state: Time slice extension state 92 + * @yielded: Indicator for rseq_slice_yield() 92 93 */ 93 94 struct rseq_slice { 94 95 union rseq_slice_state state; 96 + u8 yielded; 95 97 }; 96 98 97 99 /**
+1
include/linux/syscalls.h
··· 961 961 unsigned mask, struct statx __user *buffer); 962 962 asmlinkage long sys_rseq(struct rseq __user *rseq, uint32_t rseq_len, 963 963 int flags, uint32_t sig); 964 + asmlinkage long sys_rseq_slice_yield(void); 964 965 asmlinkage long sys_open_tree(int dfd, const char __user *path, unsigned flags); 965 966 asmlinkage long sys_open_tree_attr(int dfd, const char __user *path, 966 967 unsigned flags,
+4 -1
include/uapi/asm-generic/unistd.h
··· 860 860 #define __NR_listns 470 861 861 __SYSCALL(__NR_listns, sys_listns) 862 862 863 + #define __NR_rseq_slice_yield 471 864 + __SYSCALL(__NR_rseq_slice_yield, sys_rseq_slice_yield) 865 + 863 866 #undef __NR_syscalls 864 - #define __NR_syscalls 471 867 + #define __NR_syscalls 472 865 868 866 869 /* 867 870 * 32 bit systems traditionally used different
+21
kernel/rseq.c
··· 553 553 return -EFAULT; 554 554 } 555 555 556 + /** 557 + * sys_rseq_slice_yield - yield the current processor side effect free if a 558 + * task granted with a time slice extension is done with 559 + * the critical work before being forced out. 560 + * 561 + * Return: 1 if the task successfully yielded the CPU within the granted slice. 562 + * 0 if the slice extension was either never granted or was revoked by 563 + * going over the granted extension, using a syscall other than this one 564 + * or being scheduled out earlier due to a subsequent interrupt. 565 + * 566 + * The syscall does not schedule because the syscall entry work immediately 567 + * relinquishes the CPU and schedules if required. 568 + */ 569 + SYSCALL_DEFINE0(rseq_slice_yield) 570 + { 571 + int yielded = !!current->rseq.slice.yielded; 572 + 573 + current->rseq.slice.yielded = 0; 574 + return yielded; 575 + } 576 + 556 577 static int __init rseq_slice_cmdline(char *str) 557 578 { 558 579 bool on;
+1
kernel/sys_ni.c
··· 390 390 391 391 /* restartable sequence */ 392 392 COND_SYSCALL(rseq); 393 + COND_SYSCALL(rseq_slice_yield); 393 394 394 395 COND_SYSCALL(uretprobe); 395 396 COND_SYSCALL(uprobe);
+1
scripts/syscall.tbl
··· 411 411 468 common file_getattr sys_file_getattr 412 412 469 common file_setattr sys_file_setattr 413 413 470 common listns sys_listns 414 + 471 common rseq_slice_yield sys_rseq_slice_yield