Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp725587ybt; Fri, 26 Jun 2020 10:02:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLE3uY+ZJ6lJkXamJKo7JDR+ldz0RVe+fzts1ET5K8Un6Eg1TUflI4xKNk0vSozFNkYJpH X-Received: by 2002:a17:906:d8db:: with SMTP id re27mr3334683ejb.554.1593190950413; Fri, 26 Jun 2020 10:02:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593190950; cv=none; d=google.com; s=arc-20160816; b=ZnpsfMepvpz78y51pMkJ93Ver8Q1dCZ6Y1fEHDOyPuRUqGbQ8VEWzyRo5raqKuMUjz TRMYvt0AylAhiTNel52Et5NWNASc6vPqhWAO7MeV2xGkd+DSOb6qGR4DHA6TK4Nh0f7X TfvhiKrGS62Hj0MYlL3T5HJS0mpkedHlgtIpgEaVEDBoxGF74kJ/v1W/wbU4aMt/MJg1 sJ28vv60wEAHyMrJaG523pXi2bWrI+1NdoeKiisb/KZTiwuBADdKvgNh3FXqtw6q250g xp5KAK/BrsFWZI5brAwFKrqz/IwnJ7CzNRstnqUkRQYZQ1LsAqCsPj4i1UNEZe+V23Ok 1G2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version; bh=ZFS0A0GALa85jcwxFWd7qm3+ETIaduqsmP4v2A7mkd4=; b=mKFlCAEz39Fz99FvOBQDBQoWiWykJJsXlc/i0KhVmvFSHkkYxCw6CAXOUY6Bpc4Qnc z5lMzzG7lB47bJ7tqGpiDjFIMFjKidUik3u47CGA+lBXHRtrOjaGf8sMadNsrps9Nl36 SfSOUsE99vY+Ud6xIBEunyNuf0DSEcPqb/f9kR5/ItfuGvHhTZq5eZGPWbkCqnGozmfK wuXsY4y4DL35PI2vlnmco5KFHcj7AWFwMre8JLTa+/ZkclrqqIaNTrXqcZTOUKXyOPPU /L8115IosH/M43fBF9K7kimLPPvZh4PF6kZ7abBcZ/EEtQeNLSfitfdxuzNIC2BNN0WK WHzw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bc11si833395edb.259.2020.06.26.10.02.07; Fri, 26 Jun 2020 10:02:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729773AbgFZPnN (ORCPT + 99 others); Fri, 26 Jun 2020 11:43:13 -0400 Received: from mail-oi1-f194.google.com ([209.85.167.194]:38051 "EHLO mail-oi1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728634AbgFZPnM (ORCPT ); Fri, 26 Jun 2020 11:43:12 -0400 Received: by mail-oi1-f194.google.com with SMTP id r8so8428062oij.5 for ; Fri, 26 Jun 2020 08:43:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ZFS0A0GALa85jcwxFWd7qm3+ETIaduqsmP4v2A7mkd4=; b=npiJijXIoCkCtVOLfqwsf6veI/39XxNkRL+I0Mor532xc2VF4s/pZbE2HbGEGxz0/n pJoTmFId0DvjJKohkd4afklAVqkRZE4+E2Zdstr7y044UqsZQnVMF3dJy73hfk2tvYdc C98IC7lxzn+v1J0YTYn5IucH6LVFFjiJzMD+yGb0b6hvTxlBa/NPYAQJSuSKpsImJBFy 0eb6ED8o0UQh7EYOG6BneR2cyJihpKrVdN3JDQkikDe2uBEyFkK7sLUHG0Yb5to5WBqR iKLVTDcHAAiBYs1nWRkb8egrDGPyd9aJJc0SLmozq3lVw0jgIBHS4IRL73bl4GUjchmC QaWw== X-Gm-Message-State: AOAM533Mla6ecaQyGhunhRyWqh0Jy4yyuhnPVu+StjU79aQwFIxcys/W iWOdPvoN5hWpBSFcOC8eEWy0TePe9CeazTbFJC2eL+sX X-Received: by 2002:a05:6808:99b:: with SMTP id a27mr2849111oic.68.1593186191326; Fri, 26 Jun 2020 08:43:11 -0700 (PDT) MIME-Version: 1.0 References: <20200626100103.18879-1-a.hajda@samsung.com> <20200626100103.18879-3-a.hajda@samsung.com> In-Reply-To: <20200626100103.18879-3-a.hajda@samsung.com> From: "Rafael J. Wysocki" Date: Fri, 26 Jun 2020 17:43:00 +0200 Message-ID: Subject: Re: [PATCH v6 2/4] driver core: add deferring probe reason to devices_deferred property To: Andrzej Hajda Cc: Greg Kroah-Hartman , Bartlomiej Zolnierkiewicz , Marek Szyprowski , "Rafael J. Wysocki" , Linux Kernel Mailing List , Linux ARM , Andy Shevchenko , Mark Brown , Russell King - ARM Linux , Neil Armstrong , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Daniel Vetter , "open list:DRM DRIVERS" 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 On Fri, Jun 26, 2020 at 12:01 PM Andrzej Hajda wrote: > > /sys/kernel/debug/devices_deferred property contains list of deferred devices. > This list does not contain reason why the driver deferred probe, the patch > improves it. > The natural place to set the reason is probe_err function introduced recently, > ie. if probe_err will be called with -EPROBE_DEFER instead of printk the message > will be attached to deferred device and printed when user read devices_deferred > property. > > Signed-off-by: Andrzej Hajda > Reviewed-by: Mark Brown > Reviewed-by: Javier Martinez Canillas > Reviewed-by: Andy Shevchenko Reviewed-by: Rafael J. Wysocki > --- > drivers/base/base.h | 3 +++ > drivers/base/core.c | 8 ++++++-- > drivers/base/dd.c | 23 ++++++++++++++++++++++- > 3 files changed, 31 insertions(+), 3 deletions(-) > > diff --git a/drivers/base/base.h b/drivers/base/base.h > index 95c22c0f9036..6954fccab3d7 100644 > --- a/drivers/base/base.h > +++ b/drivers/base/base.h > @@ -93,6 +93,7 @@ struct device_private { > struct klist_node knode_class; > struct list_head deferred_probe; > struct device_driver *async_driver; > + char *deferred_probe_reason; > struct device *device; > u8 dead:1; > }; > @@ -134,6 +135,8 @@ extern void device_release_driver_internal(struct device *dev, > extern void driver_detach(struct device_driver *drv); > extern int driver_probe_device(struct device_driver *drv, struct device *dev); > extern void driver_deferred_probe_del(struct device *dev); > +extern void device_set_deferred_probe_reson(const struct device *dev, > + struct va_format *vaf); > static inline int driver_match_device(struct device_driver *drv, > struct device *dev) > { > diff --git a/drivers/base/core.c b/drivers/base/core.c > index 3a827c82933f..fee047f03681 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -3963,6 +3963,8 @@ define_dev_printk_level(_dev_info, KERN_INFO); > * This helper implements common pattern present in probe functions for error > * checking: print debug or error message depending if the error value is > * -EPROBE_DEFER and propagate error upwards. > + * In case of -EPROBE_DEFER it sets also defer probe reason, which can be > + * checked later by reading devices_deferred debugfs attribute. > * It replaces code sequence: > * if (err != -EPROBE_DEFER) > * dev_err(dev, ...); > @@ -3984,10 +3986,12 @@ int dev_err_probe(const struct device *dev, int err, const char *fmt, ...) > vaf.fmt = fmt; > vaf.va = &args; > > - if (err != -EPROBE_DEFER) > + if (err != -EPROBE_DEFER) { > dev_err(dev, "error %d: %pV", err, &vaf); > - else > + } else { > + device_set_deferred_probe_reson(dev, &vaf); > dev_dbg(dev, "error %d: %pV", err, &vaf); > + } > > va_end(args); > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index 9a1d940342ac..dd5683b61f74 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -27,6 +27,7 @@ > #include > #include > #include > +#include > > #include "base.h" > #include "power/power.h" > @@ -136,6 +137,8 @@ void driver_deferred_probe_del(struct device *dev) > if (!list_empty(&dev->p->deferred_probe)) { > dev_dbg(dev, "Removed from deferred list\n"); > list_del_init(&dev->p->deferred_probe); > + kfree(dev->p->deferred_probe_reason); > + dev->p->deferred_probe_reason = NULL; > } > mutex_unlock(&deferred_probe_mutex); > } > @@ -211,6 +214,23 @@ void device_unblock_probing(void) > driver_deferred_probe_trigger(); > } > > +/** > + * device_set_deferred_probe_reson() - Set defer probe reason message for device > + * @dev: the pointer to the struct device > + * @vaf: the pointer to va_format structure with message > + */ > +void device_set_deferred_probe_reson(const struct device *dev, struct va_format *vaf) > +{ > + const char *drv = dev_driver_string(dev); > + > + mutex_lock(&deferred_probe_mutex); > + > + kfree(dev->p->deferred_probe_reason); > + dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf); > + > + mutex_unlock(&deferred_probe_mutex); > +} > + > /* > * deferred_devs_show() - Show the devices in the deferred probe pending list. > */ > @@ -221,7 +241,8 @@ static int deferred_devs_show(struct seq_file *s, void *data) > mutex_lock(&deferred_probe_mutex); > > list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe) > - seq_printf(s, "%s\n", dev_name(curr->device)); > + seq_printf(s, "%s\t%s", dev_name(curr->device), > + curr->device->p->deferred_probe_reason ?: "\n"); > > mutex_unlock(&deferred_probe_mutex); > > -- > 2.17.1 >