Page MenuHomeFreeBSD

D41866.id127403.diff
No OneTemporary

D41866.id127403.diff

diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -945,6 +945,14 @@
{
struct nvme_tracker *tr;
+ /*
+ * nvme_complete_tracker must be called with the qpair lock held. It
+ * takes the lock to adjust outstanding_tr list, so drop it here. We
+ * start over at the head of the list, so this is safe. We are also
+ * called from contexts that do not hold the qpair lock.
+ */
+ mtx_assert(&qpair->lock, MA_UNOWNED);
+
tr = TAILQ_FIRST(&qpair->outstanding_tr);
while (tr != NULL) {
if (tr->req->cmd.opc == NVME_OPC_ASYNC_EVENT_REQUEST) {
@@ -961,6 +969,7 @@
void
nvme_admin_qpair_destroy(struct nvme_qpair *qpair)
{
+ mtx_assert(&qpair->lock, MA_UNOWNED);
nvme_admin_qpair_abort_aers(qpair);
nvme_qpair_destroy(qpair);
@@ -1410,12 +1419,13 @@
nvme_admin_qpair_disable(struct nvme_qpair *qpair)
{
mtx_lock(&qpair->recovery);
- mtx_lock(&qpair->lock);
+ mtx_lock(&qpair->lock);
nvme_qpair_disable(qpair);
+ mtx_unlock(&qpair->lock);
+
nvme_admin_qpair_abort_aers(qpair);
- mtx_unlock(&qpair->lock);
mtx_unlock(&qpair->recovery);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 1, 10:43 AM (15 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13246121
Default Alt Text
D41866.id127403.diff (1 KB)

Event Timeline