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: Jim 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: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Jim Harris 2020-08-20 15:28:48 -07:00 committed by Tomasz Zawadzki
parent 79f508b047
commit 178291a516
3 changed files with 17 additions and 19 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
}