root/drivers/infiniband/hw/hfi1/verbs_txreq.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. get_txreq
  2. get_sdma_txreq
  3. get_waiting_verbs_txreq
  4. verbs_txreq_queued

   1 /*
   2  * Copyright(c) 2016 - 2018 Intel Corporation.
   3  *
   4  * This file is provided under a dual BSD/GPLv2 license.  When using or
   5  * redistributing this file, you may do so under either license.
   6  *
   7  * GPL LICENSE SUMMARY
   8  *
   9  * This program is free software; you can redistribute it and/or modify
  10  * it under the terms of version 2 of the GNU General Public License as
  11  * published by the Free Software Foundation.
  12  *
  13  * This program is distributed in the hope that it will be useful, but
  14  * WITHOUT ANY WARRANTY; without even the implied warranty of
  15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16  * General Public License for more details.
  17  *
  18  * BSD LICENSE
  19  *
  20  * Redistribution and use in source and binary forms, with or without
  21  * modification, are permitted provided that the following conditions
  22  * are met:
  23  *
  24  *  - Redistributions of source code must retain the above copyright
  25  *    notice, this list of conditions and the following disclaimer.
  26  *  - Redistributions in binary form must reproduce the above copyright
  27  *    notice, this list of conditions and the following disclaimer in
  28  *    the documentation and/or other materials provided with the
  29  *    distribution.
  30  *  - Neither the name of Intel Corporation nor the names of its
  31  *    contributors may be used to endorse or promote products derived
  32  *    from this software without specific prior written permission.
  33  *
  34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  35  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  37  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  38  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  39  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  40  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  41  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  42  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  43  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  44  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  45  *
  46  */
  47 
  48 #ifndef HFI1_VERBS_TXREQ_H
  49 #define HFI1_VERBS_TXREQ_H
  50 
  51 #include <linux/types.h>
  52 #include <linux/slab.h>
  53 
  54 #include "verbs.h"
  55 #include "sdma_txreq.h"
  56 #include "iowait.h"
  57 
  58 struct verbs_txreq {
  59         struct hfi1_sdma_header phdr;
  60         struct sdma_txreq       txreq;
  61         struct rvt_qp           *qp;
  62         struct rvt_swqe         *wqe;
  63         struct rvt_mregion      *mr;
  64         struct rvt_sge_state    *ss;
  65         struct sdma_engine     *sde;
  66         struct send_context     *psc;
  67         u16                     hdr_dwords;
  68         u16                     s_cur_size;
  69 };
  70 
  71 struct hfi1_ibdev;
  72 struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev,
  73                                 struct rvt_qp *qp);
  74 
  75 #define VERBS_TXREQ_GFP (GFP_ATOMIC | __GFP_NOWARN)
  76 static inline struct verbs_txreq *get_txreq(struct hfi1_ibdev *dev,
  77                                             struct rvt_qp *qp)
  78         __must_hold(&qp->slock)
  79 {
  80         struct verbs_txreq *tx;
  81         struct hfi1_qp_priv *priv = qp->priv;
  82 
  83         tx = kmem_cache_alloc(dev->verbs_txreq_cache, VERBS_TXREQ_GFP);
  84         if (unlikely(!tx)) {
  85                 /* call slow path to get the lock */
  86                 tx = __get_txreq(dev, qp);
  87                 if (!tx)
  88                         return tx;
  89         }
  90         tx->qp = qp;
  91         tx->mr = NULL;
  92         tx->sde = priv->s_sde;
  93         tx->psc = priv->s_sendcontext;
  94         /* so that we can test if the sdma decriptors are there */
  95         tx->txreq.num_desc = 0;
  96         /* Set the header type */
  97         tx->phdr.hdr.hdr_type = priv->hdr_type;
  98         tx->txreq.flags = 0;
  99         return tx;
 100 }
 101 
 102 static inline struct sdma_txreq *get_sdma_txreq(struct verbs_txreq *tx)
 103 {
 104         return &tx->txreq;
 105 }
 106 
 107 static inline struct verbs_txreq *get_waiting_verbs_txreq(struct iowait_work *w)
 108 {
 109         struct sdma_txreq *stx;
 110 
 111         stx = iowait_get_txhead(w);
 112         if (stx)
 113                 return container_of(stx, struct verbs_txreq, txreq);
 114         return NULL;
 115 }
 116 
 117 static inline bool verbs_txreq_queued(struct iowait_work *w)
 118 {
 119         return iowait_packet_queued(w);
 120 }
 121 
 122 void hfi1_put_txreq(struct verbs_txreq *tx);
 123 int verbs_txreq_init(struct hfi1_ibdev *dev);
 124 void verbs_txreq_exit(struct hfi1_ibdev *dev);
 125 
 126 #endif                         /* HFI1_VERBS_TXREQ_H */

/* [<][>][^][v][top][bottom][index][help] */