From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Fri, 08 Jul 2022 12:38:42 +0200 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1o9lNe-00APRK-Ry for lore@lore.pengutronix.de; Fri, 08 Jul 2022 12:38:42 +0200 Received: from bombadil.infradead.org ([2607:7c80:54:3::133]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1o9lNg-00037Z-JV for lore@pengutronix.de; Fri, 08 Jul 2022 12:38:41 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:From:References:To:Subject:MIME-Version:Date: Message-ID:Reply-To:Cc:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=nwh0VaDx/TMJ9fCltw5VEZk3/PPdOUYkeZW/WqOj7cw=; b=Vd0FHyRTLpVkGpFwrErzpYD/KQ J4hn020vOFpDOUQfWygiSDWO2jHzJHFneSlVwiKT051WThxwCAZddQaPnUpbhPkQztKlGlgyEgL9p zwboqfQM9Uf4SP5yiFH9jr15q+1k9kXVI5N8G0VeO5Bij0qHgjG48kmK4Mb/hl675WF7dFKbLo7HH FaZpqyycP2GyzZPepi9pd5ZhAQOWfD+b3SE6qpODFYV9hwz9hbS5HF+zsRsfDh9yY/xv+K+XeC4at CbnX2cHYTgbZntjRMDA842OnCxexXxcShBEdARERqNr/FPpd8pIcFHnBiVmJmlz2JD2rxQrpCWC5+ L3mCGfmg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9lM6-003DeA-Lr; Fri, 08 Jul 2022 10:37:02 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9lM2-003DdK-1X for barebox@lists.infradead.org; Fri, 08 Jul 2022 10:36:59 +0000 Received: from ptz.office.stw.pengutronix.de ([2a0a:edc0:0:900:1d::77] helo=[127.0.0.1]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1o9lLy-0002wY-SU; Fri, 08 Jul 2022 12:36:54 +0200 Message-ID: <1e83eb81-9834-312e-f076-3f2a92a5ea77@pengutronix.de> Date: Fri, 8 Jul 2022 12:36:54 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Content-Language: en-US To: Johannes Zink , barebox@lists.infradead.org References: <20220708094138.112060-1-j.zink@pengutronix.de> From: Ahmad Fatoum In-Reply-To: <20220708094138.112060-1-j.zink@pengutronix.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220708_033658_122345_D084866D X-CRM114-Status: GOOD ( 34.98 ) X-BeenThere: barebox@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "barebox" X-SA-Exim-Connect-IP: 2607:7c80:54:3::133 X-SA-Exim-Mail-From: barebox-bounces+lore=pengutronix.de@lists.infradead.org X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on metis.ext.pengutronix.de X-Spam-Level: X-Spam-Status: No, score=-4.1 required=4.0 tests=AWL,BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,NICE_REPLY_A,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.2 Subject: Re: [PATCH v3] base: driver: print dev_err_probe message on permanent probe deferral X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on metis.ext.pengutronix.de) On 08.07.22 11:41, Johannes Zink wrote: > This stores the probe deferral reason in the device structure. > If a probe is permanently deferred, the last reason is displayed. > > Example output on a permanently deferred probe: > ERROR: imx-pgc-domain0: probe permanently deferred (Failed to get domain's regulator) > > Other dev_err_probe outputs are displayed as before. > > Signed-off-by: Johannes Zink Reviewed-by: Ahmad Fatoum > --- > v1 -> v2: > - improved commit message > - improved function prototypes > - improved debug output, device name is displayed once only per > message > - reverted removal of MSG_DEBUG output on deferred probe > - replaced kfree by free > - removed unnecessary null checks before free > - fixed several typos > - fixed compiler warnings > - fixed coding style issues > v2 -> v3: > - dropped const from dev_err_probe > - use xasprintf instead of basprintf: guarantee memory allocation > - prevent newline within message on permanent deferral > - removed unnecessary helper functions > - fixed remaining typos and whitespace changes > - improved comments > - reverted removal of kernel doc comment > - added example in commit message > --- > drivers/base/driver.c | 44 +++++++++++++++++++++++++++++++++++------- > include/driver.h | 5 +++++ > include/linux/printk.h | 6 +++--- > 3 files changed, 45 insertions(+), 10 deletions(-) > > diff --git a/drivers/base/driver.c b/drivers/base/driver.c > index 303ca061c..4898e0114 100644 > --- a/drivers/base/driver.c > +++ b/drivers/base/driver.c > @@ -283,6 +283,7 @@ void free_device_res(struct device_d *dev) > dev->name = NULL; > free(dev->unique_name); > dev->unique_name = NULL; > + free(dev->deferred_probe_reason); > } > EXPORT_SYMBOL(free_device_res); > > @@ -333,9 +334,13 @@ static int device_probe_deferred(void) > } > } while (success); > > - list_for_each_entry(dev, &deferred, active) > - dev_err(dev, "probe permanently deferred\n"); > - > + list_for_each_entry(dev, &deferred, active) { > + if (dev->deferred_probe_reason) > + dev_err(dev, "probe permanently deferred (%s)\n", > + dev->deferred_probe_reason); > + else > + dev_err(dev, "probe permanently deferred\n"); > + } > return 0; > } > late_initcall(device_probe_deferred); > @@ -573,6 +578,24 @@ const void *device_get_match_data(struct device_d *dev) > return NULL; > } > > +static void device_set_deferred_probe_reason(struct device_d *dev, const struct va_format *vaf) > +{ > + char *reason; > + char *last_char; > + > + free(dev->deferred_probe_reason); > + > + reason = xasprintf("%pV", vaf); > + > + /* drop newline char at end of reason string */ > + last_char = reason + strlen(reason) - 1; > + > + if (*last_char == '\n') > + *last_char = '\0'; > + > + dev->deferred_probe_reason = reason; > +} > + > /** > * dev_err_probe - probe error check and log helper > * @loglevel: log level configured in source file > @@ -584,8 +607,12 @@ const void *device_get_match_data(struct device_d *dev) > * 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. > + * > + * In case of -EPROBE_DEFER it sets the device's deferred_probe_reason attribute, > + * but does not report an error. The error is recorded and displayed later, if > + * (and only if) the probe is permanently deferred. For all other error codes, > + * it just outputs the error along with the formatted message. > + * > * It replaces code sequence:: > * > * if (err != -EPROBE_DEFER) > @@ -601,8 +628,8 @@ const void *device_get_match_data(struct device_d *dev) > * Returns @err. > * > */ > -int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...); > -int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...) > +int dev_err_probe(struct device_d *dev, int err, const char *fmt, ...); > +int dev_err_probe(struct device_d *dev, int err, const char *fmt, ...) > { > struct va_format vaf; > va_list args; > @@ -611,6 +638,9 @@ int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...) > vaf.fmt = fmt; > vaf.va = &args; > > + if (err == -EPROBE_DEFER) > + device_set_deferred_probe_reason(dev, &vaf); > + > dev_printf(err == -EPROBE_DEFER ? MSG_DEBUG : MSG_ERR, > dev, "error %pe: %pV", ERR_PTR(err), &vaf); > > diff --git a/include/driver.h b/include/driver.h > index b35b5f397..a89ce7af9 100644 > --- a/include/driver.h > +++ b/include/driver.h > @@ -88,6 +88,11 @@ struct device_d { > * when the driver should actually detect client devices > */ > int (*detect) (struct device_d *); > + > + /* > + * if a driver probe is deferred, this stores the last error > + */ > + char *deferred_probe_reason; > }; > > /** @brief Describes a driver present in the system */ > diff --git a/include/linux/printk.h b/include/linux/printk.h > index 39523b057..e21e859bf 100644 > --- a/include/linux/printk.h > +++ b/include/linux/printk.h > @@ -76,12 +76,12 @@ static inline int pr_print(int level, const char *format, ...) > __dev_printf(8, (dev) , format , ## arg) > > #if LOGLEVEL >= MSG_ERR > -int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...) > +int dev_err_probe(struct device_d *dev, int err, const char *fmt, ...) > __attribute__ ((format(__printf__, 3, 4))); > #elif !defined(dev_err_probe) > -static int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...) > +static int dev_err_probe(struct device_d *dev, int err, const char *fmt, ...) > __attribute__ ((format(__printf__, 3, 4))); > -static inline int dev_err_probe(const struct device_d *dev, int err, const char *fmt, ...) > +static inline int dev_err_probe(struct device_d *dev, int err, const char *fmt, ...) > { > return err; > } -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |