Whamcloud - gitweb
Landing b_hd_newconfig on HEAD
[fs/lustre-release.git] / lnet / klnds / gmlnd / gmlnd.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  *  Copyright (c) 2003 Los Alamos National Laboratory (LANL)
5  *
6  *   This file is part of Lustre, http://www.lustre.org/
7  *
8  *   Lustre is free software; you can redistribute it and/or
9  *   modify it under the terms of version 2 of the GNU General Public
10  *   License as published by the Free Software Foundation.
11  *
12  *   Lustre is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *   GNU General Public License for more details.
16  *
17  *   You should have received a copy of the GNU General Public License
18  *   along with Lustre; if not, write to the Free Software
19  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22
23 /*
24  *      Portals GM kernel NAL header file
25  *      This file makes all declaration and prototypes 
26  *      for the API side and CB side of the NAL
27  */
28 #ifndef __INCLUDE_GMNAL_H__
29 #define __INCLUDE_GMNAL_H__
30
31 /* XXX Lustre as of V1.2.2 drop defines VERSION, which causes problems
32  * when including <GM>/include/gm_lanai.h which defines a structure field
33  * with the name VERSION XXX */
34 #ifdef VERSION
35 # undef VERSION
36 #endif
37
38 #ifndef EXPORT_SYMTAB
39 # define EXPORT_SYMTAB
40 #endif
41
42 #include "linux/config.h"
43 #include "linux/module.h"
44 #include "linux/tty.h"
45 #include "linux/kernel.h"
46 #include "linux/mm.h"
47 #include "linux/string.h"
48 #include "linux/stat.h"
49 #include "linux/errno.h"
50 #include "linux/version.h"
51 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
52 #include "linux/buffer_head.h"
53 #include "linux/fs.h"
54 #else
55 #include "linux/locks.h"
56 #endif
57 #include "linux/unistd.h"
58 #include "linux/init.h"
59 #include "linux/sem.h"
60 #include "linux/vmalloc.h"
61 #include "linux/sysctl.h"
62
63 #define DEBUG_SUBSYSTEM S_LND
64
65 #include "libcfs/kp30.h"
66 #include "lnet/lnet.h"
67 #include "lnet/lib-lnet.h"
68
69 /* undefine these before including the GM headers which clash */
70 #undef PACKAGE_BUGREPORT
71 #undef PACKAGE_NAME
72 #undef PACKAGE_STRING
73 #undef PACKAGE_TARNAME
74 #undef PACKAGE_VERSION
75
76 #define GM_STRONG_TYPES 1
77 #ifdef VERSION
78 #undef VERSION
79 #endif
80 #include "gm.h"
81 #include "gm_internal.h"
82
83 /* Fixed tunables */
84 #define GMNAL_RESCHED              100          /* # busy loops to force scheduler to yield */
85 #define GMNAL_NETADDR_BASE         0x10000000   /* where we start in network VM */
86 #define GMNAL_LARGE_PRIORITY       GM_LOW_PRIORITY /* large message GM priority */
87 #define GMNAL_SMALL_PRIORITY       GM_LOW_PRIORITY /* small message GM priority */
88
89 /* Wire protocol */
90 typedef struct {
91         lnet_hdr_t      gmim_hdr;               /* portals header */
92         char            gmim_payload[0];        /* payload */
93 } gmnal_immediate_msg_t;
94
95 typedef struct {
96         /* First 2 fields fixed FOR ALL TIME */
97         __u32           gmm_magic;              /* I'm a GM message */
98         __u16           gmm_version;            /* this is my version number */
99
100         __u16           gmm_type;               /* msg type */
101         __u64           gmm_srcnid;             /* sender's NID */
102         __u64           gmm_dstnid;             /* destination's NID */
103         union {
104                 gmnal_immediate_msg_t   immediate;
105         }               gmm_u;
106 } WIRE_ATTR gmnal_msg_t;
107
108 #define GMNAL_MSG_MAGIC                 LNET_PROTO_GM_MAGIC
109 #define GMNAL_MSG_VERSION               1
110 #define GMNAL_MSG_IMMEDIATE             1
111
112 typedef struct netbuf {
113         __u64                    nb_netaddr;    /* network VM address */
114         lnet_kiov_t              nb_kiov[1];    /* the pages (at least 1) */
115 } gmnal_netbuf_t;
116
117 #define GMNAL_NETBUF_MSG(nb)            ((gmnal_msg_t *)page_address((nb)->nb_kiov[0].kiov_page))
118 #define GMNAL_NETBUF_LOCAL_NETADDR(nb)  ((void *)((unsigned long)(nb)->nb_netaddr))
119
120 typedef struct gmnal_txbuf {
121         struct list_head         txb_list;      /* queue on gmni_idle_ltxbs */
122         struct gmnal_txbuf      *txb_next;      /* stash on gmni_ltxs */
123         gmnal_netbuf_t           txb_buf;       /* space */
124 } gmnal_txbuf_t;
125
126 typedef struct gmnal_tx {
127         struct list_head         tx_list;       /* queue */
128         int                      tx_credit:1;   /* consumed a credit? */
129         int                      tx_large_iskiov:1; /* large is in kiovs? */
130         struct gmnal_ni         *tx_gmni;       /* owning NI */
131         lnet_nid_t               tx_nid;        /* destination NID */
132         int                      tx_gmlid;      /* destination GM local ID */
133         lnet_msg_t              *tx_lntmsg;     /* lntmsg to finalize on completion */
134
135         gmnal_netbuf_t           tx_buf;        /* small tx buffer */
136         gmnal_txbuf_t           *tx_ltxb;       /* large buffer (to free on completion) */
137         int                      tx_msgnob;     /* message size (so far) */
138
139         int                      tx_large_nob;  /* # bytes large buffer payload */
140         int                      tx_large_offset; /* offset within frags */
141         int                      tx_large_niov; /* # VM frags */
142         union {
143                 struct iovec    *iov;           /* mapped frags */
144                 lnet_kiov_t     *kiov;          /* page frags */
145         }                        tx_large_frags;
146         unsigned long            tx_launchtime; /* when (in jiffies) the transmit was launched */
147         struct gmnal_tx         *tx_next;       /* stash on gmni_txs */
148 } gmnal_tx_t;
149
150 typedef struct gmnal_rx {
151         struct list_head         rx_list;       /* enqueue on gmni_rxq for handling */
152         int                      rx_islarge:1;  /* large receive buffer? */
153         unsigned int             rx_recv_nob;   /* bytes received */
154         __u16                    rx_recv_gmid;  /* sender */
155         __u8                     rx_recv_port;  /* sender's port */
156         __u8                     rx_recv_type;  /* ?? */
157         struct gmnal_rx         *rx_next;       /* stash on gmni_rxs */
158         gmnal_netbuf_t           rx_buf;        /* the buffer */
159 } gmnal_rx_t;
160
161 typedef struct gmnal_ni {
162         lnet_ni_t        *gmni_ni;              /* generic NI */
163         struct gm_port   *gmni_port;            /* GM port */
164         spinlock_t        gmni_gm_lock;         /* serialise GM calls */
165         int               gmni_large_pages;     /* # pages in a large message buffer */
166         int               gmni_large_msgsize;   /* nob in large message buffers */
167         int               gmni_large_gmsize;    /* large message GM bucket */
168         int               gmni_small_msgsize;   /* nob in small message buffers */
169         int               gmni_small_gmsize;    /* small message GM bucket */
170         __u64             gmni_netaddr_base;    /* base of mapped network VM */
171         int               gmni_netaddr_size;    /* # bytes of mapped network VM */
172
173         gmnal_tx_t       *gmni_txs;             /* all txs */
174         gmnal_rx_t       *gmni_rxs;             /* all rx descs */
175         gmnal_txbuf_t    *gmni_ltxbs;           /* all large tx bufs */
176         
177         atomic_t          gmni_nthreads;        /* total # threads */
178         gm_alarm_t        gmni_alarm;           /* alarm to wake caretaker */
179         int               gmni_shutdown;        /* tell all threads to exit */
180
181         struct list_head  gmni_idle_txs;        /* idle tx's */
182         int               gmni_tx_credits;      /* # transmits still possible */
183         struct list_head  gmni_idle_ltxbs;      /* idle large tx buffers */
184         struct list_head  gmni_buf_txq;         /* tx's waiting for buffers */
185         struct list_head  gmni_cred_txq;        /* tx's waiting for credits */
186         spinlock_t        gmni_tx_lock;         /* serialise */
187
188         struct gm_hash   *gmni_rx_hash;         /* buffer->rx lookup */
189         struct semaphore  gmni_rx_mutex;        /* serialise blocking on GM */
190 } gmnal_ni_t;
191
192 typedef struct {
193         int              *gm_port;
194         int              *gm_ntx;
195         int              *gm_credits;
196         int              *gm_peer_credits;
197         int              *gm_nlarge_tx_bufs;
198         int              *gm_nrx_small;
199         int              *gm_nrx_large;
200
201 #if CONFIG_SYSCTL && !CFS_SYSFS_MODULE_PARM
202         struct ctl_table_header *gm_sysctl;    /* sysctl interface */
203 #endif
204 } gmnal_tunables_t;
205
206
207 /* gmnal_api.c */
208 int gmnal_init(void);
209 void gmnal_fini(void);
210 int gmnal_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg);
211 int gmnal_startup(lnet_ni_t *ni);
212 void gmnal_shutdown(lnet_ni_t *ni);
213
214 /* gmnal_cb.c */
215 int gmnal_recv(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg,
216                int delayed, unsigned int niov, 
217                struct iovec *iov, lnet_kiov_t *kiov,
218                unsigned int offset, unsigned int mlen, unsigned int rlen);
219 int gmnal_send(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg);
220
221 /* gmnal_util.c */
222 void gmnal_free_ltxbufs(gmnal_ni_t *gmni);
223 int gmnal_alloc_ltxbufs(gmnal_ni_t *gmni);
224 void gmnal_free_txs(gmnal_ni_t *gmni);
225 int gmnal_alloc_txs(gmnal_ni_t *gmni);
226 void gmnal_free_rxs(gmnal_ni_t *gmni);
227 int gmnal_alloc_rxs(gmnal_ni_t *gmni);
228 char *gmnal_gmstatus2str(gm_status_t status);
229 char *gmnal_rxevent2str(gm_recv_event_t *ev);
230 void gmnal_yield(int delay);
231
232 /* gmnal_comm.c */
233 void gmnal_post_rx(gmnal_ni_t *gmni, gmnal_rx_t *rx);
234 gmnal_tx_t *gmnal_get_tx(gmnal_ni_t *gmni);
235 void gmnal_tx_done(gmnal_tx_t *tx, int rc);
236 void gmnal_pack_msg(gmnal_ni_t *gmni, gmnal_msg_t *msg,
237                     lnet_nid_t dstnid, int type);
238 void gmnal_stop_threads(gmnal_ni_t *gmni);
239 int gmnal_start_threads(gmnal_ni_t *gmni);
240 void gmnal_check_txqueues_locked (gmnal_ni_t *gmni);
241
242 /* Module Parameters */
243 extern gmnal_tunables_t gmnal_tunables;
244
245 #endif /*__INCLUDE_GMNAL_H__*/