From owner-dev-commits-src-all@freebsd.org Thu Jan 7 23:20:58 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 7EA164DEB4C; Thu, 7 Jan 2021 23:20:53 +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 "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4DBj044pjXz4ShW; Thu, 7 Jan 2021 23:20:52 +0000 (UTC) (envelope-from git@FreeBSD.org) 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 DA68719276; Thu, 7 Jan 2021 23:20:51 +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 107NKpgI063392; Thu, 7 Jan 2021 23:20:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 107NKpIK063391; Thu, 7 Jan 2021 23:20:51 GMT (envelope-from git) Date: Thu, 7 Jan 2021 23:20:51 GMT Message-Id: <202101072320.107NKpIK063391@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Vladimir Kondratyev Subject: git: 3b8c8b35de3a - main - evdev: Allow open() handler to be interrupted by a signal MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: wulf X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3b8c8b35de3a1a8a24169d144189b6a4db82ce10 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jan 2021 23:21:00 -0000 The branch main has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=3b8c8b35de3a1a8a24169d144189b6a4db82ce10 commit 3b8c8b35de3a1a8a24169d144189b6a4db82ce10 Author: Vladimir Kondratyev AuthorDate: 2020-04-21 22:38:14 +0000 Commit: Vladimir Kondratyev CommitDate: 2021-01-07 23:18:42 +0000 evdev: Allow open() handler to be interrupted by a signal It is possible that the client list lock is taken by other process for too long due to e.g. IO timeouts. Allow user to terminate open() in this case. Reviewed by: markj (as part of D27865) --- sys/dev/evdev/cdev.c | 11 ++++++----- sys/dev/evdev/evdev_private.h | 9 +++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/sys/dev/evdev/cdev.c b/sys/dev/evdev/cdev.c index c4550362ebce..ec60a12dbf2d 100644 --- a/sys/dev/evdev/cdev.c +++ b/sys/dev/evdev/cdev.c @@ -126,19 +126,20 @@ evdev_open(struct cdev *dev, int oflags, int devtype, struct thread *td) mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF); knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx); + ret = EVDEV_LIST_LOCK_SIG(evdev); + if (ret != 0) + goto out; /* Avoid race with evdev_unregister */ - EVDEV_LIST_LOCK(evdev); if (dev->si_drv1 == NULL) ret = ENODEV; else ret = evdev_register_client(evdev, client); - - if (ret != 0) - evdev_revoke_client(client); EVDEV_LIST_UNLOCK(evdev); - +out: if (ret == 0) ret = devfs_set_cdevpriv(client, evdev_dtor); + else + client->ec_revoked = true; if (ret != 0) { debugf(client, "cannot register evdev client"); diff --git a/sys/dev/evdev/evdev_private.h b/sys/dev/evdev/evdev_private.h index 66a059c763bc..19636823b804 100644 --- a/sys/dev/evdev/evdev_private.h +++ b/sys/dev/evdev/evdev_private.h @@ -206,6 +206,15 @@ struct evdev_dev else \ sx_assert(&(evdev)->ev_list_lock, MA_OWNED); \ } while (0) +static inline int +EVDEV_LIST_LOCK_SIG(struct evdev_dev *evdev) +{ + if (evdev->ev_lock_type == EV_LOCK_MTX) { + EVDEV_LOCK(evdev); + return (0); + } + return (sx_xlock_sig(&evdev->ev_list_lock)); +} struct evdev_client {