DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Bruce Richardson <bruce.richardson@intel.com>
To: David Marchand <david.marchand@redhat.com>
Cc: <dev@dpdk.org>, <patrick.mahan@hpe.com>,
	Anatoly Burakov <anatoly.burakov@intel.com>
Subject: Re: [PATCH] net/ice: improve log messages for DDP loading
Date: Tue, 19 May 2026 18:58:05 +0100	[thread overview]
Message-ID: <agykrWAcEnOBZvY-@bricha3-mobl1.ger.corp.intel.com> (raw)
In-Reply-To: <20260516101942.443871-1-david.marchand@redhat.com>

On Sat, May 16, 2026 at 12:19:41PM +0200, David Marchand wrote:
> Some nics may not provide a serial number (PCI capability
> RTE_PCI_EXT_CAP_ID_DSN).
> 
> This results in a confusing ERROR log:
> ICE_INIT: ice_dev_init(): Failed to read device serial number
> 
> This is confusing as DDP loading does *not* require the serial number to
> be present for the port to be functional afterwards.
> 
> Besides, after trying various path, if the default DDP is not present on
> the runtime system, the port initialisation ends up with a vague error:
> ICE_INIT: ice_load_pkg(): failed to search file path
> 
> Improve the situation with adjusting the log level when reading the
> SN fails, then add more debug context to DDP file loading and end up
> with a ERROR log mentioning the expected file.
> 
> ICE_INIT: ice_firmware_read(): Cannot read DDP file
> 	/lib/firmware/updates/intel/ice/ddp/ice-b49691ffffe6e69c.pkg
> ICE_INIT: ice_firmware_read(): Cannot read DDP file
> 	/lib/firmware/intel/ice/ddp/ice-b49691ffffe6e69c.pkg
> ICE_INIT: ice_firmware_read(): Cannot read DDP file
> 	/lib/firmware/updates/intel/ice/ddp/ice.pkg
> ICE_INIT: ice_firmware_read(): Cannot read DDP file
> 	/lib/firmware/intel/ice/ddp/ice.pkg
> ICE_INIT: ice_load_pkg(): Failed to load default DDP package
> 	/lib/firmware/intel/ice/ddp/ice.pkg
> 
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
>  drivers/net/intel/ice/ice_ethdev.c | 31 ++++++++++++++++++++----------
>  1 file changed, 21 insertions(+), 10 deletions(-)
> 
On top of the changes made in this patch, how about something like the
below to extend things?

Rather than just debug logging the failed paths, we change the debug logs
to always log each load attempt. We also record the path as it's attempted,
and then on failure to load any path we use that record to print out an
error message for each failure, so the user can see in the error logs ALL
the failed paths, rather than having to re-run the app at debug level to
find them.

WDYT?

/Bruce

diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index e065581ccf..926b0febea 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <sys/queue.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
@@ -2003,15 +2004,23 @@ static int ice_read_customized_path(char *pkg_file, uint16_t buff_len)
        return n;
 }
 
+struct ddp_path_list_entry {
+       TAILQ_ENTRY(ddp_path_list_entry) next;
+       char path[ICE_MAX_PKG_FILENAME_SIZE];
+};
+TAILQ_HEAD(ddp_paths_head, ddp_path_list_entry);
+
 static int
-ice_firmware_read(const char *file, void *buf, size_t *bufsz)
+ice_firmware_read(const char *file, void *buf, size_t *bufsz, struct ddp_paths_head *searched_paths)
 {
-       int ret = rte_firmware_read(file, buf, bufsz);
-
-       if (ret < 0)
-               PMD_INIT_LOG(DEBUG, "Cannot read DDP file %s", file);
-
-       return ret;
+       /* record paths searched for DDP files */
+       struct ddp_path_list_entry *path = malloc(sizeof(struct ddp_path_list_entry));
+       if (path) {
+               strlcpy(path->path, file, sizeof(path->path));
+               TAILQ_INSERT_TAIL(searched_paths, path, next);
+       }
+       PMD_INIT_LOG(DEBUG, "Trying to load DDP file from: %s", file);
+       return rte_firmware_read(file, buf, bufsz);
 }
 
 int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn)
@@ -2020,6 +2029,8 @@ int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn)
        char pkg_file[ICE_MAX_PKG_FILENAME_SIZE];
        char customized_path[ICE_MAX_PKG_FILENAME_SIZE];
        char opt_ddp_filename[ICE_MAX_PKG_FILENAME_SIZE];
+       struct ddp_paths_head searched_paths = TAILQ_HEAD_INITIALIZER(searched_paths);
+       struct ddp_path_list_entry *path, *tmp;  /* used to free the paths list */
        void *buf;
        size_t bufsz;
        int err;
@@ -2027,9 +2038,14 @@ int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn)
        /* first read any explicitly referenced DDP file*/
        if (adapter->devargs.ddp_filename != NULL) {
                strlcpy(pkg_file, adapter->devargs.ddp_filename, sizeof(pkg_file));
-               if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0) {
+               if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0) {
                        goto load_fw;
                } else {
+                       /* free the searched paths list */
+                       RTE_TAILQ_FOREACH_SAFE(path, &searched_paths, next, tmp) {
+                               TAILQ_REMOVE(&searched_paths, path, next);
+                               free(path);
+                       }
                        PMD_INIT_LOG(ERR, "Cannot load DDP file: %s", pkg_file);
                        return -1;
                }
@@ -2043,11 +2059,11 @@ int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn)
                if (use_dsn) {
                        snprintf(pkg_file, RTE_DIM(pkg_file), "%s/%s",
                                        customized_path, opt_ddp_filename);
-                       if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0)
+                       if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0)
                                goto load_fw;
                }
                snprintf(pkg_file, RTE_DIM(pkg_file), "%s/%s", customized_path, "ice.pkg");
-               if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0)
+               if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0)
                        goto load_fw;
        }
 
@@ -2057,27 +2073,39 @@ int ice_load_pkg(struct ice_adapter *adapter, bool use_dsn, uint64_t dsn)
        strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_UPDATES,
                ICE_MAX_PKG_FILENAME_SIZE);
        strcat(pkg_file, opt_ddp_filename);
-       if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0)
+       if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0)
                goto load_fw;
 
        strncpy(pkg_file, ICE_PKG_FILE_SEARCH_PATH_DEFAULT,
                ICE_MAX_PKG_FILENAME_SIZE);
        strcat(pkg_file, opt_ddp_filename);
-       if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0)
+       if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0)
                goto load_fw;
 
 no_dsn:
        strncpy(pkg_file, ICE_PKG_FILE_UPDATES, ICE_MAX_PKG_FILENAME_SIZE);
-       if (ice_firmware_read(pkg_file, &buf, &bufsz) == 0)
+       if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) == 0)
                goto load_fw;
 
        strncpy(pkg_file, ICE_PKG_FILE_DEFAULT, ICE_MAX_PKG_FILENAME_SIZE);
-       if (ice_firmware_read(pkg_file, &buf, &bufsz) < 0) {
-               PMD_INIT_LOG(ERR, "Failed to load default DDP package " ICE_PKG_FILE_DEFAULT);
+       if (ice_firmware_read(pkg_file, &buf, &bufsz, &searched_paths) < 0) {
+               /* list out all the failed package reads, emptying the list */
+               RTE_TAILQ_FOREACH_SAFE(path, &searched_paths, next, tmp) {
+                       PMD_INIT_LOG(ERR, "Failed to load DDP package from: %s", path->path);
+                       TAILQ_REMOVE(&searched_paths, path, next);
+                       free(path);
+               }
+               PMD_INIT_LOG(ERR, "Error: Cannot load any DDP package");
                return -1;
        }
 
 load_fw:
+       /* we have success opening a package, so clear the load list */
+       RTE_TAILQ_FOREACH_SAFE(path, &searched_paths, next, tmp) {
+               TAILQ_REMOVE(&searched_paths, path, next);
+               free(path);
+       }
+
        PMD_INIT_LOG(DEBUG, "DDP package name: %s", pkg_file);
 
        err = ice_copy_and_init_pkg(hw, buf, bufsz, adapter->devargs.ddp_load_sched);

  reply	other threads:[~2026-05-19 17:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-16 10:19 [PATCH] net/ice: improve log messages for DDP loading David Marchand
2026-05-19 17:58 ` Bruce Richardson [this message]
2026-05-20 15:44   ` David Marchand
2026-05-20 15:52     ` Bruce Richardson
2026-05-20 15:52 ` Bruce Richardson
2026-05-22 14:53   ` Bruce Richardson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=agykrWAcEnOBZvY-@bricha3-mobl1.ger.corp.intel.com \
    --to=bruce.richardson@intel.com \
    --cc=anatoly.burakov@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=patrick.mahan@hpe.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox