aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2021-10-14 14:44:37 +0000
committerWarner Losh <imp@FreeBSD.org>2021-10-14 14:44:37 +0000
commit2ec165e3f065217ae8d54a2a8235fe1f219805ea (patch)
tree8f62eb13f0157a2efd73a05e35afe02859178ad3
parent76384bd10fdbb97be2803d969905f15a84255d6a (diff)
downloadsrc-2ec165e3f065217ae8d54a2a8235fe1f219805ea.tar.gz
src-2ec165e3f065217ae8d54a2a8235fe1f219805ea.zip
nvme: Reduce traffic to the doorbell register
Reduce traffic to doorbell register when processing multiple completion events at once. Only write it at the end of the loop after we've processed everything (assuming we found at least one completion, even if that completion wasn't valid). Sponsored by: Netflix Reviewed by: mav Differential Revision: https://reviews.freebsd.org/D32470
-rw-r--r--sys/dev/nvme/nvme_qpair.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 6669eeee6613..54718492ff09 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -629,10 +629,10 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
else
tr = NULL;
+ done++;
if (tr != NULL) {
nvme_qpair_complete_tracker(tr, &cpl, ERROR_PRINT_ALL);
qpair->sq_head = cpl.sqhd;
- done++;
} else if (!in_panic) {
/*
* A missing tracker is normally an error. However, a
@@ -664,10 +664,13 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
atomic_store_rel_int(&qpair->cq_head, 0); /* 2 */
qpair->phase = !qpair->phase; /* 3 */
}
+ }
+ if (done != 0) {
bus_space_write_4(qpair->ctrlr->bus_tag, qpair->ctrlr->bus_handle,
qpair->cq_hdbl_off, qpair->cq_head);
}
+
return (done != 0);
}