Browse Source

[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>
tags/v1.20.1
Michael Brown 14 years ago
parent
commit
4cb157a3b7
2 changed files with 10 additions and 6 deletions
  1. 3
    2
      src/drivers/infiniband/arbel.c
  2. 7
    4
      src/drivers/infiniband/arbel.h

+ 3
- 2
src/drivers/infiniband/arbel.c View File

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

+ 7
- 4
src/drivers/infiniband/arbel.h View File

@@ -360,8 +360,8 @@ struct arbel_recv_work_queue {
360 360
  */
361 361
 #define ARBEL_MAX_QPS		8
362 362
 
363
-/** Base queue pair number */
364
-#define ARBEL_QPN_BASE 0x550000
363
+/** Queue pair number randomisation mask */
364
+#define ARBEL_QPN_RANDOM_MASK 0xfff000
365 365
 
366 366
 /** An Arbel queue pair */
367 367
 struct arbel_queue_pair {
@@ -564,7 +564,9 @@ arbel_cq_arm_doorbell_idx ( struct arbel *arbel,
564 564
  */
565 565
 static inline unsigned int
566 566
 arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
567
-	return ( ARBEL_MAX_CQS + ( qp->qpn - arbel->special_qpn_base ) );
567
+	return ( ARBEL_MAX_CQS +
568
+		 ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
569
+		   arbel->special_qpn_base ) );
568 570
 }
569 571
 
570 572
 /**
@@ -577,7 +579,8 @@ arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
577 579
 static inline unsigned int
578 580
 arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
579 581
 	return ( ARBEL_MAX_DOORBELL_RECORDS - ARBEL_MAX_CQS -
580
-		 ( qp->qpn - arbel->special_qpn_base ) - 1 );
582
+		 ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
583
+		   arbel->special_qpn_base ) - 1 );
581 584
 }
582 585
 
583 586
 /**

Loading…
Cancel
Save