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

nvme: create netlink socket during nvme_driver_init



This helps ensure thread safety on creation of the
netlink socket, when probe is called from multiple
threads at once.  It is also a lot more clean - we just
create it once, rather than checking every time probe
is called to see if it has to be created.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I528cedc3ff44de6ea8ecaf6d2389226502ba408e

Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2681


Community-CI: Broadcom CI
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 18f79f24
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include "spdk/string.h"
#include "nvme_internal.h"
#include "nvme_io_msg.h"
#include "nvme_uevent.h"

#define SPDK_NVME_DRIVER_NAME "spdk_nvme_driver"

@@ -438,6 +439,10 @@ nvme_driver_init(void)
	nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock);

	g_spdk_nvme_driver->initialized = false;
	g_spdk_nvme_driver->hotplug_fd = spdk_uevent_connect();
	if (g_spdk_nvme_driver->hotplug_fd < 0) {
		SPDK_DEBUGLOG(SPDK_LOG_NVME, "Failed to open uevent netlink socket\n");
	}

	TAILQ_INIT(&g_spdk_nvme_driver->shared_attached_ctrlrs);

+3 −0
Original line number Diff line number Diff line
@@ -798,6 +798,9 @@ struct nvme_driver {

	bool				initialized;
	struct spdk_uuid		default_extended_host_id;

	/** netlink socket fd for hotplug messages */
	int				hotplug_fd;
};

extern struct nvme_driver *g_spdk_nvme_driver;
+6 −10
Original line number Diff line number Diff line
@@ -214,7 +214,6 @@ static int nvme_pcie_qpair_destroy(struct spdk_nvme_qpair *qpair);
__thread struct nvme_pcie_ctrlr *g_thread_mmio_ctrlr = NULL;
static uint16_t g_signal_lock;
static bool g_sigset = false;
static int g_hotplug_fd = -1;

static void
nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
@@ -273,7 +272,11 @@ _nvme_pcie_hotplug_monitor(struct spdk_nvme_probe_ctx *probe_ctx)
	union spdk_nvme_csts_register csts;
	struct spdk_nvme_ctrlr_process *proc;

	while (spdk_get_uevent(g_hotplug_fd, &event) > 0) {
	if (g_spdk_nvme_driver->hotplug_fd < 0) {
		return 0;
	}

	while (spdk_get_uevent(g_spdk_nvme_driver->hotplug_fd, &event) > 0) {
		if (event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UIO ||
		    event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_VFIO) {
			if (event.action == SPDK_NVME_UEVENT_ADD) {
@@ -778,15 +781,8 @@ nvme_pcie_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx,

	/* Only the primary process can monitor hotplug. */
	if (spdk_process_is_primary()) {
		if (g_hotplug_fd < 0) {
			g_hotplug_fd = spdk_uevent_connect();
			if (g_hotplug_fd < 0) {
				SPDK_DEBUGLOG(SPDK_LOG_NVME, "Failed to open uevent netlink socket\n");
			}
		} else {
		_nvme_pcie_hotplug_monitor(probe_ctx);
	}
	}

	if (enum_ctx.has_pci_addr == false) {
		return spdk_pci_enumerate(spdk_pci_nvme_get_driver(),
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ DEFINE_STUB(nvme_transport_ctrlr_construct, struct spdk_nvme_ctrlr *,
DEFINE_STUB_V(nvme_io_msg_ctrlr_detach, (struct spdk_nvme_ctrlr *ctrlr));
DEFINE_STUB(spdk_nvme_transport_available, bool,
	    (enum spdk_nvme_transport_type trtype), true);
DEFINE_STUB(spdk_uevent_connect, int, (void), 1);


static bool ut_destruct_called = false;