From patchwork Thu Dec 21 18:43:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 182407 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp615506dyi; Thu, 21 Dec 2023 10:44:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IGtUUKevAmYQJWiGltiYMXsYoCtcedAxZ0vl6/uW4SJF7GUMbXRL1myfYgpoo9CdeH0mlRR X-Received: by 2002:a17:902:e847:b0:1d0:6ffd:adff with SMTP id t7-20020a170902e84700b001d06ffdadffmr62072plg.102.1703184281240; Thu, 21 Dec 2023 10:44:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703184281; cv=none; d=google.com; s=arc-20160816; b=XN8Vz6hR6CR0ZhbG+fb6RhEJOxhyHk/p2MahRYZchQzLSXafJYD8IY/gyqsXIhEIgy /5BFjgZdttetLtlW74fQtXfASSVr18TYfXJo0+JLJuvjgrV33zxf8FmDZZYF5f49wjWk o1f6QL0n3NIwCg8MCM+on85zYSkmH8vxyZ2v3GcQrrgmroC7VrIzpqC/Sn+w3kvJE6/f Jaes7i0PC31pRgZsDcsSkbPlY4Ol7+yJ7H5VcqF3YQdGkECn5dit/jh96MWbf+YGlSb5 d3GA65hu+JPeWVe5l5/BeMsd6VwTsrxFAl3FkSY2VgefSkXXokuYl/aQbpcCDNjBEiLu en0Q== ARC-Message-Signature: i=1; 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=4Q+b8wqRYdeT/k9zOecma8OzQDizS0i1OJX7YWZXzlI=; fh=u8rLQsUjk/DQ68o09SM+wx8FxqDFcT3zeQdKot9Eyy4=; b=p77+YjqSj6tUJ7040x0cR+nDVWdsBTF9gozOgVYFPTY2NYSLBFPbw9oSAmYvT5Q0YT WeVpN8PmwrtQDjAA9Y6z0dzJfce+TMn042Pc0NmRdFgTYmU/FCFHS1Sb9TR5ObwW4SWZ pua5qmMy6cTBgmhQJ1kWXiTH+5Ey/oxFfWmDbnXOBC//J6K+NkXuNri9bH01FtyYncsB kIm7ONJhKQTMpduLcCKpMG1P8GslPBnxhUbXLpfE/o741gTaP83WX1xm13EeU6IBv6O/ jfFZvK1qKOrAyEk+5NiyasQmZeUk6hQmP/Kabxjg90AYAT2YRDtjuLwBR2axIderslLy czcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bgdev-pl.20230601.gappssmtp.com header.s=20230601 header.b=XARgSbdu; spf=pass (google.com: domain of linux-kernel+bounces-8945-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-8945-ouuuleilei=gmail.com@vger.kernel.org" Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id jc11-20020a17090325cb00b001d06d7f9134si1901131plb.97.2023.12.21.10.44.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Dec 2023 10:44:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-8945-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@bgdev-pl.20230601.gappssmtp.com header.s=20230601 header.b=XARgSbdu; spf=pass (google.com: domain of linux-kernel+bounces-8945-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-8945-ouuuleilei=gmail.com@vger.kernel.org" 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 sv.mirrors.kernel.org (Postfix) with ESMTPS id EE8D5284E82 for ; Thu, 21 Dec 2023 18:44:10 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8518A745D4; Thu, 21 Dec 2023 18:43:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bgdev-pl.20230601.gappssmtp.com header.i=@bgdev-pl.20230601.gappssmtp.com header.b="XARgSbdu" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA42559902 for ; Thu, 21 Dec 2023 18:43:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bgdev.pl Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=bgdev.pl Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40d190044c5so11045215e9.2 for ; Thu, 21 Dec 2023 10:43:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20230601.gappssmtp.com; s=20230601; t=1703184202; x=1703789002; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4Q+b8wqRYdeT/k9zOecma8OzQDizS0i1OJX7YWZXzlI=; b=XARgSbduESI25dQ+m3yC9TGoNDJ5wTGbWexTt0rzwxyQJtwqAQipl5JM8JSrTnsDVN /iUrGFHiVWUJlzUk1AnTG/mpym2pd2TKJdJ7Bnp764vM4ztiCTZjZtO3woEufVfVHbva L3SfcND19OKQrt6JW1cfbAojKGgZD9rAtyCj/GBBcVDom4ADGP/JZjAQrPa8Fl4jGxZG X29JK4pXu/A4ED7PExFYJDFYicTpMStskNL/H6dIMlHQy6GsXJFyh28uqZzmIzsRiu2q KDO0jagMOAPUb+42uZ2yULaZ269Py4mure484qDhfMdVlNhlIxi01liK9Ass3hNlIBkJ tjtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703184202; x=1703789002; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4Q+b8wqRYdeT/k9zOecma8OzQDizS0i1OJX7YWZXzlI=; b=TItQb+dH2c3s8FdigFncD+0FuI30iu20IhO29qwoB6SPXJxzH0S1xPKW9mFd9UBUYG ceQC0b5/4BqWTxP/kXwqKLgDCg1MFNdG9C2NW9F5dFSOVTaIxuqN/Tfr5U+ovc7S4nKV s+WnwIy1+PJcncRDtHdtZT5pkbuYEpjJjqsebNhA0W7N5YS7lHVUspgsZXqSNuxSDeTn /xKNvXS2sv9ezH7iyG4sUavBChiaURCGMpgUI/w3Qh0JT6UIXY0DUQKtkREyDxuE2sWZ XwG2vwrIAEVa18TmbSY9KpOhXT6crYL0+3mCvbXFwcoq1wEmTgZ6ns2PAJPTLAGbv6lj KItA== X-Gm-Message-State: AOJu0YzQzyyPeOCCNRYh7I1I/T/6pv/cAJe8mS3AgA0zHCUDAE4KxLuo /8Y4xBe39xpqSpg0XT6Nul3P9gsnHwV2Jw== X-Received: by 2002:a05:600c:19cf:b0:40d:3159:9303 with SMTP id u15-20020a05600c19cf00b0040d31599303mr80995wmq.155.1703184201920; Thu, 21 Dec 2023 10:43:21 -0800 (PST) Received: from brgl-uxlite.home ([2a01:cb1d:334:ac00:7701:a2c3:cba4:74db]) by smtp.gmail.com with ESMTPSA id t20-20020a05600c199400b0040c42681fcesm4188059wmq.15.2023.12.21.10.43.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Dec 2023 10:43:21 -0800 (PST) From: Bartosz Golaszewski To: Linus Walleij , Andy Shevchenko , Kent Gibson Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 1/2] gpiolib: replace the GPIO device mutex with a read-write semaphore Date: Thu, 21 Dec 2023 19:43:15 +0100 Message-Id: <20231221184316.24506-2-brgl@bgdev.pl> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231221184316.24506-1-brgl@bgdev.pl> References: <20231221184316.24506-1-brgl@bgdev.pl> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785918161142998122 X-GMAIL-MSGID: 1785918161142998122 From: Bartosz Golaszewski There are only two spots where we modify (add to or remove objects from) the GPIO device list. Readers should be able to access it concurrently. Replace the mutex with a read-write semaphore and adjust the locking operations accordingly. Signed-off-by: Bartosz Golaszewski --- drivers/gpio/gpiolib-sysfs.c | 2 +- drivers/gpio/gpiolib.c | 18 +++++++++--------- drivers/gpio/gpiolib.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index ae4fc013b675..e4159344a0ea 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -771,7 +771,7 @@ int gpiochip_sysfs_register_all(void) struct gpio_device *gdev; int ret; - guard(mutex)(&gpio_devices_lock); + guard(rwsem_read)(&gpio_devices_sem); list_for_each_entry(gdev, &gpio_devices, list) { if (gdev->mockdev) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index c9ca809b55de..1baeb6778ec6 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -98,7 +98,7 @@ static DEFINE_MUTEX(gpio_lookup_lock); static LIST_HEAD(gpio_lookup_list); LIST_HEAD(gpio_devices); -DEFINE_MUTEX(gpio_devices_lock); +DECLARE_RWSEM(gpio_devices_sem); static DEFINE_MUTEX(gpio_machine_hogs_mutex); static LIST_HEAD(gpio_machine_hogs); @@ -131,7 +131,7 @@ struct gpio_desc *gpio_to_desc(unsigned gpio) { struct gpio_device *gdev; - scoped_guard(mutex, &gpio_devices_lock) { + scoped_guard(rwsem_read, &gpio_devices_sem) { list_for_each_entry(gdev, &gpio_devices, list) { if (gdev->base <= gpio && gdev->base + gdev->ngpio > gpio) @@ -415,7 +415,7 @@ static struct gpio_desc *gpio_name_to_desc(const char * const name) if (!name) return NULL; - guard(mutex)(&gpio_devices_lock); + guard(rwsem_read)(&gpio_devices_sem); list_for_each_entry(gdev, &gpio_devices, list) { struct gpio_desc *desc; @@ -664,7 +664,7 @@ static void gpiodev_release(struct device *dev) { struct gpio_device *gdev = to_gpio_device(dev); - scoped_guard(mutex, &gpio_devices_lock) + scoped_guard(rwsem_write, &gpio_devices_sem) list_del(&gdev->list); ida_free(&gpio_ida, gdev->id); @@ -887,7 +887,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, gdev->ngpio = gc->ngpio; - scoped_guard(mutex, &gpio_devices_lock) { + scoped_guard(rwsem_write, &gpio_devices_sem) { /* * TODO: this allocates a Linux GPIO number base in the global * GPIO numberspace for this chip. In the long run we want to @@ -1017,7 +1017,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, goto err_print_message; } err_remove_from_list: - scoped_guard(mutex, &gpio_devices_lock) + scoped_guard(rwsem_write, &gpio_devices_sem) list_del(&gdev->list); err_free_label: kfree_const(gdev->label); @@ -1127,7 +1127,7 @@ struct gpio_device *gpio_device_find(void *data, */ might_sleep(); - guard(mutex)(&gpio_devices_lock); + guard(rwsem_read)(&gpio_devices_sem); list_for_each_entry(gdev, &gpio_devices, list) { if (gdev->chip && match(gdev->chip, data)) @@ -4745,7 +4745,7 @@ static void *gpiolib_seq_start(struct seq_file *s, loff_t *pos) s->private = ""; - guard(mutex)(&gpio_devices_lock); + guard(rwsem_read)(&gpio_devices_sem); list_for_each_entry(gdev, &gpio_devices, list) { if (index-- == 0) @@ -4760,7 +4760,7 @@ static void *gpiolib_seq_next(struct seq_file *s, void *v, loff_t *pos) struct gpio_device *gdev = v; void *ret = NULL; - scoped_guard(mutex, &gpio_devices_lock) { + scoped_guard(rwsem_read, &gpio_devices_sem) { if (list_is_last(&gdev->list, &gpio_devices)) ret = NULL; else diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index 0ce7451a6b24..97df54abf57a 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h @@ -137,7 +137,7 @@ int gpiod_set_transitory(struct gpio_desc *desc, bool transitory); extern spinlock_t gpio_lock; extern struct list_head gpio_devices; -extern struct mutex gpio_devices_lock; +extern struct rw_semaphore gpio_devices_sem; void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action);