Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1631801ybv; Fri, 21 Feb 2020 00:38:51 -0800 (PST) X-Google-Smtp-Source: APXvYqyZflR8TrqplLNvxkDNvHAZirZoyFXO5Zn7ObzrKBI8J5JK3GzRUkcmetS8Jq3OO/2Y0zs0 X-Received: by 2002:aca:4587:: with SMTP id s129mr1039743oia.124.1582274331422; Fri, 21 Feb 2020 00:38:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582274331; cv=none; d=google.com; s=arc-20160816; b=hyL9zmK25KO+t3MPXt9btbNx1spVupfEE/XbZdgbkNxIv3duWOllNRbmq4O4QtI1V+ BQO2q8db56kPUctQlJ7/F84Wy2gA7e9lntiMW0SULd+xU6yP4TED1lFESKHuTvp/83Vy +G9l4GKf1sAWgot5T1WizJ1MM2Crsnp7ltE4uohjQT95jxKgV62SHZ/DHiAM640GKCEg TbNfzSsHSaNDj82EOOB4sfPekTFKpmLnTONfb6JfoKLVha9f5jrRdsPBiem/nT3xLkCv y3sOBndUEQFvVfMtafJj1W6932xgscVtz1jG6v9ysWLsZhd7wZUcjRqXwustPedJ0tWy 11hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=y7uM3w77h2Gn0yEivNMhyewHaqjCcqiwBI+mwPIiJHs=; b=UGZx+89KekEIDez0hgxQFX0xwFHAoyEvUZDfxWnG1sr5Jyerd6H326cUFf5pr7jA4d KLfectecN/lBh08qzxmIIishwF4mUJ1TyPvgeQQTo4a0kzogLnk8OHqAJahs2/dolTNI li+5gOxveRmQ2BSxaIVc8DqQ7PbCC9MyHzWhi/ljVdSjOa8NaI441jOhP++Dq90z2OzG l3rzX7vJ0AdB7yb0O9ZsSaDPSroxQ7HNWU24PbLY/obQ/VG01f4sr5DliYzO69iSk35l fIV+dAlbEs3UvVJ7YyG5IjB0YAfHSyjlUVgejvN3MatUc6HIXlk9wuBHIaRdlc5NjeYC Xyiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=pHr2BkDo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d22si1157176oti.316.2020.02.21.00.38.39; Fri, 21 Feb 2020 00:38:51 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=pHr2BkDo; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731818AbgBUIhL (ORCPT + 99 others); Fri, 21 Feb 2020 03:37:11 -0500 Received: from mail-pf1-f202.google.com ([209.85.210.202]:44391 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731796AbgBUIFU (ORCPT ); Fri, 21 Feb 2020 03:05:20 -0500 Received: by mail-pf1-f202.google.com with SMTP id r127so811325pfc.11 for ; Fri, 21 Feb 2020 00:05:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=y7uM3w77h2Gn0yEivNMhyewHaqjCcqiwBI+mwPIiJHs=; b=pHr2BkDof3Fi5RIfi45Obkf2Zn9XhrTRDiCQwEd+W7RBN7etnTZ1IyWFhtTlwLbIdr z8+GTqGz5A1U6oFjIMIgncwnPh6FTmw0fq1TS5w6vlSavXfLor8MvO0qvDREouv0pHKQ pIA+IKRPAM9epa6ygrjvw60f+Ym9nFDqq1eEjx/WKEHJLCM7gYY4m1s/kmtsLUxUfuMU ITpwSRr0sllPNnKOSSSIpCkehSqWMRLhkfu54QL8IMwSDpNjrwPQniGnNHz2KmvHR6fY qg6q3bAecNQqBw24Dgh4PcSANk7vTFq9eOYMZ6BpNYSgqi8OG3TpLPCpWaKx6AMpWewz QcTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=y7uM3w77h2Gn0yEivNMhyewHaqjCcqiwBI+mwPIiJHs=; b=bniDTvf2FYwkpclsFNIN6Cl2N+UkSY4eoYyQOu4+Lvww4eLsGBmUXCvywcl29iiQsG 56lJUFMZphqFoAQNwOHsU1yv6xU/WYLXMaHLPJxW4bqUwMc800LwtODtJxKjjGyoFVL0 StOlUGNUGHtuj0QkbIkB6FImeoQA/N1JywVFBNczU3FuYuMP3vkjZIn94k7muaaqIm+o 1T8aMmR3eibRQ7AdrEbE+dKc9HuptoTLC+K6No1brW68KSjW1uMb6nw2PSYjImknVtIm PgAlUm/Z9OvB08e/xAe5H8OvWoSdYtxN0SmgKkU0Ds6f+SGfuw4Aa/gfHrKlO2ti1unK q+6Q== X-Gm-Message-State: APjAAAVnxeCtj8+qLoiDTccofhHca/T2X4RUvaof1WGIKB3Jo2GhIxfx H55NYF9ibNWhAitJso6U1OYPAJXFNZTwNk0= X-Received: by 2002:a63:8f49:: with SMTP id r9mr37735880pgn.190.1582272319742; Fri, 21 Feb 2020 00:05:19 -0800 (PST) Date: Fri, 21 Feb 2020 00:05:08 -0800 In-Reply-To: <20200221080510.197337-1-saravanak@google.com> Message-Id: <20200221080510.197337-2-saravanak@google.com> Mime-Version: 1.0 References: <20200221080510.197337-1-saravanak@google.com> X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog Subject: [PATCH v2 1/3] driver core: Call sync_state() even if supplier has no consumers From: Saravana Kannan To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Saravana Kannan Cc: kernel-team@android.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The initial patch that added sync_state() support didn't handle the case where a supplier has no consumers. This was because when a device is successfully bound with a driver, only its suppliers were checked to see if they are eligible to get a sync_state(). This is not sufficient for devices that have no consumers but still need to do device state clean up. So fix this. Fixes: fc5a251d0fd7ca90 (driver core: Add sync_state driver/bus callback) Signed-off-by: Saravana Kannan --- drivers/base/core.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index 42a672456432..3306d5ae92a6 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -745,25 +745,31 @@ static void __device_links_queue_sync_state(struct device *dev, /** * device_links_flush_sync_list - Call sync_state() on a list of devices * @list: List of devices to call sync_state() on + * @dont_lock_dev: Device for which lock is already held by the caller * * Calls sync_state() on all the devices that have been queued for it. This - * function is used in conjunction with __device_links_queue_sync_state(). + * function is used in conjunction with __device_links_queue_sync_state(). The + * @dont_lock_dev parameter is useful when this function is called from a + * context where a device lock is already held. */ -static void device_links_flush_sync_list(struct list_head *list) +static void device_links_flush_sync_list(struct list_head *list, + struct device *dont_lock_dev) { struct device *dev, *tmp; list_for_each_entry_safe(dev, tmp, list, links.defer_sync) { list_del_init(&dev->links.defer_sync); - device_lock(dev); + if (dev != dont_lock_dev) + device_lock(dev); if (dev->bus->sync_state) dev->bus->sync_state(dev); else if (dev->driver && dev->driver->sync_state) dev->driver->sync_state(dev); - device_unlock(dev); + if (dev != dont_lock_dev) + device_unlock(dev); put_device(dev); } @@ -801,7 +807,7 @@ void device_links_supplier_sync_state_resume(void) out: device_links_write_unlock(); - device_links_flush_sync_list(&sync_list); + device_links_flush_sync_list(&sync_list, NULL); } static int sync_state_resume_initcall(void) @@ -865,6 +871,11 @@ void device_links_driver_bound(struct device *dev) driver_deferred_probe_add(link->consumer); } + if (defer_sync_state_count) + __device_links_supplier_defer_sync(dev); + else + __device_links_queue_sync_state(dev, &sync_list); + list_for_each_entry(link, &dev->links.suppliers, c_node) { if (!(link->flags & DL_FLAG_MANAGED)) continue; @@ -883,7 +894,7 @@ void device_links_driver_bound(struct device *dev) device_links_write_unlock(); - device_links_flush_sync_list(&sync_list); + device_links_flush_sync_list(&sync_list, dev); } static void device_link_drop_managed(struct device_link *link) -- 2.25.0.265.gbab2e86ba0-goog