Received: by 2002:ab2:b82:0:b0:1f3:401:3cfb with SMTP id 2csp791443lqh; Thu, 28 Mar 2024 17:24:52 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXMixXBMMSkfevIonGK+7btbCEzgkIs4VQdhcRDkfLePU/R+mTZfODbvu9SngC11px/LK5eM3cqbBeNePMy2YHXROW/CYgEQ1azuc6eog== X-Google-Smtp-Source: AGHT+IHlh8PsmAJCIaM1S9hGXqp0bTSytD/Rtzu3hPZW028TPd7z1abtLikGVsR82PIKr7hUSRFd X-Received: by 2002:a0c:e38b:0:b0:696:8e81:77d8 with SMTP id a11-20020a0ce38b000000b006968e8177d8mr964052qvl.20.1711671892308; Thu, 28 Mar 2024 17:24:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711671892; cv=pass; d=google.com; s=arc-20160816; b=LjAc7Hpuh9sMrKaxxrj0oN/u4xxPv3vbTdrirZSGh0wWmGlleka9Sby9pGgr12gZ54 aOFjoiXWenWzj9UjbYq72S/34mboyoGUlc3kIUQiNLGbbH327KjLeboao7gDNuSx8prT Fn/OCnmG15YyshiWNTGW7N+tWZCi4nvZki6mJ3YIoIp7eIXW1co3ZOK5eaz77FmbkDEv i7j7IUz51sgBWfLNhtyhLBDE9jhSKBmNL2/O4WR1lkmqTzVmvuCp54QpMp+oviZmerm/ Br0UdA6YTzJlFZaITseW3XcwgSuDP+N3tx5+0L+so8EZS3kkoaqgBClL90xSc9gsKjW+ O87Q== 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=hR3Xqo6s6FufP5gEw1XgbtLHrluZu7hd5XGp+hLIfiM=; b=n6h8R44qQsxfT2jp2G3+aQ7AASBuANPbzCxLi5v9trJE3hz8plP3rxasPvgOTPwihs 9+OPZlABrJz58vGavRCfP98MSRSJ3Imu2darrmTTk2a900IdG/qpPkwXdRMcAjoH0lmP dEIE5TBULkvNGQrS1qzjwBq3TJZ/jmEPrQKkwyYQWF7I7WEMRi+GjdCOCYtxw+M5cz8k FuS2N5QJLxPHCzw4uf7nNZbFzq3COEXicMJ2x5oST6BpBKyRlpp1k25BWbjWCxvBNwvY 6bPlOfKl4cMV7piLGHoVYUlJ0MyNrQkNDCgxSfKofQcjxiDnNVGNXEl+aBKBEXR/HYcu UivQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@codeweavers.com header.s=s1 header.b=TYpTxjOD; 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-123884-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-123884-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. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id n23-20020a05620a223700b00789d71be408si2518919qkh.441.2024.03.28.17.24.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Mar 2024 17:24:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-123884-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@codeweavers.com header.s=s1 header.b=TYpTxjOD; 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-123884-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-123884-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 0F4EA1C23CB2 for ; Fri, 29 Mar 2024 00:24:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A99F01E877; Fri, 29 Mar 2024 00:23:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeweavers.com header.i=@codeweavers.com header.b="TYpTxjOD" 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 7328D101E2; Fri, 29 Mar 2024 00:23:37 +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=1711671818; cv=none; b=SM9HTM2RLx4wukhl8zFJMLNEjcSW8cSvt1H0VWXJ7WhcL6xmiLC1tXOdoyP0OJm7HnOPWNEO1kCntYPgjvhcLwUnh8bU8yAcN2rppv07uCjZJiHBL/ryHhDN+iM9oxsnmPGoj760TcWRlz1i5rfsMaKyi69bm3yqDQwDhs1no0Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711671818; c=relaxed/simple; bh=ZpmXc+jo5vS+063ZnNDqudgU3KZ6+0rnGyQbe6US0Lg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=urhXmkhSWGN+gZ2S8/aMFEPW8Wvhx9nmeftkmMEMmh12DEjvgMeU65yQ77ersx99ziQfrGaEJjhJkRXh1rDrg+GlkDRoFAlcXoih/S3f2ZbWS1iSd5d3+NMVpghn1m1R3ddiwVUjcyrxDTChRyn1Qlk6xq/1F+tO+LrBgWvxgVs= 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=TYpTxjOD; 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=TYpTxjODBC777Wsva+xH5yvFw7 0aatHpZnaPsCgMBGpqk/HmtRj4XI6hW+r13raO2TvVN0EA4lPn20h5nxLSnr4tKARd51HUcSwRmrF cmnRLwUDjpXVy4IKisau0W/k+vX4Jg2nQJdUY6kLIYFBCwroyabCq03lglGpIChw6YzOH02UObIe2 fZfo6+fDIS6SEDOiY7imVSCFtEjLczfpmdQATLBkSRvB9b+Zh8R//c5wwirsTZbgg4eqXXphZvOmY b6qtmnIpzYU97N2SVrkXJPb0y//RqBy92hkwfCF7fDxg2hyGpTBke/bIqP7x/xNBtZGW3AcjBA6vl AaRqLjKg==; 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 1rpzlN-000iik-0N; Thu, 28 Mar 2024 19:06:29 -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 , Elizabeth Figura Subject: [PATCH v3 07/30] ntsync: Introduce NTSYNC_IOC_MUTEX_UNLOCK. Date: Thu, 28 Mar 2024 19:05:58 -0500 Message-ID: <20240329000621.148791-8-zfigura@codeweavers.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240329000621.148791-1-zfigura@codeweavers.com> References: <20240329000621.148791-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