diff options
| author | Michael Brown | 2010-07-17 10:41:32 +0200 |
|---|---|---|
| committer | Michael Brown | 2010-09-17 06:43:47 +0200 |
| commit | 4cb157a3b73e91dc64d5e956d4290d73d5bc0f7a (patch) | |
| tree | 529aea08dbde2d575eb7f38bab9f82b9043ac44a | |
| parent | [arbel] Allow software GMA to receive packets destined for QP1 (diff) | |
| download | ipxe-4cb157a3b73e91dc64d5e956d4290d73d5bc0f7a.tar.gz ipxe-4cb157a3b73e91dc64d5e956d4290d73d5bc0f7a.tar.xz ipxe-4cb157a3b73e91dc64d5e956d4290d73d5bc0f7a.zip | |
[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>
| -rw-r--r-- | src/drivers/infiniband/arbel.c | 5 | ||||
| -rw-r--r-- | src/drivers/infiniband/arbel.h | 11 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/drivers/infiniband/arbel.c b/src/drivers/infiniband/arbel.c index fe5bd2ad8..20d374e67 100644 --- a/src/drivers/infiniband/arbel.c +++ b/src/drivers/infiniband/arbel.c @@ -725,7 +725,8 @@ static int arbel_alloc_qpn ( struct ib_device *ibdev, arbel ); return qpn_offset; } - qp->qpn = ( arbel->qpn_base + qpn_offset ); + qp->qpn = ( ( random() & ARBEL_QPN_RANDOM_MASK ) | + ( arbel->qpn_base + qpn_offset ) ); return 0; default: 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 ); 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 ) arbel_bitmask_free ( arbel->qp_inuse, qpn_offset ); } diff --git a/src/drivers/infiniband/arbel.h b/src/drivers/infiniband/arbel.h index 501b01355..967707f62 100644 --- a/src/drivers/infiniband/arbel.h +++ b/src/drivers/infiniband/arbel.h @@ -360,8 +360,8 @@ struct arbel_recv_work_queue { */ #define ARBEL_MAX_QPS 8 -/** Base queue pair number */ -#define ARBEL_QPN_BASE 0x550000 +/** Queue pair number randomisation mask */ +#define ARBEL_QPN_RANDOM_MASK 0xfff000 /** An Arbel queue pair */ struct arbel_queue_pair { @@ -564,7 +564,9 @@ arbel_cq_arm_doorbell_idx ( struct arbel *arbel, */ static inline unsigned int 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 arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) { 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 ); } /** |
