The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ofed/drivers/infiniband/ulp/sdp/sdp.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #ifndef _SDP_H_
    2 #define _SDP_H_
    3 
    4 #define LINUXKPI_PARAM_PREFIX ib_sdp_
    5 
    6 #include "opt_ddb.h"
    7 #include "opt_inet.h"
    8 #include "opt_ofed.h"
    9 
   10 #include <sys/param.h>
   11 #include <sys/systm.h>
   12 #include <sys/malloc.h>
   13 #include <sys/kernel.h>
   14 #include <sys/sysctl.h>
   15 #include <sys/mbuf.h>
   16 #include <sys/lock.h>
   17 #include <sys/rwlock.h>
   18 #include <sys/socket.h>
   19 #include <sys/socketvar.h>
   20 #include <sys/protosw.h>
   21 #include <sys/proc.h>
   22 #include <sys/jail.h>
   23 #include <sys/domain.h>
   24 
   25 #ifdef DDB
   26 #include <ddb/ddb.h>
   27 #endif
   28 
   29 #include <net/if.h>
   30 #include <net/if_var.h>
   31 #include <net/route.h>
   32 #include <net/vnet.h>
   33 
   34 #include <netinet/in.h>
   35 #include <netinet/in_systm.h>
   36 #include <netinet/in_var.h>
   37 #include <netinet/in_pcb.h>
   38 #include <netinet/tcp.h>
   39 #include <netinet/tcp_fsm.h>
   40 #include <netinet/tcp_timer.h>
   41 #include <netinet/tcp_var.h>
   42 
   43 #include <linux/device.h>
   44 #include <linux/err.h>
   45 #include <linux/sched.h>
   46 #include <linux/workqueue.h>
   47 #include <linux/wait.h>
   48 #include <linux/module.h>
   49 #include <linux/moduleparam.h>
   50 #include <linux/pci.h>
   51 
   52 #include <rdma/ib_verbs.h>
   53 #include <rdma/rdma_cm.h>
   54 #include <rdma/ib_cm.h>
   55 #include <rdma/ib_fmr_pool.h>
   56 #include <rdma/rdma_sdp.h>
   57 
   58 #ifdef SDP_DEBUG
   59 #define CONFIG_INFINIBAND_SDP_DEBUG
   60 #endif
   61 
   62 #include "sdp_dbg.h"
   63 
   64 #undef LIST_HEAD
   65 /* From sys/queue.h */
   66 #define LIST_HEAD(name, type)                                           \
   67 struct name {                                                           \
   68         struct type *lh_first;  /* first element */                     \
   69 }
   70 
   71 /* Interval between successive polls in the Tx routine when polling is used
   72    instead of interrupts (in per-core Tx rings) - should be power of 2 */
   73 #define SDP_TX_POLL_MODER       16
   74 #define SDP_TX_POLL_TIMEOUT     (HZ / 20)
   75 #define SDP_NAGLE_TIMEOUT (HZ / 10)
   76 
   77 #define SDP_SRCAVAIL_CANCEL_TIMEOUT (HZ * 5)
   78 #define SDP_SRCAVAIL_ADV_TIMEOUT (1 * HZ)
   79 #define SDP_SRCAVAIL_PAYLOAD_LEN 1
   80 
   81 #define SDP_RESOLVE_TIMEOUT 1000
   82 #define SDP_ROUTE_TIMEOUT 1000
   83 #define SDP_RETRY_COUNT 5
   84 #define SDP_KEEPALIVE_TIME (120 * 60 * HZ)
   85 #define SDP_FIN_WAIT_TIMEOUT (60 * HZ) /* like TCP_FIN_TIMEOUT */
   86 
   87 #define SDP_TX_SIZE 0x40
   88 #define SDP_RX_SIZE 0x40
   89 
   90 #define SDP_FMR_SIZE (MIN(0x1000, PAGE_SIZE) / sizeof(u64))
   91 #define SDP_FMR_POOL_SIZE       1024
   92 #define SDP_FMR_DIRTY_SIZE      ( SDP_FMR_POOL_SIZE / 4 )
   93 
   94 #define SDP_MAX_RDMA_READ_LEN (PAGE_SIZE * (SDP_FMR_SIZE - 2))
   95 
   96 /* mb inlined data len - rest will be rx'ed into frags */
   97 #define SDP_HEAD_SIZE (sizeof(struct sdp_bsdh))
   98 
   99 /* limit tx payload len, if the sink supports bigger buffers than the source
  100  * can handle.
  101  * or rx fragment size (limited by sge->length size) */
  102 #define SDP_MAX_PACKET  (1 << 16)
  103 #define SDP_MAX_PAYLOAD (SDP_MAX_PACKET - SDP_HEAD_SIZE)
  104 
  105 #define SDP_MAX_RECV_SGES (SDP_MAX_PACKET / MCLBYTES)
  106 #define SDP_MAX_SEND_SGES (SDP_MAX_PACKET / MCLBYTES) + 2
  107 
  108 #define SDP_NUM_WC 4
  109 
  110 #define SDP_DEF_ZCOPY_THRESH 64*1024
  111 #define SDP_MIN_ZCOPY_THRESH PAGE_SIZE
  112 #define SDP_MAX_ZCOPY_THRESH 1048576
  113 
  114 #define SDP_OP_RECV 0x800000000LL
  115 #define SDP_OP_SEND 0x400000000LL
  116 #define SDP_OP_RDMA 0x200000000LL
  117 #define SDP_OP_NOP  0x100000000LL
  118 
  119 /* how long (in jiffies) to block sender till tx completion*/
  120 #define SDP_BZCOPY_POLL_TIMEOUT (HZ / 10)
  121 
  122 #define SDP_AUTO_CONF   0xffff
  123 #define AUTO_MOD_DELAY (HZ / 4)
  124 
  125 struct sdp_mb_cb {
  126         __u32           seq;            /* Starting sequence number     */
  127         struct bzcopy_state      *bz;
  128         struct rx_srcavail_state *rx_sa;
  129         struct tx_srcavail_state *tx_sa;
  130 };
  131 
  132 #define M_PUSH  M_PROTO1        /* Do a 'push'. */
  133 #define M_URG   M_PROTO2        /* Mark as urgent (oob). */
  134 
  135 #define SDP_SKB_CB(__mb)      ((struct sdp_mb_cb *)&((__mb)->cb[0]))
  136 #define BZCOPY_STATE(mb)      (SDP_SKB_CB(mb)->bz)
  137 #define RX_SRCAVAIL_STATE(mb) (SDP_SKB_CB(mb)->rx_sa)
  138 #define TX_SRCAVAIL_STATE(mb) (SDP_SKB_CB(mb)->tx_sa)
  139 
  140 #ifndef MIN
  141 #define MIN(a, b) (a < b ? a : b)
  142 #endif
  143 
  144 #define ring_head(ring)   (atomic_read(&(ring).head))
  145 #define ring_tail(ring)   (atomic_read(&(ring).tail))
  146 #define ring_posted(ring) (ring_head(ring) - ring_tail(ring))
  147 
  148 #define rx_ring_posted(ssk) ring_posted(ssk->rx_ring)
  149 #ifdef SDP_ZCOPY
  150 #define tx_ring_posted(ssk) (ring_posted(ssk->tx_ring) + \
  151         (ssk->tx_ring.rdma_inflight ? ssk->tx_ring.rdma_inflight->busy : 0))
  152 #else
  153 #define tx_ring_posted(ssk) ring_posted(ssk->tx_ring)
  154 #endif
  155 
  156 extern int sdp_zcopy_thresh;
  157 extern int rcvbuf_initial_size;
  158 extern struct workqueue_struct *rx_comp_wq;
  159 extern struct ib_client sdp_client;
  160 
  161 enum sdp_mid {
  162         SDP_MID_HELLO = 0x0,
  163         SDP_MID_HELLO_ACK = 0x1,
  164         SDP_MID_DISCONN = 0x2,
  165         SDP_MID_ABORT = 0x3,
  166         SDP_MID_SENDSM = 0x4,
  167         SDP_MID_RDMARDCOMPL = 0x6,
  168         SDP_MID_SRCAVAIL_CANCEL = 0x8,
  169         SDP_MID_CHRCVBUF = 0xB,
  170         SDP_MID_CHRCVBUF_ACK = 0xC,
  171         SDP_MID_SINKAVAIL = 0xFD,
  172         SDP_MID_SRCAVAIL = 0xFE,
  173         SDP_MID_DATA = 0xFF,
  174 };
  175 
  176 enum sdp_flags {
  177         SDP_OOB_PRES = 1 << 0,
  178         SDP_OOB_PEND = 1 << 1,
  179 };
  180 
  181 enum {
  182         SDP_MIN_TX_CREDITS = 2
  183 };
  184 
  185 enum {
  186         SDP_ERR_ERROR   = -4,
  187         SDP_ERR_FAULT   = -3,
  188         SDP_NEW_SEG     = -2,
  189         SDP_DO_WAIT_MEM = -1
  190 };
  191 
  192 struct sdp_rrch {
  193         __u32 len;
  194 } __attribute__((__packed__));
  195 
  196 struct sdp_srcah {
  197         __u32 len;
  198         __u32 rkey;
  199         __u64 vaddr;
  200 } __attribute__((__packed__));
  201 
  202 struct sdp_buf {
  203         struct mbuf *mb;
  204         u64             mapping[SDP_MAX_SEND_SGES];
  205 } __attribute__((__packed__));
  206 
  207 struct sdp_chrecvbuf {
  208         u32 size;
  209 } __attribute__((__packed__));
  210 
  211 /* Context used for synchronous zero copy bcopy (BZCOPY) */
  212 struct bzcopy_state {
  213         unsigned char __user  *u_base;
  214         int                    u_len;
  215         int                    left;
  216         int                    page_cnt;
  217         int                    cur_page;
  218         int                    cur_offset;
  219         int                    busy;
  220         struct sdp_sock      *ssk;
  221         struct page         **pages;
  222 };
  223 
  224 enum rx_sa_flag {
  225         RX_SA_ABORTED    = 2,
  226 };
  227 
  228 enum tx_sa_flag {
  229         TX_SA_SENDSM     = 0x01,
  230         TX_SA_CROSS_SEND = 0x02,
  231         TX_SA_INTRRUPTED = 0x04,
  232         TX_SA_TIMEDOUT   = 0x08,
  233         TX_SA_ERROR      = 0x10,
  234 };
  235 
  236 struct rx_srcavail_state {
  237         /* Advertised buffer stuff */
  238         u32 mseq;
  239         u32 used;
  240         u32 reported;
  241         u32 len;
  242         u32 rkey;
  243         u64 vaddr;
  244 
  245         /* Dest buff info */
  246         struct ib_umem *umem;
  247         struct ib_pool_fmr *fmr;
  248 
  249         /* Utility */
  250         u8  busy;
  251         enum rx_sa_flag  flags;
  252 };
  253 
  254 struct tx_srcavail_state {
  255         /* Data below 'busy' will be reset */
  256         u8              busy;
  257 
  258         struct ib_umem *umem;
  259         struct ib_pool_fmr *fmr;
  260 
  261         u32             bytes_sent;
  262         u32             bytes_acked;
  263 
  264         enum tx_sa_flag abort_flags;
  265         u8              posted;
  266 
  267         u32             mseq;
  268 };
  269 
  270 struct sdp_tx_ring {
  271 #ifdef SDP_ZCOPY
  272         struct rx_srcavail_state *rdma_inflight;
  273 #endif
  274         struct sdp_buf          *buffer;
  275         atomic_t                head;
  276         atomic_t                tail;
  277         struct ib_cq            *cq;
  278 
  279         atomic_t                credits;
  280 #define tx_credits(ssk) (atomic_read(&ssk->tx_ring.credits))
  281 
  282         struct callout          timer;
  283         u16                     poll_cnt;
  284 };
  285 
  286 struct sdp_rx_ring {
  287         struct sdp_buf   *buffer;
  288         atomic_t          head;
  289         atomic_t          tail;
  290         struct ib_cq     *cq;
  291 
  292         int              destroyed;
  293         struct rwlock    destroyed_lock;
  294 };
  295 
  296 struct sdp_device {
  297         struct ib_pd            *pd;
  298         struct ib_fmr_pool      *fmr_pool;
  299 };
  300 
  301 struct sdp_moderation {
  302         unsigned long last_moder_packets;
  303         unsigned long last_moder_tx_packets;
  304         unsigned long last_moder_bytes;
  305         unsigned long last_moder_jiffies;
  306         int last_moder_time;
  307         u16 rx_usecs;
  308         u16 rx_frames;
  309         u16 tx_usecs;
  310         u32 pkt_rate_low;
  311         u16 rx_usecs_low;
  312         u32 pkt_rate_high;
  313         u16 rx_usecs_high;
  314         u16 sample_interval;
  315         u16 adaptive_rx_coal;
  316         u32 msg_enable;
  317 
  318         int moder_cnt;
  319         int moder_time;
  320 };
  321 
  322 /* These are flags fields. */
  323 #define SDP_TIMEWAIT    0x0001          /* In ssk timewait state. */
  324 #define SDP_DROPPED     0x0002          /* Socket has been dropped. */
  325 #define SDP_SOCKREF     0x0004          /* Holding a sockref for close. */
  326 #define SDP_NODELAY     0x0008          /* Disble nagle. */
  327 #define SDP_NEEDFIN     0x0010          /* Send a fin on the next tx. */
  328 #define SDP_DREQWAIT    0x0020          /* Waiting on DREQ. */
  329 #define SDP_DESTROY     0x0040          /* Being destroyed. */
  330 #define SDP_DISCON      0x0080          /* rdma_disconnect is owed. */
  331 
  332 /* These are oobflags */
  333 #define SDP_HADOOB      0x0001          /* Had OOB data. */
  334 #define SDP_HAVEOOB     0x0002          /* Have OOB data. */
  335 
  336 struct sdp_sock {
  337         LIST_ENTRY(sdp_sock) list;
  338         struct socket *socket;
  339         struct rdma_cm_id *id;
  340         struct ib_device *ib_device;
  341         struct sdp_device *sdp_dev;
  342         struct ib_qp *qp;
  343         struct ucred *cred;
  344         struct callout keep2msl;        /* 2msl and keepalive timer. */
  345         struct callout nagle_timer;     /* timeout waiting for ack */
  346         struct ib_ucontext context;
  347         in_port_t lport;
  348         in_addr_t laddr;
  349         in_port_t fport;
  350         in_addr_t faddr;
  351         int flags;
  352         int oobflags;           /* protected by rx lock. */
  353         int state;
  354         int softerror;
  355         int recv_bytes;         /* Bytes per recv. buf including header */
  356         int xmit_size_goal;
  357         char iobc;
  358 
  359         struct sdp_rx_ring rx_ring;
  360         struct sdp_tx_ring tx_ring;
  361         struct rwlock   lock;
  362         struct mbufq    rxctlq;         /* received control packets */
  363 
  364         int qp_active;  /* XXX Flag. */
  365         int max_sge;
  366         struct work_struct rx_comp_work;
  367 #define rcv_nxt(ssk) atomic_read(&(ssk->rcv_nxt))
  368         atomic_t rcv_nxt;
  369 
  370         /* SDP specific */
  371         atomic_t mseq_ack;
  372 #define mseq_ack(ssk) (atomic_read(&ssk->mseq_ack))
  373         unsigned max_bufs;      /* Initial buffers offered by other side */
  374         unsigned min_bufs;      /* Low water mark to wake senders */
  375 
  376         unsigned long nagle_last_unacked; /* mseq of lastest unacked packet */
  377 
  378         atomic_t               remote_credits;
  379 #define remote_credits(ssk) (atomic_read(&ssk->remote_credits))
  380         int               poll_cq;
  381 
  382         /* SDP slow start */
  383         int recv_request_head;  /* mark the rx_head when the resize request
  384                                    was received */
  385         int recv_request;       /* XXX flag if request to resize was received */
  386 
  387         unsigned long tx_packets;
  388         unsigned long rx_packets;
  389         unsigned long tx_bytes;
  390         unsigned long rx_bytes;
  391         struct sdp_moderation auto_mod;
  392         struct task shutdown_task;
  393 #ifdef SDP_ZCOPY
  394         struct tx_srcavail_state *tx_sa;
  395         struct rx_srcavail_state *rx_sa;
  396         spinlock_t tx_sa_lock;
  397         struct delayed_work srcavail_cancel_work;
  398         int srcavail_cancel_mseq;
  399         /* ZCOPY data: -1:use global; 0:disable zcopy; >0: zcopy threshold */
  400         int zcopy_thresh;
  401 #endif
  402 };
  403 
  404 #define sdp_sk(so)      ((struct sdp_sock *)(so->so_pcb))
  405 
  406 #define SDP_RLOCK(ssk)          rw_rlock(&(ssk)->lock)
  407 #define SDP_WLOCK(ssk)          rw_wlock(&(ssk)->lock)
  408 #define SDP_RUNLOCK(ssk)        rw_runlock(&(ssk)->lock)
  409 #define SDP_WUNLOCK(ssk)        rw_wunlock(&(ssk)->lock)
  410 #define SDP_WLOCK_ASSERT(ssk)   rw_assert(&(ssk)->lock, RA_WLOCKED)
  411 #define SDP_RLOCK_ASSERT(ssk)   rw_assert(&(ssk)->lock, RA_RLOCKED)
  412 #define SDP_LOCK_ASSERT(ssk)    rw_assert(&(ssk)->lock, RA_LOCKED)
  413 
  414 MALLOC_DECLARE(M_SDP);
  415 SYSCTL_DECL(_net_inet_sdp);
  416 
  417 static inline void tx_sa_reset(struct tx_srcavail_state *tx_sa)
  418 {
  419         memset((void *)&tx_sa->busy, 0,
  420                         sizeof(*tx_sa) - offsetof(typeof(*tx_sa), busy));
  421 }
  422 
  423 static inline void rx_ring_unlock(struct sdp_rx_ring *rx_ring)
  424 {
  425         rw_runlock(&rx_ring->destroyed_lock);
  426 }
  427 
  428 static inline int rx_ring_trylock(struct sdp_rx_ring *rx_ring)
  429 {
  430         rw_rlock(&rx_ring->destroyed_lock);
  431         if (rx_ring->destroyed) {
  432                 rx_ring_unlock(rx_ring);
  433                 return 0;
  434         }
  435         return 1;
  436 }
  437 
  438 static inline void rx_ring_destroy_lock(struct sdp_rx_ring *rx_ring)
  439 {
  440         rw_wlock(&rx_ring->destroyed_lock);
  441         rx_ring->destroyed = 1;
  442         rw_wunlock(&rx_ring->destroyed_lock);
  443 }
  444 
  445 static inline void sdp_arm_rx_cq(struct sdp_sock *ssk)
  446 {
  447         sdp_prf(ssk->socket, NULL, "Arming RX cq");
  448         sdp_dbg_data(ssk->socket, "Arming RX cq\n");
  449 
  450         ib_req_notify_cq(ssk->rx_ring.cq, IB_CQ_NEXT_COMP);
  451 }
  452 
  453 static inline void sdp_arm_tx_cq(struct sdp_sock *ssk)
  454 {
  455         sdp_prf(ssk->socket, NULL, "Arming TX cq");
  456         sdp_dbg_data(ssk->socket, "Arming TX cq. credits: %d, posted: %d\n",
  457                 tx_credits(ssk), tx_ring_posted(ssk));
  458 
  459         ib_req_notify_cq(ssk->tx_ring.cq, IB_CQ_NEXT_COMP);
  460 }
  461 
  462 /* return the min of:
  463  * - tx credits
  464  * - free slots in tx_ring (not including SDP_MIN_TX_CREDITS
  465  */
  466 static inline int tx_slots_free(struct sdp_sock *ssk)
  467 {
  468         int min_free;
  469 
  470         min_free = MIN(tx_credits(ssk),
  471                         SDP_TX_SIZE - tx_ring_posted(ssk));
  472         if (min_free < SDP_MIN_TX_CREDITS)
  473                 return 0;
  474 
  475         return min_free - SDP_MIN_TX_CREDITS;
  476 };
  477 
  478 /* utilities */
  479 static inline char *mid2str(int mid)
  480 {
  481 #define ENUM2STR(e) [e] = #e
  482         static char *mid2str[] = {
  483                 ENUM2STR(SDP_MID_HELLO),
  484                 ENUM2STR(SDP_MID_HELLO_ACK),
  485                 ENUM2STR(SDP_MID_ABORT),
  486                 ENUM2STR(SDP_MID_DISCONN),
  487                 ENUM2STR(SDP_MID_SENDSM),
  488                 ENUM2STR(SDP_MID_RDMARDCOMPL),
  489                 ENUM2STR(SDP_MID_SRCAVAIL_CANCEL),
  490                 ENUM2STR(SDP_MID_CHRCVBUF),
  491                 ENUM2STR(SDP_MID_CHRCVBUF_ACK),
  492                 ENUM2STR(SDP_MID_DATA),
  493                 ENUM2STR(SDP_MID_SRCAVAIL),
  494                 ENUM2STR(SDP_MID_SINKAVAIL),
  495         };
  496 
  497         if (mid >= ARRAY_SIZE(mid2str))
  498                 return NULL;
  499 
  500         return mid2str[mid];
  501 }
  502 
  503 static inline struct mbuf *
  504 sdp_alloc_mb(struct socket *sk, u8 mid, int size, int wait)
  505 {
  506         struct sdp_bsdh *h;
  507         struct mbuf *mb;
  508 
  509         MGETHDR(mb, wait, MT_DATA);
  510         if (mb == NULL)
  511                 return (NULL);
  512         mb->m_pkthdr.len = mb->m_len = sizeof(struct sdp_bsdh);
  513         h = mtod(mb, struct sdp_bsdh *);
  514         h->mid = mid;
  515 
  516         return mb;
  517 }
  518 static inline struct mbuf *
  519 sdp_alloc_mb_data(struct socket *sk, int wait)
  520 {
  521         return sdp_alloc_mb(sk, SDP_MID_DATA, 0, wait);
  522 }
  523 
  524 static inline struct mbuf *
  525 sdp_alloc_mb_disconnect(struct socket *sk, int wait)
  526 {
  527         return sdp_alloc_mb(sk, SDP_MID_DISCONN, 0, wait);
  528 }
  529 
  530 static inline void *
  531 mb_put(struct mbuf *mb, int len)
  532 {
  533         uint8_t *data;
  534 
  535         data = mb->m_data;
  536         data += mb->m_len;
  537         mb->m_len += len;
  538         return (void *)data;
  539 }
  540 
  541 static inline struct mbuf *
  542 sdp_alloc_mb_chrcvbuf_ack(struct socket *sk, int size, int wait)
  543 {
  544         struct mbuf *mb;
  545         struct sdp_chrecvbuf *resp_size;
  546 
  547         mb = sdp_alloc_mb(sk, SDP_MID_CHRCVBUF_ACK, sizeof(*resp_size), wait);
  548         if (mb == NULL)
  549                 return (NULL);
  550         resp_size = (struct sdp_chrecvbuf *)mb_put(mb, sizeof *resp_size);
  551         resp_size->size = htonl(size);
  552 
  553         return mb;
  554 }
  555 
  556 static inline struct mbuf *
  557 sdp_alloc_mb_srcavail(struct socket *sk, u32 len, u32 rkey, u64 vaddr, int wait)
  558 {
  559         struct mbuf *mb;
  560         struct sdp_srcah *srcah;
  561 
  562         mb = sdp_alloc_mb(sk, SDP_MID_SRCAVAIL, sizeof(*srcah), wait);
  563         if (mb == NULL)
  564                 return (NULL);
  565         srcah = (struct sdp_srcah *)mb_put(mb, sizeof(*srcah));
  566         srcah->len = htonl(len);
  567         srcah->rkey = htonl(rkey);
  568         srcah->vaddr = cpu_to_be64(vaddr);
  569 
  570         return mb;
  571 }
  572 
  573 static inline struct mbuf *
  574 sdp_alloc_mb_srcavail_cancel(struct socket *sk, int wait)
  575 {
  576         return sdp_alloc_mb(sk, SDP_MID_SRCAVAIL_CANCEL, 0, wait);
  577 }
  578 
  579 static inline struct mbuf *
  580 sdp_alloc_mb_rdmardcompl(struct socket *sk, u32 len, int wait)
  581 {
  582         struct mbuf *mb;
  583         struct sdp_rrch *rrch;
  584 
  585         mb = sdp_alloc_mb(sk, SDP_MID_RDMARDCOMPL, sizeof(*rrch), wait);
  586         if (mb == NULL)
  587                 return (NULL);
  588         rrch = (struct sdp_rrch *)mb_put(mb, sizeof(*rrch));
  589         rrch->len = htonl(len);
  590 
  591         return mb;
  592 }
  593 
  594 static inline struct mbuf *
  595 sdp_alloc_mb_sendsm(struct socket *sk, int wait)
  596 {
  597         return sdp_alloc_mb(sk, SDP_MID_SENDSM, 0, wait);
  598 }
  599 static inline int sdp_tx_ring_slots_left(struct sdp_sock *ssk)
  600 {
  601         return SDP_TX_SIZE - tx_ring_posted(ssk);
  602 }
  603 
  604 static inline int credit_update_needed(struct sdp_sock *ssk)
  605 {
  606         int c;
  607 
  608         c = remote_credits(ssk);
  609         if (likely(c > SDP_MIN_TX_CREDITS))
  610                 c += c/2;
  611         return unlikely(c < rx_ring_posted(ssk)) &&
  612             likely(tx_credits(ssk) > 0) &&
  613             likely(sdp_tx_ring_slots_left(ssk));
  614 }
  615 
  616 
  617 #define SDPSTATS_COUNTER_INC(stat)
  618 #define SDPSTATS_COUNTER_ADD(stat, val)
  619 #define SDPSTATS_COUNTER_MID_INC(stat, mid)
  620 #define SDPSTATS_HIST_LINEAR(stat, size)
  621 #define SDPSTATS_HIST(stat, size)
  622 
  623 static inline void
  624 sdp_cleanup_sdp_buf(struct sdp_sock *ssk, struct sdp_buf *sbuf,
  625     enum dma_data_direction dir)
  626 {
  627         struct ib_device *dev;
  628         struct mbuf *mb;
  629         int i;
  630 
  631         dev = ssk->ib_device;
  632         for (i = 0, mb = sbuf->mb; mb != NULL; mb = mb->m_next, i++)
  633                 ib_dma_unmap_single(dev, sbuf->mapping[i], mb->m_len, dir);
  634 }
  635 
  636 /* sdp_main.c */
  637 void sdp_set_default_moderation(struct sdp_sock *ssk);
  638 void sdp_start_keepalive_timer(struct socket *sk);
  639 void sdp_urg(struct sdp_sock *ssk, struct mbuf *mb);
  640 void sdp_cancel_dreq_wait_timeout(struct sdp_sock *ssk);
  641 void sdp_abort(struct socket *sk);
  642 struct sdp_sock *sdp_notify(struct sdp_sock *ssk, int error);
  643 
  644 
  645 /* sdp_cma.c */
  646 int sdp_cma_handler(struct rdma_cm_id *, struct rdma_cm_event *);
  647 
  648 /* sdp_tx.c */
  649 int sdp_tx_ring_create(struct sdp_sock *ssk, struct ib_device *device);
  650 void sdp_tx_ring_destroy(struct sdp_sock *ssk);
  651 int sdp_xmit_poll(struct sdp_sock *ssk, int force);
  652 void sdp_post_send(struct sdp_sock *ssk, struct mbuf *mb);
  653 void sdp_post_sends(struct sdp_sock *ssk, int wait);
  654 void sdp_post_keepalive(struct sdp_sock *ssk);
  655 
  656 /* sdp_rx.c */
  657 void sdp_rx_ring_init(struct sdp_sock *ssk);
  658 int sdp_rx_ring_create(struct sdp_sock *ssk, struct ib_device *device);
  659 void sdp_rx_ring_destroy(struct sdp_sock *ssk);
  660 int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size);
  661 int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size);
  662 void sdp_do_posts(struct sdp_sock *ssk);
  663 void sdp_rx_comp_full(struct sdp_sock *ssk);
  664 
  665 /* sdp_zcopy.c */
  666 struct kiocb;
  667 int sdp_sendmsg_zcopy(struct kiocb *iocb, struct socket *sk, struct iovec *iov);
  668 int sdp_handle_srcavail(struct sdp_sock *ssk, struct sdp_srcah *srcah);
  669 void sdp_handle_sendsm(struct sdp_sock *ssk, u32 mseq_ack);
  670 void sdp_handle_rdma_read_compl(struct sdp_sock *ssk, u32 mseq_ack,
  671                 u32 bytes_completed);
  672 int sdp_handle_rdma_read_cqe(struct sdp_sock *ssk);
  673 int sdp_rdma_to_iovec(struct socket *sk, struct iovec *iov, struct mbuf *mb,
  674                 unsigned long *used);
  675 int sdp_post_rdma_rd_compl(struct sdp_sock *ssk,
  676                 struct rx_srcavail_state *rx_sa);
  677 int sdp_post_sendsm(struct socket *sk);
  678 void srcavail_cancel_timeout(struct work_struct *work);
  679 void sdp_abort_srcavail(struct socket *sk);
  680 void sdp_abort_rdma_read(struct socket *sk);
  681 int sdp_process_rx(struct sdp_sock *ssk);
  682 
  683 #endif

Cache object: 691c8e7b1035cc55f18e2bc83c71f5f2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.