Commit e63da6d8 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

nvme: only allow cuse operations from primary process



We don't want to allow primary and secondary process to register the
same ctrlr. Also avoid any chance of a secondary process trying to
unregister or cleanup cuse sessions for a primary process (and vice
versa).

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I9510a648bfeef8dc782304eef3ba0f0368f401e8
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21129


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 50833855
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1258,6 +1258,8 @@ nvme_cuse_stop(struct spdk_nvme_ctrlr *ctrlr)
{
	struct cuse_device *ctrlr_device;

	assert(spdk_process_is_primary());

	pthread_mutex_lock(&g_cuse_mtx);

	ctrlr_device = nvme_cuse_get_cuse_ctrlr_device(ctrlr);
@@ -1277,6 +1279,8 @@ nvme_cuse_update(struct spdk_nvme_ctrlr *ctrlr)
{
	struct cuse_device *ctrlr_device;

	assert(spdk_process_is_primary());

	pthread_mutex_lock(&g_cuse_mtx);

	ctrlr_device = nvme_cuse_get_cuse_ctrlr_device(ctrlr);
@@ -1301,6 +1305,11 @@ spdk_nvme_cuse_register(struct spdk_nvme_ctrlr *ctrlr)
{
	int rc;

	if (!spdk_process_is_primary()) {
		SPDK_ERRLOG("only allowed from primary process\n");
		return -EINVAL;
	}

	rc = nvme_io_msg_ctrlr_register(ctrlr, &cuse_nvme_io_msg_producer);
	if (rc) {
		return rc;
@@ -1323,6 +1332,11 @@ spdk_nvme_cuse_unregister(struct spdk_nvme_ctrlr *ctrlr)
{
	struct cuse_device *ctrlr_device;

	if (!spdk_process_is_primary()) {
		SPDK_ERRLOG("only allowed from primary process\n");
		return -EINVAL;
	}

	pthread_mutex_lock(&g_cuse_mtx);

	ctrlr_device = nvme_cuse_get_cuse_ctrlr_device(ctrlr);
+2 −0
Original line number Diff line number Diff line
@@ -901,6 +901,8 @@ struct spdk_nvme_ctrlr {

	bool				is_disconnecting;

	bool				needs_io_msg_update;

	uint16_t			max_sges;

	uint16_t			cntlid;
+16 −2
Original line number Diff line number Diff line
@@ -54,13 +54,18 @@ nvme_io_msg_process(struct spdk_nvme_ctrlr *ctrlr)
	struct spdk_nvme_io_msg *io;
	void *requests[SPDK_NVME_MSG_IO_PROCESS_SIZE];

	if (!spdk_process_is_primary()) {
		return 0;
	}

	if (!ctrlr->external_io_msgs || !ctrlr->external_io_msgs_qpair) {
		/* Not ready or pending reset */
		return 0;
	}

	if (!spdk_process_is_primary()) {
		return 0;
	if (ctrlr->needs_io_msg_update) {
		ctrlr->needs_io_msg_update = false;
		nvme_io_msg_ctrlr_update(ctrlr);
	}

	spdk_nvme_qpair_process_completions(ctrlr->external_io_msgs_qpair, 0);
@@ -145,6 +150,11 @@ nvme_io_msg_ctrlr_update(struct spdk_nvme_ctrlr *ctrlr)
{
	struct nvme_io_msg_producer *io_msg_producer;

	if (!spdk_process_is_primary()) {
		ctrlr->needs_io_msg_update = true;
		return;
	}

	/* Update all producers */
	STAILQ_FOREACH(io_msg_producer, &ctrlr->io_producers, link) {
		io_msg_producer->update(ctrlr);
@@ -156,6 +166,10 @@ nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr)
{
	struct nvme_io_msg_producer *io_msg_producer, *tmp;

	if (!spdk_process_is_primary()) {
		return;
	}

	/* Stop all producers */
	STAILQ_FOREACH_SAFE(io_msg_producer, &ctrlr->io_producers, link, tmp) {
		io_msg_producer->stop(ctrlr);