From 4cb157a3b73e91dc64d5e956d4290d73d5bc0f7a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 17 Jul 2010 09:41:32 +0100 Subject: [PATCH] [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 --- src/drivers/infiniband/arbel.c | 5 +++-- 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 fe5bd2ad..20d374e6 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 501b0135..967707f6 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 ); } /**