]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[arbel] Randomise the high-order bits of queue pair numbers
authorMichael Brown <mcb30@ipxe.org>
Sat, 17 Jul 2010 08:41:32 +0000 (09:41 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 17 Sep 2010 04:43:47 +0000 (05:43 +0100)
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>
src/drivers/infiniband/arbel.c
src/drivers/infiniband/arbel.h

index fe5bd2ad8c164c18c298985074a1d660090b8d30..20d374e67e2829e55512817116656c1c0d217a6e 100644 (file)
@@ -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 );
 }
index 501b0135529551c902ee844df4c9d011082d4844..967707f625876a1c9c43f931e9df426b5aa7a563 100644 (file)
@@ -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 );
 }
 
 /**