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

nvme: read all uevents



Currently when the uevent processing code finds a non-uio/vfio
uevent, it just stops its loops and returns.  This means that if
there are a lot of non-uio/vfio uevents, the netlink socket buffer
can build up until its full because only one non-uio/vfio event
gets drained per spdk_nvme_probe() call (which may be very
infrequently).

So modify parse_event so that it does not indicate error when
a non-uio/vfio event is found.

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

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


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 79f508b0
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -144,9 +144,7 @@ parse_event(const char *buf, struct spdk_uevent *event)
			return -1;
		}
		spdk_pci_addr_fmt(event->traddr, sizeof(event->traddr), &pci_addr);
		return 1;
	}
	if (!strncmp(driver, "vfio-pci", 8)) {
	} else if (!strncmp(driver, "vfio-pci", 8)) {
		struct spdk_pci_addr pci_addr;

		event->subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_VFIO;
@@ -161,10 +159,11 @@ parse_event(const char *buf, struct spdk_uevent *event)
			return -1;
		}
		spdk_pci_addr_fmt(event->traddr, sizeof(event->traddr), &pci_addr);
		return 1;

	} else {
		event->subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;
	}
	return -1;

	return 1;
}

int
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#ifndef SPDK_UEVENT_H_
#define SPDK_UEVENT_H_

#define SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED 0
#define SPDK_NVME_UEVENT_SUBSYSTEM_UIO 1
#define SPDK_NVME_UEVENT_SUBSYSTEM_VFIO 2

+11 −13
Original line number Diff line number Diff line
@@ -47,8 +47,6 @@ enum uevent_parse_event_return_type {
	uevent_expected_continue = 1
};

#define SPDK_NVME_UEVENT_SUBSYSTEM_NULL 0xFF

static void
test_nvme_uevent_parse_event(void)
{
@@ -62,19 +60,19 @@ test_nvme_uevent_parse_event(void)
	/* Case 1: Add wrong non-uio or vfio-pci /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
	commands =
		"ACTION=add\0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM= \0DRIVER= \0PCI_SLOT_NAME= \0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = 0xFF;
	uevent.action = 0;

	rc = parse_event(commands, &uevent);

	CU_ASSERT(rc == uevent_abnormal_exit);
	CU_ASSERT(uevent.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_NULL);
	CU_ASSERT(rc == uevent_expected_continue);
	CU_ASSERT(uevent.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED);
	CU_ASSERT(uevent.action == SPDK_NVME_UEVENT_ADD);

	/* Case 2: Add uio /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
	commands =
		"ACTION=add \0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;
	uevent.action = 0;

	rc = parse_event(commands, &uevent);
@@ -86,7 +84,7 @@ test_nvme_uevent_parse_event(void)
	/* Case 3: Remove uio /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
	commands =
		"ACTION=remove\0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;

	rc = parse_event(commands, &uevent);

@@ -96,7 +94,7 @@ test_nvme_uevent_parse_event(void)

	/* Case 4: Add vfio-pci 0000:81:00.0 */
	commands = "ACTION=bind\0DEVPATH=\0SUBSYSTEM= \0DRIVER=vfio-pci\0PCI_SLOT_NAME=0000:81:00.0\0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;

	rc = parse_event(commands, &uevent);

@@ -106,7 +104,7 @@ test_nvme_uevent_parse_event(void)

	/* Case 5: Remove vfio-pci 0000:81:00.0 */
	commands = "ACTION=remove\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=0000:81:00.0\0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;

	rc = parse_event(commands, &uevent);

@@ -116,7 +114,7 @@ test_nvme_uevent_parse_event(void)

	/* Case 6: Add wrong vfio-pci addr 000000 */
	commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=000000\0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED;

	rc = parse_event(commands, &uevent);

@@ -126,12 +124,12 @@ test_nvme_uevent_parse_event(void)

	/* Case 7: Add wrong type vfio 0000:81:00.0 */
	commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio \0PCI_SLOT_NAME=0000:81:00.0\0";
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_NULL;
	uevent.subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UIO;
	uevent.action = 0;
	rc = parse_event(commands, &uevent);

	CU_ASSERT(rc == uevent_abnormal_exit);
	CU_ASSERT(uevent.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_NULL);
	CU_ASSERT(rc == uevent_expected_continue);
	CU_ASSERT(uevent.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UNRECOGNIZED);
	CU_ASSERT(uevent.action == SPDK_NVME_UEVENT_ADD);
}