From patchwork Fri Jul 14 13:39:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120499 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537034vqm; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) X-Google-Smtp-Source: APBJJlFGiBGOCbYT24kU2U3ztpfnOy5npj6KkV9F0ybzEd0ypTg2Y6rxUdzAvL4y1MWreDTNbm6D X-Received: by 2002:a05:6a20:d90b:b0:12b:5277:6f83 with SMTP id jd11-20020a056a20d90b00b0012b52776f83mr4578929pzb.52.1689344364771; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344364; cv=none; d=google.com; s=arc-20160816; b=v0F6gkawvGLoxAe6umNYWTqQ5/7zlcUJ/iYFZV32prt8qyzAJT6+67yFiXWBuBvBXT 6dp4mdBUYIGmw0Cv/9/th7j5Fa4T0J9VW0KP0p/SikdckC27volZY0+pN5lssPJ+Fmfv Zdm/KYPGYsM4pOYwVSiAUY0aWznsXHFMVjS6hikIOGtUdgGcNYKFj9Sl5bZPs9TDXaJp pRpFynoYqWeP76Od4PEefG0TQ/lz/y0InXUlYDq7mABjvGMeQnAIuKrT/jtDknxcJYCe iRMz2HYK6w8VSzNlvSJ9KhKfLRE2g6vXvPCznUKgVBp3Fqm65zjT2Is1w4TWfcQxkk23 tXyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=QqRA1A/aeG7Vp+frAisWOweSXHDCgPVqvl/Ov07GdYA=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=J6eSYWenUtmSeWVQLAQJP7eHbMY68TbSsPUfXOHLOQYROlrayWfNeVkPnTws81O0iQ cIF1P+UX7VdExAn0DLyizl2ubo+wJnbbBgQFA+669n1qMuUmNzGRhvxr7tUpvajYKshI i5pyOsYflQsKnKzbPoz0dB1SCBMdCGqOA/8mcI56zKbG5sOeiN8GU0w4I0mtFrAW358e 5VdCmEpztwIHPGQukXHLKRNPGxHrcZwe9twDfzCO94C3aC0ZFVc+aecxFfMNUkOar4BT V1GetoV0gWfgQctEWFj58p1zaaGS06HP+6BJTCdYlBd3fcrtZA4c2dnre0gAdm9N7L/f owgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=keXvIPEO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h25-20020a63f919000000b0054fdce77666si6895616pgi.630.2023.07.14.07.19.05; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=keXvIPEO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235946AbjGNOQ5 (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235574AbjGNOQn (ORCPT ); Fri, 14 Jul 2023 10:16:43 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E068430C6; Fri, 14 Jul 2023 07:16:41 -0700 (PDT) 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=QqRA1A/aeG7Vp+frAisWOweSXHDCgPVqvl/Ov07GdYA=; b=keXvIPEO22MCTYT4gVabzMzK4E 7zZ4B7VY3kbDqlVMOrYGQfJiEOSPC6TYRJwwLI4z77Mas0c6YAf8GNXbwWcnhfyKRjasvonlAqnBW +mJC9B+tXoPm19KZVSUqRxMF7xg73W6zJrsVfUwVqdzrEHWjFQnujsu33OkbGmCFyJwnz5GZzDle7 H9739utpS0sI3pEmgP1kgng0pbxnX6+lYHnPrWYSOAAt7it9tZSJbJHoOuUD8hx0g3LLH0uPTvNvE LhxvjVH8fIzku5xDR10iHOMR6yvT3U+fPYGSL56BOtfdNaCpQgl9mBurFiJ50dh/4e4oPwLfZQc2k fcIiaoxw==; 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-006Iiv-21; 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) server-digest SHA256) (Client did not present a certificate) by noisy.programming.kicks-ass.net (Postfix) with ESMTPS id A22C4300513; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 5EA7E200D83A3; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141218.679746713@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:00 +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 01/10] futex: Clarify FUTEX2 flags References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405956932299336 X-GMAIL-MSGID: 1771405956932299336 sys_futex_waitv() is part of the futex2 series (the first and only so far) of syscalls and has a flags field per futex (as opposed to flags being encoded in the futex op). This new flags field has a new namespace, which unfortunately isn't super explicit. Notably it currently takes FUTEX_32 and FUTEX_PRIVATE_FLAG. Introduce the FUTEX2 namespace to clarify this Signed-off-by: Peter Zijlstra (Intel) --- include/uapi/linux/futex.h | 16 +++++++++++++--- kernel/futex/syscalls.c | 7 +++---- 2 files changed, 16 insertions(+), 7 deletions(-) --- a/include/uapi/linux/futex.h +++ b/include/uapi/linux/futex.h @@ -44,10 +44,20 @@ FUTEX_PRIVATE_FLAG) /* - * Flags to specify the bit length of the futex word for futex2 syscalls. - * Currently, only 32 is supported. + * Flags for futex2 syscalls. */ -#define FUTEX_32 2 + /* 0x00 */ + /* 0x01 */ +#define FUTEX2_32 0x02 + /* 0x04 */ + /* 0x08 */ + /* 0x10 */ + /* 0x20 */ + /* 0x40 */ +#define FUTEX2_PRIVATE FUTEX_PRIVATE_FLAG + +/* do not use */ +#define FUTEX_32 FUTEX2_32 /* historical accident :-( */ /* * Max numbers of elements in a futex_waitv array --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -183,8 +183,7 @@ SYSCALL_DEFINE6(futex, u32 __user *, uad return do_futex(uaddr, op, val, tp, uaddr2, (unsigned long)utime, val3); } -/* Mask of available flags for each futex in futex_waitv list */ -#define FUTEXV_WAITER_MASK (FUTEX_32 | FUTEX_PRIVATE_FLAG) +#define FUTEX2_MASK (FUTEX2_32 | FUTEX2_PRIVATE) /** * futex_parse_waitv - Parse a waitv array from userspace @@ -205,10 +204,10 @@ static int futex_parse_waitv(struct fute if (copy_from_user(&aux, &uwaitv[i], sizeof(aux))) return -EFAULT; - if ((aux.flags & ~FUTEXV_WAITER_MASK) || aux.__reserved) + if ((aux.flags & ~FUTEX2_MASK) || aux.__reserved) return -EINVAL; - if (!(aux.flags & FUTEX_32)) + if (!(aux.flags & FUTEX2_32)) return -EINVAL; futexv[i].w.flags = aux.flags; From patchwork Fri Jul 14 13:39:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120503 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537068vqm; Fri, 14 Jul 2023 07:19:28 -0700 (PDT) X-Google-Smtp-Source: APBJJlFZAWUyP34Q5OY67tMt4BJYr9+U4tsvZ0s2GdVtxkSqaWEgyBSeg7ZiH5+f8SxjLITftMZn X-Received: by 2002:a17:902:c1d4:b0:1b3:8862:9823 with SMTP id c20-20020a170902c1d400b001b388629823mr3423973plc.28.1689344367863; Fri, 14 Jul 2023 07:19:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344367; cv=none; d=google.com; s=arc-20160816; b=HvbkVaWXRNshMTUuOTsKwwXjlTM1UG1hcG7XiPpp3YSVLbVktCsbm1lvWCDyL2nCHq /04RQHm5eWaTAWieOG1Z+pGP6Uf+8q1vWoovETd2LhZM1KYiwpXUDhXHp0q3G1GtoRr9 503yPm70kaVemuGub2a/HKY6qatEzLlDRa4TQQCjjV7K0lml4w8jDOUQjN/6S4LiSqjz bfOmqlk9V7SDxf8QlAW7KFHZv0XdQTRJJs0E5OE0zThCSyU/huEkwS6IpWo/lfxqzaru DrZtFhUQzoabWeyfQ6jTM/P6MWU8mc3ejX4Zabxx7jFBL2MW1krUchEurOghOWcHBkza xC6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=JH41pDo7+Jk4qffVzaO2p6sCO6Nd3BbMmWUDDzgZdtk=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=ApvxDwgNAOG74JWYE2i3eJJN7MhoKjdHKF05/qudoP3nUlcN2L4U/IaaWqDOvT586P lXkt7z+IMQ5p/g1n+0XLZHFTUKBRNHyBUI0uS9byhl9Q98EiySZ7Qr9f1063TtgxlsRV +IHmpBn8uBzfDLexYTfGhMj5b7Atb1O+ul8FCcBu43n8rWwleUsx/987zCsWst0/HSwz aBlq2/jYf5KdqmoKiNAQ5i5uhBSVlIqLxHPfS3cdUFWIVdzWigj8AXnx8fkcTTxNQ4Od 43unhDEJKde/9qRk3aRy0lo4X0a/t8VY9HAR6gGNE4/hlj74YJIw9VWMyvhoIeVTv+ft clow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=svWkhtHF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f19-20020a170902f39300b001b9e29fe870si6753629ple.62.2023.07.14.07.19.15; Fri, 14 Jul 2023 07:19:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=svWkhtHF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235882AbjGNOQm (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235692AbjGNOQg (ORCPT ); Fri, 14 Jul 2023 10:16:36 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 32E8E30C0; Fri, 14 Jul 2023 07:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=JH41pDo7+Jk4qffVzaO2p6sCO6Nd3BbMmWUDDzgZdtk=; b=svWkhtHF2Xpvm5S2/jG0ESgpOR TrBT7MXzx1VRkZJl6Z6JFy0pTLtfdLkAEIKsOMTFwQdkIcyy7ECVjFqE40I2iJe1vrTASfja+qtM8 WDZzYWTGTFQE6iD8ojO/zPWX2v5OoL4npt+I6MnajImZXMT3MMTG8Etf217dclTq1BWGZGQyPj8vI cckrPl4lyNHyA0T5FPLyqSrU5OeSoDbhmhEhc3Q+AzAlgex4F5uq1gNKB6i32P1QVfvRGn5o+/Qo9 SmMRrS031NkgiHkFCkG/Lg0t6+kVO2fNi2Q9P/DCCL+60sQ/32+jDCeaEmgLQ+HU5c+7wxd2+P8im H4FxABfQ==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1qKJah-0016z2-4F; Fri, 14 Jul 2023 14:16:15 +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 A3DB730057E; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 60EA0213728AD; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141218.746077262@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:01 +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 02/10] futex: Extend the FUTEX2 flags References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405959820115959 X-GMAIL-MSGID: 1771405959820115959 Add the definition for the missing but always intended extra sizes, and add a NUMA flag for the planned numa extention. Signed-off-by: Peter Zijlstra (Intel) --- include/uapi/linux/futex.h | 7 ++++--- kernel/futex/syscalls.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) --- a/include/uapi/linux/futex.h +++ b/include/uapi/linux/futex.h @@ -46,10 +46,11 @@ /* * Flags for futex2 syscalls. */ - /* 0x00 */ - /* 0x01 */ +#define FUTEX2_8 0x00 +#define FUTEX2_16 0x01 #define FUTEX2_32 0x02 - /* 0x04 */ +#define FUTEX2_64 0x03 +#define FUTEX2_NUMA 0x04 /* 0x08 */ /* 0x10 */ /* 0x20 */ --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -183,7 +183,7 @@ SYSCALL_DEFINE6(futex, u32 __user *, uad return do_futex(uaddr, op, val, tp, uaddr2, (unsigned long)utime, val3); } -#define FUTEX2_MASK (FUTEX2_32 | FUTEX2_PRIVATE) +#define FUTEX2_MASK (FUTEX2_64 | FUTEX2_PRIVATE) /** * futex_parse_waitv - Parse a waitv array from userspace @@ -207,7 +207,7 @@ static int futex_parse_waitv(struct fute if ((aux.flags & ~FUTEX2_MASK) || aux.__reserved) return -EINVAL; - if (!(aux.flags & FUTEX2_32)) + if ((aux.flags & FUTEX2_64) != FUTEX2_32) return -EINVAL; futexv[i].w.flags = aux.flags; From patchwork Fri Jul 14 13:39:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120502 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537043vqm; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) X-Google-Smtp-Source: APBJJlFQgJr/ravAbjKUhyQMb+pGXl0bxdnnssNYXtDXqsH5kqB9bQ/VxbK1l78dyNXfSZ9aOtzT X-Received: by 2002:a05:6a20:144d:b0:125:f3d8:e65b with SMTP id a13-20020a056a20144d00b00125f3d8e65bmr4319193pzi.18.1689344365321; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344365; cv=none; d=google.com; s=arc-20160816; b=alBJrCB9TTIP6gfBoIY9Y2Tzf6421BVvwmzdAyvKO/RrFapvnvPQm/EnPPMv6ioDc8 Wg+50+yH2/7UTOKUfdwjzOKBW1n62MhD+qUW7AD7qW2JTh3E3GOfx5zci90rpMnAh1ap FveDAkhf0U4NQESTXwLmGuYU3ZJ/kthuwL/AVZOqtRNw5WKnFMkXkxdFvIq8xMySSp8N TJHrF9VrNVEYYwe7bKLc8kqKdrfmds7E4REYJU0b+0pym7DxzBpzhUe4NtqCzbkI+TWA Oa8VP97fvL2tmWdumE8sb7ziNx3OvbsA1SoWPTCKoTEDrCGoyZLSSXy02vf+n9NanyXC Cfpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=98fwNtpV0Bbvya3mBoauq7smkVWN16/6yjAoJPAxLCQ=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=x83AG4GIUMS39eeAJ63YQ0K/1xoVJN62BbFiSeKjVl+O6m5ppzHzoijdVzm+fq170q /7i5v18FIFwpLWspXxYFSxlnbXh+N84jMFbfR0ogXxOjwkksWokKeOg9094JtIxNE4El Tj4cRr3yZw3x2oJ5avo2p1EN9T0FCKGjcqPX/1PJrTU2G5Nvbf13QQAATtW88G1a1DC3 kjIvXMo9w0unKlZ4SoBt3oXD7hCY3wJ765ACLnP1JE5MdH16LAMzjArGXJh3JK3zS47Z jIWCx0OmOhIaaUssNHKvlwsGUTnKMlj64dUrr8D8ma8fE0h8Gmu088ksJJXP/sOCQJir s52A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=k0AkkJTw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e1-20020a636901000000b0055baed7e7e6si6994206pgc.251.2023.07.14.07.19.06; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=k0AkkJTw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235972AbjGNOQz (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235510AbjGNOQn (ORCPT ); Fri, 14 Jul 2023 10:16:43 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C50B730C0; Fri, 14 Jul 2023 07:16:41 -0700 (PDT) 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=98fwNtpV0Bbvya3mBoauq7smkVWN16/6yjAoJPAxLCQ=; b=k0AkkJTwfkefz5URce2ntHKAIC 6CkN91KKm1sEDmU8seNl1uV4Im1FILXye+5BHlydSaZELYf9BNA3/k7+QifPdr1WwzxLzYcvHvf6T P1AJrThlTJ4nWZgI8kec0ij5yNMrSO/t5B/BJ5VDAX+AR7E+PAaN9ykyCq7vT6csjBMqdhA19nELp lEz1sIwnXytxoy8hFGNf0qkpI0+Ch+wz56SHgu5eT13eNOFZ9pHKXoHl5VNSgkeZfGyJrfRhvnzkm 2UMzg2C3u8KfvGSkocm2zB5m0xp474j8eyUMo0BZX3hXkqvYrbCtZ7F7zHwbFS4yTB9IgE5FV80uX dly3b80w==; 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-006Iiw-21; 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 A0834300362; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 691B3213728B7; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141218.813185695@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:02 +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 03/10] futex: Flag conversion References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405957305015585 X-GMAIL-MSGID: 1771405957305015585 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 | 48 +++++++++++++++++++++++++++++++++++++++++++++--- kernel/futex/syscalls.c | 21 +++++++++++++-------- kernel/futex/waitwake.c | 4 ++-- 3 files changed, 60 insertions(+), 13 deletions(-) --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -16,8 +16,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 +32,43 @@ */ # 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 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 @@ -85,15 +85,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,6 +198,8 @@ static int futex_parse_waitv(struct fute unsigned int i; for (i = 0; i < nr_futexes; i++) { + unsigned int bits, flags; + if (copy_from_user(&aux, &uwaitv[i], sizeof(aux))) return -EFAULT; @@ -210,7 +209,13 @@ static int futex_parse_waitv(struct fute if ((aux.flags & FUTEX2_64) != FUTEX2_32) return -EINVAL; - futexv[i].w.flags = aux.flags; + flags = futex2_to_flags(aux.flags); + bits = 8 * futex_size(flags); + + if (bits < 64 && aux.val >> bits) + return -EINVAL; + + 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)) From patchwork Fri Jul 14 13:39:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120501 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537037vqm; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) X-Google-Smtp-Source: APBJJlGmv2DxPcOOJLDFrq2M9Tm5tKOLJyU9wxM+52KK6P+qGoiE8+xQk2oKiIMXGn5OPSoouE9Q X-Received: by 2002:a05:6a21:33a2:b0:131:5f8b:9c7d with SMTP id yy34-20020a056a2133a200b001315f8b9c7dmr4270612pzb.22.1689344365035; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344365; cv=none; d=google.com; s=arc-20160816; b=DauI1g1wypso9SxgmEXgnN1k9DJDkl3dGXPjwTVAuNlsHv9g1STIzqyU0eMxZI6t6h H6yF5egQpe4AXIGPa/aNOrbUFVam/Aew5W+wJ8lpEsGeo86NQni6z6q1DheRl9JnpZ19 j7QvC/FGD0+VNclWDz0PypnSvpEeo536x3kMYI+DeJ7LdEdvyKHbnOcIJRjxovxtPUqZ 0UG7KgrhBJX1d3XrQNLepyvskoCpHUz/zWnZbcZ78RK06SfY3BtBS1j6lhRtyU34ONRJ B6IOb95JeLkJMhfmgZISw0CX2JgL2sMIl1t/z5hFAUXDSLRMpXFZtyleFVOKjzRujt9+ qxhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=f9cIjtSvczJQzaoy/33m3QuVdm29wDRZG/Co3tko+Xc=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=mRpF4nH+eNd02U7qGwETTRLafb9Dlez3+P9Snwf8wpiF+jGJal9i4yrCO9WOl1XryA H0WciCPMN1HLojht9ufeNXgprkxnFGQDrGt5Q6QmvtZbyQT7KW2TbiTa3KMqFN8HQ5fS u9RW4BBRd7fKSM/0aMane1n7bSyyifhV1BIlnEYTbMSNEMKU69GQiyU9C0mZ3FIrG6TV MaGQOE0d7n8D/rz7IMZmSsPd1Y5Snzc0X6XPlTo8cBmiJGJr+euPrkG0At50huR0KvV7 +yjz9PCjNkt3Awe0twl8F9X2dEPkgiMF103hngl4vEmQ7zB1Jr07tNYjjX+wq1NOzRQY XmXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=Ex87tFfx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z14-20020a170903018e00b001b8a88cba84si596615plg.129.2023.07.14.07.19.03; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=Ex87tFfx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236007AbjGNOQv (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234555AbjGNOQi (ORCPT ); Fri, 14 Jul 2023 10:16:38 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDD941989; Fri, 14 Jul 2023 07:16:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=f9cIjtSvczJQzaoy/33m3QuVdm29wDRZG/Co3tko+Xc=; b=Ex87tFfxAGzCWArXtjjyD9/4ya nGclUVR+Zd0W0YM1P1AJRTaPXoWuAwIlPYNAyOLp52E2w1jE7yxw+UPqs0Whz/O9xNFK7IdnY0TVn XDoZNGxQMaTdB3YsUFOmbmq8L6mxzIcN0A2AiGnZdPV06KYiEnSrR8K9VhFnMnkB7pBs2UxnETzxY Fr3THWigl3xbUumsm8PutaMhgykj9zjmp7oyBoVLBq3NKWRSAjQMgDL441ZEc5Qi+D8C+VAL5Rdbk f+7OxaLt8zKZtoX9fJIP01ADwQn/Ki/S3hPyfyCyCm3jKe1WhdOrcjSSILHp6hwRXv9dqwqrePlFK HYWPxzxQ==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1qKJah-0016z0-49; Fri, 14 Jul 2023 14:16:15 +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 9ED6F3002CE; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 6CBBC213728B0; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141218.879715585@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:03 +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 04/10] futex: Add sys_futex_wake() References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405956465008197 X-GMAIL-MSGID: 1771405956465008197 To complement sys_futex_waitv() add sys_futex_wake(). Together they provide the basic Futex2 WAIT/WAKE functionality. Signed-off-by: Peter Zijlstra (Intel) --- arch/alpha/kernel/syscalls/syscall.tbl | 1 arch/arm/tools/syscall.tbl | 1 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 | 5 ++- kernel/futex/syscalls.c | 37 ++++++++++++++++++++++++++++ kernel/sys_ni.c | 1 21 files changed, 62 insertions(+), 2 deletions(-) --- a/arch/alpha/kernel/syscalls/syscall.tbl +++ b/arch/alpha/kernel/syscalls/syscall.tbl @@ -491,3 +491,4 @@ 559 common futex_waitv sys_futex_waitv 560 common set_mempolicy_home_node sys_ni_syscall 561 common cachestat sys_cachestat +562 common futex_wake sys_futex_wake --- a/arch/arm/tools/syscall.tbl +++ b/arch/arm/tools/syscall.tbl @@ -465,3 +465,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -909,6 +909,8 @@ __SYSCALL(__NR_futex_waitv, sys_futex_wa __SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node) #define __NR_cachestat 451 __SYSCALL(__NR_cachestat, sys_cachestat) +#define __NR_futex_wake 452 +__SYSCALL(__NR_futex_wake, sys_futex_wake) /* * Please add new compat syscalls above this comment and update --- a/arch/ia64/kernel/syscalls/syscall.tbl +++ b/arch/ia64/kernel/syscalls/syscall.tbl @@ -372,3 +372,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/m68k/kernel/syscalls/syscall.tbl +++ b/arch/m68k/kernel/syscalls/syscall.tbl @@ -451,3 +451,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/microblaze/kernel/syscalls/syscall.tbl +++ b/arch/microblaze/kernel/syscalls/syscall.tbl @@ -457,3 +457,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/mips/kernel/syscalls/syscall_n32.tbl +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -390,3 +390,4 @@ 449 n32 futex_waitv sys_futex_waitv 450 n32 set_mempolicy_home_node sys_set_mempolicy_home_node 451 n32 cachestat sys_cachestat +452 n32 futex_wake sys_futex_wake --- a/arch/mips/kernel/syscalls/syscall_n64.tbl +++ b/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -366,3 +366,4 @@ 449 n64 futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 n64 cachestat sys_cachestat +452 n64 futex_wake sys_futex_wake --- a/arch/mips/kernel/syscalls/syscall_o32.tbl +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -439,3 +439,4 @@ 449 o32 futex_waitv sys_futex_waitv 450 o32 set_mempolicy_home_node sys_set_mempolicy_home_node 451 o32 cachestat sys_cachestat +452 o32 futex_wake sys_futex_wake --- a/arch/parisc/kernel/syscalls/syscall.tbl +++ b/arch/parisc/kernel/syscalls/syscall.tbl @@ -450,3 +450,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/powerpc/kernel/syscalls/syscall.tbl +++ b/arch/powerpc/kernel/syscalls/syscall.tbl @@ -538,3 +538,4 @@ 449 common futex_waitv sys_futex_waitv 450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/s390/kernel/syscalls/syscall.tbl +++ b/arch/s390/kernel/syscalls/syscall.tbl @@ -454,3 +454,4 @@ 449 common futex_waitv sys_futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat sys_cachestat +452 common futex_wake sys_futex_wake sys_futex_wake --- a/arch/sh/kernel/syscalls/syscall.tbl +++ b/arch/sh/kernel/syscalls/syscall.tbl @@ -454,3 +454,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/sparc/kernel/syscalls/syscall.tbl +++ b/arch/sparc/kernel/syscalls/syscall.tbl @@ -497,3 +497,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl @@ -456,3 +456,4 @@ 449 i386 futex_waitv sys_futex_waitv 450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node 451 i386 cachestat sys_cachestat +452 i386 futex_wake sys_futex_wake --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -373,6 +373,7 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake # # Due to a historical design error, certain syscalls are numbered differently --- a/arch/xtensa/kernel/syscalls/syscall.tbl +++ b/arch/xtensa/kernel/syscalls/syscall.tbl @@ -422,3 +422,4 @@ 449 common futex_waitv sys_futex_waitv 450 common set_mempolicy_home_node sys_set_mempolicy_home_node 451 common cachestat sys_cachestat +452 common futex_wake sys_futex_wake --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -563,6 +563,9 @@ asmlinkage long sys_set_robust_list(stru asmlinkage long sys_futex_waitv(struct futex_waitv *waiters, unsigned int nr_futexes, unsigned int flags, struct __kernel_timespec __user *timeout, clockid_t clockid); + +asmlinkage long sys_futex_wake(void __user *uaddr, int nr, unsigned int flags, u64 mask); + asmlinkage long sys_nanosleep(struct __kernel_timespec __user *rqtp, struct __kernel_timespec __user *rmtp); asmlinkage long sys_nanosleep_time32(struct old_timespec32 __user *rqtp, --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -816,12 +816,13 @@ __SYSCALL(__NR_process_mrelease, sys_pro __SYSCALL(__NR_futex_waitv, sys_futex_waitv) #define __NR_set_mempolicy_home_node 450 __SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node) - #define __NR_cachestat 451 __SYSCALL(__NR_cachestat, sys_cachestat) +#define __NR_futex_wake 452 +__SYSCALL(__NR_futex_wake, sys_futex_wake) #undef __NR_syscalls -#define __NR_syscalls 452 +#define __NR_syscalls 453 /* * 32 bit systems traditionally used different --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -309,6 +309,43 @@ SYSCALL_DEFINE5(futex_waitv, struct fute return ret; } +/* + * sys_futex_wake - Wake a number of futexes + * @uaddr: Address of the futex(es) to wake + * @nr: Number of the futexes to wake + * @flags: FUTEX2 flags + * @mask: bitmask + * + * Identical to the traditional FUTEX_WAKE_BITSET op, except it matches futex_waitv() above + * in that it enables u64 futex values and has a new flags set. + * + * NOTE: u64 futexes are not actually supported yet, but both these interfaces + * should allow for this to happen. + */ + +SYSCALL_DEFINE4(futex_wake, + void __user *, uaddr, + int, nr, + unsigned int, flags, + u64, mask) +{ + int bits; + + if (flags & ~FUTEX2_MASK) + return -EINVAL; + + if ((flags & FUTEX2_64) != FUTEX2_32) + return -EINVAL; + + flags = futex2_to_flags(flags); + bits = 8 * futex_size(flags); + + if (bits < 64 && mask >> bits) + return -EINVAL; + + return futex_wake(uaddr, flags, nr, mask); +} + #ifdef CONFIG_COMPAT COMPAT_SYSCALL_DEFINE2(set_robust_list, struct compat_robust_list_head __user *, head, --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -87,6 +87,7 @@ COND_SYSCALL_COMPAT(set_robust_list); COND_SYSCALL(get_robust_list); COND_SYSCALL_COMPAT(get_robust_list); COND_SYSCALL(futex_waitv); +COND_SYSCALL(futex_wake); COND_SYSCALL(kexec_load); COND_SYSCALL_COMPAT(kexec_load); COND_SYSCALL(init_module); From patchwork Fri Jul 14 13:39:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120500 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537036vqm; Fri, 14 Jul 2023 07:19:25 -0700 (PDT) X-Google-Smtp-Source: APBJJlFGy82r1XlfwdOYDSONCFxId46RKSCw7AYptVzCt4F+WiOBU9sGtr95+9PlDbPuZBRUqt8y X-Received: by 2002:aa7:8894:0:b0:682:4edf:b9c7 with SMTP id z20-20020aa78894000000b006824edfb9c7mr6577141pfe.2.1689344364950; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344364; cv=none; d=google.com; s=arc-20160816; b=C06QxtG9mjuiZbo60X/xQ6rOi2UkzzEBtS4SadltinfDl+ImGUK8H8mGQGF9ToDB38 iEYWU/cg5gLu7nydXfv+F61ENCDrJwYEfNODAWrBGVamz1oysy0ZdJTk/9U52fAo8rzM zHbncDl0btGmZIz4WU+38nG5fDKv3YsZSOo0oegz+Qf5fJrOu9ZmnPgtPl0IssOgJP5i 92U6eRSQstKhUbuXJIHruJNSWNRtJej5U2kry+dTunBcOh0EetgQIzEdWzEGZy5wYCvR MXKYNDELxLRf8pN/Tj5kCMAC/HIThhQWt6R66MdvVb35dZwoH8AN9xBBb36gtKQoNq5Z 4tlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=vd7IZ5Q9sG2aEX5C+B5mpNsAgNCXrsR4bE5i4Du1qnc=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=D+DmeQhJcuJ0zVFYAQGnTeDJqkgC2JybaPBBtVCDs5/6dt82d9NS5f6iSCP8iccIHk L78GjTm+NYIXznmJH9jNa/evNUrpgPwAqBZ8xVl+FUicz3STUyEgeYY3rLAcI1tjV9lI JU6zjg5YuZon0WJsDgWogD94EgyyYL+vKzL0DRjT2Ca5Ms9lpg9jan+8kX0IvaFeAsH5 vle+Tz9yyepokGngHF6P9J55II0gJxed2zn8FYPM9/AheqIyD9OVWMB//OKz13waLjvh HZpwRNZU9BrqTQ4qkgeyYvXkFDKfdH4+K7hEHkI4/kJVdXehFjOp/vWfYcp7hR1qf8an 1KEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=X9gijMCm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a16-20020a056a001d1000b0067b51fca490si7039736pfx.248.2023.07.14.07.19.05; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=X9gijMCm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235463AbjGNORA (ORCPT + 99 others); Fri, 14 Jul 2023 10:17:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235719AbjGNOQn (ORCPT ); Fri, 14 Jul 2023 10:16:43 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BAF71989; Fri, 14 Jul 2023 07:16:42 -0700 (PDT) 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=vd7IZ5Q9sG2aEX5C+B5mpNsAgNCXrsR4bE5i4Du1qnc=; b=X9gijMCmfaPrSsayyWL0NuHiOe pGOhwRRTPBsZ40IXNFRORyzItcRWv4X+M3D/uQhswBiY0asbLlff6VJbJ0JHPEZfFMXjzmVs0I3h2 zIKqL8xHXO1+pjyWMBoxtpmq/8rxGe7cTHGeZ59jD2gdh/RhQ1gSNvuGbpNqbMkv4kEbOqjxxt/Bk BXDNnfyaPMAZRHuxBHH6Wfgfjrb5LqQ6zKpgZIsXsl9TYZBQrbC9LXYFJBv8YGZQfOAumvP+LAfQH DKKaLDkbVrzm/PSaPiAwV1U7mLa+G0455XJv/+IXRtYsqpaPxRb6KOlKfb+F71dSxkGZZpqg+7ydQ MafKW0bA==; 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-006Iiz-2D; 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 B2786300C88; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 72FA0213728B8; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141218.947137012@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:04 +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 05/10] mm: Add vmalloc_huge_node() References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405956884784894 X-GMAIL-MSGID: 1771405956884784894 To enable node specific hash-tables. Signed-off-by: Peter Zijlstra (Intel) --- include/linux/vmalloc.h | 1 + mm/vmalloc.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -152,6 +152,7 @@ extern void *__vmalloc_node_range(unsign void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, int node, const void *caller) __alloc_size(1); void *vmalloc_huge(unsigned long size, gfp_t gfp_mask) __alloc_size(1); +void *vmalloc_huge_node(unsigned long size, gfp_t gfp_mask, int node) __alloc_size(1); extern void *__vmalloc_array(size_t n, size_t size, gfp_t flags) __alloc_size(1, 2); extern void *vmalloc_array(size_t n, size_t size) __alloc_size(1, 2); --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3416,6 +3416,13 @@ void *vmalloc(unsigned long size) } EXPORT_SYMBOL(vmalloc); +void *vmalloc_huge_node(unsigned long size, gfp_t gfp_mask, int node) +{ + return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, + node, __builtin_return_address(0)); +} + /** * vmalloc_huge - allocate virtually contiguous memory, allow huge pages * @size: allocation size @@ -3430,9 +3437,7 @@ EXPORT_SYMBOL(vmalloc); */ void *vmalloc_huge(unsigned long size, gfp_t gfp_mask) { - return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, - gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, - NUMA_NO_NODE, __builtin_return_address(0)); + return vmalloc_huge_node(size, gfp_mask, NUMA_NO_NODE); } EXPORT_SYMBOL_GPL(vmalloc_huge); From patchwork Fri Jul 14 13:39:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120497 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2536961vqm; Fri, 14 Jul 2023 07:19:20 -0700 (PDT) X-Google-Smtp-Source: APBJJlHr2HcRwTNCASoFoKqWSX9jb5ln/deXtZLR8QsgWS+NPoCkhGk7qxYDSkbeaVHOU7zXpMd2 X-Received: by 2002:a17:90a:db87:b0:263:6ccd:38b5 with SMTP id h7-20020a17090adb8700b002636ccd38b5mr3273901pjv.1.1689344360185; Fri, 14 Jul 2023 07:19:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344360; cv=none; d=google.com; s=arc-20160816; b=dUL7Tm48YtDgnGXj64EM/YgvdcNbRjOkGPzawmGwD46Nu8VnVtFrHwpT2Y4tvidINE Fs0rWNkA+6Dd0BhgmUfgpLEuuZWA0uN2/Fnw3imwZSS1h0QWBxsyT85LsqPtVFZAaqtC Us+d9TYOD1tDlKjQ9n3oS+8/spMYzhmHoPkSBrqrQvE6IDd62sbzHQTWnd/oPgMw6RTz lczjZBMNL3HspfFlNNZ9IKoAX4Pcc6xXhBTr7Oj0SvXC+QRPird1rVRx/QtK/s5irpoh OpJv5f5luIXIUcX4T8DD5WyPVgJ3jjyTHsYmLZqX4JOq7vefOuf/t+CPw+TffEyIjciW e/iw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=gMJRupFzL+218xO81Os5o1A1M02NMRGWkhUhH51/Eio=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=ahUVulvSgsAoiV0rtWqipzlSxepgDkBmYTwnF2DHn6tFjnyAz3AchdoY3v5QEfvJf0 D7WTKTZ7yUyxFZdlj6sTxSX7REnea0clSbhUWv4hr9GbmG0+2DLQHJMF0uDm5Ng5ZLVh hJKtTlx0zhu4VtCrLxjBxV8vocrOsD5rT9xcI6MxPt6oGoPlxe4jxoDVvxrUZMfqwE54 ihiXV25c33gLUe1Rx2Rk27LV8fxMM5ljdaSfn1Qog4+u6EtuqMB7mnYBT3tlOIjCL7l7 QTRHYPLmJymof36NMw1k8X+i6GRjk7gg5v0PFrCQP7n0jjzjuS/CQsfCma7L78GxK8XB hjWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=nSMf8b1r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i9-20020a17090acf8900b002507cbb009bsi1321253pju.112.2023.07.14.07.18.43; Fri, 14 Jul 2023 07:19:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=nSMf8b1r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235958AbjGNOQp (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235709AbjGNOQg (ORCPT ); Fri, 14 Jul 2023 10:16:36 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 255052D51; Fri, 14 Jul 2023 07:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=gMJRupFzL+218xO81Os5o1A1M02NMRGWkhUhH51/Eio=; b=nSMf8b1rDj20p7163tEl4RgaYw DSLe3ZSkxQr+7VY+r4TGNHy4IKVGgxGwlAnaBfZ1PYxgc+9BuGU4lppaUgLKt/OlT2VI9vmL+gtik RUUId1CkI+N7mJbbIBxkpyuDGdUa5aVpvS+Yc8iRIksH5FyqowxzwctWZ66ifZj4zpcRzxA1JwJLi xF0TcSWW2JGAR7aiFXIAyNyG7gAGrNLXJTPzDH9o8S5WGUPpfdHzDOaRFWdzQrzyqvi/yLQh8bPzw J3JoHmSbBfv75wEYSpd5GgPHirR718Rgz4S1L/+YVHpWN8Rfzc7tvdreKeoz9KiQE8w+Veqj80xY5 hVMxyKYA==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1qKJah-0016z7-Me; Fri, 14 Jul 2023 14:16:15 +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 B37713014BF; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 79A14213728BA; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141219.014386004@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:05 +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 06/10] futex: Propagate flags into get_futex_key() References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405951859589188 X-GMAIL-MSGID: 1771405951859589188 Instead of only passing FLAGS_SHARED as a boolean, pass down flags as a whole. Signed-off-by: Peter Zijlstra (Intel) --- kernel/futex/core.c | 5 ++++- kernel/futex/futex.h | 2 +- kernel/futex/pi.c | 4 ++-- kernel/futex/requeue.c | 6 +++--- kernel/futex/waitwake.c | 15 ++++++++------- 5 files changed, 18 insertions(+), 14 deletions(-) --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -217,7 +217,7 @@ static u64 get_inode_sequence_number(str * * lock_page() might sleep, the caller should not hold a spinlock. */ -int get_futex_key(u32 __user *uaddr, bool fshared, union futex_key *key, +int get_futex_key(u32 __user *uaddr, unsigned int flags, union futex_key *key, enum futex_access rw) { unsigned long address = (unsigned long)uaddr; @@ -225,6 +225,9 @@ int get_futex_key(u32 __user *uaddr, boo struct page *page, *tail; struct address_space *mapping; int err, ro = 0; + bool fshared; + + fshared = flags & FLAGS_SHARED; /* * The futex address must be "naturally" aligned. --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -158,7 +158,7 @@ enum futex_access { FUTEX_WRITE }; -extern int get_futex_key(u32 __user *uaddr, bool fshared, union futex_key *key, +extern int get_futex_key(u32 __user *uaddr, unsigned int flags, union futex_key *key, enum futex_access rw); extern struct hrtimer_sleeper * --- a/kernel/futex/pi.c +++ b/kernel/futex/pi.c @@ -945,7 +945,7 @@ int futex_lock_pi(u32 __user *uaddr, uns to = futex_setup_timer(time, &timeout, flags, 0); retry: - ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, FUTEX_WRITE); + ret = get_futex_key(uaddr, flags, &q.key, FUTEX_WRITE); if (unlikely(ret != 0)) goto out; @@ -1117,7 +1117,7 @@ int futex_unlock_pi(u32 __user *uaddr, u if ((uval & FUTEX_TID_MASK) != vpid) return -EPERM; - ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, FUTEX_WRITE); + ret = get_futex_key(uaddr, flags, &key, FUTEX_WRITE); if (ret) return ret; --- a/kernel/futex/requeue.c +++ b/kernel/futex/requeue.c @@ -424,10 +424,10 @@ int futex_requeue(u32 __user *uaddr1, un } retry: - ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, FUTEX_READ); + ret = get_futex_key(uaddr1, flags, &key1, FUTEX_READ); if (unlikely(ret != 0)) return ret; - ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, + ret = get_futex_key(uaddr2, flags, &key2, requeue_pi ? FUTEX_WRITE : FUTEX_READ); if (unlikely(ret != 0)) return ret; @@ -789,7 +789,7 @@ int futex_wait_requeue_pi(u32 __user *ua */ rt_mutex_init_waiter(&rt_waiter); - ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); + ret = get_futex_key(uaddr2, flags, &key2, FUTEX_WRITE); if (unlikely(ret != 0)) goto out; --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -145,13 +145,13 @@ int futex_wake(u32 __user *uaddr, unsign struct futex_hash_bucket *hb; struct futex_q *this, *next; union futex_key key = FUTEX_KEY_INIT; - int ret; DEFINE_WAKE_Q(wake_q); + int ret; if (!bitset) return -EINVAL; - ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, FUTEX_READ); + ret = get_futex_key(uaddr, flags, &key, FUTEX_READ); if (unlikely(ret != 0)) return ret; @@ -245,10 +245,10 @@ int futex_wake_op(u32 __user *uaddr1, un DEFINE_WAKE_Q(wake_q); retry: - ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, FUTEX_READ); + ret = get_futex_key(uaddr1, flags, &key1, FUTEX_READ); if (unlikely(ret != 0)) return ret; - ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); + ret = get_futex_key(uaddr2, flags, &key2, FUTEX_WRITE); if (unlikely(ret != 0)) return ret; @@ -423,7 +423,7 @@ static int futex_wait_multiple_setup(str continue; ret = get_futex_key(u64_to_user_ptr(vs[i].w.uaddr), - vs[i].w.flags & FLAGS_SHARED, + vs[i].w.flags, &vs[i].q.key, FUTEX_READ); if (unlikely(ret)) @@ -435,7 +435,8 @@ static int futex_wait_multiple_setup(str for (i = 0; i < count; i++) { u32 __user *uaddr = (u32 __user *)(unsigned long)vs[i].w.uaddr; struct futex_q *q = &vs[i].q; - u32 val = (u32)vs[i].w.val; + unsigned int flags = vs[i].w.flags; + u32 val = vs[i].w.val; hb = futex_q_lock(q); ret = futex_get_value_locked(&uval, uaddr); @@ -599,7 +600,7 @@ int futex_wait_setup(u32 __user *uaddr, * while the syscall executes. */ retry: - ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key, FUTEX_READ); + ret = get_futex_key(uaddr, flags, &q->key, FUTEX_READ); if (unlikely(ret != 0)) return ret; From patchwork Fri Jul 14 13:39:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120504 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537136vqm; Fri, 14 Jul 2023 07:19:35 -0700 (PDT) X-Google-Smtp-Source: APBJJlE93Hp+XUr4xBInJHESMhJJdFcbu/DkLp6XPDCBU0KhJM+NS7kMctPOfScGdhUUyH/EJrbh X-Received: by 2002:a17:90a:e514:b0:262:ecb6:23e8 with SMTP id t20-20020a17090ae51400b00262ecb623e8mr2986418pjy.39.1689344374820; Fri, 14 Jul 2023 07:19:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344374; cv=none; d=google.com; s=arc-20160816; b=Oc5+mWW2+LFlG5I5ZcXcSkXTaqUzenc1nSvnkfPVzIvJ3nGNQk8RSo08P/RAqjKvfI 78Bnum3YgbmOj9QzSed3SCfQTctrqUzubRGsJWLxuBDr2mEesrrTgsmkIlHKf+UjD3/w WHyIPlJLaTYMcjsUIm524h7PZ/SD/xApI7D360N1UusG34TU/g8zsSfGwGVYIE0mFbTs zEG9rNZM9v0knIzeQsDv6Z1xKfaKUagcJOTN7XE2wtRPxObNs3c3E0PHNi8P10jkz/e5 vuUS+kqlLI/yo+g7VwtifHgdXXYF+k0tTKj4FPRyn8j+WUmj6a+0uRBjDfd5+YES3UTA zs0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=LKkIc+bVFvx2M3BQiNOMB5u+Bv/zv5TptYfDZLCVMJs=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=ATZibnPuyXDN0pdXOyX4VIpZW3gxvKNaFRC0ErnalVJuzJxKt1ceAa/FrqGyP+88yB tQZemHKigWbWQtxo88TzKwNaneK7pvXaWcMZW5uenK0MZtKNAJ+PhuFFe6mC2dQfHYgV spAwUEqdi8YKtTUmamKMhTSpebewJ/TbyKyIiNMUHuT/yeG5wm3uvUuKZWnJScR7eGiK B4C0ofwEdy4Z/T7f0nn/15RsxywJSIEuGVoLFn3CYRmf5gdeBnlvwmzQohiD44W/HSa7 uesswSKu9WmxEP5sztI7sF7tAunkyuJi/yrU8SbAK1NlpEINi5r8jFqCBNdMJUrpqwZE 2tzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=YACvjEyF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p5-20020a17090adf8500b00260e4b41b3csi1284894pjv.68.2023.07.14.07.19.22; Fri, 14 Jul 2023 07:19:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=YACvjEyF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235749AbjGNORD (ORCPT + 99 others); Fri, 14 Jul 2023 10:17:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33358 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235949AbjGNOQp (ORCPT ); Fri, 14 Jul 2023 10:16:45 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D54A7358E; Fri, 14 Jul 2023 07:16:42 -0700 (PDT) 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=LKkIc+bVFvx2M3BQiNOMB5u+Bv/zv5TptYfDZLCVMJs=; b=YACvjEyFpBHjZfWdUxJnifglSz ea+gxPw67sni1nYRSulmOd5Io1CTpN5nFemshxus7UujKs08hppNBahXzwhDQBRYKGXQLVfwzl+Ql xZsBFlng7IRFd1Vqa9MBl6kY8VJ+WIgAfMJ4dfRSUFbEZ8PnRpbkRlNyf92y5CEP8RGHyf9Z2cgEp BL1VegIdxBf93+2hNYgYqzhCf0ICdxo22/fYjcrn+pWw9zm2xQw0NSo6pPa19tMBuzgWnnAYCKcoP jcIeQ2RhDbyNm0k85zyrS8tIY7ZZAD4DttNbjAC+2ns4jOUY1zl13S2SQPfb06ejazyJtE1tnOemz gS1wCzbA==; 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-006Iiy-2I; 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 B27623001E7; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 7E6BB213728BB; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141219.081639007@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:06 +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 07/10] futex: Implement FUTEX2_NUMA References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405967625697583 X-GMAIL-MSGID: 1771405967625697583 Extend the futex2 interface to be numa aware. When FUTEX2_NUMA is specified for a futex, the user value is extended to two words (of the same size). The first is the user value we all know, the second one will be the node to place this futex on. struct futex_numa_32 { u32 val; u32 node; }; When node is set to ~0, WAIT will set it to the current node_id such that WAKE knows where to find it. If userspace corrupts the node value between WAIT and WAKE, the futex will not be found and no wakeup will happen. When FUTEX2_NUMA is not set, the node is simply an extention of the hash, such that traditional futexes are still interleaved over the nodes. This is done to avoid having to have a separate !numa hash-table. Signed-off-by: Peter Zijlstra (Intel) --- include/linux/futex.h | 3 + kernel/futex/core.c | 125 +++++++++++++++++++++++++++++++++++++++--------- kernel/futex/futex.h | 2 kernel/futex/syscalls.c | 2 4 files changed, 107 insertions(+), 25 deletions(-) --- a/include/linux/futex.h +++ b/include/linux/futex.h @@ -34,6 +34,7 @@ union futex_key { u64 i_seq; unsigned long pgoff; unsigned int offset; + /* unsigned int node; */ } shared; struct { union { @@ -42,11 +43,13 @@ union futex_key { }; unsigned long address; unsigned int offset; + /* unsigned int node; */ } private; struct { u64 ptr; unsigned long word; unsigned int offset; + unsigned int node; /* NOT hashed! */ } both; }; --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -47,12 +47,14 @@ * reside in the same cacheline. */ static struct { - struct futex_hash_bucket *queues; unsigned long hashsize; + unsigned int hashshift; + struct futex_hash_bucket *queues[MAX_NUMNODES]; } __futex_data __read_mostly __aligned(2*sizeof(long)); -#define futex_queues (__futex_data.queues) -#define futex_hashsize (__futex_data.hashsize) +#define futex_hashsize (__futex_data.hashsize) +#define futex_hashshift (__futex_data.hashshift) +#define futex_queues (__futex_data.queues) /* * Fault injections for futexes. @@ -105,6 +107,26 @@ late_initcall(fail_futex_debugfs); #endif /* CONFIG_FAIL_FUTEX */ +static int futex_get_value(u32 *val, u32 __user *from, unsigned int flags) +{ + switch (futex_size(flags)) { + case 1: return __get_user(*val, (u8 __user *)from); + case 2: return __get_user(*val, (u16 __user *)from); + case 4: return __get_user(*val, (u32 __user *)from); + default: BUG(); + } +} + +static int futex_put_value(u32 val, u32 __user *to, unsigned int flags) +{ + switch (futex_size(flags)) { + case 1: return __put_user(val, (u8 __user *)to); + case 2: return __put_user(val, (u16 __user *)to); + case 4: return __put_user(val, (u32 __user *)to); + default: BUG(); + } +} + /** * futex_hash - Return the hash bucket in the global hash * @key: Pointer to the futex key for which the hash is calculated @@ -114,10 +136,20 @@ late_initcall(fail_futex_debugfs); */ struct futex_hash_bucket *futex_hash(union futex_key *key) { - u32 hash = jhash2((u32 *)key, offsetof(typeof(*key), both.offset) / 4, + u32 hash = jhash2((u32 *)key, + offsetof(typeof(*key), both.offset) / sizeof(u32), key->both.offset); + int node = key->both.node; + + if (node == -1) { + /* + * In case of !FLAGS_NUMA, use some unused hash bits to pick a + * node. + */ + node = (hash >> futex_hashshift) % num_possible_nodes(); + } - return &futex_queues[hash & (futex_hashsize - 1)]; + return &futex_queues[node][hash & (futex_hashsize - 1)]; } @@ -217,32 +249,64 @@ static u64 get_inode_sequence_number(str * * lock_page() might sleep, the caller should not hold a spinlock. */ -int get_futex_key(u32 __user *uaddr, unsigned int flags, union futex_key *key, +int get_futex_key(void __user *uaddr, unsigned int flags, union futex_key *key, enum futex_access rw) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; struct page *page, *tail; struct address_space *mapping; - int err, ro = 0; + int node, err, size, ro = 0; bool fshared; fshared = flags & FLAGS_SHARED; + size = futex_size(flags); /* * The futex address must be "naturally" aligned. */ key->both.offset = address % PAGE_SIZE; - if (unlikely((address % sizeof(u32)) != 0)) + if (unlikely((address % size) != 0)) return -EINVAL; address -= key->both.offset; - if (unlikely(!access_ok(uaddr, sizeof(u32)))) + if (flags & FLAGS_NUMA) + size *= 2; + + if (unlikely(!access_ok(uaddr, size))) return -EFAULT; if (unlikely(should_fail_futex(fshared))) return -EFAULT; + key->both.node = -1; + if (flags & FLAGS_NUMA) { + void __user *naddr = uaddr + size/2; + + if (futex_get_value(&node, naddr, flags)) + return -EFAULT; + + if (node == -1) { + node = numa_node_id(); + if (futex_put_value(node, naddr, flags)) + return -EFAULT; + } + + if (node >= num_possible_nodes()) + return -EINVAL; + + key->both.node = node; + } + + /* + * Encode the futex size in the offset. This makes cross-size + * wake-wait fail -- see futex_match(). + * + * NOTE that cross-size wake-wait is fundamentally broken wrt + * FLAGS_NUMA but could possibly work for !NUMA. + */ + key->both.offset |= FUT_OFF_SIZE * (flags & FLAGS_SIZE_MASK); + /* * PROCESS_PRIVATE futexes are fast. * As the mm cannot disappear under us and the 'key' only needs @@ -1125,27 +1189,42 @@ void futex_exit_release(struct task_stru static int __init futex_init(void) { - unsigned int futex_shift; - unsigned long i; + unsigned int order, n; + unsigned long size, i; #if CONFIG_BASE_SMALL futex_hashsize = 16; #else - futex_hashsize = roundup_pow_of_two(256 * num_possible_cpus()); + futex_hashsize = 256 * num_possible_cpus(); + futex_hashsize /= num_possible_nodes(); + futex_hashsize = roundup_pow_of_two(futex_hashsize); #endif + futex_hashshift = ilog2(futex_hashsize); + size = sizeof(struct futex_hash_bucket) * futex_hashsize; + order = get_order(size); + + for_each_node(n) { + struct futex_hash_bucket *table; + + if (order > MAX_ORDER) + table = vmalloc_huge_node(size, GFP_KERNEL, n); + else + table = alloc_pages_exact_nid(n, size, GFP_KERNEL); + + BUG_ON(!table); + + for (i = 0; i < futex_hashsize; i++) { + atomic_set(&table[i].waiters, 0); + spin_lock_init(&table[i].lock); + plist_head_init(&table[i].chain); + } - futex_queues = alloc_large_system_hash("futex", sizeof(*futex_queues), - futex_hashsize, 0, - futex_hashsize < 256 ? HASH_SMALL : 0, - &futex_shift, NULL, - futex_hashsize, futex_hashsize); - futex_hashsize = 1UL << futex_shift; - - for (i = 0; i < futex_hashsize; i++) { - atomic_set(&futex_queues[i].waiters, 0); - plist_head_init(&futex_queues[i].chain); - spin_lock_init(&futex_queues[i].lock); + futex_queues[n] = table; } + pr_info("futex hash table, %d nodes, %ld entries (order: %d, %lu bytes)\n", + num_possible_nodes(), + futex_hashsize, order, + sizeof(struct futex_hash_bucket) * futex_hashsize); return 0; } --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -158,7 +158,7 @@ enum futex_access { FUTEX_WRITE }; -extern int get_futex_key(u32 __user *uaddr, unsigned int flags, union futex_key *key, +extern int get_futex_key(void __user *uaddr, unsigned int flags, union futex_key *key, enum futex_access rw); extern struct hrtimer_sleeper * --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -180,7 +180,7 @@ SYSCALL_DEFINE6(futex, u32 __user *, uad return do_futex(uaddr, op, val, tp, uaddr2, (unsigned long)utime, val3); } -#define FUTEX2_MASK (FUTEX2_64 | FUTEX2_PRIVATE) +#define FUTEX2_MASK (FUTEX2_64 | FUTEX2_NUMA | FUTEX2_PRIVATE) /** * futex_parse_waitv - Parse a waitv array from userspace From patchwork Fri Jul 14 13:39:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120498 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537024vqm; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) X-Google-Smtp-Source: APBJJlE54xYiRNa8umT7bTWcCuvE0bG3M3J4qU3Gq76pDFT0400R2IYau3Ak4QbdC9r4GmeHr/Ju X-Received: by 2002:a17:902:ced2:b0:1b8:76cb:c6a4 with SMTP id d18-20020a170902ced200b001b876cbc6a4mr4123869plg.21.1689344364303; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344364; cv=none; d=google.com; s=arc-20160816; b=Jo7efk0zAT/vSWnCd6y+z941IfKPp+GB0XZplRtnrILz8goLl9t4yroJWc05GEtD25 gfpKmu4LfsEP7vHZmS/CRNJ6ZiE6CZNjuYBamoI1zI5TMGVkDzqHJ7vu+b2l/mt8OQFo +M7Nc/dwTtuMac59Nzux6EDmm/cfOTdNWFddMwdRx6yKzkk5irx/TrLjLaHLy9zfflT2 wtGGbH/CylFoRgjVhAJqCuDIGNbzsheh3+X/3aCfl3dGsmK1ZbWWWAoi+jmX4Z7HQZ54 VfS8np2xPNK0dsyMAIY+IiWeNBla57Sh7/78CZoYsik1WJNV+wNJPSoLoyztisp7wbNB nblQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=YZtbZT4V1GJ1CVh10G4kmmhbwertk2B4UiVE4SdkC2M=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=s2lUfsY7cvvxl3wGhBPtKYsHa+cjJEdfNkVjAqyeqgklQT86zRgQo0oWjOSDPtwGXP NviFU+r3hYG7Y2fdN0Ns4A0+2dHm5OV77+kmqnExq4qVWOokxsznbP6qf5scuS6XtM5q xQ3kbLA/zbz+2vH/lkKqpx+/DRWXa/c84lV8j8djLlwGKQb0GcLTrUath1lI9o0SCfq6 5hg+01EzT6/gCw7TED33GwT1/CBRVOFlKmDC8NhW/RW6XJPTyhrm+HS0UjVVixJIQbsT Ae0+TDOOovBrzShIBNIq99Zjuc3LYBERIRvr+vTARAUffTnpS2khEhEa4E7mp8AMJ5em ww4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=cOl8XfYm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l129-20020a633e87000000b00543e355adb5si6995699pga.294.2023.07.14.07.18.49; Fri, 14 Jul 2023 07:19:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=cOl8XfYm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235990AbjGNOQs (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33252 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235798AbjGNOQh (ORCPT ); Fri, 14 Jul 2023 10:16:37 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C40E012E; Fri, 14 Jul 2023 07:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=YZtbZT4V1GJ1CVh10G4kmmhbwertk2B4UiVE4SdkC2M=; b=cOl8XfYmCU/a0b/BBC7Nn/k0cT jBGUjXr8YbhcZHuC4EI7XNNB/CSbBBJrMRHM1uNNOcQI8p4hKMQuy/VnTzEcSLjV/fzlbhknFLYoC dyWPMzFBFHM0hllwEVXnC3zMrQpN8LeZu3QtawgherNAdSWLu/Us8LNZDlNosZz82Qv/54HfQqNRR IjvdglEd/PN8ktcC2J5/z4X0KzDvGesqRa/Bq9pZEWVw2PbspvLbdwCABlamLxGYvQxbmNJap4jHU Fkt/rlPiR+riomGl78Bo/4NsC2PJtU1xj+JL23YTLLHaFPgeNfUblbA1Oz7pZCRr3CKgStl1nHf3k LRhUC0Eg==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1qKJah-0016z6-M2; Fri, 14 Jul 2023 14:16:15 +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 B280030114F; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 82B8B244088B0; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141219.148373175@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:07 +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 08/10] futex: Propagate flags into futex_get_value_locked() References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405956266613322 X-GMAIL-MSGID: 1771405956266613322 In order to facilitate variable sized futexes propagate the flags into futex_get_value_locked(). Signed-off-by: Peter Zijlstra (Intel) --- kernel/futex/core.c | 4 ++-- kernel/futex/futex.h | 2 +- kernel/futex/pi.c | 8 ++++---- kernel/futex/requeue.c | 4 ++-- kernel/futex/waitwake.c | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -506,12 +506,12 @@ int futex_cmpxchg_value_locked(u32 *curv return ret; } -int futex_get_value_locked(u32 *dest, u32 __user *from) +int futex_get_value_locked(u32 *dest, u32 __user *from, unsigned int flags) { int ret; pagefault_disable(); - ret = __get_user(*dest, from); + ret = futex_get_value(dest, from, flags); pagefault_enable(); return ret ? -EFAULT : 0; --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -190,7 +190,7 @@ extern void futex_wake_mark(struct wake_ extern int fault_in_user_writeable(u32 __user *uaddr); extern int futex_cmpxchg_value_locked(u32 *curval, u32 __user *uaddr, u32 uval, u32 newval); -extern int futex_get_value_locked(u32 *dest, u32 __user *from); +extern int futex_get_value_locked(u32 *dest, u32 __user *from, unsigned int flags); extern struct futex_q *futex_top_waiter(struct futex_hash_bucket *hb, union futex_key *key); extern void __futex_unqueue(struct futex_q *q); --- a/kernel/futex/pi.c +++ b/kernel/futex/pi.c @@ -239,7 +239,7 @@ static int attach_to_pi_state(u32 __user * still is what we expect it to be, otherwise retry the entire * operation. */ - if (futex_get_value_locked(&uval2, uaddr)) + if (futex_get_value_locked(&uval2, uaddr, FLAGS_SIZE_32)) goto out_efault; if (uval != uval2) @@ -358,7 +358,7 @@ static int handle_exit_race(u32 __user * * The same logic applies to the case where the exiting task is * already gone. */ - if (futex_get_value_locked(&uval2, uaddr)) + if (futex_get_value_locked(&uval2, uaddr, FLAGS_SIZE_32)) return -EFAULT; /* If the user space value has changed, try again. */ @@ -526,7 +526,7 @@ int futex_lock_pi_atomic(u32 __user *uad * Read the user space value first so we can validate a few * things before proceeding further. */ - if (futex_get_value_locked(&uval, uaddr)) + if (futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32)) return -EFAULT; if (unlikely(should_fail_futex(true))) @@ -762,7 +762,7 @@ static int __fixup_pi_state_owner(u32 __ if (!pi_state->owner) newtid |= FUTEX_OWNER_DIED; - err = futex_get_value_locked(&uval, uaddr); + err = futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32); if (err) goto handle_err; --- a/kernel/futex/requeue.c +++ b/kernel/futex/requeue.c @@ -273,7 +273,7 @@ futex_proxy_trylock_atomic(u32 __user *p u32 curval; int ret; - if (futex_get_value_locked(&curval, pifutex)) + if (futex_get_value_locked(&curval, pifutex, FLAGS_SIZE_32)) return -EFAULT; if (unlikely(should_fail_futex(true))) @@ -449,7 +449,7 @@ int futex_requeue(u32 __user *uaddr1, un if (likely(cmpval != NULL)) { u32 curval; - ret = futex_get_value_locked(&curval, uaddr1); + ret = futex_get_value_locked(&curval, uaddr1, FLAGS_SIZE_32); if (unlikely(ret)) { double_unlock_hb(hb1, hb2); --- 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); + ret = futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32); 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); + ret = futex_get_value_locked(&uval, uaddr, FLAGS_SIZE_32); if (ret) { futex_q_unlock(*hb); 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: 120505 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2537209vqm; Fri, 14 Jul 2023 07:19:41 -0700 (PDT) X-Google-Smtp-Source: APBJJlEiNWN4FO0/pikV6ggKQ0muSLF6wR/XRVufpMZeF03UqrCdvb0hpN+zAIblsuggig47ex6O X-Received: by 2002:a17:903:1109:b0:1b8:560a:aa16 with SMTP id n9-20020a170903110900b001b8560aaa16mr5606221plh.10.1689344381104; Fri, 14 Jul 2023 07:19:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344381; cv=none; d=google.com; s=arc-20160816; b=ilfV7qVjQ1UR31EhvpaT/t+vdHSqvYm5lKPCxZ9eOdGuKHG2zyjYMmzm3Axwl6bSzd IgbwDRqoplae8Jio8XepwAlmcYzaUtWgTphzAh4N/s5t9tNe2jApu4wB8EdPdyiU+r57 bBapNUd/P9oTpE/BeCDUtoeAjQ05SwzKnppBeqEcMF2+uR11LDho7DXn5AAr0BBnQXQ2 OUSv8O8XeILwKGq5Rh+EtoKYLM+xIz+uZEP9odPqAuW4yxTqI5YZP9/78PSL98rmNIJr jx02c7UeOC0pZNhtLmpa7QtbkbTZfgk+2Iizgk8EpPPIZLUBdJHo9wrC/BE8yirXYV7i erJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=50j8lu0fq8DZ70IkYc8oVFT5B2TMdBpxV7U6GuBpl7Q=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=x/iJ8M5xYWwR67Rmmtj91kcf168aG4P3m+Sz8dKF+pkeY/FNl/spCEYhH2IgXxV8dC swcaedZ2awh3UJA4246tMvdXpLvItrLcK7JtnHsDwEfyBN92Bl9arjqpqrHmOXu59Y+2 IMrqR8M6cQIJdbUr02f9avCgHGqlk38PKDbeMJxNLEiksOTrnUygBdpUMRQOWuJ+Crn3 UZXvRUKzYbQlaACUQbmBQ/JY6ABT9eWOFGgrOiEg90Tf4avXLoelcn2Att2UA3Ge29Su KJlHpDX2nmyh28DARPqeOjudMzTiNylPog3cmti0dFUfXPcwiB7tIa5FOB/a4HE3IpOL gFIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=RAyQOPIK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ik7-20020a170902ab0700b001b9eb349549si6843940plb.630.2023.07.14.07.19.26; Fri, 14 Jul 2023 07:19:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=RAyQOPIK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235949AbjGNORI (ORCPT + 99 others); Fri, 14 Jul 2023 10:17:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235957AbjGNOQp (ORCPT ); Fri, 14 Jul 2023 10:16:45 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BC7230C8; Fri, 14 Jul 2023 07:16:42 -0700 (PDT) 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-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771405973814355622 X-GMAIL-MSGID: 1771405973814355622 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); From patchwork Fri Jul 14 13:39:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 120508 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2541400vqm; Fri, 14 Jul 2023 07:27:03 -0700 (PDT) X-Google-Smtp-Source: APBJJlGCYD5UQkfDRzIJhEvXK3dPd5MIEdqdzXKbBOoyrea/Wak9OXhCwev0h+57/hpG0JJNU4mN X-Received: by 2002:a92:c6ce:0:b0:346:46e:2099 with SMTP id v14-20020a92c6ce000000b00346046e2099mr4564629ilm.1.1689344823403; Fri, 14 Jul 2023 07:27:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689344823; cv=none; d=google.com; s=arc-20160816; b=ejEKuoEUk4SpQE4tYaG6JSeG5NNKOKM3/eqbhVF1JTHIvweHnmqzwu64m1jDKt1+ui U/DjDSo1Oh0XTbkcyzPHl5TZhti8ZJJxm3xwKyLtE/bFYhBL3dVcwhzMdBBhY7Kpq9lr Zj/DHijPbXTcV+oiolU4bv1JVEOK24vC9bxGUZbQlB0YRg+OfZWew/u70h4dR1eJBQeR xw8E5htxvW9HEQskFXRmmqJoJpzRzSh56JU9lNyM6+vN+17WAjhVkl2BLSqurypMXwQm gn+11/i5epWzD8CKnbtn/atTwOt1sAM7cJj/zqL7B6R5AjZQ4w5Nsjhkkfs16K8DLFVK LEXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature; bh=GuDJ92pMIScKKU1gBauDG1HK4VUsLXyIVGMSjzGcY4Y=; fh=EjmxZ37PYlcfWlhzAqi5wmPe8R8k7/dCt/LKb5qak3s=; b=QwJNIhn1l55ilEJmKdHcWFzRtWLyWArmQZsvt4mePPerhTdICB4igiskZ3bHSUu8iG dXjSQrHI+pjYx1LAm6xhulWJiBGvoWp+sDgjQJsWLa/3PZDG7j4mKdekE+xRVmOHSssv SIRboluPmVnRg51FpnU65B2jrznOqO+9be6kxXm7XtBB/lXRXrw7s4tTC5YcOod87uhq ZbNwMPAjc4c7ZzuTyrCYuRtdw53fOG0kb7rmXUOHTrpTCMcM99bM1h887Z8m+jfkygUB Su1dQ4lIGLtPqI895msCv9UNRXf8quG9vQmT4pCAt8XyQkbibVOTjBM2l5yQJvOZ/IDn Dksw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=vBKCfPzs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v18-20020a17090a899200b002612b8cd1dcsi1333242pjn.162.2023.07.14.07.26.49; Fri, 14 Jul 2023 07:27:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=casper.20170209 header.b=vBKCfPzs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235611AbjGNOQh (ORCPT + 99 others); Fri, 14 Jul 2023 10:16:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234555AbjGNOQf (ORCPT ); Fri, 14 Jul 2023 10:16:35 -0400 Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:8b0:10b:1236::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6852912E; Fri, 14 Jul 2023 07:16:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; 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=GuDJ92pMIScKKU1gBauDG1HK4VUsLXyIVGMSjzGcY4Y=; b=vBKCfPzsXlmZQm0fbY9sm4XN73 kHbqhYPRg24KF+nwElURpqsTJDlryKmDUOG3hRkpWvd0PhoT+M+UUAAfZagygwwYN+EQF96rxRzwh y6Ksh55FaQO2qES2eZnYAQMF0W7I/N7hS39vamjL/ghCgcLWgEwlM2yccrC8KGWmH4aRt4oV3JFNS hotzaBdyxJlbgmQPxYdyPurXiCwYhcjscrxIqsdlOamEmJ65hOEFV33r2X0xNYQURheEouIYUgXH7 LZl2gTROHDF1JASKWhc+5uERTwqfjo5eGhlgZOjCV9CM0JpWWZtTMWyghP3XtRYjLU3AJZkGy2PqC A1aFb12A==; Received: from j130084.upc-j.chello.nl ([24.132.130.84] helo=noisy.programming.kicks-ass.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1qKJah-0016z8-NN; Fri, 14 Jul 2023 14:16:15 +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 B952E301A2F; Fri, 14 Jul 2023 16:16:14 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 0) id 8BA61245EFFAB; Fri, 14 Jul 2023 16:16:13 +0200 (CEST) Message-ID: <20230714141219.282650897@infradead.org> User-Agent: quilt/0.66 Date: Fri, 14 Jul 2023 15:39:09 +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: [HACK][PATCH 10/10] futex: Munge size and numa into the legacy interface References: <20230714133859.305719029@infradead.org> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771406437724535698 X-GMAIL-MSGID: 1771406437724535698 Avert your eyes... Arguably just the NUMA thing wouldn't be too bad. Signed-off-by: Peter Zijlstra (Intel) --- include/uapi/linux/futex.h | 15 ++++++++++++--- kernel/futex/futex.h | 9 ++++++++- kernel/futex/syscalls.c | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) --- a/include/uapi/linux/futex.h +++ b/include/uapi/linux/futex.h @@ -23,9 +23,18 @@ #define FUTEX_CMP_REQUEUE_PI 12 #define FUTEX_LOCK_PI2 13 -#define FUTEX_PRIVATE_FLAG 128 -#define FUTEX_CLOCK_REALTIME 256 -#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) +#define FUTEX_PRIVATE_FLAG (1 << 7) +#define FUTEX_CLOCK_REALTIME (1 << 8) +#define FUTEX_NUMA (1 << 9) +#define FUTEX_SIZE_32 (0 << 10) /* backwards compat */ +#define FUTEX_SIZE_64 (1 << 10) +#define FUTEX_SIZE_8 (2 << 10) +#define FUTEX_SIZE_16 (3 << 10) + +#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | \ + FUTEX_CLOCK_REALTIME | \ + FUTEX_NUMA | \ + FUTEX_SIZE_16) #define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) #define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -39,7 +39,7 @@ /* FUTEX_ to FLAGS_ */ static inline unsigned int futex_to_flags(unsigned int op) { - unsigned int flags = FLAGS_SIZE_32; + unsigned int sz, flags = 0; if (!(op & FUTEX_PRIVATE_FLAG)) flags |= FLAGS_SHARED; @@ -47,6 +47,13 @@ static inline unsigned int futex_to_flag if (op & FUTEX_CLOCK_REALTIME) flags |= FLAGS_CLOCKRT; + if (op & FUTEX_NUMA) + flags |= FLAGS_NUMA; + + /* { 2,3,0,1 } -> { 0,1,2,3 } */ + sz = ((op + FUTEX_SIZE_8) & FUTEX_SIZE_16) >> 10; + flags |= sz; + return flags; } --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -95,6 +95,24 @@ long do_futex(u32 __user *uaddr, int op, return -ENOSYS; } + /* can't support u64 with a u32 based interface */ + if ((flags & FLAGS_SIZE_MASK) == FLAGS_SIZE_64) + return -ENOSYS; + + switch (cmd) { + case FUTEX_WAIT: + case FUTEX_WAIT_BITSET: + case FUTEX_WAKE: + case FUTEX_WAKE_BITSET: + /* u8, u16, u32 */ + break; + + default: + /* only u32 for now */ + if ((flags & FLAGS_SIZE_MASK) != FLAGS_SIZE_32) + return -ENOSYS; + } + switch (cmd) { case FUTEX_WAIT: val3 = FUTEX_BITSET_MATCH_ANY;