IB/qib: Reduce sdma_lock contention
[deliverable/linux.git] / drivers / infiniband / hw / qib / qib_verbs.h
index 4a2277bc059e9becf1d28e02252f54b138554419..aff8b2c178869ce31503b7981ed5d7c8df456469 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation.
- * All rights reserved.
+ * Copyright (c) 2012 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved.
  * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -303,8 +303,9 @@ struct qib_mregion {
        u32 max_segs;           /* number of qib_segs in all the arrays */
        u32 mapsz;              /* size of the map array */
        u8  page_shift;         /* 0 - non unform/non powerof2 sizes */
-       u8  lkey_published;     /* in global table */
+       u8  lkey_published;     /* in global table */
        struct completion comp; /* complete when refcount goes to zero */
+       struct rcu_head list;
        atomic_t refcount;
        struct qib_segarray *map[0];    /* the segments */
 };
@@ -419,7 +420,7 @@ struct qib_qp {
        /* read mostly fields above and below */
        struct ib_ah_attr remote_ah_attr;
        struct ib_ah_attr alt_ah_attr;
-       struct qib_qp *next;            /* link list for QPN hash table */
+       struct qib_qp __rcu *next;            /* link list for QPN hash table */
        struct qib_swqe *s_wq;  /* send work queue */
        struct qib_mmap_info *ip;
        struct qib_ib_header *s_hdr;     /* next packet header to send */
@@ -649,7 +650,7 @@ struct qib_lkey_table {
        u32 next;               /* next unused index (speeds search) */
        u32 gen;                /* generation count */
        u32 max;                /* size of the table */
-       struct qib_mregion **table;
+       struct qib_mregion __rcu **table;
 };
 
 struct qib_opcode_stats {
@@ -658,8 +659,8 @@ struct qib_opcode_stats {
 };
 
 struct qib_ibport {
-       struct qib_qp *qp0;
-       struct qib_qp *qp1;
+       struct qib_qp __rcu *qp0;
+       struct qib_qp __rcu *qp1;
        struct ib_mad_agent *send_agent;        /* agent for SMI (traps) */
        struct qib_ah *sm_ah;
        struct qib_ah *smi_ah;
@@ -726,12 +727,13 @@ struct qib_ibport {
        struct qib_opcode_stats opstats[128];
 };
 
+
 struct qib_ibdev {
        struct ib_device ibdev;
        struct list_head pending_mmaps;
        spinlock_t mmap_offset_lock; /* protect mmap_offset */
        u32 mmap_offset;
-       struct qib_mregion *dma_mr;
+       struct qib_mregion __rcu *dma_mr;
 
        /* QP numbers are shared by all IB ports */
        struct qib_qpn_table qpn_table;
@@ -742,7 +744,7 @@ struct qib_ibdev {
        struct list_head memwait;       /* list for wait kernel memory */
        struct list_head txreq_free;
        struct timer_list mem_timer;
-       struct qib_qp **qp_table;
+       struct qib_qp __rcu **qp_table;
        struct qib_pio_header *pio_hdrs;
        dma_addr_t pio_hdrs_phys;
        /* list of QPs waiting for RNR timer */
@@ -835,11 +837,7 @@ extern struct workqueue_struct *qib_cq_wq;
 /*
  * This must be called with s_lock held.
  */
-static inline void qib_schedule_send(struct qib_qp *qp)
-{
-       if (qib_send_ok(qp))
-               queue_work(ib_wq, &qp->s_work);
-}
+void qib_schedule_send(struct qib_qp *qp);
 
 static inline int qib_pkey_ok(u16 pkey1, u16 pkey2)
 {
@@ -936,6 +934,8 @@ void qib_rc_rcv(struct qib_ctxtdata *rcd, struct qib_ib_header *hdr,
 
 int qib_check_ah(struct ib_device *ibdev, struct ib_ah_attr *ah_attr);
 
+struct ib_ah *qib_create_qp0_ah(struct qib_ibport *ibp, u16 dlid);
+
 void qib_rc_rnr_retry(unsigned long arg);
 
 void qib_rc_send_complete(struct qib_qp *qp, struct qib_ib_header *hdr);
@@ -1022,10 +1022,12 @@ static inline void qib_get_mr(struct qib_mregion *mr)
        atomic_inc(&mr->refcount);
 }
 
+void mr_rcu_callback(struct rcu_head *list);
+
 static inline void qib_put_mr(struct qib_mregion *mr)
 {
        if (unlikely(atomic_dec_and_test(&mr->refcount)))
-               complete(&mr->comp);
+               call_rcu(&mr->list, mr_rcu_callback);
 }
 
 static inline void qib_put_ss(struct qib_sge_state *ss)
This page took 0.047987 seconds and 5 git commands to generate.