]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsblk: introduce 'MQ' column
authorzhenwei pi <pizhenwei@bytedance.com>
Fri, 3 Jun 2022 12:24:01 +0000 (20:24 +0800)
committerKarel Zak <kzak@redhat.com>
Mon, 6 Jun 2022 10:31:56 +0000 (12:31 +0200)
Typically a modern block device supports mutil queues feature, count
queues by walking '$sysfs/mq' directory. If no '$sysfs/mq' exists, it
is a legacy single queue.

~# lsblk --nvme -o NAME,TYPE,MODEL,TRAN,RQ-SIZE,MQ
NAME    TYPE MODEL                      TRAN   RQ-SIZE  MQ
nvme0n1 disk INTEL SSDPF2KX038TZ        nvme      1023 135
nvme3n1 disk INTEL SSDPE2KX020T8        nvme      1023 128
nvme1n1 disk SAMSUNG MZQL23T8HCLS-00A07 nvme      1023 129
nvme2n2 disk RP2A03T8RK004LX            nvme      1023  64
nvme2n3 disk RP2A03T8RK004LX            nvme      1023  64

Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
bash-completion/lsblk
misc-utils/lsblk.c

index 697dd23d21cefd9fc80b188cc2e23981c937c86a..6756764b260bb81c041000f523eb4ee52c9aefed 100644 (file)
@@ -11,7 +11,7 @@ _lsblk_module()
                RO RM HOTPLUG MODEL SERIAL SIZE STATE OWNER GROUP MODE ALIGNMENT MIN-IO OPT-IO
                PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE TYPE DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
                WSAME WWN RAND PKNAME HCTL TRAN SUBSYSTEMS REV VENDOR ZONED ZONE-SZ ZONE-WGRAN
-               ZONE-APP ZONE-NR ZONE-OMAX ZONE-AMAX DAX
+               ZONE-APP ZONE-NR ZONE-OMAX ZONE-AMAX DAX MQ
        "
 
        case $prev in
index 64d7edad6f4bcc82be3d625d76fae58b3daafb5e..d9c4ee982595de9f3ca20f43bf4008a678fa73dd 100644 (file)
@@ -90,6 +90,7 @@ enum {
        COL_MINIO,
        COL_MODE,
        COL_MODEL,
+       COL_MQ,
        COL_NAME,
        COL_OPTIO,
        COL_OWNER,
@@ -189,6 +190,7 @@ static struct colinfo infos[] = {
        [COL_MINIO] = { "MIN-IO", 6, SCOLS_FL_RIGHT, N_("minimum I/O size"), COLTYPE_NUM },
        [COL_MODEL] = { "MODEL", 0.1, SCOLS_FL_TRUNC, N_("device identifier") },
        [COL_MODE] = { "MODE", 10, 0, N_("device node permissions") },
+       [COL_MQ] = { "MQ", 3, SCOLS_FL_RIGHT, N_("device queues") },
        [COL_NAME] = { "NAME", 0.25, SCOLS_FL_NOEXTREMES, N_("device name") },
        [COL_OPTIO] = { "OPT-IO", 6, SCOLS_FL_RIGHT, N_("optimal I/O size"), COLTYPE_NUM },
        [COL_OWNER] = { "OWNER", 0.1, SCOLS_FL_TRUNC, N_("user name"), },
@@ -746,6 +748,34 @@ static void device_read_bytes(struct lsblk_device *dev, char *path, char **str,
        }
 }
 
+static void process_mq(struct lsblk_device *dev, char **str)
+{
+       DIR *dir;
+       struct dirent *d;
+       unsigned int queues = 0;
+
+       DBG(DEV, ul_debugobj(dev, "%s: process mq", dev->name));
+
+       dir = ul_path_opendir(dev->sysfs, "mq");
+       if (!dir) {
+               *str = xstrdup("1");
+               DBG(DEV, ul_debugobj(dev, "%s: no mq supported, use a single queue", dev->name));
+               return;
+       }
+
+       while ((d = xreaddir(dir))) {
+               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+                       continue;
+
+               queues++;
+       }
+
+       closedir(dir);
+
+       DBG(DEV, ul_debugobj(dev, "%s: has %d queues", dev->name, queues));
+       xasprintf(str, "%3u", queues);
+}
+
 /*
  * Generates data (string) for column specified by column ID for specified device. If sortdata
  * is not NULL then returns number usable to sort the column if the data are available for the
@@ -1143,6 +1173,9 @@ static char *device_get_data(
        case COL_DAX:
                ul_path_read_string(dev->sysfs, &str, "queue/dax");
                break;
+       case COL_MQ:
+               process_mq(dev, &str);
+               break;
        };
 
        return str;