nvme: normalize PCI addresses before comparing
Use the env abstraction PCI functions to compare PCI addresses so that details like whether or not domain is specified or whether 0-padding is present don't affect the comparison. For example, 0000:01:00.0 should compare equal to 01:00.0. Change-Id: I9f3aaeb5f8fdbf3e246e31a41b4c09151288015e Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-on: https://review.gerrithub.io/387202 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
9f1fd30d5c
commit
ed53cba059
@ -737,16 +737,25 @@ spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1,
|
||||
return cmp;
|
||||
}
|
||||
|
||||
if (trid1->trtype == SPDK_NVME_TRANSPORT_PCIE) {
|
||||
struct spdk_pci_addr pci_addr1;
|
||||
struct spdk_pci_addr pci_addr2;
|
||||
|
||||
/* Normalize PCI addresses before comparing */
|
||||
if (spdk_pci_addr_parse(&pci_addr1, trid1->traddr) < 0 ||
|
||||
spdk_pci_addr_parse(&pci_addr2, trid2->traddr) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* PCIe transport ID only uses trtype and traddr */
|
||||
return spdk_pci_addr_compare(&pci_addr1, &pci_addr2);
|
||||
}
|
||||
|
||||
cmp = strcasecmp(trid1->traddr, trid2->traddr);
|
||||
if (cmp) {
|
||||
return cmp;
|
||||
}
|
||||
|
||||
if (trid1->trtype == SPDK_NVME_TRANSPORT_PCIE) {
|
||||
/* PCIe transport ID only uses trtype and traddr */
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmp = cmp_int(trid1->adrfam, trid2->adrfam);
|
||||
if (cmp) {
|
||||
return cmp;
|
||||
|
@ -293,6 +293,30 @@ spdk_pci_addr_fmt(char *bdf, size_t sz, const struct spdk_pci_addr *addr)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2)
|
||||
{
|
||||
if (a1->domain > a2->domain) {
|
||||
return 1;
|
||||
} else if (a1->domain < a2->domain) {
|
||||
return -1;
|
||||
} else if (a1->bus > a2->bus) {
|
||||
return 1;
|
||||
} else if (a1->bus < a2->bus) {
|
||||
return -1;
|
||||
} else if (a1->dev > a2->dev) {
|
||||
return 1;
|
||||
} else if (a1->dev < a2->dev) {
|
||||
return -1;
|
||||
} else if (a1->func > a2->func) {
|
||||
return 1;
|
||||
} else if (a1->func < a2->func) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
spdk_env_get_core_count(void)
|
||||
{
|
||||
|
@ -71,10 +71,6 @@ DEFINE_STUB(nvme_ctrlr_start, int,
|
||||
DEFINE_STUB(spdk_pci_device_get_addr, struct spdk_pci_addr,
|
||||
(struct spdk_pci_device *pci_dev), {0})
|
||||
|
||||
DEFINE_STUB(spdk_pci_addr_compare, int,
|
||||
(const struct spdk_pci_addr *a1,
|
||||
const struct spdk_pci_addr *a2), 1)
|
||||
|
||||
DEFINE_STUB(nvme_ctrlr_get_ref_count, int,
|
||||
(struct spdk_nvme_ctrlr *ctrlr), 0)
|
||||
|
||||
@ -771,6 +767,22 @@ test_trid_parse_and_compare(void)
|
||||
memset_trid(&trid1, &trid2);
|
||||
ret = spdk_nvme_transport_id_compare(&trid1, &trid2);
|
||||
CU_ASSERT(ret == 0);
|
||||
|
||||
/* Compare PCI addresses via spdk_pci_addr_compare (rather than as strings) */
|
||||
memset_trid(&trid1, &trid2);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:04:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:04:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) == 0);
|
||||
|
||||
memset_trid(&trid1, &trid2);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:05:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:04:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) > 0);
|
||||
|
||||
memset_trid(&trid1, &trid2);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:04:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:05:00.0") == 0);
|
||||
CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) < 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -128,12 +128,6 @@ spdk_pci_device_get_id(struct spdk_pci_device *pci_dev)
|
||||
return pci_id;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
spdk_nvme_ctrlr_get_default_ctrlr_opts(struct spdk_nvme_ctrlr_opts *opts, size_t opts_size)
|
||||
{
|
||||
|
@ -134,12 +134,6 @@ spdk_pci_device_get_addr(struct spdk_pci_device *dev)
|
||||
abort();
|
||||
}
|
||||
|
||||
int
|
||||
spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
int
|
||||
spdk_pci_device_cfg_read32(struct spdk_pci_device *dev, uint32_t *value, uint32_t offset)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user