david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[arbel] Randomise the high-order bits of queue pair numbers

This is a backport of commit 0b1222f ("[hermon] Randomise the
high-order bits of queue pair numbers") to the Arbel driver.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2010-07-17 09:41:32 +01:00
parent 40d7c70438
commit 4cb157a3b7
2 changed files with 10 additions and 6 deletions

View File

@ -725,7 +725,8 @@ static int arbel_alloc_qpn ( struct ib_device *ibdev,
arbel ); arbel );
return qpn_offset; return qpn_offset;
} }
qp->qpn = ( arbel->qpn_base + qpn_offset ); qp->qpn = ( ( random() & ARBEL_QPN_RANDOM_MASK ) |
( arbel->qpn_base + qpn_offset ) );
return 0; return 0;
default: default:
DBGC ( arbel, "Arbel %p unsupported QP type %d\n", DBGC ( arbel, "Arbel %p unsupported QP type %d\n",
@ -745,7 +746,7 @@ static void arbel_free_qpn ( struct ib_device *ibdev,
struct arbel *arbel = ib_get_drvdata ( ibdev ); struct arbel *arbel = ib_get_drvdata ( ibdev );
int qpn_offset; int qpn_offset;
qpn_offset = ( qp->qpn - arbel->qpn_base ); qpn_offset = ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) - arbel->qpn_base );
if ( qpn_offset >= 0 ) if ( qpn_offset >= 0 )
arbel_bitmask_free ( arbel->qp_inuse, qpn_offset ); arbel_bitmask_free ( arbel->qp_inuse, qpn_offset );
} }

View File

@ -360,8 +360,8 @@ struct arbel_recv_work_queue {
*/ */
#define ARBEL_MAX_QPS 8 #define ARBEL_MAX_QPS 8
/** Base queue pair number */ /** Queue pair number randomisation mask */
#define ARBEL_QPN_BASE 0x550000 #define ARBEL_QPN_RANDOM_MASK 0xfff000
/** An Arbel queue pair */ /** An Arbel queue pair */
struct arbel_queue_pair { struct arbel_queue_pair {
@ -564,7 +564,9 @@ arbel_cq_arm_doorbell_idx ( struct arbel *arbel,
*/ */
static inline unsigned int static inline unsigned int
arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) { arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
return ( ARBEL_MAX_CQS + ( qp->qpn - arbel->special_qpn_base ) ); return ( ARBEL_MAX_CQS +
( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
arbel->special_qpn_base ) );
} }
/** /**
@ -577,7 +579,8 @@ arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
static inline unsigned int static inline unsigned int
arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) { arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
return ( ARBEL_MAX_DOORBELL_RECORDS - ARBEL_MAX_CQS - return ( ARBEL_MAX_DOORBELL_RECORDS - ARBEL_MAX_CQS -
( qp->qpn - arbel->special_qpn_base ) - 1 ); ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
arbel->special_qpn_base ) - 1 );
} }
/** /**