From patchwork Fri Jul 14 13:39:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 13313727 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 72F91C001B0 for ; Fri, 14 Jul 2023 14:16:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 262628D0007; Fri, 14 Jul 2023 10:16:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1E7368D0005; Fri, 14 Jul 2023 10:16:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0B0328D0007; Fri, 14 Jul 2023 10:16:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id F0CAC8D0005 for ; Fri, 14 Jul 2023 10:16:34 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id B864016028F for ; Fri, 14 Jul 2023 14:16:34 +0000 (UTC) X-FDA: 81010417908.17.C51D014 Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) by imf06.hostedemail.com (Postfix) with ESMTP id 3112A180017 for ; Fri, 14 Jul 2023 14:16:30 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=RAyQOPIK; dmarc=none; spf=none (imf06.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=1689344191; 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=50j8lu0fq8DZ70IkYc8oVFT5B2TMdBpxV7U6GuBpl7Q=; b=SgYLbgBL+4Bn3uy1WIZgRyUjpQ4Kj/VKr25+wupojr/JabB2zZiZJ5bV0AOyzeAJ6pTwTY bnZ3Tw74gxBROAJLXSgHIVs752yTXD1DAlgyv+IJVBThsC9qyIoAz/L42zKYe6xJWmCyDT SH3P5of0dISxcPkYnZnSkNzgIMTHoq8= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=infradead.org header.s=desiato.20200630 header.b=RAyQOPIK; dmarc=none; spf=none (imf06.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=1689344191; a=rsa-sha256; cv=none; b=DkNVFz5XEQzRLmbEi92XaiuBb36w4i8akPqofal9OzRObI2w9YBk8i7SIPv4sWW5suDxbZ E9fnwhUK5FNl6SpRqYgx+zf0zxjxIOgB63L8NHMm2OTaZYFC6NLZEceBMI8eHaegiTQ5Go EX+4E4RBIgx9CMG3uuTjA7hNUDMPz6k= 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=50j8lu0fq8DZ70IkYc8oVFT5B2TMdBpxV7U6GuBpl7Q=; b=RAyQOPIKt+lXLX555aDpPJzUC9 L7EOxKUfSVd10nX0K16zDGniwOxKc30Cd/+xG8LzFUBBkCLdSF5xP40Cevv5Y/l6dyWqJa+dVphas 6Gr3l8Rz6zoUJVtRlBiLy943qRAqpj/vIhSitOCh6gTyqaAbRgo3JiXP+Dc7K9WePvtmFiCyQfKj8 RCN4PcykMUeb1gdeFB8LRCRweSK248CKdk4wGCboxrybdoWYOf/v45Z/R/lBU7b2/xNeycJx/kjtz pIi/tFYgUgJFMSvi1VEusccqOJXl+n6NkSpusiNz4nBzjjmriQXxNwJcJZ5QOUmUYPapDvpPLr6Ya W0DmGT1Q==; 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 1qKJah-006Iix-2B; Fri, 14 Jul 2023 14:16:16 +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 B27AC300E86; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 8732D245EFFAA; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141219.215288670@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:08 +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: [RFC][PATCH 09/10] futex: Enable FUTEX2_{8,16} References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 3112A180017 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: nnk1bb1zkit6a9f3m7fexu3ehq9ymbih X-HE-Tag: 1689344190-610280 X-HE-Meta: U2FsdGVkX19RwH8nmMJiVlOXQQk8logzP8Q5i6hg0g0hPZ1F7Uc/x+CHki+UXru7GFSVK+pgh9TyiIQdWsZvb6EO7gTJl5aF7Y2o/fmwZXnQmqNRfBF9NsGIMkXJbG/zWo0SQ5uuH3FB8Vc/pNEN2Gw/e4732XvhvTBf/k6UyuVohQhLbUSPb8n1IDvXbfVjK/NCHZvM7iksLtMgaXP0tNLu0q7Na0SCmo9bLeATSX/IQYIsNGrvHA7X6YlLbJGPQPN479EExbojyq+NbGFHQ/cKCtgLtucoTD60vzRl7hv23n510VhfvXLIkXgLGgJqLe+PYVMOnVOtvgFs+VTxnhzeiKN1k60F7h0B3tYUP4rSnPRClgVPxzvkx5ytNkvuOU3gBjZhenZSjhtwmKNRjXzNuVWQU8p8O0ts0gM8hNxu1d+4Mg+k2O2yLTXoZ6IyO4b18VkesR2feTGqbMiUZw0mAL3ErmLR2381THNO7YdAIJH/CU65eWn2tSMeJQ9h/QElxmIe4Rqhtgn14y29ZI5ftAQjQVuFJsRamr3HvsOihxTLEBpM0G6u36+82H7dGo1Ms0Zlw1kVazUdF6exo5D7Z9UrKkKuc0K9zujo9cKCkBIQgbOWx/FpE1M+hdYh+6H1dTU8X3seHbtq8X3teTmIzZ2y89yVbGCpOeFzfG5Ba6Ywqh++BGeQxXREAynshjHilDOP8V5/J186TZmaIJ2k8ST6rcZ1NaWKJgswxFxKP1mjU6tvCJx2T3INPFlt6GMns5jvZ2EOVkzoCgkHuOzSCbNW5KeYFzNC6sy4LZgjADcBL15iQt2XVCcy8PLj+pDtplY3RO3a6gX8SV/fH0y89rl1KOcMqyMWaUvZ8J/wGGofokd44a4nvJlDISMPJx9cf3hu2X/4cdu2/J/2jMMPRW8yDLA5H5Ffw6yIP8RUMpV0ezxBIF1QXy9j5Z4nGHr2kEvOiRvMW6B79so w0O4WEwK n6zm8IoPK1Z5DhGsqC0vLmasE/VbpgHjI6KHFShnBaLg4D8q+ul7bJ85cPDjANr9u2MfZQB2d/JwCFGqa6nj5K2R9e6sVa5Jc0Y/WA0+zccSLAU0fxWCQgGnSBMjbGrN0YRiffwoT0Vio8kxg6MKr0UZMifcdrxCprAGQCs1yOSU5AZwE+S7aomLVavj4eOKF9imgeFKNdaYX17JVkm677nSdYcMGdItbDWnpR36lDeX+o52T5R1YNZep+iMNN0USeE4V6uB+eNlP0/RKkHt/UlkoeXWkI3eZDcnBAMhR8Ba2fCcHFHU/UplfByKnOg0KzzDQ 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: When futexes are no longer u32 aligned, the lower offset bits are no longer available to put type info in. However, since offset is the offset within a page, there are plenty bits available on the top end. After that, pass flags into futex_get_value_locked() for WAIT and disallow FUTEX2_64 instead of mandating FUTEX2_32. Signed-off-by: Peter Zijlstra (Intel) --- include/linux/futex.h | 11 ++++++----- kernel/futex/syscalls.c | 4 ++-- kernel/futex/waitwake.c | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) --- a/include/linux/futex.h +++ b/include/linux/futex.h @@ -16,18 +16,19 @@ struct task_struct; * The key type depends on whether it's a shared or private mapping. * Don't rearrange members without looking at hash_futex(). * - * offset is aligned to a multiple of sizeof(u32) (== 4) by definition. - * We use the two low order bits of offset to tell what is the kind of key : + * offset is the position within a page and is in the range [0, PAGE_SIZE). + * The high bits of the offset indicate what kind of key this is: * 00 : Private process futex (PTHREAD_PROCESS_PRIVATE) * (no reference on an inode or mm) * 01 : Shared futex (PTHREAD_PROCESS_SHARED) * mapped on a file (reference on the underlying inode) * 10 : Shared futex (PTHREAD_PROCESS_SHARED) * (but private mapping on an mm, and reference taken on it) -*/ + */ -#define FUT_OFF_INODE 1 /* We set bit 0 if key has a reference on inode */ -#define FUT_OFF_MMSHARED 2 /* We set bit 1 if key has a reference on mm */ +#define FUT_OFF_INODE (PAGE_SIZE << 0) +#define FUT_OFF_MMSHARED (PAGE_SIZE << 1) +#define FUT_OFF_SIZE (PAGE_SIZE << 2) union futex_key { struct { --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -206,7 +206,7 @@ static int futex_parse_waitv(struct fute if ((aux.flags & ~FUTEX2_MASK) || aux.__reserved) return -EINVAL; - if ((aux.flags & FUTEX2_64) != FUTEX2_32) + if ((aux.flags & FUTEX2_64) == FUTEX2_64) return -EINVAL; flags = futex2_to_flags(aux.flags); @@ -334,7 +334,7 @@ SYSCALL_DEFINE4(futex_wake, if (flags & ~FUTEX2_MASK) return -EINVAL; - if ((flags & FUTEX2_64) != FUTEX2_32) + if ((flags & FUTEX2_64) == FUTEX2_64) return -EINVAL; flags = futex2_to_flags(flags); --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -439,7 +439,7 @@ static int futex_wait_multiple_setup(str u32 val = vs[i].w.val; hb = futex_q_lock(q); - ret = futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32); + ret = futex_get_value_locked(&uval, uaddr, flags); if (!ret && uval == val) { /* @@ -607,7 +607,7 @@ int futex_wait_setup(u32 __user *uaddr, retry_private: *hb = futex_q_lock(q); - ret = futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32); + ret = futex_get_value_locked(&uval, uaddr, flags); if (ret) { futex_q_unlock(*hb);