Whamcloud - gitweb
b=15332,i=liang:
[fs/lustre-release.git] / lnet / klnds / ptllnd / ptllnd.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lnet/klnds/ptllnd/ptllnd.h
37  *
38  * Author: PJ Kirner <pjkirner@clusterfs.com>
39  */
40
41 #ifndef EXPORT_SYMTAB
42 # define EXPORT_SYMTAB
43 #endif
44 #ifndef AUTOCONF_INCLUDED
45 #include <linux/config.h>
46 #endif
47 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/mm.h>
50 #include <linux/string.h>
51 #include <linux/stat.h>
52 #include <linux/errno.h>
53 #include <linux/smp_lock.h>
54 #include <linux/unistd.h>
55 #include <linux/uio.h>
56
57 #include <asm/system.h>
58 #include <asm/uaccess.h>
59 #include <asm/io.h>
60
61 #include <linux/init.h>
62 #include <linux/fs.h>
63 #include <linux/file.h>
64 #include <linux/stat.h>
65 #include <linux/list.h>
66 #include <linux/kmod.h>
67 #include <linux/sysctl.h>
68 #include <linux/random.h>
69
70 #include <net/sock.h>
71 #include <linux/in.h>
72
73
74 #define DEBUG_SUBSYSTEM S_LND
75
76 #include <libcfs/libcfs.h>
77 #include <lnet/lnet.h>
78 #include <lnet/lib-lnet.h>
79 #include <lnet/lnet-sysctl.h>
80 #include <portals/p30.h>
81 #ifdef CRAY_XT3
82 #include <portals/ptltrace.h>
83 #endif
84 #include <lnet/ptllnd.h>        /* Depends on portals/p30.h */
85
86 /*
87  * Define this to enable console debug logging
88  * and simulation
89  */
90 //#define PJK_DEBUGGING
91
92 #ifdef CONFIG_SMP
93 # define PTLLND_N_SCHED         num_online_cpus()   /* # schedulers */
94 #else
95 # define PTLLND_N_SCHED         1                   /* # schedulers */
96 #endif
97
98 #define PTLLND_CREDIT_HIGHWATER ((*kptllnd_tunables.kptl_peertxcredits)-1)
99   /* when eagerly to return credits */
100
101 typedef struct
102 {
103         int             *kptl_ntx;              /* # tx descs to pre-allocate */
104         int             *kptl_max_nodes;        /* max # nodes all talking to me */
105         int             *kptl_max_procs_per_node; /* max # processes per node */
106         int             *kptl_checksum;         /* checksum kptl_msg_t? */
107         int             *kptl_timeout;          /* comms timeout (seconds) */
108         int             *kptl_portal;           /* portal number */
109         int             *kptl_pid;              /* portals PID (self + kernel peers) */
110         int             *kptl_rxb_npages;       /* number of pages for rx buffer */
111         int             *kptl_rxb_nspare;       /* number of spare rx buffers */
112         int             *kptl_credits;          /* number of credits */
113         int             *kptl_peertxcredits;    /* number of peer tx credits */
114         int             *kptl_peerrtrcredits;   /* number of peer router credits */
115         int             *kptl_max_msg_size;     /* max immd message size*/
116         int             *kptl_peer_hash_table_size; /* # slots in peer hash table */
117         int             *kptl_reschedule_loops; /* scheduler yield loops */
118         int             *kptl_ack_puts;         /* make portals ack PUTs */
119 #ifdef CRAY_XT3
120         int             *kptl_ptltrace_on_timeout; /* dump pltrace on timeout? */
121         int             *kptl_ptltrace_on_fail;    /* dump pltrace on PTL_NAL_FAILED? */
122         char           **kptl_ptltrace_basename;  /* ptltrace dump file basename */
123 #endif
124 #ifdef PJK_DEBUGGING
125         int             *kptl_simulation_bitmap;/* simulation bitmap */
126 #endif
127
128 #if defined(CONFIG_SYSCTL) && !CFS_SYSFS_MODULE_PARM
129         cfs_sysctl_table_header_t *kptl_sysctl; /* sysctl interface */
130 #endif
131 } kptl_tunables_t;
132
133 #include "lnet/ptllnd_wire.h"
134
135 /***********************************************************************/
136
137 typedef struct kptl_data kptl_data_t;
138 typedef struct kptl_rx_buffer kptl_rx_buffer_t;
139 typedef struct kptl_peer kptl_peer_t;
140
141 typedef struct {
142         char      eva_type;
143 } kptl_eventarg_t;
144
145 #define PTLLND_EVENTARG_TYPE_MSG    0x1
146 #define PTLLND_EVENTARG_TYPE_RDMA   0x2
147 #define PTLLND_EVENTARG_TYPE_BUF    0x3
148
149 typedef struct kptl_rx                          /* receive message */
150 {
151         struct list_head        rx_list;        /* queue for attention */
152         kptl_rx_buffer_t       *rx_rxb;         /* the rx buffer pointer */
153         kptl_msg_t             *rx_msg;         /* received message */
154         int                     rx_nob;         /* received message size */
155         unsigned long           rx_treceived;   /* time received */
156         ptl_process_id_t        rx_initiator;   /* sender's address */
157 #ifdef CRAY_XT3
158         ptl_uid_t               rx_uid;         /* sender's uid */
159 #endif
160         kptl_peer_t            *rx_peer;        /* pointer to peer */
161         char                    rx_space[0];    /* copy of incoming request */
162 } kptl_rx_t;
163
164 #define PTLLND_POSTRX_DONT_POST    0            /* don't post */
165 #define PTLLND_POSTRX_NO_CREDIT    1            /* post: no credits */
166 #define PTLLND_POSTRX_PEER_CREDIT  2            /* post: give peer back 1 credit */
167
168 typedef struct kptl_rx_buffer_pool
169 {
170         spinlock_t              rxbp_lock;
171         struct list_head        rxbp_list;      /* all allocated buffers */
172         int                     rxbp_count;     /* # allocated buffers */
173         int                     rxbp_reserved;  /* # requests to buffer */
174         int                     rxbp_shutdown;  /* shutdown flag */
175 } kptl_rx_buffer_pool_t;
176
177 struct kptl_rx_buffer
178 {
179         kptl_rx_buffer_pool_t  *rxb_pool;
180         struct list_head        rxb_list;       /* for the rxb_pool list */
181         struct list_head        rxb_repost_list;/* for the kptl_sched_rxbq list */
182         int                     rxb_posted:1;   /* on the net */
183         int                     rxb_idle:1;     /* all done */
184         kptl_eventarg_t         rxb_eventarg;   /* event->md.user_ptr */
185         int                     rxb_refcount;   /* reference count */
186         ptl_handle_md_t         rxb_mdh;        /* the portals memory descriptor (MD) handle */
187         char                   *rxb_buffer;     /* the buffer */
188
189 };
190
191 enum kptl_tx_type
192 {
193         TX_TYPE_RESERVED                = 0,
194         TX_TYPE_SMALL_MESSAGE           = 1,
195         TX_TYPE_PUT_REQUEST             = 2,
196         TX_TYPE_GET_REQUEST             = 3,
197         TX_TYPE_PUT_RESPONSE            = 4,
198         TX_TYPE_GET_RESPONSE            = 5,
199 };
200
201 typedef union {
202 #ifdef _USING_LUSTRE_PORTALS_
203         struct iovec iov[PTL_MD_MAX_IOV];
204         lnet_kiov_t kiov[PTL_MD_MAX_IOV];
205 #else
206         ptl_md_iovec_t iov[PTL_MD_MAX_IOV];
207 #endif
208 } kptl_fragvec_t;
209
210 typedef struct kptl_tx                           /* transmit message */
211 {
212         struct list_head        tx_list;      /* queue on idle_txs etc */
213         atomic_t                tx_refcount;  /* reference count*/
214         enum kptl_tx_type       tx_type;      /* small msg/{put,get}{req,resp} */
215         int                     tx_active:1;  /* queued on the peer */
216         int                     tx_idle:1;    /* on the free list */
217         int                     tx_acked:1;   /* portals ACK wanted (for debug only) */
218         kptl_eventarg_t         tx_msg_eventarg; /* event->md.user_ptr */
219         kptl_eventarg_t         tx_rdma_eventarg; /* event->md.user_ptr */
220         int                     tx_status;    /* the status of this tx descriptor */
221         ptl_handle_md_t         tx_rdma_mdh;  /* RDMA buffer */
222         ptl_handle_md_t         tx_msg_mdh;   /* the portals MD handle for the initial message */
223         lnet_msg_t             *tx_lnet_msg;  /* LNET message to finalize */
224         lnet_msg_t             *tx_lnet_replymsg; /* LNET reply message to finalize */
225         kptl_msg_t             *tx_msg;       /* the message data */
226         kptl_peer_t            *tx_peer;      /* the peer this is waiting on */
227         unsigned long           tx_deadline;  /* deadline */
228         unsigned long           tx_tposted;   /* time posted */
229         ptl_md_t                tx_rdma_md;   /* rdma descriptor */
230         kptl_fragvec_t         *tx_frags;     /* buffer fragments */
231 } kptl_tx_t;
232
233 enum kptllnd_peer_state
234 {
235         PEER_STATE_UNINITIALIZED        = 0,
236         PEER_STATE_ALLOCATED            = 1,
237         PEER_STATE_WAITING_HELLO        = 2,
238         PEER_STATE_ACTIVE               = 3,
239         PEER_STATE_CLOSING              = 4,
240         PEER_STATE_ZOMBIE               = 5,
241 };
242
243 struct kptl_peer
244 {
245         struct list_head        peer_list;
246         atomic_t                peer_refcount;          /* The current refrences */
247         enum kptllnd_peer_state peer_state;
248         spinlock_t              peer_lock;              /* serialize */
249         struct list_head        peer_noops;             /* PTLLND_MSG_TYPE_NOOP txs */
250         struct list_head        peer_sendq;             /* txs waiting for mh handles */
251         struct list_head        peer_activeq;           /* txs awaiting completion */
252         lnet_process_id_t       peer_id;                /* Peer's LNET id */
253         ptl_process_id_t        peer_ptlid;             /* Peer's portals id */
254         __u64                   peer_incarnation;       /* peer's incarnation */
255         __u64                   peer_myincarnation;     /* my incarnation at HELLO */
256         int                     peer_sent_hello;        /* have I sent HELLO? */
257         int                     peer_credits;           /* number of send credits */
258         int                     peer_outstanding_credits;/* number of peer credits to return */
259         int                     peer_sent_credits;      /* #msg buffers posted for peer */
260         int                     peer_max_msg_size;      /* peer's rx buffer size */
261         int                     peer_error;             /* errno on closing this peer */
262         int                     peer_retry_noop;        /* need to retry returning credits */
263         int                     peer_check_stamp;       /* watchdog check stamp */
264         cfs_time_t              peer_last_alive;        /* when (in jiffies) I was last alive */
265         __u64                   peer_next_matchbits;    /* Next value to register RDMA from peer */
266         __u64                   peer_last_matchbits_seen; /* last matchbits used to RDMA to peer */
267 };
268
269 struct kptl_data
270 {
271         int                     kptl_init;             /* initialisation state */
272         volatile int            kptl_shutdown;         /* shut down? */
273         atomic_t                kptl_nthreads;         /* # live threads */
274         lnet_ni_t              *kptl_ni;               /* _the_ LND instance */
275         ptl_handle_ni_t         kptl_nih;              /* network inteface handle */
276         ptl_process_id_t        kptl_portals_id;       /* Portals ID of interface */
277         __u64                   kptl_incarnation;      /* which one am I */
278         ptl_handle_eq_t         kptl_eqh;              /* Event Queue (EQ) */
279
280         spinlock_t              kptl_sched_lock;       /* serialise... */
281         wait_queue_head_t       kptl_sched_waitq;      /* schedulers sleep here */
282         struct list_head        kptl_sched_txq;        /* tx requiring attention */
283         struct list_head        kptl_sched_rxq;        /* rx requiring attention */
284         struct list_head        kptl_sched_rxbq;       /* rxb requiring reposting */
285
286         wait_queue_head_t       kptl_watchdog_waitq;   /* watchdog sleeps here */
287         atomic_t                kptl_needs_ptltrace;   /* watchdog thread to dump ptltrace */
288
289         kptl_rx_buffer_pool_t   kptl_rx_buffer_pool;   /* rx buffer pool */
290         cfs_mem_cache_t*        kptl_rx_cache;         /* rx descripter cache */
291
292         atomic_t                kptl_ntx;              /* # tx descs allocated */
293         spinlock_t              kptl_tx_lock;          /* serialise idle tx list*/
294         struct list_head        kptl_idle_txs;         /* idle tx descriptors */
295
296         rwlock_t                kptl_peer_rw_lock;     /* lock for peer table */
297         struct list_head       *kptl_peers;            /* hash table of all my known peers */
298         struct list_head        kptl_closing_peers;    /* peers being closed */
299         struct list_head        kptl_zombie_peers;     /* peers waiting for refs to drain */
300         int                     kptl_peer_hash_size;   /* size of kptl_peers */
301         int                     kptl_npeers;           /* # peers extant */
302         int                     kptl_n_active_peers;   /* # active peers */
303         int                     kptl_expected_peers;   /* # peers I can buffer HELLOs from */
304
305         kptl_msg_t             *kptl_nak_msg;          /* common NAK message */
306         spinlock_t              kptl_ptlid2str_lock;   /* serialise str ops */
307 };
308
309 enum 
310 {
311         PTLLND_INIT_NOTHING = 0,
312         PTLLND_INIT_DATA,
313         PTLLND_INIT_ALL,
314 };
315
316 extern kptl_tunables_t  kptllnd_tunables;
317 extern kptl_data_t      kptllnd_data;
318
319 static inline lnet_nid_t 
320 kptllnd_ptl2lnetnid(ptl_nid_t ptl_nid)
321 {
322 #ifdef _USING_LUSTRE_PORTALS_
323         return LNET_MKNID(LNET_NIDNET(kptllnd_data.kptl_ni->ni_nid), 
324                           LNET_NIDADDR(ptl_nid));
325 #else
326         return LNET_MKNID(LNET_NIDNET(kptllnd_data.kptl_ni->ni_nid), 
327                           ptl_nid);
328 #endif
329 }
330
331 static inline ptl_nid_t 
332 kptllnd_lnet2ptlnid(lnet_nid_t lnet_nid)
333 {
334 #ifdef _USING_LUSTRE_PORTALS_
335         return LNET_MKNID(LNET_NIDNET(kptllnd_data.kptl_portals_id.nid),
336                           LNET_NIDADDR(lnet_nid));
337 #else
338         return LNET_NIDADDR(lnet_nid);
339 #endif
340 }
341
342 static inline void
343 kptllnd_schedule_ptltrace_dump (void)
344 {
345 #ifdef CRAY_XT3
346         if (*kptllnd_tunables.kptl_ptltrace_on_fail) {
347                 atomic_inc(&kptllnd_data.kptl_needs_ptltrace);
348                 wake_up(&kptllnd_data.kptl_watchdog_waitq);
349         }
350 #endif
351 }
352
353 int  kptllnd_startup(lnet_ni_t *ni);
354 void kptllnd_shutdown(lnet_ni_t *ni);
355 int  kptllnd_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg);
356 void kptllnd_query (struct lnet_ni *ni, lnet_nid_t nid, time_t *when);
357 int  kptllnd_send(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg);
358 int  kptllnd_recv(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg,
359                   int delayed, unsigned int niov, 
360                   struct iovec *iov, lnet_kiov_t *kiov,
361                   unsigned int offset, unsigned int mlen, unsigned int rlen);
362 int  kptllnd_eager_recv(struct lnet_ni *ni, void *private, 
363                         lnet_msg_t *msg, void **new_privatep);
364 void kptllnd_eq_callback(ptl_event_t *evp);
365 int  kptllnd_scheduler(void *arg);
366 int  kptllnd_watchdog(void *arg);
367 int  kptllnd_thread_start(int (*fn)(void *arg), void *arg);
368 int  kptllnd_tunables_init(void);
369 void kptllnd_tunables_fini(void);
370
371 const char *kptllnd_evtype2str(int evtype);
372 const char *kptllnd_msgtype2str(int msgtype);
373 const char *kptllnd_errtype2str(int errtype);
374
375 static inline void *
376 kptllnd_eventarg2obj (kptl_eventarg_t *eva)
377 {
378         switch (eva->eva_type) {
379         default:
380                 LBUG();
381         case PTLLND_EVENTARG_TYPE_BUF:
382                 return list_entry(eva, kptl_rx_buffer_t, rxb_eventarg);
383         case PTLLND_EVENTARG_TYPE_RDMA:
384                 return list_entry(eva, kptl_tx_t, tx_rdma_eventarg);
385         case PTLLND_EVENTARG_TYPE_MSG:
386                 return list_entry(eva, kptl_tx_t, tx_msg_eventarg);
387         }
388 }
389
390 /*
391  * RX BUFFER SUPPORT FUNCTIONS
392  */
393 void kptllnd_rx_buffer_pool_init(kptl_rx_buffer_pool_t *rxbp);
394 void kptllnd_rx_buffer_pool_fini(kptl_rx_buffer_pool_t *rxbp);
395 int  kptllnd_rx_buffer_pool_reserve(kptl_rx_buffer_pool_t *rxbp, int count);
396 void kptllnd_rx_buffer_pool_unreserve(kptl_rx_buffer_pool_t *rxbp, int count);
397 void kptllnd_rx_buffer_callback(ptl_event_t *ev);
398 void kptllnd_rx_buffer_post(kptl_rx_buffer_t *rxb);
399
400 static inline int
401 kptllnd_rx_buffer_size(void)
402 {
403         return PAGE_SIZE * (*kptllnd_tunables.kptl_rxb_npages);
404 }
405
406 static inline void
407 kptllnd_rx_buffer_addref(kptl_rx_buffer_t *rxb)
408 {
409         unsigned long flags;
410         
411         spin_lock_irqsave(&rxb->rxb_pool->rxbp_lock, flags);
412         rxb->rxb_refcount++;
413         spin_unlock_irqrestore(&rxb->rxb_pool->rxbp_lock, flags);
414 }
415
416 static inline void
417 kptllnd_rx_buffer_decref_locked(kptl_rx_buffer_t *rxb)
418 {
419         if (--(rxb->rxb_refcount) == 0) {
420                 spin_lock(&kptllnd_data.kptl_sched_lock);
421         
422                 list_add_tail(&rxb->rxb_repost_list,
423                               &kptllnd_data.kptl_sched_rxbq);
424                 wake_up(&kptllnd_data.kptl_sched_waitq);
425
426                 spin_unlock(&kptllnd_data.kptl_sched_lock);
427         }
428 }
429
430 static inline void
431 kptllnd_rx_buffer_decref(kptl_rx_buffer_t *rxb)
432 {
433         unsigned long flags;
434         int           count;
435         
436         spin_lock_irqsave(&rxb->rxb_pool->rxbp_lock, flags);
437         count = --(rxb->rxb_refcount);
438         spin_unlock_irqrestore(&rxb->rxb_pool->rxbp_lock, flags);
439
440         if (count == 0)
441                 kptllnd_rx_buffer_post(rxb);
442 }
443
444 /*
445  * RX SUPPORT FUNCTIONS
446  */
447 void kptllnd_rx_parse(kptl_rx_t *rx);
448 void kptllnd_rx_done(kptl_rx_t *rx, int post_credit);
449
450 /*
451  * PEER SUPPORT FUNCTIONS
452  */
453 int kptllnd_get_peer_info(int index,
454                           lnet_process_id_t *id, 
455                           int *state, int *sent_hello,
456                           int *refcount, __u64 *incarnation,
457                           __u64 *next_matchbits, __u64 *last_matchbits_seen,
458                           int *nsendq, int *nactiveq,
459                           int *credits, int *outstanding_credits);
460 void kptllnd_peer_destroy(kptl_peer_t *peer);
461 int  kptllnd_peer_del(lnet_process_id_t id);
462 void kptllnd_peer_close_locked(kptl_peer_t *peer, int why);
463 void kptllnd_peer_close(kptl_peer_t *peer, int why);
464 void kptllnd_handle_closing_peers(void);
465 int  kptllnd_peer_connect(kptl_tx_t *tx, lnet_nid_t nid);
466 void kptllnd_peer_check_sends(kptl_peer_t *peer);
467 void kptllnd_peer_check_bucket(int idx, int stamp);
468 void kptllnd_tx_launch(kptl_peer_t *peer, kptl_tx_t *tx, int nfrag);
469 int  kptllnd_find_target(kptl_peer_t **peerp, lnet_process_id_t target);
470 kptl_peer_t *kptllnd_peer_handle_hello(ptl_process_id_t initiator,
471                                        kptl_msg_t *msg);
472 kptl_peer_t *kptllnd_id2peer_locked(lnet_process_id_t id);
473 void kptllnd_peer_alive(kptl_peer_t *peer);
474
475 static inline void
476 kptllnd_peer_addref (kptl_peer_t *peer)
477 {
478         atomic_inc(&peer->peer_refcount);
479 }
480
481 static inline void
482 kptllnd_peer_decref (kptl_peer_t *peer)
483 {
484         if (atomic_dec_and_test(&peer->peer_refcount))
485                 kptllnd_peer_destroy(peer);
486 }
487
488 static inline void
489 kptllnd_set_tx_peer(kptl_tx_t *tx, kptl_peer_t *peer) 
490 {
491         LASSERT (tx->tx_peer == NULL);
492         
493         kptllnd_peer_addref(peer);
494         tx->tx_peer = peer;
495 }
496
497 static inline struct list_head *
498 kptllnd_nid2peerlist(lnet_nid_t nid)
499 {
500         unsigned int hash = ((unsigned int)nid) %
501                             kptllnd_data.kptl_peer_hash_size;
502
503         return &kptllnd_data.kptl_peers[hash];
504 }
505
506 static inline kptl_peer_t *
507 kptllnd_id2peer(lnet_process_id_t id)
508 {
509         kptl_peer_t   *peer;
510         unsigned long  flags;
511
512         read_lock_irqsave(&kptllnd_data.kptl_peer_rw_lock, flags);
513         peer = kptllnd_id2peer_locked(id);
514         read_unlock_irqrestore(&kptllnd_data.kptl_peer_rw_lock, flags);
515
516         return peer;
517 }
518
519 static inline int
520 kptllnd_reserve_buffers(int n)
521 {
522         return kptllnd_rx_buffer_pool_reserve(&kptllnd_data.kptl_rx_buffer_pool,
523                                               n);
524 }
525
526 static inline int
527 kptllnd_peer_reserve_buffers(void)
528 {
529         return kptllnd_reserve_buffers(*kptllnd_tunables.kptl_peertxcredits);
530 }
531
532 static inline void
533 kptllnd_peer_unreserve_buffers(void)
534 {
535         kptllnd_rx_buffer_pool_unreserve(&kptllnd_data.kptl_rx_buffer_pool,
536                                          *kptllnd_tunables.kptl_peertxcredits);
537 }
538
539 /*
540  * TX SUPPORT FUNCTIONS
541  */
542 int  kptllnd_setup_tx_descs(void);
543 void kptllnd_cleanup_tx_descs(void);
544 void kptllnd_tx_fini(kptl_tx_t *tx);
545 kptl_tx_t *kptllnd_get_idle_tx(enum kptl_tx_type purpose);
546 void kptllnd_tx_callback(ptl_event_t *ev);
547 const char *kptllnd_tx_typestr(int type);
548
549 static inline void
550 kptllnd_tx_addref(kptl_tx_t *tx)
551 {
552         atomic_inc(&tx->tx_refcount);
553 }
554
555 static inline void 
556 kptllnd_tx_decref(kptl_tx_t *tx)
557 {
558         LASSERT (!in_interrupt());        /* Thread context only */
559
560         if (atomic_dec_and_test(&tx->tx_refcount))
561                 kptllnd_tx_fini(tx);
562 }
563
564 /*
565  * MESSAGE SUPPORT FUNCTIONS
566  */
567 void kptllnd_init_msg(kptl_msg_t *msg, int type, int body_nob);
568 void kptllnd_msg_pack(kptl_msg_t *msg, kptl_peer_t *peer);
569 int  kptllnd_msg_unpack(kptl_msg_t *msg, int nob);
570
571 /*
572  * MISC SUPPORT FUNCTIONS
573  */
574 void kptllnd_init_rdma_md(kptl_tx_t *tx, unsigned int niov,
575                           struct iovec *iov, lnet_kiov_t *kiov,
576                           unsigned int offset, unsigned int nob);
577 char *kptllnd_ptlid2str(ptl_process_id_t id);
578
579 void kptllnd_init_ptltrace(void);
580 void kptllnd_dump_ptltrace(void);
581
582 #ifdef PJK_DEBUGGING
583 #define SIMULATION_FAIL_TX_PUT_ALLOC   0       /* 0x00000001 */
584 #define SIMULATION_FAIL_TX_GET_ALLOC   1       /* 0x00000002 */
585 #define SIMULATION_FAIL_TX             2       /* 0x00000004 */
586 #define SIMULATION_FAIL_RX_ALLOC       3       /* 0x00000008 */
587
588 #define IS_SIMULATION_ENABLED(x) \
589         (((*kptllnd_tunables.kptl_simulation_bitmap) & 1<< SIMULATION_##x) != 0)
590 #else
591 #define IS_SIMULATION_ENABLED(x)       0
592 #endif