mirror of
https://github.com/ipxe/ipxe
synced 2025-12-20 03:55:46 +03:00
[infiniband] Add infrastructure for RC queue pairs
Queue pairs are now assumed to be created in the INIT state, with a call to ib_modify_qp() required to bring the queue pair to the RTS state. ib_modify_qp() no longer takes a modification list; callers should modify the relevant queue pair parameters (e.g. qkey) directly and then call ib_modify_qp() to synchronise the changes to the hardware. The packet sequence number is now a property of the queue pair, rather than of the device. Each queue pair may have an associated address vector. For RC queue pairs, this is the address vector that will be programmed in to the hardware as the remote address. For UD queue pairs, it will be used as the default address vector if none is supplied to ib_post_send().
This commit is contained in:
@@ -296,8 +296,17 @@ static union ib_mad * ib_sma_set_pkey_table ( struct ib_gma *gma,
|
||||
union ib_mad *mad ) {
|
||||
struct ib_device *ibdev = gma->ibdev;
|
||||
struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table;
|
||||
int rc;
|
||||
|
||||
ibdev->pkey = ntohs ( pkey_table->pkey[0] );
|
||||
DBGC ( gma, "GMA %p set pkey %04x\n", gma, ibdev->pkey );
|
||||
|
||||
if ( ( rc = ib_set_pkey_table ( ibdev, mad ) ) != 0 ) {
|
||||
DBGC ( gma, "GMA %p could not set pkey table: %s\n",
|
||||
gma, strerror ( rc ) );
|
||||
mad->hdr.status =
|
||||
htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR );
|
||||
}
|
||||
|
||||
return ib_sma_get_pkey_table ( gma, mad );
|
||||
}
|
||||
@@ -618,7 +627,7 @@ int ib_gma_request ( struct ib_gma *gma, union ib_mad *mad,
|
||||
struct ib_gma * ib_create_gma ( struct ib_device *ibdev,
|
||||
enum ib_queue_pair_type type ) {
|
||||
struct ib_gma *gma;
|
||||
unsigned long qkey;
|
||||
int rc;
|
||||
|
||||
/* Allocate and initialise fields */
|
||||
gma = zalloc ( sizeof ( *gma ) );
|
||||
@@ -637,21 +646,28 @@ struct ib_gma * ib_create_gma ( struct ib_device *ibdev,
|
||||
}
|
||||
|
||||
/* Create queue pair */
|
||||
qkey = ( ( type == IB_QPT_SMA ) ? IB_QKEY_SMA : IB_QKEY_GMA );
|
||||
gma->qp = ib_create_qp ( ibdev, type, IB_GMA_NUM_SEND_WQES, gma->cq,
|
||||
IB_GMA_NUM_RECV_WQES, gma->cq, qkey );
|
||||
IB_GMA_NUM_RECV_WQES, gma->cq );
|
||||
if ( ! gma->qp ) {
|
||||
DBGC ( gma, "GMA %p could not allocate queue pair\n", gma );
|
||||
goto err_create_qp;
|
||||
}
|
||||
ib_qp_set_ownerdata ( gma->qp, gma );
|
||||
|
||||
DBGC ( gma, "GMA %p running on QPN %#lx\n", gma, gma->qp->qpn );
|
||||
|
||||
/* Set queue key */
|
||||
gma->qp->qkey = ( ( type == IB_QPT_SMA ) ? IB_QKEY_SMA : IB_QKEY_GMA );
|
||||
if ( ( rc = ib_modify_qp ( ibdev, gma->qp ) ) != 0 ) {
|
||||
DBGC ( gma, "GMA %p could not set queue key: %s\n",
|
||||
gma, strerror ( rc ) );
|
||||
goto err_modify_qp;
|
||||
}
|
||||
|
||||
/* Fill receive ring */
|
||||
ib_refill_recv ( ibdev, gma->qp );
|
||||
return gma;
|
||||
|
||||
err_modify_qp:
|
||||
ib_destroy_qp ( ibdev, gma->qp );
|
||||
err_create_qp:
|
||||
ib_destroy_cq ( ibdev, gma->cq );
|
||||
|
||||
@@ -178,7 +178,8 @@ static union ib_mad * ib_handle_mc_member_join ( struct ib_gma *gma,
|
||||
ntohl ( gid->u.dwords[3] ), qkey );
|
||||
|
||||
/* Set queue key */
|
||||
if ( ( rc = ib_modify_qp ( ibdev, qp, IB_MODIFY_QKEY, qkey ) ) != 0 ) {
|
||||
qp->qkey = qkey;
|
||||
if ( ( rc = ib_modify_qp ( ibdev, qp ) ) != 0 ) {
|
||||
DBGC ( gma, "GMA %p QPN %lx could not modify qkey: %s\n",
|
||||
gma, qp->qpn, strerror ( rc ) );
|
||||
return NULL;
|
||||
|
||||
@@ -100,7 +100,7 @@ int ib_push ( struct ib_device *ibdev, struct io_buffer *iobuf,
|
||||
bth->se__m__padcnt__tver = ( pad_len << 4 );
|
||||
bth->pkey = htons ( ibdev->pkey );
|
||||
bth->dest_qp = htonl ( av->qpn );
|
||||
bth->ack__psn = htonl ( ( ibdev->psn++ ) & 0xffffffUL );
|
||||
bth->ack__psn = htonl ( ( qp->send.psn++ ) & 0xffffffUL );
|
||||
|
||||
/* Construct DETH */
|
||||
deth->qkey = htonl ( av->qkey );
|
||||
|
||||
Reference in New Issue
Block a user