static int register_controllers(void) { struct pci_device_iterator *pci_dev_iter; struct pci_device *pci_dev; struct pci_id_match match; int rc; printf("Initializing NVMe Controllers\n"); pci_system_init(); match.vendor_id = PCI_MATCH_ANY; match.subvendor_id = PCI_MATCH_ANY; match.subdevice_id = PCI_MATCH_ANY; match.device_id = PCI_MATCH_ANY; match.device_class = NVME_CLASS_CODE; match.device_class_mask = 0xFFFFFF; pci_dev_iter = pci_id_match_iterator_create(&match); rc = 0; while ((pci_dev = pci_device_next(pci_dev_iter))) { struct nvme_controller *ctrlr; if (pci_device_has_non_null_driver(pci_dev)) { fprintf(stderr, "non-null kernel driver attached to nvme\n"); fprintf(stderr, " controller at pci bdf %d:%d:%d\n", pci_dev->bus, pci_dev->dev, pci_dev->func); fprintf(stderr, " skipping...\n"); continue; } pci_device_probe(pci_dev); ctrlr = nvme_attach(pci_dev); if (ctrlr == NULL) { fprintf(stderr, "nvme_attach failed for controller at pci bdf %d:%d:%d\n", pci_dev->bus, pci_dev->dev, pci_dev->func); rc = 1; continue; } register_ctrlr(ctrlr, pci_dev); } pci_iterator_destroy(pci_dev_iter); return rc; }
int main(int argc, char **argv) { struct pci_device_iterator *pci_dev_iter; struct pci_device *pci_dev; struct dev *iter; struct pci_id_match match; int rc, i; rc = rte_eal_init(sizeof(ealargs) / sizeof(ealargs[0]), (char **)(void *)(uintptr_t)ealargs); if (rc < 0) { fprintf(stderr, "could not initialize dpdk\n"); exit(1); } request_mempool = rte_mempool_create("nvme_request", 8192, nvme_request_size(), 128, 0, NULL, NULL, NULL, NULL, SOCKET_ID_ANY, 0); if (request_mempool == NULL) { fprintf(stderr, "could not initialize request mempool\n"); exit(1); } pci_system_init(); match.vendor_id = PCI_MATCH_ANY; match.subvendor_id = PCI_MATCH_ANY; match.subdevice_id = PCI_MATCH_ANY; match.device_id = PCI_MATCH_ANY; match.device_class = NVME_CLASS_CODE; match.device_class_mask = 0xFFFFFF; pci_dev_iter = pci_id_match_iterator_create(&match); rc = 0; while ((pci_dev = pci_device_next(pci_dev_iter))) { struct nvme_controller *ctrlr; struct dev *dev; if (pci_device_has_non_uio_driver(pci_dev)) { fprintf(stderr, "non-uio kernel driver attached to nvme\n"); fprintf(stderr, " controller at pci bdf %d:%d:%d\n", pci_dev->bus, pci_dev->dev, pci_dev->func); fprintf(stderr, " skipping...\n"); continue; } pci_device_probe(pci_dev); ctrlr = nvme_attach(pci_dev); if (ctrlr == NULL) { fprintf(stderr, "failed to attach to NVMe controller at PCI BDF %d:%d:%d\n", pci_dev->bus, pci_dev->dev, pci_dev->func); rc = 1; continue; } /* add to dev list */ dev = &devs[num_devs++]; dev->pci_dev = pci_dev; dev->ctrlr = ctrlr; } pci_iterator_destroy(pci_dev_iter); if (num_devs) { rc = nvme_register_io_thread(); if (rc != 0) return rc; } foreach_dev(iter) { reserve_controller(iter->ctrlr, iter->pci_dev); } printf("Cleaning up...\n"); for (i = 0; i < num_devs; i++) { struct dev *dev = &devs[i]; nvme_detach(dev->ctrlr); } if (num_devs) nvme_unregister_io_thread(); return rc; }