struct mlx5_cqe64 *cqe64;
        struct mlx5_core_qp *mqp;
        struct mlx5_ib_wq *wq;
-       struct mlx5_sig_err_cqe *sig_err_cqe;
-       struct mlx5_core_mkey *mmkey;
-       struct mlx5_ib_mr *mr;
        uint8_t opcode;
        uint32_t qpn;
        u16 wqe_ctr;
                        }
                }
                break;
-       case MLX5_CQE_SIG_ERR:
-               sig_err_cqe = (struct mlx5_sig_err_cqe *)cqe64;
+       case MLX5_CQE_SIG_ERR: {
+               struct mlx5_sig_err_cqe *sig_err_cqe =
+                       (struct mlx5_sig_err_cqe *)cqe64;
+               struct mlx5_core_sig_ctx *sig;
 
-               xa_lock(&dev->mdev->priv.mkey_table);
-               mmkey = xa_load(&dev->mdev->priv.mkey_table,
+               xa_lock(&dev->sig_mrs);
+               sig = xa_load(&dev->sig_mrs,
                                mlx5_base_mkey(be32_to_cpu(sig_err_cqe->mkey)));
-               mr = to_mibmr(mmkey);
-               get_sig_err_item(sig_err_cqe, &mr->sig->err_item);
-               mr->sig->sig_err_exists = true;
-               mr->sig->sigerr_count++;
+               get_sig_err_item(sig_err_cqe, &sig->err_item);
+               sig->sig_err_exists = true;
+               sig->sigerr_count++;
 
                mlx5_ib_warn(dev, "CQN: 0x%x Got SIGERR on key: 0x%x err_type %x err_offset %llx expected %x actual %x\n",
-                            cq->mcq.cqn, mr->sig->err_item.key,
-                            mr->sig->err_item.err_type,
-                            mr->sig->err_item.sig_err_offset,
-                            mr->sig->err_item.expected,
-                            mr->sig->err_item.actual);
+                            cq->mcq.cqn, sig->err_item.key,
+                            sig->err_item.err_type,
+                            sig->err_item.sig_err_offset,
+                            sig->err_item.expected,
+                            sig->err_item.actual);
 
-               xa_unlock(&dev->mdev->priv.mkey_table);
+               xa_unlock(&dev->sig_mrs);
                goto repoll;
        }
+       }
 
        return 0;
 }
 
                cleanup_srcu_struct(&dev->mr_srcu);
        }
 
+       WARN_ON(!xa_empty(&dev->sig_mrs));
        WARN_ON(!bitmap_empty(dev->dm.memic_alloc_pages, MLX5_MAX_MEMIC_PAGES));
 }
 
        mutex_init(&dev->cap_mask_mutex);
        INIT_LIST_HEAD(&dev->qp_list);
        spin_lock_init(&dev->reset_flow_resource_lock);
+       xa_init(&dev->sig_mrs);
 
        spin_lock_init(&dev->dm.lock);
        dev->dm.dev = mdev;
 
                                          mr->sig->psv_wire.psv_idx))
                        mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
                                     mr->sig->psv_wire.psv_idx);
+               xa_erase(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key));
                kfree(mr->sig);
                mr->sig = NULL;
        }
        if (err)
                goto err_free_mtt_mr;
 
+       err = xa_err(xa_store(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key),
+                             mr->sig, GFP_KERNEL));
+       if (err)
+               goto err_free_descs;
        return 0;
 
+err_free_descs:
+       destroy_mkey(dev, mr);
+       mlx5_free_priv_descs(mr);
 err_free_mtt_mr:
        dereg_mr(to_mdev(mr->mtt_mr->ibmr.device), mr->mtt_mr);
        mr->mtt_mr = NULL;