From patchwork Thu Sep 21 10:45:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 13393854 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 08060E70714 for ; Thu, 21 Sep 2023 11:01:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4C99D6B0205; Thu, 21 Sep 2023 07:01:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 47A246B0208; Thu, 21 Sep 2023 07:01:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2F24A6B0209; Thu, 21 Sep 2023 07:01:07 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 178756B0205 for ; Thu, 21 Sep 2023 07:01:07 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id D972F1CADF1 for ; Thu, 21 Sep 2023 11:01:06 +0000 (UTC) X-FDA: 81260312532.28.9FDF7D7 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) by imf10.hostedemail.com (Postfix) with ESMTP id 01054C0027 for ; Thu, 21 Sep 2023 11:01:04 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=HEloi5ch; spf=none (imf10.hostedemail.com: domain of peterz@infradead.org has no SPF policy when checking 90.155.92.199) smtp.mailfrom=peterz@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1695294065; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding:in-reply-to: references:references:dkim-signature; bh=f+fo5qtlWKdma6yR33ByQC30fFdCan4IPhCDTk6tKSM=; b=1giCWq0aDHYH/1ltu7ElaE8r7WM/DJjAlMd2pJPQqUKVowYvH3ewugRnla1S5ueLYGxyBw C1JCOnp7mtlWIENaBT7Hb4qNvm/aIW6ZVLa3FH9dTFoAFqzNuOtumhc6nEvVd20VHvTf9r 94RD9zELMuBVkY2dbmpXFI6P2Q8sk6w= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1695294065; a=rsa-sha256; cv=none; b=8rFdMCoO09wr1p4T3YMI4SVZp9wZfYeDgZduT0J5kJOMLlXk14L+lvkzkAun6ocWL5kC3k NEYyQDu5fUV5nAVwtJjs7Ds5LwjDvPXBCis8CIP/OYjgrWmg8t6OkPPDcUcAoHzefKVdon wfjqf6QOhMJhyjnAgpP0WWPwSD7a8M4= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=HEloi5ch; spf=none (imf10.hostedemail.com: domain of peterz@infradead.org has no SPF policy when checking 90.155.92.199) smtp.mailfrom=peterz@infradead.org; dmarc=none DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Type:MIME-Version:References: Subject:Cc:To:From:Date:Message-Id:Sender:Reply-To:Content-Transfer-Encoding: Content-ID:Content-Description:In-Reply-To; bh=f+fo5qtlWKdma6yR33ByQC30fFdCan4IPhCDTk6tKSM=; b=HEloi5chIkoAzJ1qmH9doIMMLS ZkNSD4N2RkkbqgCewVxvAHggRdWZnFRlWj4IhTeRhItbbFVErm62/CTGDqCmyjsnOp4ZuteeOoFdF yIEIu8bnwVXPVpe6KPzotIKluKJ0e+mnwy062T62ceHSKleg0fzg6/b1LE8m/A4OlmlXuCwJfqVcV xHMQu5W5PZqXS6brx0IevaeO27f1kU1m0gjva+SDK5AWHjcO2nWlE/J9+3FVfPKfua0pNdfZVpV3Y v4a1PegmFDKYJ5+tOvwtgzugAgCj5s7ib09/wtVoAKIabLs7TIX8znLpx9OXnGZG8oI1jFkcJns8j 3bUiJ+NA==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by desiato.infradead.org with esmtpsa (Exim 4.96 #2 (Red Hat Linux)) id 1qjHQN-00FJvu-1M; Thu, 21 Sep 2023 11:00:57 +0000 Received: by noisy.programming.kicks-ass.net (Postfix, from userid 0) id 10D1E300642; Thu, 21 Sep 2023 13:00:43 +0200 (CEST) Message-Id: <20230921105248.511860556@noisy.programming.kicks-ass.net> User-Agent: quilt/0.65 Date: Thu, 21 Sep 2023 12:45:15 +0200 From: peterz@infradead.org To: tglx@linutronix.de, axboe@kernel.dk Cc: linux-kernel@vger.kernel.org, peterz@infradead.org, mingo@redhat.com, dvhart@infradead.org, dave@stgolabs.net, andrealmeid@igalia.com, Andrew Morton , urezki@gmail.com, hch@infradead.org, lstoakes@gmail.com, Arnd Bergmann , linux-api@vger.kernel.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, malteskarupke@web.de, Geert Uytterhoeven Subject: [PATCH v3 10/15] futex: Add sys_futex_requeue() References: <20230921104505.717750284@noisy.programming.kicks-ass.net> MIME-Version: 1.0 Content-Disposition: inline; filename=peterz-futex2-requeue.patch X-Rspamd-Queue-Id: 01054C0027 X-Rspam-User: X-Stat-Signature: 4sx9qejc39inxj3ozpda7jipyggsa1g4 X-Rspamd-Server: rspam03 X-HE-Tag: 1695294064-831947 X-HE-Meta: U2FsdGVkX1+XhIxNA+W2nBwDgkAUmzUmeDqYzZMm9jWa6oLXzFW8VUkxjN8R9sx7vw4Kq9RoXvsurjeWP/zARn44RkQx+Chg9lOGwPzcWEy44eeIWOaKJN4mY902ObhMFf5BnvTCac8oLErcr7jbQ2slnwdoX7GXDop9lWmZhwlGDvFQPABiWH4sQod1nxVD6hCVDbVY5WhHRrmLm2UB8QOzcgBPizx1Ws+A+TNjC/mxPyjI8puOxvbRUm1ryDBn1k/mUzqw9HhuOzMxmK7LOUUoawZVh+ShRPSJEEdB7GwWCFtBMpcCuMCPIV5aI06DJq8u9ekliuTZZUXrHKqJQ+x15aYqfGS2hkAzRf82O0yqoUgNUM0tedfIPUNYNwh/AReb3IZ9VVc/HIOUcpB4bvW0lkwhhsyVQ/SFdtcEk39TsLP74UEOgT4j9bqCZBPG7VXnSLr0og+lLaUfkqoVwsHwZ/XDkoK1fYZzYTW3+Zlg8tOs3T6Me2qt6Q4qWHavA0hXDX4fU0HKZZ5NL5JX6JZyi7CsYDR+F/50HwO/Nn1SC8baDFfjPwyFL4qq0Oyc9g2lJZaAo8/MuV4pIF/htO4hvC50bNxL4a21AzAafzecJnr1ACweG+knIyQWPT3iQ+CJShDRhDLIL4tTf2hGDpjR+wLBW0mxm/BYUiCDdCSKh0Yi6lRwu20WOtzpqZnz8q8WOocsdFPpHTs0D9KhepSrF5+Zk0mmA6KBq3TTTnXTnop/VLMhEUyvlKmZYd3gFICf3fILWjbDGm9G2HPGh4RlNG0gpdNazC/aDjqtx8jmVm2nVxjgygcC4SDPbPmutvblBcEiL00g2zUVR3bjjJxYYhd58SUa5Ek6TCDKRTIIHsMbIeMf7p6nhKU8zYG5LuKyAMsqpB/sOmjTzGySuAHwkFGV65dvU2XfrnpZ2a6fM6mrwsfPU6YsN2KpuPOYfkmQA7Oh/YZVoxGNGEV LtjANkqG 9YCeBmC3K4k0UPTFPhDHPsvel3b/36oHmId+JTlAhsErv3iwcTaFdwgIt2wwpxxPClhxzY92Khj6CzfmAAHEvU027GBodcx7TV8kfZ+OLZ+5m35WK0Yy+T7xvnujWmE/w1WxMg1yYIZzB20kFhw+LknbAENviaX5a+t2kUYQNjFl/Lxuislq+edUstMr/EZzR6S+mHajVNSuj8ZWGFfGOXJgCoN5vz3RyA86gUWXLoMkal/XJ2EdTzPoFuRrOhEKXv36EYDX+4atSROaRERZxt1W9kmo1LXLFOZbWt3uF6RPhiViwkvNNHZXiLw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Finish off the 'simple' futex2 syscall group by adding sys_futex_requeue(). Unlike sys_futex_{wait,wake}() its arguments are too numerous to fit into a regular syscall. As such, use struct futex_waitv to pass the 'source' and 'destination' futexes to the syscall. This syscall implements what was previously known as FUTEX_CMP_REQUEUE and uses {val, uaddr, flags} for source and {uaddr, flags} for destination. This design explicitly allows requeueing between different types of futex by having a different flags word per uaddr. Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Thomas Gleixner Acked-by: Geert Uytterhoeven --- arch/alpha/kernel/syscalls/syscall.tbl | 1 arch/arm/tools/syscall.tbl | 1 arch/arm64/include/asm/unistd.h | 2 - arch/arm64/include/asm/unistd32.h | 2 + arch/ia64/kernel/syscalls/syscall.tbl | 1 arch/m68k/kernel/syscalls/syscall.tbl | 1 arch/microblaze/kernel/syscalls/syscall.tbl | 1 arch/mips/kernel/syscalls/syscall_n32.tbl | 1 arch/mips/kernel/syscalls/syscall_n64.tbl | 1 arch/mips/kernel/syscalls/syscall_o32.tbl | 1 arch/parisc/kernel/syscalls/syscall.tbl | 1 arch/powerpc/kernel/syscalls/syscall.tbl | 1 arch/s390/kernel/syscalls/syscall.tbl | 1 arch/sh/kernel/syscalls/syscall.tbl | 1 arch/sparc/kernel/syscalls/syscall.tbl | 1 arch/x86/entry/syscalls/syscall_32.tbl | 1 arch/x86/entry/syscalls/syscall_64.tbl | 1 arch/xtensa/kernel/syscalls/syscall.tbl | 1 include/linux/syscalls.h | 3 ++ include/uapi/asm-generic/unistd.h | 4 ++ kernel/futex/syscalls.c | 38 ++++++++++++++++++++++++++++ kernel/sys_ni.c | 1 22 files changed, 64 insertions(+), 2 deletions(-) Index: linux-2.6/arch/alpha/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/alpha/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/alpha/kernel/syscalls/syscall.tbl @@ -494,3 +494,4 @@ 562 common fchmodat2 sys_fchmodat2 563 common futex_wake sys_futex_wake 564 common futex_wait sys_futex_wait +565 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/arm/tools/syscall.tbl =================================================================== --- linux-2.6.orig/arch/arm/tools/syscall.tbl +++ linux-2.6/arch/arm/tools/syscall.tbl @@ -468,3 +468,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/arm64/include/asm/unistd.h =================================================================== --- linux-2.6.orig/arch/arm64/include/asm/unistd.h +++ linux-2.6/arch/arm64/include/asm/unistd.h @@ -39,7 +39,7 @@ #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE + 5) #define __ARM_NR_COMPAT_END (__ARM_NR_COMPAT_BASE + 0x800) -#define __NR_compat_syscalls 456 +#define __NR_compat_syscalls 457 #endif #define __ARCH_WANT_SYS_CLONE Index: linux-2.6/arch/arm64/include/asm/unistd32.h =================================================================== --- linux-2.6.orig/arch/arm64/include/asm/unistd32.h +++ linux-2.6/arch/arm64/include/asm/unistd32.h @@ -915,6 +915,8 @@ __SYSCALL(__NR_fchmodat2, sys_fchmodat2) __SYSCALL(__NR_futex_wake, sys_futex_wake) #define __NR_futex_wait 455 __SYSCALL(__NR_futex_wait, sys_futex_wait) +#define __NR_futex_requeue 456 +__SYSCALL(__NR_futex_requeue, sys_futex_requeue) /* * Please add new compat syscalls above this comment and update Index: linux-2.6/arch/ia64/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/ia64/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/ia64/kernel/syscalls/syscall.tbl @@ -375,3 +375,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/m68k/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/m68k/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/m68k/kernel/syscalls/syscall.tbl @@ -454,3 +454,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/microblaze/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/microblaze/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/microblaze/kernel/syscalls/syscall.tbl @@ -460,3 +460,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/mips/kernel/syscalls/syscall_n32.tbl =================================================================== --- linux-2.6.orig/arch/mips/kernel/syscalls/syscall_n32.tbl +++ linux-2.6/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -393,3 +393,4 @@ 452 n32 fchmodat2 sys_fchmodat2 454 n32 futex_wake sys_futex_wake 455 n32 futex_wait sys_futex_wait +456 n32 futex_requeue sys_futex_requeue Index: linux-2.6/arch/mips/kernel/syscalls/syscall_n64.tbl =================================================================== --- linux-2.6.orig/arch/mips/kernel/syscalls/syscall_n64.tbl +++ linux-2.6/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -369,3 +369,4 @@ 452 n64 fchmodat2 sys_fchmodat2 454 n64 futex_wake sys_futex_wake 455 n64 futex_wait sys_futex_wait +456 n64 futex_requeue sys_futex_requeue Index: linux-2.6/arch/mips/kernel/syscalls/syscall_o32.tbl =================================================================== --- linux-2.6.orig/arch/mips/kernel/syscalls/syscall_o32.tbl +++ linux-2.6/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -442,3 +442,4 @@ 452 o32 fchmodat2 sys_fchmodat2 454 o32 futex_wake sys_futex_wake 455 o32 futex_wait sys_futex_wait +456 o32 futex_requeue sys_futex_requeue Index: linux-2.6/arch/parisc/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/parisc/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/parisc/kernel/syscalls/syscall.tbl @@ -453,3 +453,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/powerpc/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/powerpc/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/powerpc/kernel/syscalls/syscall.tbl @@ -541,3 +541,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/s390/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/s390/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/s390/kernel/syscalls/syscall.tbl @@ -457,3 +457,4 @@ 452 common fchmodat2 sys_fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue sys_futex_requeue Index: linux-2.6/arch/sh/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/sh/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/sh/kernel/syscalls/syscall.tbl @@ -457,3 +457,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/sparc/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/sparc/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/sparc/kernel/syscalls/syscall.tbl @@ -500,3 +500,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/arch/x86/entry/syscalls/syscall_32.tbl =================================================================== --- linux-2.6.orig/arch/x86/entry/syscalls/syscall_32.tbl +++ linux-2.6/arch/x86/entry/syscalls/syscall_32.tbl @@ -459,3 +459,4 @@ 452 i386 fchmodat2 sys_fchmodat2 454 i386 futex_wake sys_futex_wake 455 i386 futex_wait sys_futex_wait +456 i386 futex_requeue sys_futex_requeue Index: linux-2.6/arch/x86/entry/syscalls/syscall_64.tbl =================================================================== --- linux-2.6.orig/arch/x86/entry/syscalls/syscall_64.tbl +++ linux-2.6/arch/x86/entry/syscalls/syscall_64.tbl @@ -377,6 +377,7 @@ 453 64 map_shadow_stack sys_map_shadow_stack 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue # # Due to a historical design error, certain syscalls are numbered differently Index: linux-2.6/arch/xtensa/kernel/syscalls/syscall.tbl =================================================================== --- linux-2.6.orig/arch/xtensa/kernel/syscalls/syscall.tbl +++ linux-2.6/arch/xtensa/kernel/syscalls/syscall.tbl @@ -425,3 +425,4 @@ 452 common fchmodat2 sys_fchmodat2 454 common futex_wake sys_futex_wake 455 common futex_wait sys_futex_wait +456 common futex_requeue sys_futex_requeue Index: linux-2.6/include/linux/syscalls.h =================================================================== --- linux-2.6.orig/include/linux/syscalls.h +++ linux-2.6/include/linux/syscalls.h @@ -556,6 +556,9 @@ asmlinkage long sys_futex_wait(void __us unsigned int flags, struct __kernel_timespec __user *timespec, clockid_t clockid); +asmlinkage long sys_futex_requeue(struct futex_waitv __user *waiters, + unsigned int flags, int nr_wake, int nr_requeue); + asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp, struct __kernel_timespec __user *rmtp); asmlinkage long sys_nanosleep_time32(struct old_timespec32 __user *rqtp, Index: linux-2.6/include/uapi/asm-generic/unistd.h =================================================================== --- linux-2.6.orig/include/uapi/asm-generic/unistd.h +++ linux-2.6/include/uapi/asm-generic/unistd.h @@ -826,9 +826,11 @@ __SYSCALL(__NR_fchmodat2, sys_fchmodat2) __SYSCALL(__NR_futex_wake, sys_futex_wake) #define __NR_futex_wait 455 __SYSCALL(__NR_futex_wait, sys_futex_wait) +#define __NR_futex_requeue 456 +__SYSCALL(__NR_futex_requeue, sys_futex_requeue) #undef __NR_syscalls -#define __NR_syscalls 456 +#define __NR_syscalls 457 /* * 32 bit systems traditionally used different Index: linux-2.6/kernel/futex/syscalls.c =================================================================== --- linux-2.6.orig/kernel/futex/syscalls.c +++ linux-2.6/kernel/futex/syscalls.c @@ -396,6 +396,44 @@ SYSCALL_DEFINE6(futex_wait, return ret; } +/* + * sys_futex_requeue - Requeue a waiter from one futex to another + * @waiters: array describing the source and destination futex + * @flags: unused + * @nr_wake: number of futexes to wake + * @nr_requeue: number of futexes to requeue + * + * Identical to the traditional FUTEX_CMP_REQUEUE op, except it is part of the + * futex2 family of calls. + */ + +SYSCALL_DEFINE4(futex_requeue, + struct futex_waitv __user *, waiters, + unsigned int, flags, + int, nr_wake, + int, nr_requeue) +{ + struct futex_vector futexes[2]; + u32 cmpval; + int ret; + + if (flags) + return -EINVAL; + + if (!waiters) + return -EINVAL; + + ret = futex_parse_waitv(futexes, waiters, 2); + if (ret) + return ret; + + cmpval = futexes[0].w.val; + + return futex_requeue(u64_to_user_ptr(futexes[0].w.uaddr), futexes[0].w.flags, + u64_to_user_ptr(futexes[1].w.uaddr), futexes[1].w.flags, + nr_wake, nr_requeue, &cmpval, 0); +} + #ifdef CONFIG_COMPAT COMPAT_SYSCALL_DEFINE2(set_robust_list, struct compat_robust_list_head __user *, head, Index: linux-2.6/kernel/sys_ni.c =================================================================== --- linux-2.6.orig/kernel/sys_ni.c +++ linux-2.6/kernel/sys_ni.c @@ -89,6 +89,7 @@ COND_SYSCALL_COMPAT(get_robust_list); COND_SYSCALL(futex_waitv); COND_SYSCALL(futex_wake); COND_SYSCALL(futex_wait); +COND_SYSCALL(futex_requeue); COND_SYSCALL(kexec_load); COND_SYSCALL_COMPAT(kexec_load); COND_SYSCALL(init_module);