From nobody Mon May 12 17:46:47 2025 X-Original-To: dev-commits-src-main@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 4Zx6Vb4dM6z5wKPl; Mon, 12 May 2025 17:46:47 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zx6Vb43wWz3gRx; Mon, 12 May 2025 17:46:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747072007; 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=Ic4f4tFFo5a8RWKkX2q+Bs7ywKFb9oXNCV3LWS1bPaM=; b=DAi/AZkvIyAp4kgVgjiM5vpuCfXB27l+CO1ceVcZaNRgVcWeC91nyjOgH89WoSmwOEYxbM W9Ys0I6kbaHe/vPC7jOxzaNaSC+GOB6YTYkxYyfjDYQ0PpgSbsQCBqTgHUSqPws7JzH+br gkNoIzgdjwwpn8LhrjUzO7c4fukBY97r3tPiG/zB0QC/6IJLo6vVHSTFixEKBEhnumiadC 9nWz+WJ4YlnRI6dDWu4E9kALlUjnDjaA4PPgONF78058rS5tjk7Gl/jVRScci52wqz7Br+ 4QIU7FyrxK4YeaaHvNhzHvX48EdkcplzP1ovuRW1NpTcJN6QQDI+ripeR9H5JQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1747072007; 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=Ic4f4tFFo5a8RWKkX2q+Bs7ywKFb9oXNCV3LWS1bPaM=; b=AiXmND/kniVjoJoDvOmo9yBwcsFJ/fNPYgKogeGb8NGLQsIrjvxzlAzW2vuoER8lb8BgZ0 960WVDAjmilqkMn9owZ2l/QLJmzkaHrqmYVrE5ZrO41l+MMCACiXmTAmcUzyQZzGAElx+A CUoogVAwToQEwxTgC91zWVywsIrNMlko0Lvs1lVyGKaWhMWkPrTxGwGlUFBGc7k8yDn32F DooN7BdSNMpad5+hYHTJu9/tCNDWsXApjloEZhH9d8cnDXhyfedsk3jUXZ82ed3K2xfOPs 8q5wcTHPUxS5o41Myc6CPyyIO/P5KxBKJrVkbaeDIwrK0pFDPdHOVP/KamBhVQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1747072007; a=rsa-sha256; cv=none; b=NPOwW7CB9NRkrsxAC/KBm5RXg18CVSiFt6hlSP5D972YEb3KXb7ieUGnGfTQkb8xGJfvfJ G5H+V5eWSgtCLjZnTcl1L3HL79AEB6Sdz65CX1ZlNX8G1+74lwe+6lSt2bKomHOBhhPSLE yh/OhpMgrubZtcD3kuIRwd0NdOpz+wlbHdSCk+2C5KCVGiqYH8oD4btcAEw/qod8ek10OQ lipqAlHl0qU0K7XIPOIY4ZV084UHJF+4+yexj73hf4+2Jc/1lQXY4wVkqy4QRH9TfFTovm qwjALwQ+WleSOYhXF+pVjxfrd1/xyiRCKyDHtzg8GHtJqYtymWceBR2yERlMew== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4Zx6Vb3K8cz1QCj; Mon, 12 May 2025 17:46:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54CHklfT035202; Mon, 12 May 2025 17:46:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54CHklNh035199; Mon, 12 May 2025 17:46:47 GMT (envelope-from git) Date: Mon, 12 May 2025 17:46:47 GMT Message-Id: <202505121746.54CHklNh035199@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Jean-S=C3=A9bastien?= =?utf-8?Q?P=C3=A9dron?= Subject: git: 6d720cdfe735 - main - linuxkpi: Add `woken_wake_function()` and `wait_woken()` List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dumbbell X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6d720cdfe7350d1eed620f1456bbe76ead708c30 Auto-Submitted: auto-generated The branch main has been updated by dumbbell: URL: https://cgit.FreeBSD.org/src/commit/?id=6d720cdfe7350d1eed620f1456bbe76ead708c30 commit 6d720cdfe7350d1eed620f1456bbe76ead708c30 Author: Jean-Sébastien Pédron AuthorDate: 2024-12-27 21:43:59 +0000 Commit: Jean-Sébastien Pédron CommitDate: 2025-05-12 17:08:02 +0000 linuxkpi: Add `woken_wake_function()` and `wait_woken()` They are used by the i915 DRM driver starting with Linux 6.7. `(struct wait_queue)->flags` is no longer always zero. I wonder if some code relied on this... Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D48755 --- sys/compat/linuxkpi/common/include/linux/wait.h | 14 ++++-- sys/compat/linuxkpi/common/src/linux_schedule.c | 59 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/wait.h b/sys/compat/linuxkpi/common/include/linux/wait.h index bd496793e27e..03ddce2c06f5 100644 --- a/sys/compat/linuxkpi/common/include/linux/wait.h +++ b/sys/compat/linuxkpi/common/include/linux/wait.h @@ -61,12 +61,14 @@ typedef struct wait_queue_head wait_queue_head_t; typedef int wait_queue_func_t(wait_queue_t *, unsigned int, int, void *); +#define WQ_FLAG_WOKEN 0x02 + /* * Many API consumers directly reference these fields and those of * wait_queue_head. */ struct wait_queue { - unsigned int flags; /* always 0 */ + unsigned int flags; void *private; wait_queue_func_t *func; union { @@ -87,8 +89,14 @@ struct wait_queue_head { * This function is referenced by at least one DRM driver, so it may not be * renamed and furthermore must be the default wait queue callback. */ -extern wait_queue_func_t autoremove_wake_function; -extern wait_queue_func_t default_wake_function; +wait_queue_func_t autoremove_wake_function; +wait_queue_func_t default_wake_function; +wait_queue_func_t woken_wake_function; + +long linux_wait_woken(wait_queue_t *wq, unsigned state, long timeout); + +#define wait_woken(wq, state, timeout) \ + linux_wait_woken((wq), (state), (timeout)) #define DEFINE_WAIT_FUNC(name, function) \ wait_queue_t name = { \ diff --git a/sys/compat/linuxkpi/common/src/linux_schedule.c b/sys/compat/linuxkpi/common/src/linux_schedule.c index 3f3605096d62..c6b7a2ebbd66 100644 --- a/sys/compat/linuxkpi/common/src/linux_schedule.c +++ b/sys/compat/linuxkpi/common/src/linux_schedule.c @@ -200,6 +200,65 @@ default_wake_function(wait_queue_t *wq, unsigned int state, int flags, return (wake_up_task(wq->private, state)); } +long +linux_wait_woken(wait_queue_t *wq, unsigned state, long timeout) +{ + void *wchan; + struct task_struct *task; + int ret; + int remainder; + + task = current; + wchan = wq->private; + + remainder = jiffies + timeout; + + set_task_state(task, state); + + sleepq_lock(wchan); + if (!(wq->flags & WQ_FLAG_WOKEN)) { + ret = linux_add_to_sleepqueue(wchan, task, "woken", + timeout, state); + } else { + sleepq_release(wchan); + ret = 0; + } + + set_task_state(task, TASK_RUNNING); + wq->flags &= ~WQ_FLAG_WOKEN; + + if (timeout == MAX_SCHEDULE_TIMEOUT) + return (MAX_SCHEDULE_TIMEOUT); + + /* range check return value */ + remainder -= jiffies; + + /* range check return value */ + if (ret == -ERESTARTSYS && remainder < 1) + remainder = 1; + else if (remainder < 0) + remainder = 0; + else if (remainder > timeout) + remainder = timeout; + return (remainder); +} + +int +woken_wake_function(wait_queue_t *wq, unsigned int state, + int flags __unused, void *key __unused) +{ + void *wchan; + + wchan = wq->private; + + sleepq_lock(wchan); + wq->flags |= WQ_FLAG_WOKEN; + sleepq_signal(wchan, SLEEPQ_SLEEP, 0, 0); + sleepq_release(wchan); + + return (1); +} + void linux_init_wait_entry(wait_queue_t *wq, int flags) {