Commit 82395855 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

nvme: move ctrlr alloction to transport



Make the transport ctrlr_construct callback responsible for allocating
its own controller.

Change-Id: I5102ee233df23e27349410ed063cde8bfdce4c67
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent eaecf47e
Loading
Loading
Loading
Loading
+2 −17
Original line number Diff line number Diff line
@@ -49,24 +49,10 @@ nvme_attach(void *devhandle)
{
	const struct spdk_nvme_transport *transport;
	struct spdk_nvme_ctrlr	*ctrlr;
	int			status;
	uint64_t		phys_addr = 0;

	transport = &spdk_nvme_transport_pcie;

	ctrlr = spdk_zmalloc(transport->ctrlr_size, 64, &phys_addr);
	if (ctrlr == NULL) {
		SPDK_ERRLOG("could not allocate ctrlr\n");
		return NULL;
	}

	ctrlr->transport = transport;

	status = nvme_ctrlr_construct(ctrlr, devhandle);
	if (status != 0) {
		spdk_free(ctrlr);
		return NULL;
	}
	ctrlr = transport->ctrlr_construct(devhandle);

	return ctrlr;
}
@@ -76,9 +62,8 @@ spdk_nvme_detach(struct spdk_nvme_ctrlr *ctrlr)
{
	pthread_mutex_lock(&g_spdk_nvme_driver->lock);

	nvme_ctrlr_destruct(ctrlr);
	TAILQ_REMOVE(&g_spdk_nvme_driver->attached_ctrlrs, ctrlr, tailq);
	spdk_free(ctrlr);
	nvme_ctrlr_destruct(ctrlr);

	pthread_mutex_unlock(&g_spdk_nvme_driver->lock);
	return 0;
+1 −7
Original line number Diff line number Diff line
@@ -998,20 +998,14 @@ pthread_mutex_init_recursive(pthread_mutex_t *mtx)
}

int
nvme_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr, void *devhandle)
nvme_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr)
{
	union spdk_nvme_cap_register	cap;
	int				rc;

	nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_INIT, NVME_TIMEOUT_INFINITE);
	ctrlr->devhandle = devhandle;
	ctrlr->flags = 0;

	rc = ctrlr->transport->ctrlr_construct(ctrlr, devhandle);
	if (rc) {
		return rc;
	}

	if (nvme_ctrlr_get_cap(ctrlr, &cap)) {
		SPDK_TRACELOG(SPDK_TRACE_NVME, "get_cap() failed\n");
		return -EIO;
+2 −8
Original line number Diff line number Diff line
@@ -249,13 +249,7 @@ struct pci_id {
};

struct spdk_nvme_transport {
	/*
	 * Size of the transport-specific extended spdk_nvme_ctrlr structure,
	 * which must contain spdk_nvme_ctrlr as the first element.
	 */
	size_t ctrlr_size;

	int (*ctrlr_construct)(struct spdk_nvme_ctrlr *ctrlr, void *devhandle);
	struct spdk_nvme_ctrlr *(*ctrlr_construct)(void *devhandle);
	void (*ctrlr_destruct)(struct spdk_nvme_ctrlr *ctrlr);

	int (*ctrlr_get_pci_id)(struct spdk_nvme_ctrlr *ctrlr, struct pci_id *pci_id);
@@ -572,7 +566,7 @@ int nvme_ctrlr_cmd_fw_image_download(struct spdk_nvme_ctrlr *ctrlr,
		spdk_nvme_cmd_cb cb_fn, void *cb_arg);
void	nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl);

int	nvme_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr, void *devhandle);
int	nvme_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr);
void	nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr);
int	nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr);
int	nvme_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr);
+32 −17
Original line number Diff line number Diff line
@@ -59,13 +59,12 @@ struct nvme_pcie_ctrlr {
	/** stride in uint32_t units between doorbell registers (1 = 4 bytes, 2 = 8 bytes, ...) */
	uint32_t doorbell_stride_u32;
};
SPDK_STATIC_ASSERT(offsetof(struct nvme_pcie_ctrlr, ctrlr) == 0, "ctrlr must be first field");

static inline struct nvme_pcie_ctrlr *
nvme_pcie_ctrlr(struct spdk_nvme_ctrlr *ctrlr)
{
	assert(ctrlr->transport == &spdk_nvme_transport_pcie);
	return (struct nvme_pcie_ctrlr *)ctrlr;
	return (struct nvme_pcie_ctrlr *)((uintptr_t)ctrlr - offsetof(struct nvme_pcie_ctrlr, ctrlr));
}

static int
@@ -279,27 +278,38 @@ nvme_pcie_ctrlr_free_bars(struct nvme_pcie_ctrlr *pctrlr)
	return rc;
}

static int
nvme_pcie_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr, void *devhandle)
static struct spdk_nvme_ctrlr *nvme_pcie_ctrlr_construct(void *devhandle)
{
	struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(ctrlr);
	struct spdk_pci_device *pci_dev = devhandle;
	struct nvme_pcie_ctrlr *pctrlr;
	union spdk_nvme_cap_register cap;
	uint32_t cmd_reg;
	int rc;

	pctrlr = spdk_zmalloc(sizeof(struct nvme_pcie_ctrlr), 64, NULL);
	if (pctrlr == NULL) {
		SPDK_ERRLOG("could not allocate ctrlr\n");
		return NULL;
	}

	pctrlr->ctrlr.transport = &spdk_nvme_transport_pcie;
	pctrlr->ctrlr.devhandle = devhandle;

	rc = nvme_pcie_ctrlr_allocate_bars(pctrlr);
	if (rc != 0) {
		return rc;
		spdk_free(pctrlr);
		return NULL;
	}

	/* Enable PCI busmaster and disable INTx */
	spdk_pci_device_cfg_read32(devhandle, &cmd_reg, 4);
	spdk_pci_device_cfg_read32(pci_dev, &cmd_reg, 4);
	cmd_reg |= 0x404;
	spdk_pci_device_cfg_write32(devhandle, cmd_reg, 4);
	spdk_pci_device_cfg_write32(pci_dev, cmd_reg, 4);

	if (nvme_ctrlr_get_cap(ctrlr, &cap)) {
	if (nvme_ctrlr_get_cap(&pctrlr->ctrlr, &cap)) {
		SPDK_TRACELOG(SPDK_TRACE_NVME, "get_cap() failed\n");
		return -EIO;
		spdk_free(pctrlr);
		return NULL;
	}

	/* Doorbell stride is 2 ^ (dstrd + 2),
@@ -307,12 +317,18 @@ nvme_pcie_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr, void *devhandle)
	pctrlr->doorbell_stride_u32 = 1 << cap.bits.dstrd;

	/* Save the PCI address */
	ctrlr->pci_addr.domain = spdk_pci_device_get_domain(devhandle);
	ctrlr->pci_addr.bus = spdk_pci_device_get_bus(devhandle);
	ctrlr->pci_addr.dev = spdk_pci_device_get_dev(devhandle);
	ctrlr->pci_addr.func = spdk_pci_device_get_func(devhandle);
	pctrlr->ctrlr.pci_addr.domain = spdk_pci_device_get_domain(pci_dev);
	pctrlr->ctrlr.pci_addr.bus = spdk_pci_device_get_bus(pci_dev);
	pctrlr->ctrlr.pci_addr.dev = spdk_pci_device_get_dev(pci_dev);
	pctrlr->ctrlr.pci_addr.func = spdk_pci_device_get_func(pci_dev);

	return 0;
	rc = nvme_ctrlr_construct(&pctrlr->ctrlr);
	if (rc != 0) {
		spdk_free(pctrlr);
		return NULL;
	}

	return &pctrlr->ctrlr;
}

static void
@@ -321,6 +337,7 @@ nvme_pcie_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr)
	struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(ctrlr);

	nvme_pcie_ctrlr_free_bars(pctrlr);
	spdk_free(pctrlr);
}

static void
@@ -1212,8 +1229,6 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_
}

const struct spdk_nvme_transport spdk_nvme_transport_pcie = {
	.ctrlr_size = sizeof(struct nvme_pcie_ctrlr),

	.ctrlr_construct = nvme_pcie_ctrlr_construct,
	.ctrlr_destruct = nvme_pcie_ctrlr_destruct,

+0 −6
Original line number Diff line number Diff line
@@ -50,12 +50,6 @@ spdk_pci_enumerate(enum spdk_pci_device_type type,
	return -1;
}

int
nvme_ctrlr_construct(struct spdk_nvme_ctrlr *ctrlr, void *devhandle)
{
	return 0;
}

void
nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr)
{
Loading