From nobody Fri Jun 17 19:37:08 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 0534785A69D; Fri, 17 Jun 2022 19:37:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (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-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LPq785TpCz3PDx; Fri, 17 Jun 2022 19:37:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494629; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8xz0cS+TblwM0i1iPtlIR2HMXy0uxZyb756WpkZG83c=; b=brFqP/nmdzJLGGG2mgthZhiGNiXOTcK+HP7M1+Xl7lcUp+gGHxfuAKz9zhTOMi4fZdb4JZ oQ9cfqywoaQQDAxs/6wo+e8xM9SoSdOulCqP1MKysITIgb/AYRLbiEd9rjlTnOkGoZ0hSt /E0L1RjWR9Tr/+eohcXi9D9om8CxOdd/hac7yArooBkr9JjYC4Pd3hygH58EfSVyUDPzeL wmqkI05nK6JFjhuqDLyShTg7EcFWXOnO2pl5x+xhcpJtfs+v+KZvj+Njpy+9p7eAoOceNw 9pLjpBON7E86LLDcORzlbEzV5ivHDMvNkgHBnl9MMW6oY0vISkM5hzLbtNCEEg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 88EB925AB4; Fri, 17 Jun 2022 19:37:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25HJb8uP012955; Fri, 17 Jun 2022 19:37:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25HJb86R012954; Fri, 17 Jun 2022 19:37:08 GMT (envelope-from git) Date: Fri, 17 Jun 2022 19:37:08 GMT Message-Id: <202206171937.25HJb86R012954@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dmitry Chagin Subject: git: 062cd27d0e77 - stable/13 - linux(4): Factor out the FUTEX_WAKE_OP op into linux_futex_wakeop(). List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 062cd27d0e77f255c4172acba2fae4335ac022dc Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494629; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=8xz0cS+TblwM0i1iPtlIR2HMXy0uxZyb756WpkZG83c=; b=mYVKzZJoGkr6xnPN2Rs15/+wgM773weIuWEzxlpGG9PnY22vHkfih2KTeRf6HoCBAZf47L 1ktmSXsg0o61dyLT0gkiErWVSt/PVv2NdWE6nK8A/PLnE1an8XrDnlHlK7pX0kkgg5nTAi mp7kaJhge7fxg9q6mbPciQPkqrm4IqSwsmAtGq/gfxeN8WHykc5My/HrgHQvLs+3XJQT1G cskrOv9WvBlcMWCj3Sn36kC8j/hyoIW5e5agqgYKhk0HJFpWokMbLjLvdfgS3WuvL6I+Qw APuXNUa7X+Q8mo5/bCp0dkYs1GsSRmcG9U7Da9/dHHKHLcakeZW8T8fSeaxWtw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655494629; a=rsa-sha256; cv=none; b=UitwaqkJV3FGOYHJhCpiCj57PudLMxrDG2bzAKUAefM0dAcrAoEC7Y+oG7WB6KAra0yHH5 4G3nExvQiuJ1NP7JxUqwolp9Q580SEz008ttr7wqgmhSjCF6M7U0nHWIwlSUNMv+RIXo2Q UsAjqR+gkbBu7XjZRfZU6yj0tkJIbnEZdHFl8Vw3GkYOj6g3eTBzzaOIfbcIbdsg1FX0lw 6l/AtXbGh1slb4p25DnkWK1JRYiQ+uzG7433+uFwdeVHo9UpM/rjsy4n5TeS4FH1tJoIbm vwobwZMW20VVevq6Byiey3s9LenvGx3IA4EnTBeSg4N4aprb5wDGPcIkQJGY/w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=062cd27d0e77f255c4172acba2fae4335ac022dc commit 062cd27d0e77f255c4172acba2fae4335ac022dc Author: Dmitry Chagin AuthorDate: 2021-07-20 11:38:44 +0000 Commit: Dmitry Chagin CommitDate: 2022-06-17 19:33:11 +0000 linux(4): Factor out the FUTEX_WAKE_OP op into linux_futex_wakeop(). MFC after: 2 weeks (cherry picked from commit 4c361d7a5acc04f3da304a605855e23774449204) --- sys/compat/linux/linux_futex.c | 130 +++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 64 deletions(-) diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c index 71ea8e320d73..1ba11ed3fc57 100644 --- a/sys/compat/linux/linux_futex.c +++ b/sys/compat/linux/linux_futex.c @@ -241,6 +241,7 @@ static int linux_futex(struct thread *, struct linux_futex_args *); static int linux_futex_wait(struct thread *, struct linux_futex_args *); static int linux_futex_wake(struct thread *, struct linux_futex_args *); static int linux_futex_requeue(struct thread *, struct linux_futex_args *); +static int linux_futex_wakeop(struct thread *, struct linux_futex_args *); static void futex_put(struct futex *f, struct waiting_proc *wp) @@ -646,11 +647,7 @@ futex_atomic_op(struct thread *td, int encoded_op, uint32_t *uaddr) static int linux_futex(struct thread *td, struct linux_futex_args *args) { - int nrwake, op_ret, ret; struct linux_pemuldata *pem; - struct futex *f, *f2; - int error, save; - uint32_t val; if (args->op & LINUX_FUTEX_PRIVATE_FLAG) { args->flags = 0; @@ -673,9 +670,6 @@ linux_futex(struct thread *td, struct linux_futex_args *args) return (ENOSYS); } - error = 0; - f = f2 = NULL; - switch (args->op) { case LINUX_FUTEX_WAIT: args->val3 = FUTEX_BITSET_MATCH_ANY; @@ -720,62 +714,7 @@ linux_futex(struct thread *td, struct linux_futex_args *args) args->uaddr, args->val, args->uaddr2, args->val3, args->ts); - if (args->uaddr == args->uaddr2) - return (EINVAL); - -retry2: - error = futex_get(args->uaddr, NULL, &f, - args->flags | FUTEX_DONTLOCK); - if (error) - return (error); - - error = futex_get(args->uaddr2, NULL, &f2, - args->flags | FUTEX_DONTLOCK); - if (error) { - futex_put(f, NULL); - return (error); - } - futex_lock(f); - futex_lock(f2); - - /* - * This function returns positive number as results and - * negative as errors - */ - save = vm_fault_disable_pagefaults(); - op_ret = futex_atomic_op(td, args->val3, args->uaddr2); - vm_fault_enable_pagefaults(save); - - LINUX_CTR2(sys_futex, "WAKE_OP atomic_op uaddr %p ret 0x%x", - args->uaddr, op_ret); - - if (op_ret < 0) { - if (f2 != NULL) - futex_put(f2, NULL); - futex_put(f, NULL); - error = copyin(args->uaddr2, &val, sizeof(val)); - if (error == 0) - goto retry2; - return (error); - } - - ret = futex_wake(f, args->val, args->val3); - - if (op_ret > 0) { - op_ret = 0; - nrwake = (int)(unsigned long)args->ts; - - if (f2 != NULL) - op_ret += futex_wake(f2, nrwake, args->val3); - else - op_ret += futex_wake(f, nrwake, args->val3); - ret += op_ret; - } - if (f2 != NULL) - futex_put(f2, NULL); - futex_put(f, NULL); - td->td_retval[0] = ret; - break; + return (linux_futex_wakeop(td, args)); case LINUX_FUTEX_LOCK_PI: /* not yet implemented */ @@ -854,8 +793,71 @@ retry2: args->op); return (ENOSYS); } +} - return (error); +static int +linux_futex_wakeop(struct thread *td, struct linux_futex_args *args) +{ + int nrwake, op_ret, ret; + struct futex *f, *f2; + int error, save; + uint32_t val; + + if (args->uaddr == args->uaddr2) + return (EINVAL); + +retry: + f = f2 = NULL; + error = futex_get(args->uaddr, NULL, &f, args->flags | FUTEX_DONTLOCK); + if (error != 0) + return (error); + + error = futex_get(args->uaddr2, NULL, &f2, args->flags | FUTEX_DONTLOCK); + if (error != 0) { + futex_put(f, NULL); + return (error); + } + futex_lock(f); + futex_lock(f2); + + /* + * This function returns positive number as results and + * negative as errors + */ + save = vm_fault_disable_pagefaults(); + op_ret = futex_atomic_op(td, args->val3, args->uaddr2); + vm_fault_enable_pagefaults(save); + + LINUX_CTR2(sys_futex, "WAKE_OP atomic_op uaddr %p ret 0x%x", + args->uaddr, op_ret); + + if (op_ret < 0) { + if (f2 != NULL) + futex_put(f2, NULL); + futex_put(f, NULL); + error = copyin(args->uaddr2, &val, sizeof(val)); + if (error == 0) + goto retry; + return (error); + } + + ret = futex_wake(f, args->val, args->val3); + + if (op_ret > 0) { + op_ret = 0; + nrwake = (int)(unsigned long)args->ts; + + if (f2 != NULL) + op_ret += futex_wake(f2, nrwake, args->val3); + else + op_ret += futex_wake(f, nrwake, args->val3); + ret += op_ret; + } + if (f2 != NULL) + futex_put(f2, NULL); + futex_put(f, NULL); + td->td_retval[0] = ret; + return (0); } static int