Skip to content

Commit b59bcfc

Browse files
author
Jakub Ramaseuski
committed
RDMA/ionic: Register device ops for control path
JIRA: https://issues.redhat.com/browse/RHEL-121486 commit e852182 Author: Abhijit Gangurde <abhijit.gangurde@amd.com> Date: Wed Sep 3 11:46:02 2025 +0530 RDMA/ionic: Register device ops for control path Implement device supported verb APIs for control path. Co-developed-by: Andrew Boyer <andrew.boyer@amd.com> Signed-off-by: Andrew Boyer <andrew.boyer@amd.com> Co-developed-by: Allen Hubbe <allen.hubbe@amd.com> Signed-off-by: Allen Hubbe <allen.hubbe@amd.com> Signed-off-by: Abhijit Gangurde <abhijit.gangurde@amd.com> Link: https://patch.msgid.link/20250903061606.4139957-11-abhijit.gangurde@amd.com Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Jakub Ramaseuski <jramaseu@redhat.com>
1 parent 5565b90 commit b59bcfc

File tree

7 files changed

+3741
-9
lines changed

7 files changed

+3741
-9
lines changed

drivers/infiniband/hw/ionic/ionic_admin.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,44 @@ static struct ionic_aq *ionic_create_rdma_adminq(struct ionic_ibdev *dev,
627627
return ERR_PTR(rc);
628628
}
629629

630+
static void ionic_flush_qs(struct ionic_ibdev *dev)
631+
{
632+
struct ionic_qp *qp, *qp_tmp;
633+
struct ionic_cq *cq, *cq_tmp;
634+
LIST_HEAD(flush_list);
635+
unsigned long index;
636+
637+
WARN_ON(!irqs_disabled());
638+
639+
/* Flush qp send and recv */
640+
xa_lock(&dev->qp_tbl);
641+
xa_for_each(&dev->qp_tbl, index, qp) {
642+
kref_get(&qp->qp_kref);
643+
list_add_tail(&qp->ibkill_flush_ent, &flush_list);
644+
}
645+
xa_unlock(&dev->qp_tbl);
646+
647+
list_for_each_entry_safe(qp, qp_tmp, &flush_list, ibkill_flush_ent) {
648+
ionic_flush_qp(dev, qp);
649+
kref_put(&qp->qp_kref, ionic_qp_complete);
650+
list_del(&qp->ibkill_flush_ent);
651+
}
652+
653+
/* Notify completions */
654+
xa_lock(&dev->cq_tbl);
655+
xa_for_each(&dev->cq_tbl, index, cq) {
656+
kref_get(&cq->cq_kref);
657+
list_add_tail(&cq->ibkill_flush_ent, &flush_list);
658+
}
659+
xa_unlock(&dev->cq_tbl);
660+
661+
list_for_each_entry_safe(cq, cq_tmp, &flush_list, ibkill_flush_ent) {
662+
ionic_notify_flush_cq(cq);
663+
kref_put(&cq->cq_kref, ionic_cq_complete);
664+
list_del(&cq->ibkill_flush_ent);
665+
}
666+
}
667+
630668
static void ionic_kill_ibdev(struct ionic_ibdev *dev, bool fatal_path)
631669
{
632670
unsigned long irqflags;
@@ -650,6 +688,9 @@ static void ionic_kill_ibdev(struct ionic_ibdev *dev, bool fatal_path)
650688
spin_unlock(&aq->lock);
651689
}
652690

691+
if (do_flush)
692+
ionic_flush_qs(dev);
693+
653694
local_irq_restore(irqflags);
654695

655696
/* Post a fatal event if requested */
@@ -789,6 +830,65 @@ static void ionic_cq_event(struct ionic_ibdev *dev, u32 cqid, u8 code)
789830
kref_put(&cq->cq_kref, ionic_cq_complete);
790831
}
791832

833+
static void ionic_qp_event(struct ionic_ibdev *dev, u32 qpid, u8 code)
834+
{
835+
unsigned long irqflags;
836+
struct ib_event ibev;
837+
struct ionic_qp *qp;
838+
839+
xa_lock_irqsave(&dev->qp_tbl, irqflags);
840+
qp = xa_load(&dev->qp_tbl, qpid);
841+
if (qp)
842+
kref_get(&qp->qp_kref);
843+
xa_unlock_irqrestore(&dev->qp_tbl, irqflags);
844+
845+
if (!qp) {
846+
ibdev_dbg(&dev->ibdev,
847+
"missing qpid %#x code %u\n", qpid, code);
848+
return;
849+
}
850+
851+
ibev.device = &dev->ibdev;
852+
ibev.element.qp = &qp->ibqp;
853+
854+
switch (code) {
855+
case IONIC_V1_EQE_SQ_DRAIN:
856+
ibev.event = IB_EVENT_SQ_DRAINED;
857+
break;
858+
859+
case IONIC_V1_EQE_QP_COMM_EST:
860+
ibev.event = IB_EVENT_COMM_EST;
861+
break;
862+
863+
case IONIC_V1_EQE_QP_LAST_WQE:
864+
ibev.event = IB_EVENT_QP_LAST_WQE_REACHED;
865+
break;
866+
867+
case IONIC_V1_EQE_QP_ERR:
868+
ibev.event = IB_EVENT_QP_FATAL;
869+
break;
870+
871+
case IONIC_V1_EQE_QP_ERR_REQUEST:
872+
ibev.event = IB_EVENT_QP_REQ_ERR;
873+
break;
874+
875+
case IONIC_V1_EQE_QP_ERR_ACCESS:
876+
ibev.event = IB_EVENT_QP_ACCESS_ERR;
877+
break;
878+
879+
default:
880+
ibdev_dbg(&dev->ibdev,
881+
"unrecognized qpid %#x code %u\n", qpid, code);
882+
goto out;
883+
}
884+
885+
if (qp->ibqp.event_handler)
886+
qp->ibqp.event_handler(&ibev, qp->ibqp.qp_context);
887+
888+
out:
889+
kref_put(&qp->qp_kref, ionic_qp_complete);
890+
}
891+
792892
static u16 ionic_poll_eq(struct ionic_eq *eq, u16 budget)
793893
{
794894
struct ionic_ibdev *dev = eq->dev;
@@ -818,6 +918,10 @@ static u16 ionic_poll_eq(struct ionic_eq *eq, u16 budget)
818918
ionic_cq_event(dev, qid, code);
819919
break;
820920

921+
case IONIC_V1_EQE_TYPE_QP:
922+
ionic_qp_event(dev, qid, code);
923+
break;
924+
821925
default:
822926
ibdev_dbg(&dev->ibdev,
823927
"unknown event %#x type %u\n", evt, type);

0 commit comments

Comments
 (0)