Received: by 2002:ac2:464d:0:0:0:0:0 with SMTP id s13csp191646lfo; Tue, 17 May 2022 21:53:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxSVSMS4u/Bujf0dwThwLgCETTrYTqGGigtYKm3fiJIzz2Fz69DZEawNTz51RZYs35DKBUL X-Received: by 2002:a17:90a:e7cb:b0:1df:8481:9469 with SMTP id kb11-20020a17090ae7cb00b001df84819469mr7497585pjb.195.1652849615996; Tue, 17 May 2022 21:53:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652849615; cv=none; d=google.com; s=arc-20160816; b=T6vPRtYUIqogEDyNg0W1rAXGak1yO5L1gDIH7CUuc8d0N5AZdkn1jlloRActNYgDbj ok5LqGx8SX1QVlHab3m9EEclkxicrG3J18c8sBNWYc7qqQFyzC77BljeG0jcEY9pDb33 KYFDwUlpR38DayodC/xoIK53PUIXC8LQkuuOzSz6YWSPit1a9z5nzz3TDpF8O5rukNFJ mz4qSyM8d4L7owseY/wp6dzSpS1n3nUyrn4t8hZ3JPjes0O3yqz426oKexzOzioIcIGj jRyRxJoRCO6lXuAx/ar1L33U2xWiwl8F5vDoB4ffBBFYS8TZynk68UpjH2kttljGAoXX EG/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=tf+qNQoI5qGFZ9RW7jx4HEPwOLh/TGpPIUH/6a1l9U4=; b=XCOl9ljo2lA2uBSDHp/aCN1HVX2DrPmOkfdsZy9VpmadxmNGVPrtIgJu+MdaCI8b/F XgPRVWHA4fpe2pCrUMou0S+qZcRecpsR3HxiT+L5Eyi8KbAhXAODBAgwhaGdUPokFeSO m4JNJpkKM0dxpHAgzE0c+ovz4up4nhwaahtrRFEulX8f2X4+qkgroGWQ8CoI4qIFR3nJ B/zHp3L+610Carj6FHmOtCumtpQR2DERXO4Dfurp3Nzcb7NQJqTLtlFQteoOl3QruGL5 78lps68oPdXVyMLZ4O9iYHu+2+Dpnngvu2/q4fKewraqAKcQxaAbpkHjAIHml4FQkTns OS2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Vsd0rtAy; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id j7-20020a170902690700b0015ce3e35354si1482899plk.90.2022.05.17.21.53.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 May 2022 21:53:35 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Vsd0rtAy; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A4D696543A; Tue, 17 May 2022 21:02:54 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230130AbiEQWIc (ORCPT + 99 others); Tue, 17 May 2022 18:08:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229982AbiEQWIa (ORCPT ); Tue, 17 May 2022 18:08:30 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E031937A01 for ; Tue, 17 May 2022 15:08:27 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id r206-20020a2576d7000000b0064d82e5b692so308323ybc.11 for ; Tue, 17 May 2022 15:08:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=tf+qNQoI5qGFZ9RW7jx4HEPwOLh/TGpPIUH/6a1l9U4=; b=Vsd0rtAyuCX1ep9X8JPz0kVgE4qriTwFWX2119dzWimM6EjZ30AHxEw53p3qxrWdi5 POmyjeHImwG4MqnpLGozKFxoNPL5EGmsOIPrfxbeifQQoCw61r9cF6yLgj9qaJudrBCn TjT2tZwfvaODmd0MssVVbrKjGeMSc6AW81dJLt5WkCPgCAdTmPdy1mskr6PlDa56AKta 25rvMKsojCYOuGZa4hqfLIuJZnoUa0GnEMoN2rRTBJeMWGKQFe9SJr22yWJXSPsaCeoQ awSYMJYsMF7kP+naNxCLPkKZAodpvp94xIYrYzmJDzVjbz7xUvrsI31pwdAGhXQwJLv7 LH7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=tf+qNQoI5qGFZ9RW7jx4HEPwOLh/TGpPIUH/6a1l9U4=; b=KwZFWr3goT5coMiOa97JaviL4H5gcuYcEqO3c9kjErsZOFQc1fNVpUGtY02OkfU+IV ozFAqVNo7uSxp1ITNEsHF2+PZDOSmTYYpb6YmGuUmPoKyYyTxx1gVEX8I88TEvg8HHMk /ksC5xp9qGtTkcE4rUV/F63zknpAnaQSv0m4F7+u0B9ve8uQ8lctxMj6xK7T1bdwcx5z pn8coiVgvUIq6r1wv2PqWCcUbAy4I5EyEbQA+aYDxj211PlkVRqNeluWfuKCxmmORiqv 9pgFubGf2+SzMTsUoRm+CSYSuA2srYGY+mB2tseK0e0kAKDZxlPk8lcXAD64hFrbALq8 Tdog== X-Gm-Message-State: AOAM533IZ8m4cIEZFpWTy2rM3ONA9CJixMy7avoQVmD4DXRrKgE9YIZc J1WwNJmxmaNcitNDyVVYKzHhwgWzrQKyIpA= X-Received: from tansuresh.svl.corp.google.com ([2620:15c:2c5:13:3c9b:5345:708:1378]) (user=tansuresh job=sendgmr) by 2002:a25:9c08:0:b0:64b:c9f8:de84 with SMTP id c8-20020a259c08000000b0064bc9f8de84mr20468621ybo.391.1652825307082; Tue, 17 May 2022 15:08:27 -0700 (PDT) Date: Tue, 17 May 2022 15:08:14 -0700 In-Reply-To: <20220517220816.1635044-1-tansuresh@google.com> Message-Id: <20220517220816.1635044-2-tansuresh@google.com> Mime-Version: 1.0 References: <20220517220816.1635044-1-tansuresh@google.com> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v3 1/3] driver core: Support asynchronous driver shutdown From: Tanjore Suresh To: Greg Kroah-Hartman , "Rafael J . Wysocki" , Christoph Hellwig , Sagi Grimberg , Bjorn Helgaas Cc: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-pci@vger.kernel.org, Tanjore Suresh Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=no 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 This changes the bus driver interface with additional entry points to enable devices to implement asynchronous shutdown. The existing synchronous interface to shutdown is unmodified and retained for backward compatibility. This changes the common device shutdown code to enable devices to participate in asynchronous shutdown implementation. Signed-off-by: Tanjore Suresh --- drivers/base/core.c | 38 +++++++++++++++++++++++++++++++++++++- include/linux/device/bus.h | 12 ++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index 3d6430eb0c6a..ba267ae70a22 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -4479,6 +4479,7 @@ EXPORT_SYMBOL_GPL(device_change_owner); void device_shutdown(void) { struct device *dev, *parent; + LIST_HEAD(async_shutdown_list); wait_for_device_probe(); device_block_probing(); @@ -4523,7 +4524,13 @@ void device_shutdown(void) dev_info(dev, "shutdown_pre\n"); dev->class->shutdown_pre(dev); } - if (dev->bus && dev->bus->shutdown) { + if (dev->bus && dev->bus->async_shutdown_start) { + if (initcall_debug) + dev_info(dev, "async_shutdown_start\n"); + dev->bus->async_shutdown_start(dev); + list_add_tail(&dev->kobj.entry, + &async_shutdown_list); + } else if (dev->bus && dev->bus->shutdown) { if (initcall_debug) dev_info(dev, "shutdown\n"); dev->bus->shutdown(dev); @@ -4543,6 +4550,35 @@ void device_shutdown(void) spin_lock(&devices_kset->list_lock); } spin_unlock(&devices_kset->list_lock); + + /* + * Second pass spin for only devices, that have configured + * Asynchronous shutdown. + */ + while (!list_empty(&async_shutdown_list)) { + dev = list_entry(async_shutdown_list.next, struct device, + kobj.entry); + parent = get_device(dev->parent); + get_device(dev); + /* + * Make sure the device is off the list + */ + list_del_init(&dev->kobj.entry); + if (parent) + device_lock(parent); + device_lock(dev); + if (dev->bus && dev->bus->async_shutdown_end) { + if (initcall_debug) + dev_info(dev, + "async_shutdown_end called\n"); + dev->bus->async_shutdown_end(dev); + } + device_unlock(dev); + if (parent) + device_unlock(parent); + put_device(dev); + put_device(parent); + } } /* diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index a039ab809753..f582c9d21515 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -49,6 +49,16 @@ struct fwnode_handle; * will never get called until they do. * @remove: Called when a device removed from this bus. * @shutdown: Called at shut-down time to quiesce the device. + * @async_shutdown_start: Called at the shutdown-time to start + * the shutdown process on the device. + * This entry point will be called only + * when the bus driver has indicated it would + * like to participate in asynchronous shutdown + * completion. + * @async_shutdown_end: Called at shutdown-time to complete the shutdown + * process of the device. This entry point will be called + * only when the bus drive has indicated it would like to + * participate in the asynchronous shutdown completion. * * @online: Called to put the device back online (after offlining it). * @offline: Called to put the device offline for hot-removal. May fail. @@ -93,6 +103,8 @@ struct bus_type { void (*sync_state)(struct device *dev); void (*remove)(struct device *dev); void (*shutdown)(struct device *dev); + void (*async_shutdown_start)(struct device *dev); + void (*async_shutdown_end)(struct device *dev); int (*online)(struct device *dev); int (*offline)(struct device *dev); -- 2.36.0.550.gb090851708-goog