From patchwork Wed Jul 12 00:46:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118755 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp832667vqm; Tue, 11 Jul 2023 17:48:27 -0700 (PDT) X-Google-Smtp-Source: APBJJlHYASSS84Fg0vZo+ZG9YZpxwJl3jhHHBVuKuhAVE8FyjPhMAWP/DDshqXAxpDKM/EwbSSEp X-Received: by 2002:a05:6a00:80f:b0:681:eddd:51fb with SMTP id m15-20020a056a00080f00b00681eddd51fbmr22059449pfk.18.1689122906779; Tue, 11 Jul 2023 17:48:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689122906; cv=none; d=google.com; s=arc-20160816; b=pBNXm4V5BX+ITnSn2mKFaG/R6ZYiLq6MVaaJj6XKr54vhP7RRfRl8vnqWsQZGNLTWs FFwyKv85cihhzgU3nmgj5h/62tS8iEwEe2vFgXI8fzc5aaEjhOLek5V6hZ8SYk9S4ce3 gYqBXFWs8KdE5dsIqXUbTGK2hQhpHH++2bwdnl2oSk9mg8zftvfOCaHJXgyxMCvNpRKG 0LzeqjD259yEot961oVzOGtFfmjJ4mBR2PT3e0eypwBWo+g9AMh4/FYTPExaX0Kch85n eLR3d6VbX0QTX4PfLfaiRwf0ztSuJnHZqblII+xrlq4IOLPCWVPbT/ZQL2WuDc2Zr6i+ f8BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8G3IrOMNGlFczpaPrC8wvkVroG8Z2Lzb2MR2ORlnT9Y=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=p0vGsDae9smoKyBIe/6eejcDLrGrrQUXdI6DRDWGsg4b6WonwmxHQ0RGnFNGrQAiYj yWUjXp9wkvNdVMdT+6zbi3zhRn+zEfzNo3pJPyUaH5dvx35j83DJRNcAailxfBP7W4ya 88jEP2qKmcQJNS8r4ekb4PbX4dAV1kNrn5U/51CahV/CA64F9R+sQtf58qwNdj+AnxST WJuKDrUKoAGc1pBWyop52DUcUmZ5Kc55Fq0QVP4P0hrawWXbKWl4NblUOKs7aMI6Sohk Zk9DLIqWdWd88xEzeSTH1O7f807rIG3BSfDriIQIDPhnGqA8j5Lq4LpIc8XpOFOmY8e8 SmgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=Vf1GAj6G; 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 bw6-20020a056a00408600b00645e8c9e27esi2245405pfb.386.2023.07.11.17.48.14; Tue, 11 Jul 2023 17:48:26 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=Vf1GAj6G; 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 S231202AbjGLArQ (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38996 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231154AbjGLArO (ORCPT ); Tue, 11 Jul 2023 20:47:14 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47D6A1720 for ; Tue, 11 Jul 2023 17:47:13 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1b8c364ad3bso11362185ad.1 for ; Tue, 11 Jul 2023 17:47:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122833; x=1691714833; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8G3IrOMNGlFczpaPrC8wvkVroG8Z2Lzb2MR2ORlnT9Y=; b=Vf1GAj6GvM+KaDdgiHg64eKqsxyAT6AMQg5TB9LHR+eDiSwMVsx4LaD8iOrRhentya AudG97oDq9deM0vTzfBmWPseEjk4/5TUQ1gnTjSicsRSl99fsfZD3IJ+2ywyp/9otCQI 0wUpyNtBeoA3N6UTxwqAs7t+eFcb3OAEnMD1jmgRn9M3HYGG2LBLgP1ncJd2kLhsgEBj c+R4XxjMub1ZM3aMdj1IyVy19gNw6KZT05pa7YJImPzgNAy7YqVq6hKNmtEr917lGs5k TPaozL/JMy0nsJ8sr4d3GOgfr9I1JinC+n1z0zswWwr552vv7lVBXwaDCqlVkzcssXzs 2vkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122833; x=1691714833; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8G3IrOMNGlFczpaPrC8wvkVroG8Z2Lzb2MR2ORlnT9Y=; b=knlpz6cAR+cZbQqEbsuZAzfhIwIbz5cvOsgAA7+xXQvc4o0/7QtoQyVfESzEZbkUZ2 oJY8umS7L5SPf4PSfA0LUhTEzAF2/to+IaGdJdZLG1sDBjoHBEmzARVA4t9LF517Pzp7 9g2wKRoSAm7i0+Yfgl7k3I2tyt9Ihr1UNB5jarznVJgdoeA/sLlzB9LRMyH2xLHACP04 L5bZ/EIOKKIGKwWxVuaR4iCw/xETkB1LdnxuTAcJbsVQrtqIM3wvdXJuxKcpeZloPZtj vNXCNI16NZD8ZVKNpAXbEBfWk7pnweycpN5Hm8ZwhV7/QPDUwJkt6+BG9cnLeLiw1k2N 8sLw== X-Gm-Message-State: ABy/qLZp7ddfmwnK/oYAErdZFlCXbyqYuyOZJ2XnrDBv3Tuly66A2AmH dbB9a5618O6nItNSh7u/iFv2Rg== X-Received: by 2002:a17:902:f683:b0:1b1:9272:55e2 with SMTP id l3-20020a170902f68300b001b1927255e2mr21727777plg.3.1689122832734; Tue, 11 Jul 2023 17:47:12 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:11 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 1/7] futex: abstract out futex_op_to_flags() helper Date: Tue, 11 Jul 2023 18:46:59 -0600 Message-Id: <20230712004705.316157-2-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771173741035140711 X-GMAIL-MSGID: 1771173741035140711 Rather than needing to duplicate this for the io_uring hook of futexes, abstract out a helper. No functional changes intended in this patch. Signed-off-by: Jens Axboe --- kernel/futex/futex.h | 15 +++++++++++++++ kernel/futex/syscalls.c | 11 ++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h index b5379c0e6d6d..d2949fca37d1 100644 --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -291,4 +291,19 @@ extern int futex_unlock_pi(u32 __user *uaddr, unsigned int flags); extern int futex_lock_pi(u32 __user *uaddr, unsigned int flags, ktime_t *time, int trylock); +static inline bool futex_op_to_flags(int op, int cmd, unsigned int *flags) +{ + 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 && + cmd != FUTEX_LOCK_PI2) + return false; + } + + return true; +} + #endif /* _FUTEX_H */ diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c index a8074079b09e..75ca8c41cc94 100644 --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -88,15 +88,8 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, 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 && - cmd != FUTEX_LOCK_PI2) - return -ENOSYS; - } + if (!futex_op_to_flags(op, cmd, &flags)) + return -ENOSYS; switch (cmd) { case FUTEX_WAIT: From patchwork Wed Jul 12 00:47:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118756 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp832705vqm; Tue, 11 Jul 2023 17:48:37 -0700 (PDT) X-Google-Smtp-Source: APBJJlEVM5kSnM9gwAKYWy7MLbPl8lvOSnHDo/5Iyd/zaV2JgUKNO2vc5DnLkzMXMJwWbgF5CTVd X-Received: by 2002:a17:902:854c:b0:1b9:cb8b:3bd3 with SMTP id d12-20020a170902854c00b001b9cb8b3bd3mr13057112plo.31.1689122916794; Tue, 11 Jul 2023 17:48:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689122916; cv=none; d=google.com; s=arc-20160816; b=AhcqjBVWlMkLnLTfSTmcV+qWVw9EojG2tKu+vFdk/2Ee/1Kfqz0+aTQIOav6ys+9Ye iBosWXbISMo5BfHUnDMOjJnhLqdr0R8VcClZuJqAvxYzzIFODsIgOH7dY+MSFB861s4T WdT5yT6wbkw5/BBzd6PjEMtkoSZwQIRhXHpE6AipsvK5NYot1TtDInNlXf+DWAl3uVAC YrkaZj5DIZCBP0vwhNpmcMSAlNGXA1tpG+BkGoHdD5KTL801X/iswKFyd7iH3pPr65dg Tsj/dYEfhD+eG1mwFR8k+IkMzuWWtYtxb0mpVLK1zbxSfrttCccvggk5DpAEEVQghgB+ bFFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=hJHEVsPXGWHqsJoWMs2SXGP/dgciG32UfjRi0VGCdeE=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=l8kPyI/kBoXu9OT98CF2KUFYS9qZMWyl0e38wR2pf6gLHiR+zd6ymnTg97jXF17Ue5 6jFe7slgButoQqya+ik1SdcPFNWDtVK5/ftKMOq7PA4pbffNoysX6VcWQ0+WSBPBSpeg wLze55o1yLG8SfYHiesV3H+mVAtjOgFOlH0CZw7/WJz6IU+W1QW9TgPkHRQi1f/B8EZL Aof5auwbVYYC1smPCNKfWDyGbcg4TL+b3da+eE75bV0GIyYoDv0YTqpIW/xqXNZ1wlQL gXnXdUg/SGFZlkQ3teaMvFm787Nxrg/H+eQPCn4gJ4Heni6kQZXvAJsbrnBlEEF4bfaB jcpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=PZeJ886W; 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 ij8-20020a170902ab4800b001a97e24eb34si2266791plb.201.2023.07.11.17.48.24; Tue, 11 Jul 2023 17:48:36 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=PZeJ886W; 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 S231238AbjGLArT (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38996 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229512AbjGLArP (ORCPT ); Tue, 11 Jul 2023 20:47:15 -0400 Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B4CFB10D4 for ; Tue, 11 Jul 2023 17:47:14 -0700 (PDT) Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-1b898cfa6a1so9140965ad.1 for ; Tue, 11 Jul 2023 17:47:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122834; x=1689727634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hJHEVsPXGWHqsJoWMs2SXGP/dgciG32UfjRi0VGCdeE=; b=PZeJ886W/oAqgibJDnI4kMYditvxSoDVVQKUvsrNa6hJC2RciZA4/XDfJbR/GFiJcN ziVXQ6rMuYZcDOBUm+002+A8xu5/3nUOR+nkF0SskrybnMXQlzcoOyf9QgVa6gOo7Hr5 vH+/r53KV/aDbsyM/bey7jiPFwKUvp3X7j2A/TcHXzjYybSjN2nSQBAutTZ4J0md1epR d2tTzmRdCc6X06ovP75BVgVzDlBQNm9eHwaMb2fa7UeeHFHzmu3gXWREQuOW1djjmt25 VongB2IiDsFM//BzOqjvdT6HPbjxrnHtUf35tzLaB3HKf9zQZEZBiU1Ulvty3mlv22fa ei8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122834; x=1689727634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hJHEVsPXGWHqsJoWMs2SXGP/dgciG32UfjRi0VGCdeE=; b=JVTRtnpS96RC1V9GS1gSUAQHUcKvU4WCqf7i/pSZ0chfBBNfQxLEDqzDjt8rFCDSos LmgBTTXJYedhfua8Mb6qcy5GI5RjPAaiN3ResfPijasLM9T9iYQVLQ1tWaEMEjYl+dxm Vh+sFvFAR4KwwNysI+ubj8eigTex0WYEIWFVGgS0L1dtn/CicDEnc7wkXrxld+LlULQM hfaBhhvvRwGocLNkpsL3A8YrTS3t0Oicotqz2QsjQY1Av09P0BXEizVmj73XX6rMmusT Dw1jvr9dxxQFQ0q/ElCoZN8Tp8LOP+k198TuC6ZDlA6I8EFXsqsAjROFZzYnRgjIwDUV Tnhg== X-Gm-Message-State: ABy/qLabme9Nd4j8MEkEEO3QknKvXBLxQ7jtRt4nJU4JugLw5ue+HPs0 vQAKrYCIJT2tyLakkbKp2x9FIw== X-Received: by 2002:a17:902:f68c:b0:1b8:17e8:547e with SMTP id l12-20020a170902f68c00b001b817e8547emr21541502plg.1.1689122834238; Tue, 11 Jul 2023 17:47:14 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:13 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 2/7] futex: factor out the futex wake handling Date: Tue, 11 Jul 2023 18:47:00 -0600 Message-Id: <20230712004705.316157-3-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771173751558248585 X-GMAIL-MSGID: 1771173751558248585 In preparation for having another waker that isn't futex_wake_mark(), add a wake handler in futex_q. No extra data is associated with the handler outside of struct futex_q itself. futex_wake_mark() is defined as the standard wakeup helper, now set through futex_q_init like other defaults. Signed-off-by: Jens Axboe --- kernel/futex/futex.h | 4 ++++ kernel/futex/requeue.c | 3 ++- kernel/futex/waitwake.c | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h index d2949fca37d1..8eaf1a5ce967 100644 --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -69,6 +69,9 @@ struct futex_pi_state { union futex_key key; } __randomize_layout; +struct futex_q; +typedef void (futex_wake_fn)(struct wake_q_head *wake_q, struct futex_q *q); + /** * struct futex_q - The hashed futex queue entry, one per waiting task * @list: priority-sorted list of tasks waiting on this futex @@ -98,6 +101,7 @@ struct futex_q { struct task_struct *task; spinlock_t *lock_ptr; + futex_wake_fn *wake; union futex_key key; struct futex_pi_state *pi_state; struct rt_mutex_waiter *rt_waiter; diff --git a/kernel/futex/requeue.c b/kernel/futex/requeue.c index cba8b1a6a4cc..e892bc6c41d8 100644 --- a/kernel/futex/requeue.c +++ b/kernel/futex/requeue.c @@ -58,6 +58,7 @@ enum { const struct futex_q futex_q_init = { /* list gets initialized in futex_queue()*/ + .wake = futex_wake_mark, .key = FUTEX_KEY_INIT, .bitset = FUTEX_BITSET_MATCH_ANY, .requeue_state = ATOMIC_INIT(Q_REQUEUE_PI_NONE), @@ -591,7 +592,7 @@ int futex_requeue(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, /* Plain futexes just wake or requeue and are done */ if (!requeue_pi) { if (++task_count <= nr_wake) - futex_wake_mark(&wake_q, this); + this->wake(&wake_q, this); else requeue_futex(this, hb1, hb2, &key2); continue; diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c index ba01b9408203..3471af87cb7d 100644 --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -174,7 +174,7 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) if (!(this->bitset & bitset)) continue; - futex_wake_mark(&wake_q, this); + this->wake(&wake_q, this); if (++ret >= nr_wake) break; } @@ -289,7 +289,7 @@ int futex_wake_op(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, ret = -EINVAL; goto out_unlock; } - futex_wake_mark(&wake_q, this); + this->wake(&wake_q, this); if (++ret >= nr_wake) break; } @@ -303,7 +303,7 @@ int futex_wake_op(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, ret = -EINVAL; goto out_unlock; } - futex_wake_mark(&wake_q, this); + this->wake(&wake_q, this); if (++op_ret >= nr_wake2) break; } From patchwork Wed Jul 12 00:47:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118760 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp839718vqm; Tue, 11 Jul 2023 18:09:23 -0700 (PDT) X-Google-Smtp-Source: APBJJlFtKkO5awT1zZ3Bi3grX+y75N5DUeaKEQK9P3dfDwXs8c5OiIbmdowNEFhvx+VpqujumEzv X-Received: by 2002:a05:6358:7205:b0:134:f326:e819 with SMTP id h5-20020a056358720500b00134f326e819mr21209432rwa.29.1689124163677; Tue, 11 Jul 2023 18:09:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689124163; cv=none; d=google.com; s=arc-20160816; b=jZnH9RRFT0q4Gv6fG5FdRm41JIOqzpDoKWWW7XnXJSd+CGJCUgI64cUZDHJkvIwsjZ I0ghWAnx5q6GyEoUR/ZexLVVcTMyJljnUM0q9ZjusyDWeuqREg1dBbYzP+qiT/l5Glke afdnRndo38dZYp2UI4EuMPkSpIBHGDO+0tkL0YnLIfTCuYAkwz+Muonbr9Vc3sVd9+op mLv8K86+H0vnwZgHBXEuhBHP6mmLf+5Zo8HxfQUj7/ShTnp0czST4uFkz1D28kBhx/0u pbgR6fUj0TGkqDvtaHw9mYQwcQCEKaPrKK4iRoW3vfDfe6SmXcl4ozUyQJIIoz6uauLo WvLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ceQzGCPNst+4GlWUlUZP0RISAT734e1HDBQMt1evUDU=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=hb9rYWLeNGRBlGnhnQkKTh/TbQDl6pFWB2UaVgQghJ3sIpxhYoiw73ppUhKANzFs3X byhNLe/usGI6mxI21rg4x/+7jFeep6A3MWD55K4VLAKMkyK/tkPRIxsbjF81TVj47CWE M0z6WJN/28qYQS0uSSWQe9ffSgQ7A+Q05+kS2jiuQZbNZIVkm2p67ca5Bowsu33C6TJn u0iWjtzCvDfzHw05t1T1sTDx1vkVpDpl+2UjAqZjyeNccU870Ip1cKAPyAsxf4GbgfBg C5ioSjcJ31vctfPW30fqfeVlRsIZxI8F8MSF82l9++8F8H20p+wYjnvXSWGwLeFc5j8B joKQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=ddq+ANYG; 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 y64-20020a638a43000000b0053fb3688fadsi2255138pgd.144.2023.07.11.18.09.11; Tue, 11 Jul 2023 18:09:23 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=ddq+ANYG; 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 S229990AbjGLArX (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231218AbjGLArS (ORCPT ); Tue, 11 Jul 2023 20:47:18 -0400 Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D74D10CF for ; Tue, 11 Jul 2023 17:47:16 -0700 (PDT) Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1b9d9cbcc70so5005815ad.0 for ; Tue, 11 Jul 2023 17:47:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122836; x=1689727636; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ceQzGCPNst+4GlWUlUZP0RISAT734e1HDBQMt1evUDU=; b=ddq+ANYGvujKOUtXjecxaLI5DXztouTYpNq8GAIrz1H6iPTUv3MbTzUbk2ARr2Iw3w AHC3UAiff3umcY/Rugtx+vIf8vf40IPc+HaEqBqg9fjGYhIMpSodwAeMaz3lOtYXtGVy xhH3Fm9wxFdBKlS9DBiQFCnPah5j75Pr2hmpj/KUftmIq+fhdCLJERx/zpTvPFgkyVnS 48wL7TrrfwKKLkNFV39q0lLQ/A41hWEDvMnnrod2dZbyFZXJjbmMpWJRsPZLCFfs9BqX Ihw6AmZSgTFUNMLabbbHp3aF9dZblE9Hk+hlX8K98THxo3NO0ue3Ymqo8T8Ze83U3mYy gtJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122836; x=1689727636; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ceQzGCPNst+4GlWUlUZP0RISAT734e1HDBQMt1evUDU=; b=SJK3rNsFTu5uCzSFJjnRFjWp9u7yZuRPDG8vQz1Q/RgriV50uSwj+y6N6CnX8YCmBD 3ld0yTCz7RcwLe2NKq5yICOk0qk76eXUqq+ASHJ+98FUzhb7vky0GynJ1yu3Pa2sr18f 9mmZwQDLhtPh4bT8weFo0yGEAkPge8NKLAZ8DmK3xFxTYujOQnvrt+ClvCcg88QT63sJ OcSbDmvokrgDu/WyohAzVgw1FdlwgkU+OPzDUAHBAEG2p90vabEg/mPs6FGbBDHjBJoE u8xZ8MfemNvv/TGYkbWpTpBxawZv8Kyy3ThCodzsnR3QQcNnRSAFWtq4RessNXZ9zKDp dQpw== X-Gm-Message-State: ABy/qLbIH2G8u2Y35xIs+KcXEamXQcyrklAidIciZWE8k2sOc7c8csv2 FOnJvB/chJHXLCMdOY3+WGiYz01HFOFZbQUEv8k= X-Received: by 2002:a17:902:da92:b0:1b3:d8ac:8db3 with SMTP id j18-20020a170902da9200b001b3d8ac8db3mr21326179plx.6.1689122835577; Tue, 11 Jul 2023 17:47:15 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:14 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 3/7] io_uring: add support for futex wake and wait Date: Tue, 11 Jul 2023 18:47:01 -0600 Message-Id: <20230712004705.316157-4-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771175059003881229 X-GMAIL-MSGID: 1771175059003881229 Add support for FUTEX_WAKE/WAIT primitives. IORING_OP_FUTEX_WAKE is mix of FUTEX_WAKE and FUTEX_WAKE_BITSET, as it does support passing in a bitset. Similary, IORING_OP_FUTEX_WAIT is a mix of FUTEX_WAIT and FUTEX_WAIT_BITSET. FUTEX_WAKE is straight forward, as we can always just do those inline. FUTEX_WAIT will queue the futex with an appropriate callback, and that callback will in turn post a CQE when it has triggered. Cancelations are supported, both from the application point-of-view, but also to be able to cancel pending waits if the ring exits before all events have occurred. This is just the barebones wait/wake support. PI or REQUEUE support is not added at this point, unclear if we might look into that later. Likewise, explicit timeouts are not supported either. It is expected that users that need timeouts would do so via the usual io_uring mechanism to do that using linked timeouts. Signed-off-by: Jens Axboe --- include/linux/io_uring_types.h | 3 + include/uapi/linux/io_uring.h | 3 + io_uring/Makefile | 4 +- io_uring/cancel.c | 5 + io_uring/cancel.h | 4 + io_uring/futex.c | 232 +++++++++++++++++++++++++++++++++ io_uring/futex.h | 34 +++++ io_uring/io_uring.c | 5 + io_uring/opdef.c | 24 +++- 9 files changed, 312 insertions(+), 2 deletions(-) create mode 100644 io_uring/futex.c create mode 100644 io_uring/futex.h diff --git a/include/linux/io_uring_types.h b/include/linux/io_uring_types.h index f04ce513fadb..a7f03d8d879f 100644 --- a/include/linux/io_uring_types.h +++ b/include/linux/io_uring_types.h @@ -273,6 +273,9 @@ struct io_ring_ctx { struct io_wq_work_list locked_free_list; unsigned int locked_free_nr; + struct hlist_head futex_list; + struct io_alloc_cache futex_cache; + const struct cred *sq_creds; /* cred used for __io_sq_thread() */ struct io_sq_data *sq_data; /* if using sq thread polling */ diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index 36f9c73082de..3bd2d765f593 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -65,6 +65,7 @@ struct io_uring_sqe { __u32 xattr_flags; __u32 msg_ring_flags; __u32 uring_cmd_flags; + __u32 futex_flags; }; __u64 user_data; /* data to be passed back at completion time */ /* pack this to avoid bogus arm OABI complaints */ @@ -235,6 +236,8 @@ enum io_uring_op { IORING_OP_URING_CMD, IORING_OP_SEND_ZC, IORING_OP_SENDMSG_ZC, + IORING_OP_FUTEX_WAIT, + IORING_OP_FUTEX_WAKE, /* this goes last, obviously */ IORING_OP_LAST, diff --git a/io_uring/Makefile b/io_uring/Makefile index 8cc8e5387a75..2e4779bc550c 100644 --- a/io_uring/Makefile +++ b/io_uring/Makefile @@ -7,5 +7,7 @@ obj-$(CONFIG_IO_URING) += io_uring.o xattr.o nop.o fs.o splice.o \ openclose.o uring_cmd.o epoll.o \ statx.o net.o msg_ring.o timeout.o \ sqpoll.o fdinfo.o tctx.o poll.o \ - cancel.o kbuf.o rsrc.o rw.o opdef.o notif.o + cancel.o kbuf.o rsrc.o rw.o opdef.o \ + notif.o obj-$(CONFIG_IO_WQ) += io-wq.o +obj-$(CONFIG_FUTEX) += futex.o diff --git a/io_uring/cancel.c b/io_uring/cancel.c index 7b23607cf4af..3dba8ccb1cd8 100644 --- a/io_uring/cancel.c +++ b/io_uring/cancel.c @@ -15,6 +15,7 @@ #include "tctx.h" #include "poll.h" #include "timeout.h" +#include "futex.h" #include "cancel.h" struct io_cancel { @@ -119,6 +120,10 @@ int io_try_cancel(struct io_uring_task *tctx, struct io_cancel_data *cd, if (ret != -ENOENT) return ret; + ret = io_futex_cancel(ctx, cd, issue_flags); + if (ret != -ENOENT) + return ret; + spin_lock(&ctx->completion_lock); if (!(cd->flags & IORING_ASYNC_CANCEL_FD)) ret = io_timeout_cancel(ctx, cd); diff --git a/io_uring/cancel.h b/io_uring/cancel.h index fc98622e6166..c0a8e7c520b6 100644 --- a/io_uring/cancel.h +++ b/io_uring/cancel.h @@ -1,4 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 +#ifndef IORING_CANCEL_H +#define IORING_CANCEL_H #include @@ -22,3 +24,5 @@ void init_hash_table(struct io_hash_table *table, unsigned size); int io_sync_cancel(struct io_ring_ctx *ctx, void __user *arg); bool io_cancel_req_match(struct io_kiocb *req, struct io_cancel_data *cd); + +#endif diff --git a/io_uring/futex.c b/io_uring/futex.c new file mode 100644 index 000000000000..ff0f6b394756 --- /dev/null +++ b/io_uring/futex.c @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +#include + +#include "../kernel/futex/futex.h" +#include "io_uring.h" +#include "rsrc.h" +#include "futex.h" + +struct io_futex { + struct file *file; + u32 __user *uaddr; + int futex_op; + unsigned int futex_val; + unsigned int futex_flags; + unsigned int futex_mask; +}; + +struct io_futex_data { + union { + struct futex_q q; + struct io_cache_entry cache; + }; + struct io_kiocb *req; +}; + +void io_futex_cache_init(struct io_ring_ctx *ctx) +{ + io_alloc_cache_init(&ctx->futex_cache, IO_NODE_ALLOC_CACHE_MAX, + sizeof(struct io_futex_data)); +} + +static void io_futex_cache_entry_free(struct io_cache_entry *entry) +{ + kfree(container_of(entry, struct io_futex_data, cache)); +} + +void io_futex_cache_free(struct io_ring_ctx *ctx) +{ + io_alloc_cache_free(&ctx->futex_cache, io_futex_cache_entry_free); +} + +static void io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts) +{ + struct io_futex_data *ifd = req->async_data; + struct io_ring_ctx *ctx = req->ctx; + + io_tw_lock(ctx, ts); + if (!io_alloc_cache_put(&ctx->futex_cache, &ifd->cache)) + kfree(ifd); + req->async_data = NULL; + hlist_del_init(&req->hash_node); + io_req_task_complete(req, ts); +} + +static bool __io_futex_cancel(struct io_ring_ctx *ctx, struct io_kiocb *req) +{ + struct io_futex_data *ifd = req->async_data; + + /* futex wake already done or in progress */ + if (!futex_unqueue(&ifd->q)) + return false; + + hlist_del_init(&req->hash_node); + io_req_set_res(req, -ECANCELED, 0); + req->io_task_work.func = io_futex_complete; + io_req_task_work_add(req); + return true; +} + +int io_futex_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd, + unsigned int issue_flags) +{ + struct hlist_node *tmp; + struct io_kiocb *req; + int nr = 0; + + if (cd->flags & (IORING_ASYNC_CANCEL_FD|IORING_ASYNC_CANCEL_FD_FIXED)) + return -ENOENT; + + io_ring_submit_lock(ctx, issue_flags); + hlist_for_each_entry_safe(req, tmp, &ctx->futex_list, hash_node) { + if (req->cqe.user_data != cd->data && + !(cd->flags & IORING_ASYNC_CANCEL_ANY)) + continue; + if (__io_futex_cancel(ctx, req)) + nr++; + if (!(cd->flags & IORING_ASYNC_CANCEL_ALL)) + break; + } + io_ring_submit_unlock(ctx, issue_flags); + + if (nr) + return nr; + + return -ENOENT; +} + +bool io_futex_remove_all(struct io_ring_ctx *ctx, struct task_struct *task, + bool cancel_all) +{ + struct hlist_node *tmp; + struct io_kiocb *req; + bool found = false; + + lockdep_assert_held(&ctx->uring_lock); + + hlist_for_each_entry_safe(req, tmp, &ctx->futex_list, hash_node) { + if (!io_match_task_safe(req, task, cancel_all)) + continue; + __io_futex_cancel(ctx, req); + found = true; + } + + return found; +} + +int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) +{ + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + + if (unlikely(sqe->addr2 || sqe->buf_index || sqe->addr3)) + return -EINVAL; + + iof->futex_op = READ_ONCE(sqe->fd); + iof->uaddr = u64_to_user_ptr(READ_ONCE(sqe->addr)); + iof->futex_val = READ_ONCE(sqe->len); + iof->futex_mask = READ_ONCE(sqe->file_index); + iof->futex_flags = READ_ONCE(sqe->futex_flags); + if (iof->futex_flags & FUTEX_CMD_MASK) + return -EINVAL; + + return 0; +} + +static void io_futex_wake_fn(struct wake_q_head *wake_q, struct futex_q *q) +{ + struct io_futex_data *ifd = container_of(q, struct io_futex_data, q); + struct io_kiocb *req = ifd->req; + + __futex_unqueue(q); + smp_store_release(&q->lock_ptr, NULL); + + io_req_set_res(req, 0, 0); + req->io_task_work.func = io_futex_complete; + io_req_task_work_add(req); +} + +static struct io_futex_data *io_alloc_ifd(struct io_ring_ctx *ctx) +{ + struct io_cache_entry *entry; + + entry = io_alloc_cache_get(&ctx->futex_cache); + if (entry) + return container_of(entry, struct io_futex_data, cache); + + return kmalloc(sizeof(struct io_futex_data), GFP_NOWAIT); +} + +int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags) +{ + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + struct io_ring_ctx *ctx = req->ctx; + struct io_futex_data *ifd = NULL; + struct futex_hash_bucket *hb; + unsigned int flags = 0; + int ret; + + if (!iof->futex_mask) { + ret = -EINVAL; + goto done; + } + if (!futex_op_to_flags(FUTEX_WAIT, iof->futex_flags, &flags)) { + ret = -ENOSYS; + goto done; + } + + io_ring_submit_lock(ctx, issue_flags); + ifd = io_alloc_ifd(ctx); + if (!ifd) { + ret = -ENOMEM; + goto done_unlock; + } + + req->async_data = ifd; + ifd->q = futex_q_init; + ifd->q.bitset = iof->futex_mask; + ifd->q.wake = io_futex_wake_fn; + ifd->req = req; + + ret = futex_wait_setup(iof->uaddr, iof->futex_val, flags, &ifd->q, &hb); + if (!ret) { + hlist_add_head(&req->hash_node, &ctx->futex_list); + io_ring_submit_unlock(ctx, issue_flags); + + futex_queue(&ifd->q, hb); + return IOU_ISSUE_SKIP_COMPLETE; + } + +done_unlock: + io_ring_submit_unlock(ctx, issue_flags); +done: + if (ret < 0) + req_set_fail(req); + io_req_set_res(req, ret, 0); + kfree(ifd); + return IOU_OK; +} + +int io_futex_wake(struct io_kiocb *req, unsigned int issue_flags) +{ + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + unsigned int flags = 0; + int ret; + + if (!futex_op_to_flags(FUTEX_WAKE, iof->futex_flags, &flags)) { + ret = -ENOSYS; + goto done; + } + + ret = futex_wake(iof->uaddr, flags, iof->futex_val, iof->futex_mask); +done: + if (ret < 0) + req_set_fail(req); + io_req_set_res(req, ret, 0); + return IOU_OK; +} diff --git a/io_uring/futex.h b/io_uring/futex.h new file mode 100644 index 000000000000..ddc9e0d73c52 --- /dev/null +++ b/io_uring/futex.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "cancel.h" + +int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); +int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags); +int io_futex_wake(struct io_kiocb *req, unsigned int issue_flags); + +#if defined(CONFIG_FUTEX) +int io_futex_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd, + unsigned int issue_flags); +bool io_futex_remove_all(struct io_ring_ctx *ctx, struct task_struct *task, + bool cancel_all); +void io_futex_cache_init(struct io_ring_ctx *ctx); +void io_futex_cache_free(struct io_ring_ctx *ctx); +#else +static inline int io_futex_cancel(struct io_ring_ctx *ctx, + struct io_cancel_data *cd, + unsigned int issue_flags) +{ + return 0; +} +static inline bool io_futex_remove_all(struct io_ring_ctx *ctx, + struct task_struct *task, bool cancel_all) +{ + return false; +} +static inline void io_futex_cache_init(struct io_ring_ctx *ctx) +{ +} +static inline void io_futex_cache_free(struct io_ring_ctx *ctx) +{ +} +#endif diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index e8096d502a7c..67ff148bc394 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -92,6 +92,7 @@ #include "cancel.h" #include "net.h" #include "notif.h" +#include "futex.h" #include "timeout.h" #include "poll.h" @@ -314,6 +315,7 @@ static __cold struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p) sizeof(struct async_poll)); io_alloc_cache_init(&ctx->netmsg_cache, IO_ALLOC_CACHE_MAX, sizeof(struct io_async_msghdr)); + io_futex_cache_init(ctx); init_completion(&ctx->ref_comp); xa_init_flags(&ctx->personalities, XA_FLAGS_ALLOC1); mutex_init(&ctx->uring_lock); @@ -333,6 +335,7 @@ static __cold struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p) INIT_LIST_HEAD(&ctx->tctx_list); ctx->submit_state.free_list.next = NULL; INIT_WQ_LIST(&ctx->locked_free_list); + INIT_HLIST_HEAD(&ctx->futex_list); INIT_DELAYED_WORK(&ctx->fallback_work, io_fallback_req_func); INIT_WQ_LIST(&ctx->submit_state.compl_reqs); return ctx; @@ -2842,6 +2845,7 @@ static __cold void io_ring_ctx_free(struct io_ring_ctx *ctx) io_eventfd_unregister(ctx); io_alloc_cache_free(&ctx->apoll_cache, io_apoll_cache_free); io_alloc_cache_free(&ctx->netmsg_cache, io_netmsg_cache_free); + io_futex_cache_free(ctx); io_destroy_buffers(ctx); mutex_unlock(&ctx->uring_lock); if (ctx->sq_creds) @@ -3254,6 +3258,7 @@ static __cold bool io_uring_try_cancel_requests(struct io_ring_ctx *ctx, ret |= io_cancel_defer_files(ctx, task, cancel_all); mutex_lock(&ctx->uring_lock); ret |= io_poll_remove_all(ctx, task, cancel_all); + ret |= io_futex_remove_all(ctx, task, cancel_all); mutex_unlock(&ctx->uring_lock); ret |= io_kill_timeouts(ctx, task, cancel_all); if (task) diff --git a/io_uring/opdef.c b/io_uring/opdef.c index 3b9c6489b8b6..c9f23c21a031 100644 --- a/io_uring/opdef.c +++ b/io_uring/opdef.c @@ -33,6 +33,7 @@ #include "poll.h" #include "cancel.h" #include "rw.h" +#include "futex.h" static int io_no_issue(struct io_kiocb *req, unsigned int issue_flags) { @@ -426,11 +427,26 @@ const struct io_issue_def io_issue_defs[] = { .issue = io_sendmsg_zc, #else .prep = io_eopnotsupp_prep, +#endif + }, + [IORING_OP_FUTEX_WAIT] = { +#if defined(CONFIG_FUTEX) + .prep = io_futex_prep, + .issue = io_futex_wait, +#else + .prep = io_eopnotsupp_prep, +#endif + }, + [IORING_OP_FUTEX_WAKE] = { +#if defined(CONFIG_FUTEX) + .prep = io_futex_prep, + .issue = io_futex_wake, +#else + .prep = io_eopnotsupp_prep, #endif }, }; - const struct io_cold_def io_cold_defs[] = { [IORING_OP_NOP] = { .name = "NOP", @@ -648,6 +664,12 @@ const struct io_cold_def io_cold_defs[] = { .fail = io_sendrecv_fail, #endif }, + [IORING_OP_FUTEX_WAIT] = { + .name = "FUTEX_WAIT", + }, + [IORING_OP_FUTEX_WAKE] = { + .name = "FUTEX_WAKE", + }, }; const char *io_uring_get_opcode(u8 opcode) From patchwork Wed Jul 12 00:47:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118759 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp839647vqm; Tue, 11 Jul 2023 18:09:08 -0700 (PDT) X-Google-Smtp-Source: APBJJlH9xwCsUWiX9vZpP6MrNCW1Wg33zWxBZA0ogbOfxdcx8VzquOIg7A3mWyH2h6oIIYvAqEaI X-Received: by 2002:a05:6a00:2da5:b0:682:57f0:7c0e with SMTP id fb37-20020a056a002da500b0068257f07c0emr21203085pfb.11.1689124148602; Tue, 11 Jul 2023 18:09:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689124148; cv=none; d=google.com; s=arc-20160816; b=wnri7egePUy0j8EzdNvL/h1tPaP9K9vIZuonPkS53AfTepy2we4DCQMA+5xXikMfER P9B/SuQIVboF6w+gBsIdBAh/ecumCB5mHqVAwNpGqFjzLDfi71IDFdXLlsHC/KguA1uX JWQO8hAPV3CKNBjs5HysItO1ooGIfuK0PdW/RcsQ92HJDLKgNOC6up6CM92IrdW3vHA5 01tklJUT8+8OcTK5Gi2QK68CeliWYfRKzFXmIgpMF0jGYv5Kl0g5+TPJ5BVFcGlagTrW bmYtduncvHi9lMHMpfi/WCHuyN6rEnuybM3G4SGecCzstPpKJNa5zG51ytTVRIcCsmRO RbGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=USpRQzApdKpSjiyBkjEmkDnIwRqj5vH3splpyWQ1un8=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=TrGfFBcIVVpb6oIs8oTl4v1a3Hc4k3TQIbXJZ1/6xNiduA3eNMnpjXgzc5jzk9UL8M zNjJWQIMO0ZcotCd9feyTwOnA6HVCnOisQhbAaL5OGaYDDrWc3U3Qo4GlRyb4PdAXOFB AEUz3Q1zazdKMk/UV3e9A+1ULatYp0EM5Ra0vLcXdDtnNTu4El+RUR37GH4dYrDJjb4M lm/lMYV3gUMR3c6t1dk2epdHP3QKCcJxel1jwYMJI5ZjtwwRhDDbJyb8zHsO+KIyHzpD AFOA3cVeVu5iDWkVN/VtBvQhnQM7b7WsU/WKtcKsP/9/Ii46QBgPfBJ5t61lse83/Q9x 4FKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=FpZRUoq0; 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 x16-20020a056a00189000b0065bbe39e1b3si2357924pfh.146.2023.07.11.18.08.56; Tue, 11 Jul 2023 18:09:08 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=FpZRUoq0; 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 S231255AbjGLArZ (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39044 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231154AbjGLArS (ORCPT ); Tue, 11 Jul 2023 20:47:18 -0400 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0F16172C for ; Tue, 11 Jul 2023 17:47:17 -0700 (PDT) Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-1b8c364ad3bso11362395ad.1 for ; Tue, 11 Jul 2023 17:47:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122837; x=1691714837; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=USpRQzApdKpSjiyBkjEmkDnIwRqj5vH3splpyWQ1un8=; b=FpZRUoq0aBYl9CAG+w+52gtPelgfB27iLDuiaLxgUVSRo0wfLIQu3VEnoXzkS21Xdq m2jQmSMLiebVrVI9WO6ahU0wvGJn/wLM2FxTrd9cUM9WY4c+wcnNp67maehJN6ewabhh dVK3RGPyvWiLbGnt4Qo07jrG56bi2emgJqA1ILLMMFhyvloYjZbVc+3Tsh0eEojhdfSx Xzby3UClIYLVNsK9oAJUNiNmY2DF9sC0AQdDgP1zbgR+eX1Dy8ibt4t9ZPK+1jt4zUJS dDCtTrGBlpkFiOwIMzYzUn/KTkuI44aU08Q8pOq37fL0TdJ7sMpjmm2L1cMFu309BpEl Dl9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122837; x=1691714837; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=USpRQzApdKpSjiyBkjEmkDnIwRqj5vH3splpyWQ1un8=; b=NxlqmxjYgKL0sg7M72cjVSnZkHeawiG8kDLp6G3jKj17Mb0zVtqWkISh5MworgZx+z eV6PSnwm8Y3fZYZPjjj4EfrCxDIytYw8RzBGUzlLRbXfPW3egbEdva3wXdQnuuZ4HBqB DN6H3pax1RC7/A3EIFtgRUrLyw+7HouHqvIo87fh17j94enqz48AhUt7RdGHFmVu+f1w trTsLcPNLs9+wJ+xsirriJ+i9aIzeDaZQNt/3jz7utPXIALnf75T8PIWYU5AuOZ7mInP r9/WwVQYZj1DzGhoc0bP7b0KdW0rDjoj90Ww4uX/zsjcBRB44f/yVCZiwAD7QQwkEFu7 9mzw== X-Gm-Message-State: ABy/qLZeSUTpwUS4C6XkI6wx8BSwuc4uvB/d7iH+AaAwhXZ1AZPut/bH N8fEnmfz/zmlKFdGdCk2A+eEhA== X-Received: by 2002:a17:903:244e:b0:1b8:b4f6:1327 with SMTP id l14-20020a170903244e00b001b8b4f61327mr21565526pls.6.1689122837255; Tue, 11 Jul 2023 17:47:17 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:16 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 4/7] futex: add wake_data to struct futex_q Date: Tue, 11 Jul 2023 18:47:02 -0600 Message-Id: <20230712004705.316157-5-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771175043215041072 X-GMAIL-MSGID: 1771175043215041072 With handling multiple futex_q for waitv, we cannot easily go from the futex_q to data related to that request or queue. Add a wake_data argument that belongs to the wake handler assigned. Signed-off-by: Jens Axboe --- kernel/futex/futex.h | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h index 8eaf1a5ce967..75dec2ec7469 100644 --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -102,6 +102,7 @@ struct futex_q { struct task_struct *task; spinlock_t *lock_ptr; futex_wake_fn *wake; + void *wake_data; union futex_key key; struct futex_pi_state *pi_state; struct rt_mutex_waiter *rt_waiter; From patchwork Wed Jul 12 00:47:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118761 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp839973vqm; Tue, 11 Jul 2023 18:10:12 -0700 (PDT) X-Google-Smtp-Source: APBJJlFz2RcFlnfgQNqkjjUKL3RgONPJPJf1HZQmprKkV3ZM2BFu1LmuJwQsMK2PTToxNIBdZqKU X-Received: by 2002:a05:6a00:10c5:b0:67d:ccbc:5e81 with SMTP id d5-20020a056a0010c500b0067dccbc5e81mr15408913pfu.4.1689124212380; Tue, 11 Jul 2023 18:10:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689124212; cv=none; d=google.com; s=arc-20160816; b=hpdyIXMPxXLw+oJZ9iVs8fWDm804lPKJ3AMtrYRiglJiJ4FsUueKETgmqRZBb2d8e1 4FiV4Ut7QcGyCvuujyVqTfx8fB+llW5q8xg49o2ygBtgI0FaMmXrdl29sIDT8cAeAdCi JkZGW/ckQdrtrebhabEM8gLPrs+JBhCiKCDfa6BGZoCbRSTc1d6ekk0qmG6Nh1PGNi6x QwPzQkOe4PWbpaL0OTnuHf6+EyXEoW3DJWDkHxqcbDsxm7It2PmthmxqlGNL8k1Da25c 2ZP350/J71lYI52o2PRSgpyDUO1Ys1JtEf8NSR3MUao6tLpZFdCG5lSm5+RU1S/kHESr Uoww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=wAI3I/Dhvc4kFPF9aMsZuUCg5MncxXQjosQul2Nohhs=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=O5PwnZcHmeX6zjpu6dYkASBd7c+6FXqN00rX+TmZtoCj8tAFExOuE3MFuozgwp5Bic egOIRL8PacDpFCvTfrhGo96WfjUmwrzkw1c+p4cNZaqbxgzw8EjDlp3F9fA+fdp47yqq /sapdMoIXN00wh3YvNAs0sDxcJjcUmzUCmd7NXvtuFYYrOGacr2M8SYhxRaJH7UstFY6 24h/dyv6NXrbb0Z7zkfLRJuKAAyXKSlRR6iRR5GHUtWOsXOObn+1dtkAq/lbFWHSv3TD 9OQaehwTKY5LQh5JdZqPpX7y2U/fM/6js5EQkU1bZ7ru9HyyqX9sg51f/BUjrOY2ZwDX n1rA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=df7itfq6; 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 q16-20020a056a00089000b0066ce96ce70csi2295124pfj.122.2023.07.11.18.09.59; Tue, 11 Jul 2023 18:10:12 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=df7itfq6; 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 S231445AbjGLAra (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229931AbjGLArV (ORCPT ); Tue, 11 Jul 2023 20:47:21 -0400 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB3A31736 for ; Tue, 11 Jul 2023 17:47:18 -0700 (PDT) Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-55b741fd0c5so1012335a12.0 for ; Tue, 11 Jul 2023 17:47:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122838; x=1691714838; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wAI3I/Dhvc4kFPF9aMsZuUCg5MncxXQjosQul2Nohhs=; b=df7itfq6b68/usvHEi91e1MzZBznscTgw/J0lMxPEjugpJIES1PAZeC1++4h+nEL73 hF+zuH761pjLrXKQpoIJkDL+LT+9G23AGGt33Admf11D+pplifWgUjWVTThi3WpgwHCO VxnxqurUC3FRQw+FWp8InVuWdBVU+xc49C5pfnXq4QjskLSfD2SG3w1CEPCSVao7WuFR kDsOdHs18B1OBSsIgbeEq870s4F9L0+4RC507KZsTFkPntUQnv5uM1x4bgmDW2yu4o4o M+JTd8NS3GwLh2iaS8FT/bN6jNFYa/baEeCgtdmpgaS+PJD47Os/ouyIY42q6CayXWI+ OQUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122838; x=1691714838; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wAI3I/Dhvc4kFPF9aMsZuUCg5MncxXQjosQul2Nohhs=; b=lawHGNPT7dP48Wr4WTIvVf5VyC8JuPFWmb/mhMDmc7QEknEkIyUyRxcMS1Fu34MUA5 V2E2EuLnny3iI26OX8DYGGFL7FWRc4TM+vckoL7dA1Eq/oqBzA/7OLSjQ3du6NxQgbwN DqfYprryZmxSq4v30rd07t12ltz6luNIu28leV+kqrn37Bir+rSYv1klEvJgJmWsIkqb is9yxzeA/cdsWn1ciYh7GD3GHU/IGQ+8m06aNxJPwfeAK107NM/HQV8g0XLYZ6t3JKn0 9QvAz44j6LIdTHWsrgtthCxHEpHKxCiS8XIcUrs61E/7e6elJnMPJAvWD71zFtJfOhv2 Bvbg== X-Gm-Message-State: ABy/qLY6a1iuum5A3xqUXU5bTMZVFkRbRqG7kqSEzVBqcJjhpfoYWXqP CWzB/cNHs3D/8c0hososyyKT5g== X-Received: by 2002:a17:902:d4cd:b0:1b8:17e8:5472 with SMTP id o13-20020a170902d4cd00b001b817e85472mr21890265plg.1.1689122838441; Tue, 11 Jul 2023 17:47:18 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:17 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 5/7] futex: make futex_parse_waitv() available as a helper Date: Tue, 11 Jul 2023 18:47:03 -0600 Message-Id: <20230712004705.316157-6-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771175110024500078 X-GMAIL-MSGID: 1771175110024500078 To make it more generically useful, augment it with allowing the caller to pass in the wake handler and wake data. Convert the futex_waitv() syscall, passing in the default handlers. Since we now provide a way to pass in a wake handler and data, ensure we use __futex_queue() to avoid having futex_queue() overwrite our wait data. Signed-off-by: Jens Axboe --- kernel/futex/futex.h | 5 +++++ kernel/futex/syscalls.c | 14 ++++++++++---- kernel/futex/waitwake.c | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h index 75dec2ec7469..ed5a7ccd2e99 100644 --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -284,6 +284,11 @@ struct futex_vector { struct futex_q q; }; +extern int futex_parse_waitv(struct futex_vector *futexv, + struct futex_waitv __user *uwaitv, + unsigned int nr_futexes, futex_wake_fn *wake, + void *wake_data); + extern int futex_wait_multiple(struct futex_vector *vs, unsigned int count, struct hrtimer_sleeper *to); diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c index 75ca8c41cc94..8ac70bfb89fc 100644 --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -184,12 +184,15 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, * @futexv: Kernel side list of waiters to be filled * @uwaitv: Userspace list to be parsed * @nr_futexes: Length of futexv + * @wake: Wake to call when futex is woken + * @wake_data: Data for the wake handler * * Return: Error code on failure, 0 on success */ -static int futex_parse_waitv(struct futex_vector *futexv, - struct futex_waitv __user *uwaitv, - unsigned int nr_futexes) +int futex_parse_waitv(struct futex_vector *futexv, + struct futex_waitv __user *uwaitv, + unsigned int nr_futexes, futex_wake_fn *wake, + void *wake_data) { struct futex_waitv aux; unsigned int i; @@ -208,6 +211,8 @@ static int futex_parse_waitv(struct futex_vector *futexv, futexv[i].w.val = aux.val; futexv[i].w.uaddr = aux.uaddr; futexv[i].q = futex_q_init; + futexv[i].q.wake = wake; + futexv[i].q.wake_data = wake_data; } return 0; @@ -284,7 +289,8 @@ SYSCALL_DEFINE5(futex_waitv, struct futex_waitv __user *, waiters, goto destroy_timer; } - ret = futex_parse_waitv(futexv, waiters, nr_futexes); + ret = futex_parse_waitv(futexv, waiters, nr_futexes, futex_wake_mark, + NULL); if (!ret) ret = futex_wait_multiple(futexv, nr_futexes, timeout ? &to : NULL); diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c index 3471af87cb7d..dfd02ca5ecfa 100644 --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -446,7 +446,8 @@ static int futex_wait_multiple_setup(struct futex_vector *vs, int count, int *wo * next futex. Queue each futex at this moment so hb can * be unlocked. */ - futex_queue(q, hb); + __futex_queue(q, hb); + spin_unlock(&hb->lock); continue; } From patchwork Wed Jul 12 00:47:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118757 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp838245vqm; Tue, 11 Jul 2023 18:05:18 -0700 (PDT) X-Google-Smtp-Source: APBJJlGltrTZ/jWHDBflvBYiabsKrlN0e2quL8dy7FMNi0e6VkimIFaxfx/viEpL5bKw3mMcv8Ij X-Received: by 2002:a17:90a:4946:b0:262:ea57:43f with SMTP id c64-20020a17090a494600b00262ea57043fmr17720114pjh.37.1689123918158; Tue, 11 Jul 2023 18:05:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689123918; cv=none; d=google.com; s=arc-20160816; b=wUKVfMOKCk6YWr4EivFxCXepP1bei6unoZWtQwCkXUg3Jx7teh8ojmwJxM3tu3Ot3J jVEXxJfIKZgx2fbtiPLAyUY3rQFxxilgAwQIpP5xTJkNxmUfJjiW/F10g/MPuU9hgJuB QYjgVxstbRqmAdC0U4eATK0kdrMfW0fw0wtZgpoBvfEYrYssC3aj/nQpq+YKwLOYQ+ai 7I1Gww8/a1lMT/UhKVdIVNBCFyMwtXNUyDyBGC4fR7imbLFMxYPtGJFott/GVdKhFOua Hm6F4j+zia4sm1aB1szeAiWo+IGDJC3N1rVg+U8HvCrXc2NPAN0gPB6t5QmdSHYO/T6+ 8Gdw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=dWVSKxrnKu5hFU+vCQFzf5LgVGgpoqEzW6iDZaj+u6I=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=iSVR6OvrNdPpF6IhRHAcMPSkbgEEDyEk+W84Fq7V9RH0nSmGkriPiQTBwLnpzuFfIz Hegq1cU3sk47NhbmX6jhM+3eVjzZVcCTnYhEsZb46m5ZYRMWpsUMmxdHOze6WgBgO+Xx ZAigAH7wkwyBPj4uIMiMLUg7iaxyq+HCa3w5pa475dziNUe9YcRdZaXkMABoj2MMHX1A ctM8WBh/ydph4v0XNOr4BqipBLKCA8IGvFOG9Qw1b2XEb4KUdmC7xu35me1zdPNxE1sF YZewzAW0VGBSlt+/6l7dszZxYs05M6vCEwzIbZv/QFdjf3xTnv0uZub3V8yG03jpZ81T k+lA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=pOpXts18; 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 lg16-20020a170902fb9000b001b3d27c4f48si2325066plb.57.2023.07.11.18.05.03; Tue, 11 Jul 2023 18:05:17 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=pOpXts18; 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 S231490AbjGLArd (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39044 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231192AbjGLArV (ORCPT ); Tue, 11 Jul 2023 20:47:21 -0400 Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38ADF1734 for ; Tue, 11 Jul 2023 17:47:20 -0700 (PDT) Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1b9d9cbcc70so5005965ad.0 for ; Tue, 11 Jul 2023 17:47:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122839; x=1689727639; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dWVSKxrnKu5hFU+vCQFzf5LgVGgpoqEzW6iDZaj+u6I=; b=pOpXts18eWWzVgfvcp1gjSlrjNuWBS8ap8AAX3uZJZfqqP+3gL8MLcAIJmy8JdLwI7 kAgvvKI+lElpiyuOIABzKxKW/9YfLkQ+KoWd8zriwzKl5/WTBrjBoG/NKbHSZNBjcz6+ DzCtwiesO2ZhE3bssOr0dVsgabQPoqBbmrBWpXDSFW84tCSHdvnaEZen/11NCaAUIhFq sm5gXEoWwibq3mVuj9nW1f/EJk82UAe8fO1eeGbFZP8EotUKX7V9LEVsS76qLnSddEmY FAHOsXqy+1jQA2aZM0a3G80veYKKMudX9CP8VdYxvYm9XwxUk6M4b8+o2hTNPPVv0C9U 4WlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122840; x=1689727640; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dWVSKxrnKu5hFU+vCQFzf5LgVGgpoqEzW6iDZaj+u6I=; b=gTIbs4GkJwnIBbF1xinzxcOklShJT7P8/k4FKJHWWjAOw2Rv1tz7rOYthtt9T5TzE5 kDSaE2vnRKvfu1lIjceSopFXstcYH8Twx0rqc+EQToAv1pTFryW4LxyEnaH5BCGAUvFY CEzKm1Sc0wyu87W1ccEwGrg27M6lMY3lf8tgKa6Cbpp0/BAxUDfiekqnL8XAmmRSvClC EEuuieSBReWuMSm2qmSGRCp3aaYjYT6P19qaixk2uhsxkC1mAVAVlUeuWzOP/fZZ0Nc+ Yp/w763Pyx8rTdSHJFyIz+2lPQWT5DTM4OmMAMpp4JtKnv55XL49uPXfgMUJjMk1Qf21 rh5Q== X-Gm-Message-State: ABy/qLZUdlng1bepHalttu0WN7nmiFNNWcVg7yyrR27bCoC5YYP5Q9Xx DPjFDYJFL7Vs2wVZ5ayDdHodDA== X-Received: by 2002:a17:902:cecd:b0:1b8:9fc4:2733 with SMTP id d13-20020a170902cecd00b001b89fc42733mr21519265plg.3.1689122839695; Tue, 11 Jul 2023 17:47:19 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:19 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 6/7] futex: make the vectored futex operations available Date: Tue, 11 Jul 2023 18:47:04 -0600 Message-Id: <20230712004705.316157-7-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771174801672002513 X-GMAIL-MSGID: 1771174801672002513 Rename unqueue_multiple() as futex_unqueue_multiple(), and make both that and futex_wait_multiple_setup() available for external users. This is in preparation for wiring up vectored waits in io_uring. Signed-off-by: Jens Axboe --- kernel/futex/futex.h | 5 +++++ kernel/futex/waitwake.c | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/kernel/futex/futex.h b/kernel/futex/futex.h index ed5a7ccd2e99..b06e23c4900e 100644 --- a/kernel/futex/futex.h +++ b/kernel/futex/futex.h @@ -289,6 +289,11 @@ extern int futex_parse_waitv(struct futex_vector *futexv, unsigned int nr_futexes, futex_wake_fn *wake, void *wake_data); +extern int futex_wait_multiple_setup(struct futex_vector *vs, int count, + int *woken); + +extern int futex_unqueue_multiple(struct futex_vector *v, int count); + extern int futex_wait_multiple(struct futex_vector *vs, unsigned int count, struct hrtimer_sleeper *to); diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c index dfd02ca5ecfa..b2b762acc997 100644 --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -358,7 +358,7 @@ void futex_wait_queue(struct futex_hash_bucket *hb, struct futex_q *q, } /** - * unqueue_multiple - Remove various futexes from their hash bucket + * futex_unqueue_multiple - Remove various futexes from their hash bucket * @v: The list of futexes to unqueue * @count: Number of futexes in the list * @@ -368,7 +368,7 @@ void futex_wait_queue(struct futex_hash_bucket *hb, struct futex_q *q, * - >=0 - Index of the last futex that was awoken; * - -1 - No futex was awoken */ -static int unqueue_multiple(struct futex_vector *v, int count) +int futex_unqueue_multiple(struct futex_vector *v, int count) { int ret = -1, i; @@ -396,7 +396,7 @@ static int unqueue_multiple(struct futex_vector *v, int count) * - 0 - Success * - <0 - -EFAULT, -EWOULDBLOCK or -EINVAL */ -static int futex_wait_multiple_setup(struct futex_vector *vs, int count, int *woken) +int futex_wait_multiple_setup(struct futex_vector *vs, int count, int *woken) { struct futex_hash_bucket *hb; bool retry = false; @@ -459,7 +459,7 @@ static int futex_wait_multiple_setup(struct futex_vector *vs, int count, int *wo * was woken, we don't return error and return this index to * userspace */ - *woken = unqueue_multiple(vs, i); + *woken = futex_unqueue_multiple(vs, i); if (*woken >= 0) return 1; @@ -544,7 +544,7 @@ int futex_wait_multiple(struct futex_vector *vs, unsigned int count, __set_current_state(TASK_RUNNING); - ret = unqueue_multiple(vs, count); + ret = futex_unqueue_multiple(vs, count); if (ret >= 0) return ret; From patchwork Wed Jul 12 00:47:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 118762 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp840402vqm; Tue, 11 Jul 2023 18:11:23 -0700 (PDT) X-Google-Smtp-Source: APBJJlGz117CQ3T3SlUzxf0LDIsdsMcjOZSZtbr4NAvKJL20iGS4WYFu/XYi05XBSQC2TQOCLVgq X-Received: by 2002:a17:90a:b397:b0:262:e3aa:fd73 with SMTP id e23-20020a17090ab39700b00262e3aafd73mr7044172pjr.17.1689124282643; Tue, 11 Jul 2023 18:11:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689124282; cv=none; d=google.com; s=arc-20160816; b=VGdnafRXb5bfGUFxFW2WDCDVXZ9tDl6GWPNLWv+cbflz180WDIekFW3Rq2QeHbw1Br Ie2fhaHAb09ObOgKBnN/gJcIluCJnQdUiI0ujsH4F1kPFO3e2nesEDmo5FM8MG1xJpTV kCdG0Ec92m8LkOxAW8nBbpJYV/qTYRvqykIZ9qbdX6VGmMH6FXoRJaqUZQw1/a3aP47y iC/FWrDP5POejyvMV4GtltdpEayM1WBwbUn517kzB6LKoEXEnGlJf3qc2KgmNLKKWy60 F23mCXF3+12LEHnnxJZg0jTtSPuS5fXADOO3Q1fJ/3mm1j9JkiNqrBwq9lns3dXcRiJE fHZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ybabf6Mx4VMuhxCixGmKPdJebzTyct2xBcgC4A4QTHE=; fh=VZL0Qt1KktOv+UhZSjoCyYNnYLdjRHfFbB26lR0lwsA=; b=C5i1EYI9RKR+pc2tyX6oWQ1erVaIiEifvW+FX08y5g/6+88dcrOoZ5985vEs6EEDSW r2WtqJ4Ruthds3e9QqV8pINV6O0oTJEf6dCPwrS5SPH54E1VkcoToFJF1/jlsDDF5+zc UKJoRykjqyZEQ2WK+t/xIAnhI+fTtLxFiKf0DzoFviyeceZlpjWmECWsRkpKAz4/Uo41 cVnEyz2elH9IF+BAYL7/H3zK0UpEftFbNJhx73ndiqckh6mIM3/yE2u5rUTes133zCG+ VFfEdkSUt7KxDBiegJqFcIN8oYSx5Bc9cfJVs1CdbcQe0VA+Eywwx8itRJkcmjFcUsf6 N7tw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=jplCC0xs; 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 gz4-20020a17090b0ec400b00263c23a5693si2321876pjb.13.2023.07.11.18.11.08; Tue, 11 Jul 2023 18:11:22 -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=@kernel-dk.20221208.gappssmtp.com header.s=20221208 header.b=jplCC0xs; 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 S231251AbjGLArh (ORCPT + 99 others); Tue, 11 Jul 2023 20:47:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231226AbjGLArY (ORCPT ); Tue, 11 Jul 2023 20:47:24 -0400 Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7AB611989 for ; Tue, 11 Jul 2023 17:47:21 -0700 (PDT) Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1b898cfa6a1so9141285ad.1 for ; Tue, 11 Jul 2023 17:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20221208.gappssmtp.com; s=20221208; t=1689122841; x=1689727641; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ybabf6Mx4VMuhxCixGmKPdJebzTyct2xBcgC4A4QTHE=; b=jplCC0xsZilG74DILpEjVEcJAUe8+fabKs3V5dzMOA/MRxevrMTrfCsq5J8kwB4it9 yaq6LQmO55fkvLM9PkUBtS8Vd+9hPjkLC/z+ctQwPYiD+IXWSn5VSM6ZOMB8w+S82lnN zJsNx2XDTbzxqfwZnAlQtzeb3c+aQ+7CPf4uEAoAY/3TnZ7CHx30kYV0pdFx8ugI2WpN +7zLN+EyS2SmVPA0PobdaLBphljLcWlQHCbTxGF33YU1BSOIkP1puvtC13xCFHSQ/FY5 pkAZ3E12S/zah08ptHaKyTMOQW92q0+qKaFslkh39kRHH1BXj2m+B66uV9mLDQa3gkro VN4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689122841; x=1689727641; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ybabf6Mx4VMuhxCixGmKPdJebzTyct2xBcgC4A4QTHE=; b=jYevEzIwdxb733gHiOArj6x9SZNnNV/Sl7Og+GgLRbW6V1KFAB0iBwfLPsX1Oh4A0S MTCSo7Z2Gq1U6CNHB5/lmi83btYgWWS7wjkCcC66CPGXmzMIPMf3K3HPGOnjiHmpEYgH MVTiAH60ioHpN9sOujvuT3PovflPA/R2xsR1F1ZH52j5nlORy10+SPe/svTtduFF7g9T 0WEelj2OChvAvJgjThHAzrMilMovqJgIbtToMm3Msv/kwTdO5DCvq2N/Vgi1h7SK2FEQ yNrsJfm0AjFa6ZnXGwY5KAh62FFbgiHUzpST+qxY9FqWGXD27igyx5akxXo5ki1qQMJl K45A== X-Gm-Message-State: ABy/qLZfxaFcP+BrL/nAxq0OV1r78RdN7fzCl8uNXi6a7ytFYSKw2zsR 7C+9zG+869V8F6aH3h/fxVClRA== X-Received: by 2002:a17:902:da92:b0:1b3:d8ac:8db3 with SMTP id j18-20020a170902da9200b001b3d8ac8db3mr21326390plx.6.1689122840987; Tue, 11 Jul 2023 17:47:20 -0700 (PDT) Received: from localhost.localdomain ([198.8.77.157]) by smtp.gmail.com with ESMTPSA id s8-20020a170902b18800b001b694140d96sm2543542plr.170.2023.07.11.17.47.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Jul 2023 17:47:20 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, peterz@infradead.org, Jens Axboe Subject: [PATCH 7/7] io_uring: add futex waitv Date: Tue, 11 Jul 2023 18:47:05 -0600 Message-Id: <20230712004705.316157-8-axboe@kernel.dk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230712004705.316157-1-axboe@kernel.dk> References: <20230712004705.316157-1-axboe@kernel.dk> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE 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: 1771175183584221857 X-GMAIL-MSGID: 1771175183584221857 Needs a bit of splitting and a few hunks should go further back (like the wake handler typedef). WIP, adds IORING_OP_FUTEX_WAITV - pass in an array of futex addresses, and wait on all of them until one of them triggers. Signed-off-by: Jens Axboe --- include/uapi/linux/io_uring.h | 1 + io_uring/futex.c | 165 +++++++++++++++++++++++++++++++--- io_uring/futex.h | 2 + io_uring/opdef.c | 11 +++ 4 files changed, 169 insertions(+), 10 deletions(-) diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index 3bd2d765f593..420f38675769 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -238,6 +238,7 @@ enum io_uring_op { IORING_OP_SENDMSG_ZC, IORING_OP_FUTEX_WAIT, IORING_OP_FUTEX_WAKE, + IORING_OP_FUTEX_WAITV, /* this goes last, obviously */ IORING_OP_LAST, diff --git a/io_uring/futex.c b/io_uring/futex.c index ff0f6b394756..b22120545d31 100644 --- a/io_uring/futex.c +++ b/io_uring/futex.c @@ -14,11 +14,16 @@ struct io_futex { struct file *file; - u32 __user *uaddr; + union { + u32 __user *uaddr; + struct futex_waitv __user *uwaitv; + }; int futex_op; unsigned int futex_val; unsigned int futex_flags; unsigned int futex_mask; + unsigned int futex_nr; + unsigned long futexv_owned; }; struct io_futex_data { @@ -45,6 +50,13 @@ void io_futex_cache_free(struct io_ring_ctx *ctx) io_alloc_cache_free(&ctx->futex_cache, io_futex_cache_entry_free); } +static void __io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts) +{ + req->async_data = NULL; + hlist_del_init(&req->hash_node); + io_req_task_complete(req, ts); +} + static void io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts) { struct io_futex_data *ifd = req->async_data; @@ -53,22 +65,59 @@ static void io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts) io_tw_lock(ctx, ts); if (!io_alloc_cache_put(&ctx->futex_cache, &ifd->cache)) kfree(ifd); - req->async_data = NULL; - hlist_del_init(&req->hash_node); - io_req_task_complete(req, ts); + __io_futex_complete(req, ts); } -static bool __io_futex_cancel(struct io_ring_ctx *ctx, struct io_kiocb *req) +static void io_futexv_complete(struct io_kiocb *req, struct io_tw_state *ts) { - struct io_futex_data *ifd = req->async_data; + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + struct futex_vector *futexv = req->async_data; + struct io_ring_ctx *ctx = req->ctx; + int res = 0; - /* futex wake already done or in progress */ - if (!futex_unqueue(&ifd->q)) + io_tw_lock(ctx, ts); + + res = futex_unqueue_multiple(futexv, iof->futex_nr); + if (res != -1) + io_req_set_res(req, res, 0); + + kfree(req->async_data); + req->flags &= ~REQ_F_ASYNC_DATA; + __io_futex_complete(req, ts); +} + +static bool io_futexv_claimed(struct io_futex *iof) +{ + return test_bit(0, &iof->futexv_owned); +} + +static bool io_futexv_claim(struct io_futex *iof) +{ + if (test_bit(0, &iof->futexv_owned) || + test_and_set_bit(0, &iof->futexv_owned)) return false; + return true; +} + +static bool __io_futex_cancel(struct io_ring_ctx *ctx, struct io_kiocb *req) +{ + /* futex wake already done or in progress */ + if (req->opcode == IORING_OP_FUTEX_WAIT) { + struct io_futex_data *ifd = req->async_data; + + if (!futex_unqueue(&ifd->q)) + return false; + req->io_task_work.func = io_futex_complete; + } else { + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + + if (!io_futexv_claim(iof)) + return false; + req->io_task_work.func = io_futexv_complete; + } hlist_del_init(&req->hash_node); io_req_set_res(req, -ECANCELED, 0); - req->io_task_work.func = io_futex_complete; io_req_task_work_add(req); return true; } @@ -124,7 +173,7 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) { struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); - if (unlikely(sqe->addr2 || sqe->buf_index || sqe->addr3)) + if (unlikely(sqe->buf_index || sqe->addr3)) return -EINVAL; iof->futex_op = READ_ONCE(sqe->fd); @@ -135,6 +184,53 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) if (iof->futex_flags & FUTEX_CMD_MASK) return -EINVAL; + iof->futexv_owned = 0; + return 0; +} + +static void io_futex_wakev_fn(struct wake_q_head *wake_q, struct futex_q *q) +{ + struct io_kiocb *req = q->wake_data; + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + + if (!io_futexv_claim(iof)) + return; + + __futex_unqueue(q); + smp_store_release(&q->lock_ptr, NULL); + + io_req_set_res(req, 0, 0); + req->io_task_work.func = io_futexv_complete; + io_req_task_work_add(req); +} + +int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) +{ + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + struct futex_vector *futexv; + int ret; + + ret = io_futex_prep(req, sqe); + if (ret) + return ret; + + iof->futex_nr = READ_ONCE(sqe->off); + if (!iof->futex_nr || iof->futex_nr > FUTEX_WAITV_MAX) + return -EINVAL; + + futexv = kcalloc(iof->futex_nr, sizeof(*futexv), GFP_KERNEL); + if (!futexv) + return -ENOMEM; + + ret = futex_parse_waitv(futexv, iof->uwaitv, iof->futex_nr, + io_futex_wakev_fn, req); + if (ret) { + kfree(futexv); + return ret; + } + + req->flags |= REQ_F_ASYNC_DATA; + req->async_data = futexv; return 0; } @@ -162,6 +258,55 @@ static struct io_futex_data *io_alloc_ifd(struct io_ring_ctx *ctx) return kmalloc(sizeof(struct io_futex_data), GFP_NOWAIT); } +int io_futex_waitv(struct io_kiocb *req, unsigned int issue_flags) +{ + struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); + struct futex_vector *futexv = req->async_data; + struct io_ring_ctx *ctx = req->ctx; + int ret, woken = -1; + + io_ring_submit_lock(ctx, issue_flags); + + ret = futex_wait_multiple_setup(futexv, iof->futex_nr, &woken); + + /* + * The above call leaves us potentially non-running. This is fine + * for the sync syscall as it'll be blocking unless we already got + * one of the futexes woken, but it obviously won't work for an async + * invocation. Mark is runnable again. + */ + __set_current_state(TASK_RUNNING); + + /* + * We got woken while setting up, let that side do the completion + */ + if (io_futexv_claimed(iof)) { +skip: + io_ring_submit_unlock(ctx, issue_flags); + return IOU_ISSUE_SKIP_COMPLETE; + } + + /* + * 0 return means that we successfully setup the waiters, and that + * nobody triggered a wakeup while we were doing so. < 0 or 1 return + * is either an error or we got a wakeup while setting up. + */ + if (!ret) { + hlist_add_head(&req->hash_node, &ctx->futex_list); + goto skip; + } + + io_ring_submit_unlock(ctx, issue_flags); + if (ret < 0) + req_set_fail(req); + else if (woken != -1) + ret = woken; + io_req_set_res(req, ret, 0); + kfree(futexv); + req->flags &= ~REQ_F_ASYNC_DATA; + return IOU_OK; +} + int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags) { struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex); diff --git a/io_uring/futex.h b/io_uring/futex.h index ddc9e0d73c52..7828e27e4184 100644 --- a/io_uring/futex.h +++ b/io_uring/futex.h @@ -3,7 +3,9 @@ #include "cancel.h" int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); +int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags); +int io_futex_waitv(struct io_kiocb *req, unsigned int issue_flags); int io_futex_wake(struct io_kiocb *req, unsigned int issue_flags); #if defined(CONFIG_FUTEX) diff --git a/io_uring/opdef.c b/io_uring/opdef.c index c9f23c21a031..2034acfe10d0 100644 --- a/io_uring/opdef.c +++ b/io_uring/opdef.c @@ -443,6 +443,14 @@ const struct io_issue_def io_issue_defs[] = { .issue = io_futex_wake, #else .prep = io_eopnotsupp_prep, +#endif + }, + [IORING_OP_FUTEX_WAITV] = { +#if defined(CONFIG_FUTEX) + .prep = io_futexv_prep, + .issue = io_futex_waitv, +#else + .prep = io_eopnotsupp_prep, #endif }, }; @@ -670,6 +678,9 @@ const struct io_cold_def io_cold_defs[] = { [IORING_OP_FUTEX_WAKE] = { .name = "FUTEX_WAKE", }, + [IORING_OP_FUTEX_WAITV] = { + .name = "FUTEX_WAITV", + }, }; const char *io_uring_get_opcode(u8 opcode)