From patchwork Fri Mar 31 09:33:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 77684 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp437537vqo; Fri, 31 Mar 2023 02:44:49 -0700 (PDT) X-Google-Smtp-Source: AKy350Z2UwQjhQsCpvWgL8lRTzto7lmtk2r67RS3OdxAIhha7vT2PJEkYWaFOqHomwFgRPUIgab9 X-Received: by 2002:aa7:cb02:0:b0:502:23a0:3fd2 with SMTP id s2-20020aa7cb02000000b0050223a03fd2mr22015494edt.9.1680255889032; Fri, 31 Mar 2023 02:44:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680255889; cv=none; d=google.com; s=arc-20160816; b=o/7GbPabsgLZ9H2gna2nVTvM8vTH+X26knphaTcR3Q8/CxB3Oezt/hhMcrN+6chBFP If0zRwylt/eJgeseb7IXlL/DJVle1+G0cSBZ2dVSXH8r3ST22MFkfbI6RxAZqxN+4bYH QbZ1/NMp4Y8SELK95axUVnyA8f4RyR6s2H25jnYUVm8z9FvKNSBl5lnCycgjU2RFy2d9 mCDtCwIS2cjFj/gc6Y18AEWLdqZC5aqBTTh0FxizmfS1ZjesBve3cT4pVm9DaM6jpXdA 4992bjvREA4gZQ3VzxoIt2nuw2eAUEZQWmrM8khhgAtUa+YwP2XvAxECpfbWhNHKf8F6 VEfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=cwsOywKFnAVO9FDnCBvaLQ4SY70L8gkxhz0G6UrLAXY=; b=meLFoQ/NnoK6jKGhq3QRfgcAPKIaodu0/NY0OTmsxH/Ch5IT9i7eiQc9xWjed6xCQh Tr9ijNO3XuRfH7LhHF3ii52W/dF1zkI97h7O/cW5pVsGuyS+LeJDM/zZ9ODl4+rEscQf EAcV7oGgZeZ81HkANFUWxTnMeKQevmSE7Z34gaG6LmONMOENzk8vdbaY9zCp3M5roCQj cyV+/TlCADuA9rvrdSEceaM7x8QcUqjP1cqbXQaCO/bo/RqDvErzGDpUYY2wgjlZ6z1u 8Mmz/DmCf5UYx0MyKofLB8wkglawNsC3OX11QQw6c7wby/2sOILoLriOiMTS+Nl4AhVg rNxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="2Racua//"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t10-20020aa7d4ca000000b004aef1baf38asi1571342edr.96.2023.03.31.02.44.26; Fri, 31 Mar 2023 02:44:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="2Racua//"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230160AbjCaJeN (ORCPT + 99 others); Fri, 31 Mar 2023 05:34:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42334 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232131AbjCaJd5 (ORCPT ); Fri, 31 Mar 2023 05:33:57 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A54D44EC9; Fri, 31 Mar 2023 02:33:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 9303CB82DB3; Fri, 31 Mar 2023 09:33:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D23B9C433D2; Fri, 31 Mar 2023 09:33:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1680255204; bh=72mzuO04L3PUk9aLCOXDvsit2zTzKDWhSwQULIrm2dg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=2Racua//Q7UDpfBF96lbadzS4b0GO6n85LayT00ZPbmGfYsxeO/GNyrTILknk4WWk 53tLe2c6OPQiNsQ37NnQAcRDAYXEHrZopBKV8o1MujN+nOybKjqCGaCQ5yq2f+zjVN YDqnPhLO5pkpeEVpm6LyU5gOEpKvosiUVDKwodwo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , Linus Walleij , Bartosz Golaszewski , Sebastian Reichel , Benjamin Tissoires , linux-gpio@vger.kernel.org, "Rafael J. Wysocki" Subject: [PATCH 2/7] driver core: create class_is_registered() Date: Fri, 31 Mar 2023 11:33:13 +0200 Message-Id: <20230331093318.82288-2-gregkh@linuxfoundation.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230331093318.82288-1-gregkh@linuxfoundation.org> References: <20230331093318.82288-1-gregkh@linuxfoundation.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3679; i=gregkh@linuxfoundation.org; h=from:subject; bh=72mzuO04L3PUk9aLCOXDvsit2zTzKDWhSwQULIrm2dg=; b=owGbwMvMwCRo6H6F97bub03G02pJDClqK+6c83t86uvFnEWSap/cVvBrx5nnSOgvVeJJ/r860 prZ4cr1jlgWBkEmBlkxRZYv23iO7q84pOhlaHsaZg4rE8gQBi5OAZjIy2MM8+N+PvoguP1DQNrn 2SdOX/IRs5vEycQw33f6p/6ZprF2J75UyvNUz91+0GWuJwA= X-Developer-Key: i=gregkh@linuxfoundation.org; a=openpgp; fpr=F4B60CC5BF78C2214A313DCB3147D40DDB2DFB29 X-Spam-Status: No, score=-2.5 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761875999094851921?= X-GMAIL-MSGID: =?utf-8?q?1761875999094851921?= Some classes (i.e. gpio), want to know if they have been registered or not, and poke around in the class's internal structures to try to figure this out. Because this is not really a good idea, provide a function for classes to call to try to figure this out. Note, this is racy as the state of the class could change at any moment in time after the call is made, but as usually a class only wants to know if it has been registered yet or not, it should be fairly safe to use, and is just as safe as the previous "poke at the class internals" check was. Move the gpiolib code to use this function as proof that it works properly. Cc: Linus Walleij Cc: Bartosz Golaszewski Cc: Sebastian Reichel Cc: Benjamin Tissoires Cc: linux-gpio@vger.kernel.org Cc: "Rafael J. Wysocki" Signed-off-by: Greg Kroah-Hartman Reviewed-by: Rafael J. Wysocki Reviewed-by: Linus Walleij --- drivers/base/class.c | 25 +++++++++++++++++++++++++ drivers/gpio/gpiolib-sysfs.c | 4 ++-- include/linux/device/class.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/base/class.c b/drivers/base/class.c index 68a6f9b56d19..a8a1bf976290 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c @@ -634,6 +634,31 @@ void class_compat_remove_link(struct class_compat *cls, struct device *dev, } EXPORT_SYMBOL_GPL(class_compat_remove_link); +/** + * class_is_registered - determine if at this moment in time, a class is + * registered in the driver core or not. + * @class: the class to check + * + * Returns a boolean to state if the class is registered in the driver core + * or not. Note that the value could switch right after this call is made, + * so only use this in places where you "know" it is safe to do so (usually + * to determine if the specific class has been registered yet or not). + * + * Be careful in using this. + */ +bool class_is_registered(const struct class *class) +{ + struct subsys_private *sp = class_to_subsys(class); + bool is_initialized = false; + + if (sp) { + is_initialized = true; + subsys_put(sp); + } + return is_initialized; +} +EXPORT_SYMBOL_GPL(class_is_registered); + int __init classes_init(void) { class_kset = kset_create_and_add("class", NULL, NULL); diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index a895915affa5..1a9b21731cc9 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -554,7 +554,7 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change) int offset; /* can't export until sysfs is available ... */ - if (!gpio_class.p) { + if (!class_is_registered(&gpio_class)) { pr_debug("%s: called too early!\n", __func__); return -ENOENT; } @@ -728,7 +728,7 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) * register later, in gpiolib_sysfs_init() ... here we just * verify that _some_ field of gpio_class got initialized. */ - if (!gpio_class.p) + if (!class_is_registered(&gpio_class)) return 0; /* diff --git a/include/linux/device/class.h b/include/linux/device/class.h index b53728ca56fb..9cb5db0588c8 100644 --- a/include/linux/device/class.h +++ b/include/linux/device/class.h @@ -84,6 +84,7 @@ extern struct kobject *sysfs_dev_block_kobj; int __must_check class_register(struct class *class); void class_unregister(const struct class *class); +bool class_is_registered(const struct class *class); struct class_compat; struct class_compat *class_compat_register(const char *name);