diff options
author | Warner Losh <imp@FreeBSD.org> | 2021-10-14 14:44:37 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2021-10-14 14:44:37 +0000 |
commit | 2ec165e3f065217ae8d54a2a8235fe1f219805ea (patch) | |
tree | 8f62eb13f0157a2efd73a05e35afe02859178ad3 | |
parent | 76384bd10fdbb97be2803d969905f15a84255d6a (diff) | |
download | src-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.c | 5 |
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); } |