Linux Storage - qla2xxx module listing
Linux Storage Solution · Config document · referenced from Linux HBA and SCSI inventory
The systool -m qla2xxx -v listing on HV01: the attributes, the parameters and the loaded sections of the QLogic FC driver module as it ran with the two QMH2572 ports. The notes do not type the module name; they find it with a nested command that reads PHYSDEVDRIVER out of the fc_transport class. Everything ran as root on HV01 and reads only; no parameter was changed.
| Item | Value |
|---|---|
| Module | qla2xxx, version 8.05.00.03.55.6-k, state live, reference count 11 |
| On which host | HV01, the first blade (HP BL660c Gen8) |
| Run as | root |
| Tool | systool -m <module> -v from the sysfsutils package; the notes do not give its version |
| Parameters | 24, all at the values the listing shows; the notes do not show a modprobe.d file, so I take them for the driver's defaults, but the notes do not say so |
| Found with | the nested command below, which prints qla2xxx from the last PHYSDEVDRIVER= line of systool -c fc_transport -v |
The command
The inner command in backquotes lists the fc_transport class, keeps the PHYSDEVDRIVER lines, takes what follows the =, keeps the last line and strips the one double quote that systool closes the uevent value with; the result, qla2xxx, becomes the argument of systool -m.
$ systool -m `systool -c fc_transport -v | grep PHYSDEVDRIVER | awk -F'=' '{print $2}' | tail -n 1 | sed 's/"//'` -v
The listing
output 52 lines
Module = "qla2xxx"
Attributes:
initstate = "live"
refcnt = "11"
srcversion = "4DA5A8C238B204974660A32"
version = "8.05.00.03.55.6-k"
Parameters:
ql2xallocfwdump = "1"
ql2xasynctmfenable = "0"
ql2xdbwr = "1"
ql2xdontresethba = "0"
ql2xenabledif = "2"
ql2xenablehba_err_chk= "2"
ql2xetsenable = "0"
ql2xextended_error_logging= "0"
ql2xfdmienable = "1"
ql2xfwloadbin = "0"
ql2xgffidenable = "0"
ql2xiidmaenable = "1"
ql2xloginretrycount = "0"
ql2xlogintimeout = "20"
ql2xmaxlun = "65535"
ql2xmaxqdepth = "32"
ql2xmaxqueues = "1"
ql2xmdcapmask = "31"
ql2xmdenable = "1"
ql2xmultique_tag = "0"
ql2xplogiabsentdevice= "0"
ql2xshiftctondsd = "6"
ql2xtargetreset = "1"
qlport_down_retry = "0"
Sections:
.altinstr_replacement= "0xedf7773c"
.altinstructions = "0xedf87cb0"
.bss = "0xedf8df60"
.data = "0xedf88da0"
.devinit.text = "0xedf77920"
.exit.text = "0xedf77880"
.gnu.linkonce.this_module= "0xedf8dde0"
.init.text = "0xedf99000"
.rodata = "0xedf79780"
.rodata.str1.1 = "0xedf8482c"
.rodata.str1.4 = "0xedf7b500"
.smp_locks = "0xedf87770"
.strtab = "0xedf9de6c"
.symtab = "0xedf9922c"
.text = "0xedf2b000"
__bug_table = "0xedf8819b"
__mcount_loc = "0xedf8843c"
__param = "0xedf8825c"The three blocks
The listing is what /sys/module/qla2xxx/ holds, in three groups.
| Block | What it is |
|---|---|
Attributes | the module itself: initstate live (loaded and initialised), refcnt 11 (how many users hold it, which my understanding says is the two SCSI hosts and the devices under them), srcversion (a checksum of the source it was built from) and version |
Parameters | the current values of the module parameters, /sys/module/qla2xxx/parameters/; they can be set at load time through modprobe or /etc/modprobe.d/, and the notes show nothing of the kind |
Sections | the addresses at which the module's ELF sections were loaded into the kernel; of no use for storage work and kept only because the listing has them. The addresses have eight hex digits, so a 32-bit kernel address space, which as I remember it fits the XenServer control domain of the time; the notes do not say |
The parameters worth a sentence
The meanings below are my understanding of the driver's own parameter descriptions (modinfo qla2xxx), not something the notes explain; where I am not sure I say so.
| Parameter | Value | My understanding |
|---|---|---|
ql2xmaxqdepth | 32 | the queue depth the driver sets for each LUN, that is how many commands may be outstanding to one LUN at a time |
qlport_down_retry | 0 | how many times a command to a port that reports PORT-DOWN is retried; with 0 the driver takes the port-down retry count stored in the HBA's NVRAM, and that count also becomes the dev_loss_tmo of the remote ports, which is why they show 16 (the mechanism is in the driver source, see below) |
ql2xlogintimeout | 20 | the login timeout in seconds |
ql2xloginretrycount | 0 | an alternate login retry count; 0 leaves the value stored in the HBA's NVRAM |
ql2xmaxlun | 65535 | the highest LUN number the driver probes for; it covers LUN 254, the SES enclosure device |
ql2xmaxqueues | 1 | the number of request queues; 1 is a single queue, the multiqueue mode is off |
ql2xfdmienable | 1 | the port registers its HBA details with the fabric's management server (FDMI), which is where a switch gets the host's HBA model and driver version from |
ql2xiidmaenable | 1 | iIDMA on: the HBA adjusts its data rate per target to the speed the target port logged in with |
ql2xenabledif | 2 | T10 data integrity (DIF) support level; 2 is the highest the driver offered, as I read it, and it only matters with an array and a kernel that use it |
ql2xenablehba_err_chk | 2 | the HBA checks the T10 guard tags on read and write; it belongs with the parameter above |
ql2xextended_error_logging | 0 | the extended driver logging is off; it is the first parameter to raise when a path problem has to be debugged |
ql2xtargetreset | 1 | the driver may issue a target reset as part of error recovery |
The rest (ql2xallocfwdump, ql2xasynctmfenable, ql2xdbwr, ql2xdontresethba, ql2xetsenable, ql2xfwloadbin, ql2xgffidenable, ql2xmdcapmask, ql2xmdenable, ql2xmultique_tag, ql2xplogiabsentdevice, ql2xshiftctondsd) are firmware dump, firmware loading, debugging and minidump switches that were not touched and that I would not touch without a reason from the vendor.
Checked against qla2xxx 10.02.10.100-k in Linux 7.2 and the HPE host guides
| As built | Today |
|---|---|
qla2xxx 8.05.00.03.55.6-k | The in-kernel driver is 10.02.10.100-k in Linux 7.0 to 7.2 and 12.00.00.2607b2 in the development tree, maintained by Marvell. The QMH2572's chip, ISP2532, is still in the driver's PCI table and its firmware file ql2500_fw.bin is at 8.08.207 in linux-firmware |
| 24 parameters | 19 still exist. Gone: ql2xmaxqueues and ql2xmultique_tag (Linux 4.10, replaced by ql2xmqsupport, default on), ql2xtargetreset (Linux 5.16), ql2xiidmaenable and ql2xetsenable (Linux 6.16, as unused: the last use of ql2xiidmaenable went in 2017). New since then include ql2xnvmeenable (FC-NVMe, default on), ql2xsmartsan, ql2xenableclass2 and ql2xsecenable |
ql2xmaxqdepth 32 | The default is now 64. HPE's 3PAR and Primera guides set options qla2xxx qlport_down_retry=14 ql2xmaxqdepth=16, the Alletra MP B10000 guide qlport_down_retry=10 ql2xmaxqdepth=16; the HP RHEL guide of 2013 already asked for ql2xmaxqdepth=16 qlport_down_retry=10 ql2xloginretrycount=30, none of which this host had |
ql2xasynctmfenable 0 | The default is now 1 |
qlport_down_retry 0 | Still exists with default 0; the driver still copies the resulting port-down retry count into the remote ports' dev_loss_tmo (see systool fc_transport and fc_remote_ports) |
| the other 16 values | Unchanged defaults: ql2xallocfwdump 1, ql2xdbwr 1, ql2xdontresethba 0, ql2xenabledif 2, ql2xenablehba_err_chk 2, ql2xextended_error_logging 0, ql2xfdmienable 1, ql2xfwloadbin 0, ql2xgffidenable 0, ql2xloginretrycount 0, ql2xlogintimeout 20, ql2xmaxlun 65535, ql2xmdcapmask 31, ql2xmdenable 1, ql2xplogiabsentdevice 0, ql2xshiftctondsd 6 |
That the as-built values match today's defaults in 17 of 19 surviving parameters is the best evidence I have that the host ran the driver's defaults; the notes themselves do not say so.