-
Notifications
You must be signed in to change notification settings - Fork 697
nvme-cli: enhance the visibility of multipath using show-topology command #2911
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Although the help text for the nvme show-topology command indicates support for a <device> option, this option has no effect in practice — specifying an NVMe device name does not filter the output. This commit adds proper support for the <device> option, enabling users to filter the topology output based on the specified NVMe device. Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: Nilay Shroff <[email protected]> Signed-off-by: Daniel Wagner <[email protected]>
This commit enhances the show-topology command by adding support for
NVMe multipath. With this change, users can now list all paths to a
namespace from its corresponding head node device. Each NVMe path
entry then also includes additional details such as ANA state, NUMA
node, and queue depth, improving visibility into multipath configs.
This information can be particularly helpful for debugging and
analyzing NVMe multipath setups.
To support this functionality, the "--ranking" option of the nvme
show-topology command has been extended with a new sub-option:
"multipath".
Since this enhancement is specific to NVMe multipath, the iopolicy
configured under each subsystem is now always displayed. Previously,
iopolicy was shown only with nvme show-topology verbose output, but
it is now included by default to improve usability and provide better
context when reviewing multipath configurations via show-topology.
With this update, users can view the multipath topology of a multi
controller/port NVMe disk.
Examples:
$ nvme show-topology -r multipath
nvme-subsys2 - NQN=nvmet_subsystem
hostnqn=nqn.2014-08.org.nvmexpress:uuid:12b49f6e-0276-4746-b10c-56815b7e6dc2
iopolicy=numa
_ _ _<head-node>
/ _ _ _ <ana-state>
/ / _ _ _ <numa-node-list>
/ / /
| / /
+- nvme2n1 (ns 1) / /
\ | |
+- nvme2c2n1 optimized 1,2 nvme2 tcp traddr=127.0.0.2,trsvcid=4460,src_addr=127.0.0.1 live
+- nvme2c3n1 optimized 3,4 nvme3 tcp traddr=127.0.0.3,trsvcid=4460,src_addr=127.0.0.1 live
For iopolicy=numa, only NUMA node list is shown (queue depth is hidden).
$ nvme show-topology -r multipath
nvme-subsys2 - NQN=nvmet_subsystem
hostnqn=nqn.2014-08.org.nvmexpress:uuid:12b49f6e-0276-4746-b10c-56815b7e6dc2
iopolicy=queue-depth
_ _ _<head-node>
/ _ _ _ <ana-state>
/ /
/ / _ _ _<queue-depth>
| / /
+- nvme2n1 (ns 1) / /
\ | |
+- nvme2c2n1 optimized 0 nvme2 tcp traddr=127.0.0.2,trsvcid=4460,src_addr=127.0.0.1 live
+- nvme2c3n1 optimized 0 nvme3 tcp traddr=127.0.0.3,trsvcid=4460,src_addr=127.0.0.1 live
For iopolicy=queue-depth, queue depth is shown (NUMA node list is hidden).
$ nvme show-topology -r multipath
nvme-subsys2 - NQN=nvmet_subsystem
hostnqn=nqn.2014-08.org.nvmexpress:uuid:12b49f6e-0276-4746-b10c-56815b7e6dc2
iopolicy=round-robin
_ _ _<head-node>
/ _ _ _ <ana-state>
/ /
/ /
| /
+- nvme2n1 (ns 1) /
\ |
+- nvme2c2n1 optimized nvme2 tcp traddr=127.0.0.2,trsvcid=4460,src_addr=127.0.0.1 live
+- nvme2c3n1 optimized nvme3 tcp traddr=127.0.0.3,trsvcid=4460,src_addr=127.0.0.1 live
For iopolicy=round-robin, both NUMA node list and queue depth are hidden.
Note:
The annotations above (e.g., <numa-node-list>, <ana-state>, <head-node>,
<queue-depth>) are for illustration only and are not part of the actual
command output. A more human-friendly tabular format will be introduced
in a follow-up patches.
Signed-off-by: Nilay Shroff <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Signed-off-by: Daniel Wagner <[email protected]>
Some nvme-cli commands, such as nvme list and nvme list -v, support output in tabular format. Currently, the table output is not well aligned because column widths are fixed at print time, regardless of the length of the data in each column. This often results in uneven and hard-to-read output.For any new CLI command that requires tabular output, developers must manually specify the column width and row value width, which is both error-prone and inconsistent. This patch introduces a set of common table APIs that: - Automatically calculate column widths based on the content - Maintain proper alignment regardless of value length - Simplify adding tabular output support to new and existing commands The new APIs are: 1. table_init() — Allocate a table instance. 2. table_add_columns() — Add column definitions (struct table_column), including name and alignment (LEFT, RIGHT, CENTERED). 3. table_add_columns_filter() - Same as table_add_columns() but also provide a filter function callback which could be then used by the caller for filtering any column. 3. table_get_row_id() — Reserve a row index for inserting values. 4. table_add_row() — Add a row to the table. 5. table_print() — Print the table with auto-calculated widths. 6. table_free() — Free resources allocated for the table. For adding values, the following setter APIs are provided, each supporting alignment types (LEFT, RIGHT, or CENTERED): - table_set_value_str() - table_set_value_int() - table_set_value_unsigned() - table_set_value_long() - table_set_value_unsigned_long() Usage steps: 1. Call table_init() to create a table handle. 2. Define an array of struct table_column specifying column names and alignment, then call table_add_columns() or if you want to filter column then table_add_columns_filter(). 3. Obtain a row ID using table_get_row_id() and set values using the appropriate setter table APIs : table_set_value_*() function. 4. Add the completed row using table_add_row(). 5. Repeat steps 3–4 for each additional row. 5. Call table_print() to display the table. 6. Call table_free() to release table resources. With these APIs, developers no longer need to pre-calculate column or row widths. The output is consistently aligned and easy to read. Suggested-by: Daniel Wagner <[email protected]> Signed-off-by: Nilay Shroff <[email protected]> Signed-off-by: Daniel Wagner <[email protected]>
The nvme CLI command show-topology currently prints the topology output in a tree format. However, in some cases it is more convenient and easier to read or interpret the output when displayed in a tabular form. This patch adds support for printing the show-topology output in a tabular format. To achieve this, the --output-format option, which previously supported only normal and json formats, is extended to include a new tabular format. With this change, the user can now choose to print the topology in any of the following formats: normal, json, or tabular. The new tabular output leverages the recently introduced table APIs to produce well- aligned, easy-to-read output. Suggested-by: Daniel Wagner <[email protected]> Signed-off-by: Nilay Shroff <[email protected]> Signed-off-by: Daniel Wagner <[email protected]>
5b47fba to
7cde355
Compare
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
https://lore.kernel.org/all/[email protected]