From 494dcc81d12bddcd8363450e5b6f8aea8611b80c Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Mon, 18 Mar 2019 11:30:50 -0700 Subject: [PATCH] nvme: Move sq doorbell ring to a function This is going to get called from two places shortly. Change-Id: I2c67e719c91887987e6e65c5c0c384bed0431409 Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/448311 Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Tested-by: SPDK CI Jenkins --- lib/nvme/nvme_pcie.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 262bfdb33..26d46c509 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1167,12 +1167,28 @@ nvme_pcie_qpair_update_mmio_required(struct spdk_nvme_qpair *qpair, uint16_t val return true; } +static inline void +nvme_pcie_qpair_ring_sq_doorbell(struct spdk_nvme_qpair *qpair) +{ + struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); + struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(qpair->ctrlr); + + if (spdk_likely(nvme_pcie_qpair_update_mmio_required(qpair, + pqpair->sq_tail, + pqpair->sq_shadow_tdbl, + pqpair->sq_eventidx))) { + spdk_wmb(); + g_thread_mmio_ctrlr = pctrlr; + spdk_mmio_write_4(pqpair->sq_tdbl, pqpair->sq_tail); + g_thread_mmio_ctrlr = NULL; + } +} + static void nvme_pcie_qpair_submit_tracker(struct spdk_nvme_qpair *qpair, struct nvme_tracker *tr) { struct nvme_request *req; struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); - struct nvme_pcie_ctrlr *pctrlr = nvme_pcie_ctrlr(qpair->ctrlr); req = tr->req; assert(req != NULL); @@ -1190,15 +1206,7 @@ nvme_pcie_qpair_submit_tracker(struct spdk_nvme_qpair *qpair, struct nvme_tracke SPDK_ERRLOG("sq_tail is passing sq_head!\n"); } - if (spdk_likely(nvme_pcie_qpair_update_mmio_required(qpair, - pqpair->sq_tail, - pqpair->sq_shadow_tdbl, - pqpair->sq_eventidx))) { - spdk_wmb(); - g_thread_mmio_ctrlr = pctrlr; - spdk_mmio_write_4(pqpair->sq_tdbl, pqpair->sq_tail); - g_thread_mmio_ctrlr = NULL; - } + nvme_pcie_qpair_ring_sq_doorbell(qpair); } static void