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 15 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
 			       arbel );
725
 			       arbel );
726
 			return qpn_offset;
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
 		return 0;
730
 		return 0;
730
 	default:
731
 	default:
731
 		DBGC ( arbel, "Arbel %p unsupported QP type %d\n",
732
 		DBGC ( arbel, "Arbel %p unsupported QP type %d\n",
745
 	struct arbel *arbel = ib_get_drvdata ( ibdev );
746
 	struct arbel *arbel = ib_get_drvdata ( ibdev );
746
 	int qpn_offset;
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
 	if ( qpn_offset >= 0 )
750
 	if ( qpn_offset >= 0 )
750
 		arbel_bitmask_free ( arbel->qp_inuse, qpn_offset );
751
 		arbel_bitmask_free ( arbel->qp_inuse, qpn_offset );
751
 }
752
 }

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

360
  */
360
  */
361
 #define ARBEL_MAX_QPS		8
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
 /** An Arbel queue pair */
366
 /** An Arbel queue pair */
367
 struct arbel_queue_pair {
367
 struct arbel_queue_pair {
564
  */
564
  */
565
 static inline unsigned int
565
 static inline unsigned int
566
 arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
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
 static inline unsigned int
579
 static inline unsigned int
578
 arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
580
 arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
579
 	return ( ARBEL_MAX_DOORBELL_RECORDS - ARBEL_MAX_CQS -
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