Commit 06358c25 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Jim Harris
Browse files

bdev/nvme: use poll_group's fd_group to register interrupts



This eliminates the need for nesting epoll instances in the kernel and
allows us to skip one epoll_wait() call.  It shows an around 5-10%
latency improvement.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Idd6ed70d41760566b82246c8af59016fa80a0610
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25469


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
parent 1ae735a5
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -3750,26 +3750,19 @@ static struct spdk_nvme_accel_fn_table g_bdev_nvme_accel_fn_table = {
	.abort_sequence		= bdev_nvme_abort_sequence,
};

static int
bdev_nvme_interrupt_wrapper(void *ctx)
static void
bdev_nvme_poll_group_interrupt_cb(struct spdk_nvme_poll_group *group, void *ctx)
{
	int num_events;
	struct nvme_poll_group *group = ctx;

	num_events = spdk_nvme_poll_group_wait(group->group, bdev_nvme_disconnected_qpair_cb);
	if (spdk_unlikely(num_events < 0)) {
		bdev_nvme_check_io_qpairs(group);
	}

	return num_events;
	bdev_nvme_poll(ctx);
}

static int
bdev_nvme_create_poll_group_cb(void *io_device, void *ctx_buf)
{
	struct nvme_poll_group *group = ctx_buf;
	struct spdk_fd_group *fgrp;
	uint64_t period;
	int fd;
	int rc;

	TAILQ_INIT(&group->qpair_list);

@@ -3789,13 +3782,20 @@ bdev_nvme_create_poll_group_cb(void *io_device, void *ctx_buf)
	if (spdk_interrupt_mode_is_enabled()) {
		spdk_poller_register_interrupt(group->poller, NULL, NULL);

		fd = spdk_nvme_poll_group_get_fd(group->group);
		if (fd < 0) {
		fgrp = spdk_nvme_poll_group_get_fd_group(group->group);
		if (fgrp == NULL) {
			spdk_nvme_poll_group_destroy(group->group);
			return -1;
		}

		rc = spdk_nvme_poll_group_set_interrupt_callback(group->group,
				bdev_nvme_poll_group_interrupt_cb, group);
		if (rc != 0) {
			spdk_nvme_poll_group_destroy(group->group);
			return -1;
		}

		group->intr = SPDK_INTERRUPT_REGISTER(fd, bdev_nvme_interrupt_wrapper, group);
		group->intr = spdk_interrupt_register_fd_group(fgrp, "bdev_nvme_interrupt");
		if (!group->intr) {
			spdk_nvme_poll_group_destroy(group->group);
			return -1;
+5 −2
Original line number Diff line number Diff line
@@ -81,12 +81,15 @@ DEFINE_STUB_V(spdk_keyring_put_key, (struct spdk_key *k));
DEFINE_STUB(spdk_key_get_name, const char *, (struct spdk_key *k), NULL);
DEFINE_STUB(spdk_nvme_scan_attached, int, (const struct spdk_nvme_transport_id *trid), 0);

DEFINE_STUB(spdk_nvme_poll_group_get_fd, int, (struct spdk_nvme_poll_group *group), 0);
DEFINE_STUB(spdk_nvme_poll_group_get_fd_group, struct spdk_fd_group *,
	    (struct spdk_nvme_poll_group *group), NULL);
DEFINE_STUB(spdk_nvme_poll_group_wait, int, (struct spdk_nvme_poll_group *group,
		spdk_nvme_disconnected_qpair_cb disconnected_qpair_cb), 0);
DEFINE_STUB(spdk_nvme_ctrlr_get_admin_qp_fd, int, (struct spdk_nvme_ctrlr *ctrlr,
		struct spdk_event_handler_opts *opts), 0);

DEFINE_STUB(spdk_nvme_poll_group_set_interrupt_callback, int,
	    (struct spdk_nvme_poll_group *group,
	     spdk_nvme_poll_group_interrupt_cb cb_fn, void *ctx), 0);
int
spdk_nvme_ctrlr_get_memory_domains(const struct spdk_nvme_ctrlr *ctrlr,
				   struct spdk_memory_domain **domains, int array_size)