From fde914fd1c1300215a5f28ba49cb7a6ab4bcff11 Mon Sep 17 00:00:00 2001 From: Harald Freudenberger Date: Wed, 11 Aug 2021 15:54:58 +0200 Subject: [PATCH] lszcrypt: Improved output for deconfig cards and queues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slight rework of the lszcrypt code with: - a queue or card in deconfigured mode is displayed as 'deconfig' regardless which driver is bound to the device. - a queue or card in 'deconfig' mode does not show any counters any more but displays a '-' instead. - a queue not bound or bound to something else as the 'default' zcrypt dd does not show any counters but displays a '-' instead. Signed-off-by: Harald Freudenberger Signed-off-by: Jan Höppner --- zconf/zcrypt/lszcrypt.c | 174 +++++++++++++++++++++++++--------------- 1 file changed, 109 insertions(+), 65 deletions(-) diff --git a/zconf/zcrypt/lszcrypt.c b/zconf/zcrypt/lszcrypt.c index f0a089a0..7939071c 100644 --- a/zconf/zcrypt/lszcrypt.c +++ b/zconf/zcrypt/lszcrypt.c @@ -22,6 +22,8 @@ #include "lib/util_scandir.h" #include "lib/zt_common.h" +#include "misc.h" + /* * Private data */ @@ -331,13 +333,49 @@ static void show_capability(const char *id_str) printf("\n"); } +/* + * Read driver entry in dir or in dir/subdir and store driver into buf. + * Returns: + * 0 if there is no driver link (no driver bound to this device or error) + * 1 if one of the cexXcard or cexXqueue driver is bound to this device + * 2 if the vfio is bound to this device + */ +static int read_driver(const char *dir, const char *subdir, char *buf, size_t buflen) +{ + char drvlink[PATH_MAX], linktarget[PATH_MAX]; + char *p, driver[256]; + + if (subdir) + snprintf(drvlink, sizeof(drvlink), "%s/%s/driver", dir, subdir); + else + snprintf(drvlink, sizeof(drvlink), "%s/driver", dir); + drvlink[sizeof(drvlink) - 1] = '\0'; + + memset(linktarget, 0, sizeof(linktarget)); + + if (readlink(drvlink, linktarget, sizeof(linktarget)) > 0) { + p = strrchr(linktarget, '/'); + if (p) { + strncpy(driver, p + 1, sizeof(driver)); + driver[sizeof(driver) - 1] = '\0'; + strncpy(buf, driver, buflen); + if (misc_regex_match(driver, "cex[0-9](card|queue)")) + return 1; + else if (misc_regex_match(driver, "vfio.ap")) + return 2; + } + } + + return 0; +} + /* * Read subdevice default attributes */ static void read_subdev_rec_default(struct util_rec *rec, const char *grp_dev, const char *sub_dev) { - long value; + long config = -1, online = -1; char buf[256]; unsigned long facility; @@ -346,24 +384,19 @@ static void read_subdev_rec_default(struct util_rec *rec, const char *grp_dev, else util_rec_set(rec, "type", buf); - if (util_path_is_readable("%s/%s/online", grp_dev, sub_dev)) { - util_file_read_l(&value, 10, "%s/%s/online", grp_dev, sub_dev); - if (value > 0) - util_rec_set(rec, "online", "online"); - else { - /* device is offline, check config (if available) */ - if (util_path_is_readable("%s/%s/config", grp_dev, sub_dev)) { - util_file_read_l(&value, 10, "%s/%s/config", grp_dev, sub_dev); - if (value > 0) - util_rec_set(rec, "online", "offline"); - else - util_rec_set(rec, "online", "deconfig"); - } else - util_rec_set(rec, "online", "offline"); - } + if (util_path_is_readable("%s/%s/config", grp_dev, sub_dev)) + util_file_read_l(&config, 10, "%s/%s/config", grp_dev, sub_dev); + if (util_path_is_readable("%s/%s/online", grp_dev, sub_dev)) + util_file_read_l(&online, 10, "%s/%s/online", grp_dev, sub_dev); + if (config == 0) { + util_rec_set(rec, "online", "deconfig"); } else { - /* no online attribute */ - util_rec_set(rec, "online", "-"); + if (online > 0) + util_rec_set(rec, "online", "online"); + else if (online == 0) + util_rec_set(rec, "online", "offline"); + else + util_rec_set(rec, "online", "-"); } util_file_read_ul(&facility, 16, "%s/ap_functions", grp_dev); @@ -376,9 +409,13 @@ static void read_subdev_rec_default(struct util_rec *rec, const char *grp_dev, else util_rec_set(rec, "mode", "Unknown"); - util_file_read_line(buf, sizeof(buf), "%s/%s/request_count", - grp_dev, sub_dev); - util_rec_set(rec, "requests", buf); + if (config == 0) { + util_rec_set(rec, "requests", "-"); + } else { + util_file_read_line(buf, sizeof(buf), "%s/%s/request_count", + grp_dev, sub_dev); + util_rec_set(rec, "requests", buf); + } } /* @@ -387,19 +424,29 @@ static void read_subdev_rec_default(struct util_rec *rec, const char *grp_dev, static void read_subdev_rec_verbose(struct util_rec *rec, const char *grp_dev, const char *sub_dev) { - int i; + int i, drvinfo; unsigned long facility; - char buf[256], afile[PATH_MAX]; - long depth, pending1, pending2; + char buf[256]; + long depth, pending1, pending2, config = -1; if (l.verbose == 0) return; - util_file_read_l(&pending1, 10, "%s/%s/pendingq_count", - grp_dev, sub_dev); - util_file_read_l(&pending2, 10, "%s/%s/requestq_count", - grp_dev, sub_dev); - util_rec_set(rec, "pending", "%ld", pending1 + pending2); + drvinfo = read_driver(grp_dev, sub_dev, buf, sizeof(buf)); + util_rec_set(rec, "driver", drvinfo > 0 ? buf : "-no-driver-"); + + if (util_path_is_readable("%s/config", grp_dev)) + util_file_read_l(&config, 10, "%s/config", grp_dev); + + if (config == 0 || drvinfo != 1) { + util_rec_set(rec, "pending", "-"); + } else { + util_file_read_l(&pending1, 10, "%s/%s/pendingq_count", + grp_dev, sub_dev); + util_file_read_l(&pending2, 10, "%s/%s/requestq_count", + grp_dev, sub_dev); + util_rec_set(rec, "pending", "%ld", pending1 + pending2); + } util_file_read_line(buf, sizeof(buf), "%s/hwtype", grp_dev); util_rec_set(rec, "hwtype", buf); @@ -412,14 +459,6 @@ static void read_subdev_rec_verbose(struct util_rec *rec, const char *grp_dev, buf[i] = facility & fac_bits[i].mask ? fac_bits[i].c : '-'; buf[i] = '\0'; util_rec_set(rec, "facility", buf); - - snprintf(afile, sizeof(afile), "%s/%s/driver", grp_dev, sub_dev); - afile[sizeof(afile) - 1] = '\0'; - memset(buf, 0, sizeof(buf)); - if (readlink(afile, buf, sizeof(buf)) > 0) - util_rec_set(rec, "driver", strrchr(buf, '/') + 1); - else - util_rec_set(rec, "driver", "-no-driver-"); } /* @@ -467,7 +506,7 @@ static void show_subdevices(struct util_rec *rec, const char *grp_dev) */ static void read_rec_default(struct util_rec *rec, const char *grp_dev) { - long value; + long config = -1, online = -1; char buf[256]; unsigned long facility; @@ -486,24 +525,27 @@ static void read_rec_default(struct util_rec *rec, const char *grp_dev) else util_rec_set(rec, "mode", "Unknown"); - if (util_path_is_readable("%s/online", grp_dev)) { - util_file_read_l(&value, 10, "%s/online", grp_dev); - if (value > 0) + if (util_path_is_readable("%s/config", grp_dev)) + util_file_read_l(&config, 10, "%s/config", grp_dev); + if (util_path_is_readable("%s/online", grp_dev)) + util_file_read_l(&online, 10, "%s/online", grp_dev); + if (config == 0) { + util_rec_set(rec, "online", "deconfig"); + } else { + if (online > 0) util_rec_set(rec, "online", "online"); - else { - if (util_path_is_readable("%s/config", grp_dev)) { - util_file_read_l(&value, 10, "%s/config", grp_dev); - if (value > 0) - util_rec_set(rec, "online", "offline"); - else - util_rec_set(rec, "online", "deconfig"); - } else - util_rec_set(rec, "online", "offline"); - } + else if (online == 0) + util_rec_set(rec, "online", "offline"); + else + util_rec_set(rec, "online", "-"); } - util_file_read_line(buf, sizeof(buf), "%s/request_count", grp_dev); - util_rec_set(rec, "requests", buf); + if (config == 0) { + util_rec_set(rec, "requests", "-"); + } else { + util_file_read_line(buf, sizeof(buf), "%s/request_count", grp_dev); + util_rec_set(rec, "requests", buf); + } } /* @@ -513,15 +555,22 @@ static void read_rec_verbose(struct util_rec *rec, const char *grp_dev) { int i; unsigned long facility; - char buf[256], afile[PATH_MAX]; - long depth, pending1, pending2; + char buf[256]; + long depth, pending1, pending2, config = -1; if (l.verbose == 0) return; - util_file_read_l(&pending1, 10, "%s/pendingq_count", grp_dev); - util_file_read_l(&pending2, 10, "%s/requestq_count", grp_dev); - util_rec_set(rec, "pending", "%ld", pending1 + pending2); + if (util_path_is_readable("%s/config", grp_dev)) + util_file_read_l(&config, 10, "%s/config", grp_dev); + + if (config == 0) { + util_rec_set(rec, "pending", "-"); + } else { + util_file_read_l(&pending1, 10, "%s/pendingq_count", grp_dev); + util_file_read_l(&pending2, 10, "%s/requestq_count", grp_dev); + util_rec_set(rec, "pending", "%ld", pending1 + pending2); + } util_file_read_line(buf, sizeof(buf), "%s/hwtype", grp_dev); util_rec_set(rec, "hwtype", buf); @@ -535,13 +584,8 @@ static void read_rec_verbose(struct util_rec *rec, const char *grp_dev) buf[i] = '\0'; util_rec_set(rec, "facility", buf); - snprintf(afile, sizeof(afile), "%s/driver", grp_dev); - afile[sizeof(afile) - 1] = '\0'; - memset(buf, 0, sizeof(buf)); - if (readlink(afile, buf, sizeof(buf)) > 0) - util_rec_set(rec, "driver", strrchr(buf, '/') + 1); - else - util_rec_set(rec, "driver", "-no-driver-"); + i = read_driver(grp_dev, NULL, buf, sizeof(buf)); + util_rec_set(rec, "driver", i > 0 ? buf : "-no-driver-"); } /*