Received: by 2002:ab2:69cc:0:b0:1f4:be93:e15a with SMTP id n12csp1779191lqp; Mon, 15 Apr 2024 18:11:13 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWXO2TD4pxdFnztLNwrcDp0oFrJsCp0vNxs5iWfJn0GM+1rqICRf1BVe8SLpzpmntwzImiSvIQKqJCPbVppShL8X8j8uPX9kRsr4Cildw== X-Google-Smtp-Source: AGHT+IGEbyH9qRFIznGwui2ThvrbkJgeVrOi2mJ70uMjhxxvcdIbn9YfyY64CxlS8avaIhZHhKm8 X-Received: by 2002:a05:620a:b0f:b0:78d:7612:3355 with SMTP id t15-20020a05620a0b0f00b0078d76123355mr12271968qkg.3.1713229873408; Mon, 15 Apr 2024 18:11:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1713229873; cv=pass; d=google.com; s=arc-20160816; b=0PltJNN/MeVjBlrvaxRgVRE+Bm+TvPqzLN/3qw0HHp0QkVM6uUuO8AeXil9sZBOj7D 7S7LAuaL3RJTPdHp/SpbM0ZYAldRoHuAuk6+pvYYMIwsgi5taYh5wJdBcE4T8I+J9ZQg wgSqL1MH6Xnx3ZxbuRKYPavjY8P99W1hwHj6LB8sNbWwjP2jrrWBgPw6G2Qp+HYWrwi2 weB7rEUjlJmujSNFKf66prrQM2hB+G4j2EIf2pjPfDyreuShmlSLuOhQAUo6j6cIJDx1 mnfOLVeNEXolLsVLslVdrk5RW5pcSWVbezUmKyhsFgthaj+2Pa8wXJU1BN/UXifbKNVZ 5ROA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=W+i/4Tm5fzFDs0G6pROKKJsrD/qfJkZXPY0XHK3LoIs=; fh=eVY06L/C5FDTmF2RNqfudsnjwkB3tbhT/y33cGhZc0I=; b=gu58Uu9cKz2mvFOpQi7ipj/0+Vus6JogTyhzjcB1CYX/kA0d33KhPSZIJL8GSmcqmi tMJk10dkKrATr9GstEW1m4OQEYN54sG6kNBgfXycchDTGxqge0z1XTirZMUus5985uqe ZlCuOndmwqeCRn/k92K2xopX70VM4VHfbdKoy79EGAnGZAKIlVxV8W+jXGiLUKbK4rVO sipFAkCaqvIeZ/bF5YAOzrYPSfs868Ce7H9NaHcu9kG11lvnc+lVLmWvPmrswx9R/DMw TUHINHR9hzW90a/pYDu543iRLcx4ucOx6x7k+ZIM3jrt8JV/r+5fmHL596rY0CfvwrEa wupg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@codeweavers.com header.s=s1 header.b=Fz4VEKnG; arc=pass (i=1 spf=pass spfdomain=codeweavers.com dkim=pass dkdomain=codeweavers.com dmarc=pass fromdomain=codeweavers.com); spf=pass (google.com: domain of linux-kernel+bounces-146054-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-146054-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=codeweavers.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id xx2-20020a05620a5d8200b0078ed0b331d1si8289812qkn.431.2024.04.15.18.11.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 18:11:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-146054-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@codeweavers.com header.s=s1 header.b=Fz4VEKnG; arc=pass (i=1 spf=pass spfdomain=codeweavers.com dkim=pass dkdomain=codeweavers.com dmarc=pass fromdomain=codeweavers.com); spf=pass (google.com: domain of linux-kernel+bounces-146054-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-146054-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=codeweavers.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 278221C2139A for ; Tue, 16 Apr 2024 01:11:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4576E1862C; Tue, 16 Apr 2024 01:10:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeweavers.com header.i=@codeweavers.com header.b="Fz4VEKnG" Received: from mail.codeweavers.com (mail.codeweavers.com [4.36.192.163]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADD2E3D7A; Tue, 16 Apr 2024 01:10:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=4.36.192.163 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713229830; cv=none; b=s7EtVq+9ZXHpR9SNWlizu4+BVc1chN3ty40LzkbwfMxjNzkxbgYMF7s1tOVwDyy7MwyK6FgIB0STMJCpH3Vfg1j/Bg3FNjKr3YWYJzSrZA9Utg2cU87m4dhuBM28keXzrq1Yu07sx7LRQQuqIDEXvxvXMhsClX5yY5Q01vKysU4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713229830; c=relaxed/simple; bh=ZpmXc+jo5vS+063ZnNDqudgU3KZ6+0rnGyQbe6US0Lg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W6MykMUHT47bLriw+1kd6jkglSFQNnYp/0HvjwzB7rltB+cAb5NIRfOT9xQqwbe+vS35fWw7hByDNsqXlU76264vNGQZA1cRPorl3zKm44ATMfrl9rGzzL/W9M+bSnK7C9oIj22s11aLSc1AEOnslRsmJc0s7V272q1jaVTjeqU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeweavers.com; spf=pass smtp.mailfrom=codeweavers.com; dkim=pass (2048-bit key) header.d=codeweavers.com header.i=@codeweavers.com header.b=Fz4VEKnG; arc=none smtp.client-ip=4.36.192.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeweavers.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeweavers.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=codeweavers.com; s=s1; h=Message-ID:Date:Subject:Cc:To:From:Sender; bh=W+i/4Tm5fzFDs0G6pROKKJsrD/qfJkZXPY0XHK3LoIs=; b=Fz4VEKnGfmwqKuMW91YzrhJCJ9 nIq96GoPO6g3ekQ883KmBc0UF9rzPMQ3pm9Tkn7hr3ow3SXOwxLMp+cv5x/+KCVVKPtFVHDo0zZJ4 SqEjiBj9lHTYXf5KcnrkD55MU83dD7mEGq6Cu+MFnqZUwpBFzPHs/JSQWM3JFQqzyTx4pl8TBjaNC 9R8jBAMXCS4lmAJhIj9u0NhMYS7RlxioqyiOIDOvSjreWhwe6bkmT91asx8DFNy0FGtifzkO8XSVI t7ewCXikhFjUMcB9Vinx1Hjh+OqSBebXPHcFTNVAu2BX7VRI1CJ4OsyKNt5dTPFGe+QmCSivCYTXf Zy9RL4BQ==; Received: from cw137ip160.mn.codeweavers.com ([10.69.137.160] helo=camazotz.mn.codeweavers.com) by mail.codeweavers.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1rwXKy-00FbQv-2n; Mon, 15 Apr 2024 20:10:16 -0500 From: Elizabeth Figura To: Arnd Bergmann , Greg Kroah-Hartman , Jonathan Corbet , Shuah Khan Cc: linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, wine-devel@winehq.org, =?UTF-8?q?Andr=C3=A9=20Almeida?= , Wolfram Sang , Arkadiusz Hiler , Peter Zijlstra , Andy Lutomirski , linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Randy Dunlap , Ingo Molnar , Will Deacon , Waiman Long , Boqun Feng , Elizabeth Figura Subject: [PATCH v4 04/27] ntsync: Introduce NTSYNC_IOC_MUTEX_UNLOCK. Date: Mon, 15 Apr 2024 20:08:14 -0500 Message-ID: <20240416010837.333694-5-zfigura@codeweavers.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240416010837.333694-1-zfigura@codeweavers.com> References: <20240416010837.333694-1-zfigura@codeweavers.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit This corresponds to the NT syscall NtReleaseMutant(). This syscall decrements the mutex's recursion count by one, and returns the previous value. If the mutex is not owned by the given owner ID, the function instead fails and returns -EPERM. Signed-off-by: Elizabeth Figura --- drivers/misc/ntsync.c | 64 +++++++++++++++++++++++++++++++++++++ include/uapi/linux/ntsync.h | 1 + 2 files changed, 65 insertions(+) diff --git a/drivers/misc/ntsync.c b/drivers/misc/ntsync.c index 173513aeeacc..f7911ef78d5b 100644 --- a/drivers/misc/ntsync.c +++ b/drivers/misc/ntsync.c @@ -315,6 +315,68 @@ static int ntsync_sem_post(struct ntsync_obj *sem, void __user *argp) return ret; } +/* + * Actually change the mutex state, returning -EPERM if not the owner. + */ +static int unlock_mutex_state(struct ntsync_obj *mutex, + const struct ntsync_mutex_args *args) +{ + lockdep_assert_held(&mutex->lock); + + if (mutex->u.mutex.owner != args->owner) + return -EPERM; + + if (!--mutex->u.mutex.count) + mutex->u.mutex.owner = 0; + return 0; +} + +static int ntsync_mutex_unlock(struct ntsync_obj *mutex, void __user *argp) +{ + struct ntsync_mutex_args __user *user_args = argp; + struct ntsync_device *dev = mutex->dev; + struct ntsync_mutex_args args; + __u32 prev_count; + int ret; + + if (copy_from_user(&args, argp, sizeof(args))) + return -EFAULT; + if (!args.owner) + return -EINVAL; + + if (mutex->type != NTSYNC_TYPE_MUTEX) + return -EINVAL; + + if (atomic_read(&mutex->all_hint) > 0) { + spin_lock(&dev->wait_all_lock); + spin_lock_nest_lock(&mutex->lock, &dev->wait_all_lock); + + prev_count = mutex->u.mutex.count; + ret = unlock_mutex_state(mutex, &args); + if (!ret) { + try_wake_all_obj(dev, mutex); + try_wake_any_mutex(mutex); + } + + spin_unlock(&mutex->lock); + spin_unlock(&dev->wait_all_lock); + } else { + spin_lock(&mutex->lock); + + prev_count = mutex->u.mutex.count; + ret = unlock_mutex_state(mutex, &args); + if (!ret) + try_wake_any_mutex(mutex); + + spin_unlock(&mutex->lock); + } + + if (!ret && put_user(prev_count, &user_args->count)) + ret = -EFAULT; + + return ret; +} + static int ntsync_obj_release(struct inode *inode, struct file *file) { struct ntsync_obj *obj = file->private_data; @@ -334,6 +396,8 @@ static long ntsync_obj_ioctl(struct file *file, unsigned int cmd, switch (cmd) { case NTSYNC_IOC_SEM_POST: return ntsync_sem_post(obj, argp); + case NTSYNC_IOC_MUTEX_UNLOCK: + return ntsync_mutex_unlock(obj, argp); default: return -ENOIOCTLCMD; } diff --git a/include/uapi/linux/ntsync.h b/include/uapi/linux/ntsync.h index cd7841cdba49..fa2c9f638d77 100644 --- a/include/uapi/linux/ntsync.h +++ b/include/uapi/linux/ntsync.h @@ -43,5 +43,6 @@ struct ntsync_wait_args { #define NTSYNC_IOC_CREATE_MUTEX _IOWR('N', 0x84, struct ntsync_sem_args) #define NTSYNC_IOC_SEM_POST _IOWR('N', 0x81, __u32) +#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args) #endif -- 2.43.0