mirror of
https://github.com/ipxe/ipxe
synced 2025-12-19 19:49:45 +03:00
[infiniband] Poll completion queues automatically
Currently, all Infiniband users must create a process for polling their completion queues (or rely on a regular hook such as netdev_poll() in ipoib.c). Move instead to a model whereby the Infiniband core maintains a single process calling ib_poll_eq(), and polling the event queue triggers polls of the applicable completion queues. (At present, the Infiniband core simply polls all of the device's completion queues.) Polling a completion queue will now implicitly refill all attached receive work queues; this is analogous to the way that netdev_poll() implicitly refills the RX ring. Infiniband users no longer need to create a process just to poll their completion queues and refill their receive rings.
This commit is contained in:
@@ -743,10 +743,7 @@ static void ipoib_poll ( struct net_device *netdev ) {
|
||||
struct ipoib_device *ipoib = netdev->priv;
|
||||
struct ib_device *ibdev = ipoib->ibdev;
|
||||
|
||||
ib_poll_cq ( ibdev, ipoib->meta.cq );
|
||||
ib_poll_cq ( ibdev, ipoib->data.cq );
|
||||
ib_qset_refill_recv ( ibdev, &ipoib->meta );
|
||||
ib_qset_refill_recv ( ibdev, &ipoib->data );
|
||||
ib_poll_eq ( ibdev );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -861,8 +858,8 @@ static int ipoib_open ( struct net_device *netdev ) {
|
||||
mac->qpn = htonl ( ipoib->data.qp->qpn );
|
||||
|
||||
/* Fill receive rings */
|
||||
ib_qset_refill_recv ( ibdev, &ipoib->meta );
|
||||
ib_qset_refill_recv ( ibdev, &ipoib->data );
|
||||
ib_refill_recv ( ibdev, ipoib->meta.qp );
|
||||
ib_refill_recv ( ibdev, ipoib->data.qp );
|
||||
|
||||
/* Join broadcast group */
|
||||
if ( ( rc = ipoib_join_broadcast_group ( ipoib ) ) != 0 ) {
|
||||
|
||||
Reference in New Issue
Block a user