From patchwork Fri Jul 21 10:22:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 13321865 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 B5B7BEB64DC for ; Fri, 21 Jul 2023 10:59:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E6EE92801BE; Fri, 21 Jul 2023 06:58:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DACCD2801C5; Fri, 21 Jul 2023 06:58:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 919612801C4; Fri, 21 Jul 2023 06:58:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 5E2712801C0 for ; Fri, 21 Jul 2023 06:58:56 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 332E2A022D for ; Fri, 21 Jul 2023 10:58:56 +0000 (UTC) X-FDA: 81035321472.07.E5660B7 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) by imf26.hostedemail.com (Postfix) with ESMTP id 1169414001E for ; Fri, 21 Jul 2023 10:58:53 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=C7i2naEt; dmarc=none; spf=none (imf26.hostedemail.com: domain of peterz@infradead.org has no SPF policy when checking 90.155.92.199) smtp.mailfrom=peterz@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689937134; 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=SORtMlf6AQ8aFXAtXEB5iMu/bkrYMuTpcyv7hAzIkB0=; b=McziUCteZnj3oIsbwIKNhJNT6et42VmAXq0d4H6t6Fp/CR1YPrx8K2vPJWTAxRpGgZ1FEQ 3ZB41zF3V8rjEY/xhMT0XssJv5KeiTsdp0CdGDBnMH3mJVJjvxGhDFnEMFWIW9Ug9znE+N 79UXtz4o2qmC8PJOre9r4IAFCNq+Ids= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=C7i2naEt; dmarc=none; spf=none (imf26.hostedemail.com: domain of peterz@infradead.org has no SPF policy when checking 90.155.92.199) smtp.mailfrom=peterz@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689937134; a=rsa-sha256; cv=none; b=jzCRJL1AK76LSXghcoT3nV4s6ZPuwvE3+Jjnq1UireqfuBV/z71SsSZtBKaZgQ/6c5hKX8 RTBfQY4E6eU21l1BLbvYEnMlAlSN5ofeIgW1mjt2HY4p0qK4ljZ4co1ZM64GAHNQyaIIIO S+u/xswR4ApNGg93Bv3NKqoemyebwMQ= 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=SORtMlf6AQ8aFXAtXEB5iMu/bkrYMuTpcyv7hAzIkB0=; b=C7i2naEtXB9PgOtkFyyD1IzI3C 9aIziC4VcH7AzunWf3zawU5TgSmHegDHfjYHDsdbBOcybREbz8Vrrl3Kx3BYHtkrHQOT3GioEQXD6 2WnojWFweddsKJprJPiwjRyQfQhZLIrKa67xiG11UAG694EvfKe1sc9LOCMpLy9j3rO7Wug//JpRq rVdiqDTuEXeRA84KUzdCYKCOx2oxkRZlk06UU5uzIwLog5GZ3QLxrGqlua8XmcAyzilhwndfdboRy 03qi9MYO17P+6tvHDsLaUzB5cwRNOKIgebn1XXInDS7DudxcciIQmX98jPfajh2nGdyjCRzC31eR3 jsJPM9ig==; 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 1qMnqK-0000Ky-0r; Fri, 21 Jul 2023 10:58:40 +0000 Received: from hirez.programming.kicks-ass.net (hirez.programming.kicks-ass.net [192.168.1.225]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (Client did not present a certificate) by noisy.programming.kicks-ass.net (Postfix) with ESMTPS id 33B583008AC; Fri, 21 Jul 2023 12:58:38 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id F190A3157E61C; Fri, 21 Jul 2023 12:58:37 +0200 (CEST) Message-ID: <20230721105743.887106899@infradead.org> User-Agent: quilt/0.66 Date: Fri, 21 Jul 2023 12:22:40 +0200 From: Peter Zijlstra 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 Subject: [PATCH v1 03/14] futex: Flag conversion References: <20230721102237.268073801@infradead.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 1169414001E X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: oc6b7tizxgzg3uihh68wm17b9eb3qpcp X-HE-Tag: 1689937133-265859 X-HE-Meta: U2FsdGVkX19LZhh1+Gil0ngkXiT8PobibPEcVreghxipdP2DNCxZtPqAytncgNLgvD4U7CBTjFKiTdT95jNgZVc6Z3ZkNpCW1JQy4HriZNwoqwIpZjUypl7oSCsIZgeULvhslugHj84ZEl5cMdS65jDdweXixojQaIiEhzaUic9SANKK6/pE4cOzJa3CicFs5xcDvgKkV8KEp37JJAiz3kq7A86KrF9ettpp/W6DnK/mgCvIbDmHl9geaANMHGNM9ACf+uTszS7kiy+le0YsfXa91DwbzcACf8JxjCMe5zSHDdsBM4+EW4/v/wMfJ5dvWM+EkQ/n9hZSTLRuM7nWvFatGqAD3QjL+BYqssYWrf1xz4CT3gmT4X0niaL0CSofYjL7lwucgwqo9cwjG5ofZuzsvLBY6UXIUpDj7j6x0XfFM2qGEuqAcU2c+YQ3SBd0wjqoy2GWCm8Fq5icxk7OxBVJjfj0ty4C9jBsVVM+HGCFazeKBjcRoTKH7ZnuplKHcPxiykz2IG4E7YllbhTKXtMqrMf2RrAvsdZmTfkd0uaGMlfgoHATLzr/C/7HN7gbPwOQS7vrgtAIA05hISsteiLmbxAVJ67j2eyNFuR53ujNddYLYHKiVEl01f2XIB5LdgOoh27emYnHaM7M7CLsrFSh1ukL9nz0exRKqnh5V+YHMUIxKr44h9p/zB4/grEa8/gsZeNdX7O1O5YqG4kEPAwqvflIHbOPg21rVjaoiq0TIpLBnsJxDCyNE6ABMdHJJAafr28gEaN1CTh9ssZ+AfMuNVNb/LwXQTo/G3J7kVJUXa1XMAUnNBl8BNQYW9pj/RA0sAdp/Cy2+stmONOmUH3bSo/nbdURQjTo1VLxGB78Xi2xZ5c7ZXqxe8QqaztTb4ycJtm/mc5QmneQPrPf40URSiJMw5o1uWJVubLbohjREm+Akj3/KESx66JdStbGcgm2O8oWr9JBZ7bbNtN 8j+Rk+Dm Z/LWF8cZVVpA4Eq+akdBpE9tUAlRQ8yPkk2NmvBprP0/Zo+ZS30GP2V6UdeAmX45AnrC5rCGOqREBK86AKjp3HbRD+ADMInqDO4NPid1ptPP7eHJN+smhYOyHKMBNYKsdKyYlJP+gV6FIR2m4RxxDdy6trlgqMeFa8MEw+rcsvzJRHP8656orzCDFxTEXfegDMM0XQ0Rv8HAhFgQHDzS2yR0wQ+ihy/WAsca//Wu4vXUoZKlPAbCMM1ojboqPb+inV9haEwHDyNs46tS/XyZQK4Y5KA== 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: Futex has 3 sets of flags: - legacy futex op bits - futex2 flags - internal flags Add a few helpers to convert from the API flags into the internal flags. Signed-off-by: Peter Zijlstra (Intel) --- kernel/futex/futex.h | 64 +++++++++++++++++++++++++++++++++++++++++++++--- kernel/futex/syscalls.c | 24 ++++++------------ kernel/futex/waitwake.c | 4 +-- 3 files changed, 72 insertions(+), 20 deletions(-) --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -5,6 +5,7 @@ #include #include #include +#include #ifdef CONFIG_PREEMPT_RT #include @@ -16,8 +17,15 @@ * Futex flags used to encode options to functions and preserve them across * restarts. */ +#define FLAGS_SIZE_8 0x00 +#define FLAGS_SIZE_16 0x01 +#define FLAGS_SIZE_32 0x02 +#define FLAGS_SIZE_64 0x03 + +#define FLAGS_SIZE_MASK 0x03 + #ifdef CONFIG_MMU -# define FLAGS_SHARED 0x01 +# define FLAGS_SHARED 0x10 #else /* * NOMMU does not have per process address space. Let the compiler optimize @@ -25,8 +33,58 @@ */ # define FLAGS_SHARED 0x00 #endif -#define FLAGS_CLOCKRT 0x02 -#define FLAGS_HAS_TIMEOUT 0x04 +#define FLAGS_CLOCKRT 0x20 +#define FLAGS_HAS_TIMEOUT 0x40 +#define FLAGS_NUMA 0x80 + +/* FUTEX_ to FLAGS_ */ +static inline unsigned int futex_to_flags(unsigned int op) +{ + unsigned int flags = FLAGS_SIZE_32; + + if (!(op & FUTEX_PRIVATE_FLAG)) + flags |= FLAGS_SHARED; + + if (op & FUTEX_CLOCK_REALTIME) + flags |= FLAGS_CLOCKRT; + + return flags; +} + +/* FUTEX2_ to FLAGS_ */ +static inline unsigned int futex2_to_flags(unsigned int flags2) +{ + unsigned int flags = flags2 & FUTEX2_64; + + if (!(flags2 & FUTEX2_PRIVATE)) + flags |= FLAGS_SHARED; + + if (flags2 & FUTEX2_NUMA) + flags |= FLAGS_NUMA; + + return flags; +} + +static inline bool futex_flags_valid(unsigned int flags) +{ + /* Only 64bit futexes for 64bit code */ + if (!IS_ENABLED(CONFIG_64BIT) || in_compat_syscall()) { + if ((flags & FLAGS_SIZE_MASK) == FLAGS_SIZE_64) + return false; + } + + /* Only 32bit futexes are implemented -- for now */ + if ((flags & FLAGS_SIZE_MASK) != FLAGS_SIZE_32) + return false; + + return true; +} + +static inline unsigned int futex_size(unsigned int flags) +{ + unsigned int size = flags & FLAGS_SIZE_MASK; + return 1 << size; /* {0,1,2,3} -> {1,2,4,8} */ +} #ifdef CONFIG_FAIL_FUTEX extern bool should_fail_futex(bool fshared); --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -1,6 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later -#include #include #include @@ -85,15 +84,12 @@ SYSCALL_DEFINE3(get_robust_list, int, pi long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, u32 __user *uaddr2, u32 val2, u32 val3) { + unsigned int flags = futex_to_flags(op); int cmd = op & FUTEX_CMD_MASK; - unsigned int flags = 0; - if (!(op & FUTEX_PRIVATE_FLAG)) - flags |= FLAGS_SHARED; - - if (op & FUTEX_CLOCK_REALTIME) { - flags |= FLAGS_CLOCKRT; - if (cmd != FUTEX_WAIT_BITSET && cmd != FUTEX_WAIT_REQUEUE_PI && + if (flags & FLAGS_CLOCKRT) { + if (cmd != FUTEX_WAIT_BITSET && + cmd != FUTEX_WAIT_REQUEUE_PI && cmd != FUTEX_LOCK_PI2) return -ENOSYS; } @@ -201,21 +197,19 @@ static int futex_parse_waitv(struct fute unsigned int i; for (i = 0; i < nr_futexes; i++) { + unsigned int flags; + if (copy_from_user(&aux, &uwaitv[i], sizeof(aux))) return -EFAULT; if ((aux.flags & ~FUTEX2_MASK) || aux.__reserved) return -EINVAL; - if (!IS_ENABLED(CONFIG_64BIT) || in_compat_syscall()) { - if ((aux.flags & FUTEX2_64) == FUTEX2_64) - return -EINVAL; - } - - if ((aux.flags & FUTEX2_64) != FUTEX2_32) + flags = futex2_to_flags(aux.flags); + if (!futex_flags_valid(flags)) return -EINVAL; - futexv[i].w.flags = aux.flags; + futexv[i].w.flags = flags; futexv[i].w.val = aux.val; futexv[i].w.uaddr = aux.uaddr; futexv[i].q = futex_q_init; --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -419,11 +419,11 @@ static int futex_wait_multiple_setup(str */ retry: for (i = 0; i < count; i++) { - if ((vs[i].w.flags & FUTEX_PRIVATE_FLAG) && retry) + if (!(vs[i].w.flags & FLAGS_SHARED) && retry) continue; ret = get_futex_key(u64_to_user_ptr(vs[i].w.uaddr), - !(vs[i].w.flags & FUTEX_PRIVATE_FLAG), + vs[i].w.flags & FLAGS_SHARED, &vs[i].q.key, FUTEX_READ); if (unlikely(ret))