From 2e61a144ddcc7f6ec5e3288ccc2ae59205bb1ddf Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Fri, 4 Mar 2016 16:08:14 -0700 Subject: [PATCH] nvme_manage: sort devices by PCI address This way, they are listed in a consistent order across runs. Change-Id: Ie920f4e0c2763efb6c1d2856b5ed0f57ecbe48c8 Signed-off-by: Daniel Verkamp --- examples/nvme/nvme_manage/nvme_manage.c | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/examples/nvme/nvme_manage/nvme_manage.c b/examples/nvme/nvme_manage/nvme_manage.c index 9d2f5040c7..98edf57591 100644 --- a/examples/nvme/nvme_manage/nvme_manage.c +++ b/examples/nvme/nvme_manage/nvme_manage.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,35 @@ static int num_devs = 0; #define foreach_dev(iter) \ for (iter = devs; iter - devs < num_devs; iter++) +static uint64_t +get_pci_addr(struct spdk_pci_device *pci_dev) +{ + uint64_t cmp; + + cmp = (uint64_t)spdk_pci_device_get_domain(pci_dev) << 24; + cmp |= (uint64_t)spdk_pci_device_get_bus(pci_dev) << 16; + cmp |= (uint64_t)spdk_pci_device_get_dev(pci_dev) << 8; + cmp |= (uint64_t)spdk_pci_device_get_func(pci_dev); + + return cmp; +} + +static int +cmp_devs(const void *ap, const void *bp) +{ + const struct dev *a = ap, *b = bp; + uint64_t cmp_a = get_pci_addr(a->pci_dev); + uint64_t cmp_b = get_pci_addr(b->pci_dev); + + if (cmp_a < cmp_b) { + return -1; + } else if (cmp_a > cmp_b) { + return 1; + } else { + return 0; + } +} + static struct dev * get_controller(void) { @@ -403,6 +433,8 @@ int main(int argc, char **argv) return 1; } + qsort(devs, num_devs, sizeof(devs[0]), cmp_devs); + if (num_devs) { rc = spdk_nvme_register_io_thread(); if (rc != 0)