]>
Commit | Line | Data |
---|---|---|
d7e09d03 PT |
1 | /* |
2 | * GPL HEADER START | |
3 | * | |
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 only, | |
8 | * as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License version 2 for more details (a copy is included | |
14 | * in the LICENSE file that accompanied this code). | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * version 2 along with this program; If not, see | |
4f3ca893 | 18 | * http://www.gnu.org/licenses/gpl-2.0.html |
d7e09d03 PT |
19 | * |
20 | * GPL HEADER END | |
21 | */ | |
22 | /* | |
23 | * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. | |
24 | * Use is subject to license terms. | |
25 | * | |
1dc563a6 | 26 | * Copyright (c) 2012, 2015, Intel Corporation. |
d7e09d03 PT |
27 | */ |
28 | /* | |
29 | * This file is part of Lustre, http://www.lustre.org/ | |
4f3ca893 | 30 | * Lustre is a trademark of Seagate, Inc. |
d7e09d03 PT |
31 | * |
32 | * lnet/include/lnet/lib-lnet.h | |
d7e09d03 PT |
33 | */ |
34 | ||
35 | #ifndef __LNET_LIB_LNET_H__ | |
36 | #define __LNET_LIB_LNET_H__ | |
37 | ||
9fdaf8c0 | 38 | #include "../libcfs/libcfs.h" |
bbf00c3d | 39 | #include "api.h" |
9fdaf8c0 GKH |
40 | #include "lnet.h" |
41 | #include "lib-types.h" | |
edeb5d8c | 42 | #include "lib-dlc.h" |
d7e09d03 | 43 | |
188acc61 | 44 | extern lnet_t the_lnet; /* THE network */ |
d7e09d03 | 45 | |
d9c90615 | 46 | #if (BITS_PER_LONG == 32) |
d7e09d03 | 47 | /* 2 CPTs, allowing more CPTs might make us under memory pressure */ |
188acc61 | 48 | #define LNET_CPT_MAX_BITS 1 |
d7e09d03 | 49 | |
d9c90615 | 50 | #else /* 64-bit system */ |
d7e09d03 PT |
51 | /* |
52 | * 256 CPTs for thousands of CPUs, allowing more CPTs might make us | |
53 | * under risk of consuming all lh_cookie. | |
54 | */ | |
188acc61 | 55 | #define LNET_CPT_MAX_BITS 8 |
d9c90615 | 56 | #endif /* BITS_PER_LONG == 32 */ |
d7e09d03 PT |
57 | |
58 | /* max allowed CPT number */ | |
188acc61 | 59 | #define LNET_CPT_MAX (1 << LNET_CPT_MAX_BITS) |
d7e09d03 | 60 | |
188acc61 JS |
61 | #define LNET_CPT_NUMBER (the_lnet.ln_cpt_number) |
62 | #define LNET_CPT_BITS (the_lnet.ln_cpt_bits) | |
63 | #define LNET_CPT_MASK ((1ULL << LNET_CPT_BITS) - 1) | |
d7e09d03 PT |
64 | |
65 | /** exclusive lock */ | |
188acc61 | 66 | #define LNET_LOCK_EX CFS_PERCPT_LOCK_EX |
d7e09d03 | 67 | |
4ee23a84 CH |
68 | static inline int lnet_is_route_alive(lnet_route_t *route) |
69 | { | |
70 | /* gateway is down */ | |
71 | if (!route->lr_gateway->lp_alive) | |
72 | return 0; | |
73 | /* no NI status, assume it's alive */ | |
74 | if ((route->lr_gateway->lp_ping_feats & | |
75 | LNET_PING_FEAT_NI_STATUS) == 0) | |
76 | return 1; | |
77 | /* has NI status, check # down NIs */ | |
78 | return route->lr_downis == 0; | |
79 | } | |
80 | ||
62fbc9f7 | 81 | static inline int lnet_is_wire_handle_none(lnet_handle_wire_t *wh) |
d7e09d03 PT |
82 | { |
83 | return (wh->wh_interface_cookie == LNET_WIRE_HANDLE_COOKIE_NONE && | |
84 | wh->wh_object_cookie == LNET_WIRE_HANDLE_COOKIE_NONE); | |
85 | } | |
86 | ||
62fbc9f7 | 87 | static inline int lnet_md_exhausted(lnet_libmd_t *md) |
d7e09d03 | 88 | { |
5fd88337 JS |
89 | return (!md->md_threshold || |
90 | ((md->md_options & LNET_MD_MAX_SIZE) && | |
d7e09d03 PT |
91 | md->md_offset + md->md_max_size > md->md_length)); |
92 | } | |
93 | ||
62fbc9f7 | 94 | static inline int lnet_md_unlinkable(lnet_libmd_t *md) |
d7e09d03 | 95 | { |
4420cfd3 JS |
96 | /* |
97 | * Should unlink md when its refcount is 0 and either: | |
2b06b70b AO |
98 | * - md has been flagged for deletion (by auto unlink or |
99 | * LNetM[DE]Unlink, in the latter case md may not be exhausted). | |
d7e09d03 PT |
100 | * - auto unlink is on and md is exhausted. |
101 | */ | |
5fd88337 | 102 | if (md->md_refcount) |
d7e09d03 PT |
103 | return 0; |
104 | ||
5fd88337 | 105 | if (md->md_flags & LNET_MD_FLAG_ZOMBIE) |
d7e09d03 PT |
106 | return 1; |
107 | ||
5fd88337 | 108 | return ((md->md_flags & LNET_MD_FLAG_AUTO_UNLINK) && |
d7e09d03 PT |
109 | lnet_md_exhausted(md)); |
110 | } | |
111 | ||
112 | #define lnet_cpt_table() (the_lnet.ln_cpt_table) | |
113 | #define lnet_cpt_current() cfs_cpt_current(the_lnet.ln_cpt_table, 1) | |
114 | ||
115 | static inline int | |
116 | lnet_cpt_of_cookie(__u64 cookie) | |
117 | { | |
118 | unsigned int cpt = (cookie >> LNET_COOKIE_TYPE_BITS) & LNET_CPT_MASK; | |
119 | ||
4420cfd3 JS |
120 | /* |
121 | * LNET_CPT_NUMBER doesn't have to be power2, which means we can | |
122 | * get illegal cpt from it's invalid cookie | |
123 | */ | |
d7e09d03 PT |
124 | return cpt < LNET_CPT_NUMBER ? cpt : cpt % LNET_CPT_NUMBER; |
125 | } | |
126 | ||
127 | static inline void | |
128 | lnet_res_lock(int cpt) | |
129 | { | |
130 | cfs_percpt_lock(the_lnet.ln_res_lock, cpt); | |
131 | } | |
132 | ||
133 | static inline void | |
134 | lnet_res_unlock(int cpt) | |
135 | { | |
136 | cfs_percpt_unlock(the_lnet.ln_res_lock, cpt); | |
137 | } | |
138 | ||
139 | static inline int | |
140 | lnet_res_lock_current(void) | |
141 | { | |
142 | int cpt = lnet_cpt_current(); | |
143 | ||
144 | lnet_res_lock(cpt); | |
145 | return cpt; | |
146 | } | |
147 | ||
148 | static inline void | |
149 | lnet_net_lock(int cpt) | |
150 | { | |
151 | cfs_percpt_lock(the_lnet.ln_net_lock, cpt); | |
152 | } | |
153 | ||
154 | static inline void | |
155 | lnet_net_unlock(int cpt) | |
156 | { | |
157 | cfs_percpt_unlock(the_lnet.ln_net_lock, cpt); | |
158 | } | |
159 | ||
160 | static inline int | |
161 | lnet_net_lock_current(void) | |
162 | { | |
163 | int cpt = lnet_cpt_current(); | |
164 | ||
165 | lnet_net_lock(cpt); | |
166 | return cpt; | |
167 | } | |
168 | ||
169 | #define LNET_LOCK() lnet_net_lock(LNET_LOCK_EX) | |
170 | #define LNET_UNLOCK() lnet_net_unlock(LNET_LOCK_EX) | |
171 | ||
d7e09d03 PT |
172 | #define lnet_ptl_lock(ptl) spin_lock(&(ptl)->ptl_lock) |
173 | #define lnet_ptl_unlock(ptl) spin_unlock(&(ptl)->ptl_lock) | |
174 | #define lnet_eq_wait_lock() spin_lock(&the_lnet.ln_eq_wait_lock) | |
175 | #define lnet_eq_wait_unlock() spin_unlock(&the_lnet.ln_eq_wait_lock) | |
176 | #define lnet_ni_lock(ni) spin_lock(&(ni)->ni_lock) | |
177 | #define lnet_ni_unlock(ni) spin_unlock(&(ni)->ni_lock) | |
d7e09d03 | 178 | |
188acc61 | 179 | #define MAX_PORTALS 64 |
d7e09d03 | 180 | |
d7e09d03 | 181 | static inline lnet_eq_t * |
62fbc9f7 | 182 | lnet_eq_alloc(void) |
d7e09d03 | 183 | { |
d7e09d03 PT |
184 | lnet_eq_t *eq; |
185 | ||
186 | LIBCFS_ALLOC(eq, sizeof(*eq)); | |
02816395 | 187 | return eq; |
d7e09d03 PT |
188 | } |
189 | ||
190 | static inline void | |
191 | lnet_eq_free(lnet_eq_t *eq) | |
192 | { | |
d7e09d03 PT |
193 | LIBCFS_FREE(eq, sizeof(*eq)); |
194 | } | |
195 | ||
196 | static inline lnet_libmd_t * | |
62fbc9f7 | 197 | lnet_md_alloc(lnet_md_t *umd) |
d7e09d03 | 198 | { |
d7e09d03 | 199 | lnet_libmd_t *md; |
188acc61 JS |
200 | unsigned int size; |
201 | unsigned int niov; | |
d7e09d03 | 202 | |
5fd88337 | 203 | if (umd->options & LNET_MD_KIOV) { |
d7e09d03 PT |
204 | niov = umd->length; |
205 | size = offsetof(lnet_libmd_t, md_iov.kiov[niov]); | |
206 | } else { | |
5fd88337 | 207 | niov = umd->options & LNET_MD_IOVEC ? umd->length : 1; |
d7e09d03 PT |
208 | size = offsetof(lnet_libmd_t, md_iov.iov[niov]); |
209 | } | |
210 | ||
211 | LIBCFS_ALLOC(md, size); | |
212 | ||
06ace26e | 213 | if (md) { |
d7e09d03 PT |
214 | /* Set here in case of early free */ |
215 | md->md_options = umd->options; | |
216 | md->md_niov = niov; | |
217 | INIT_LIST_HEAD(&md->md_list); | |
218 | } | |
219 | ||
02816395 | 220 | return md; |
d7e09d03 PT |
221 | } |
222 | ||
223 | static inline void | |
224 | lnet_md_free(lnet_libmd_t *md) | |
225 | { | |
188acc61 | 226 | unsigned int size; |
d7e09d03 | 227 | |
5fd88337 | 228 | if (md->md_options & LNET_MD_KIOV) |
d7e09d03 PT |
229 | size = offsetof(lnet_libmd_t, md_iov.kiov[md->md_niov]); |
230 | else | |
231 | size = offsetof(lnet_libmd_t, md_iov.iov[md->md_niov]); | |
232 | ||
233 | LIBCFS_FREE(md, size); | |
234 | } | |
235 | ||
236 | static inline lnet_me_t * | |
62fbc9f7 | 237 | lnet_me_alloc(void) |
d7e09d03 | 238 | { |
d7e09d03 PT |
239 | lnet_me_t *me; |
240 | ||
241 | LIBCFS_ALLOC(me, sizeof(*me)); | |
02816395 | 242 | return me; |
d7e09d03 PT |
243 | } |
244 | ||
245 | static inline void | |
246 | lnet_me_free(lnet_me_t *me) | |
247 | { | |
d7e09d03 PT |
248 | LIBCFS_FREE(me, sizeof(*me)); |
249 | } | |
250 | ||
251 | static inline lnet_msg_t * | |
252 | lnet_msg_alloc(void) | |
253 | { | |
d7e09d03 PT |
254 | lnet_msg_t *msg; |
255 | ||
256 | LIBCFS_ALLOC(msg, sizeof(*msg)); | |
257 | ||
258 | /* no need to zero, LIBCFS_ALLOC does for us */ | |
02816395 | 259 | return msg; |
d7e09d03 PT |
260 | } |
261 | ||
262 | static inline void | |
263 | lnet_msg_free(lnet_msg_t *msg) | |
264 | { | |
d7e09d03 PT |
265 | LASSERT(!msg->msg_onactivelist); |
266 | LIBCFS_FREE(msg, sizeof(*msg)); | |
267 | } | |
268 | ||
d7e09d03 PT |
269 | lnet_libhandle_t *lnet_res_lh_lookup(struct lnet_res_container *rec, |
270 | __u64 cookie); | |
271 | void lnet_res_lh_initialize(struct lnet_res_container *rec, | |
272 | lnet_libhandle_t *lh); | |
273 | static inline void | |
274 | lnet_res_lh_invalidate(lnet_libhandle_t *lh) | |
275 | { | |
d7e09d03 PT |
276 | /* NB: cookie is still useful, don't reset it */ |
277 | list_del(&lh->lh_hash_chain); | |
278 | } | |
279 | ||
280 | static inline void | |
62fbc9f7 | 281 | lnet_eq2handle(lnet_handle_eq_t *handle, lnet_eq_t *eq) |
d7e09d03 | 282 | { |
06ace26e | 283 | if (!eq) { |
d7e09d03 PT |
284 | LNetInvalidateHandle(handle); |
285 | return; | |
286 | } | |
287 | ||
288 | handle->cookie = eq->eq_lh.lh_cookie; | |
289 | } | |
290 | ||
291 | static inline lnet_eq_t * | |
292 | lnet_handle2eq(lnet_handle_eq_t *handle) | |
293 | { | |
d7e09d03 PT |
294 | lnet_libhandle_t *lh; |
295 | ||
296 | lh = lnet_res_lh_lookup(&the_lnet.ln_eq_container, handle->cookie); | |
06ace26e | 297 | if (!lh) |
d7e09d03 PT |
298 | return NULL; |
299 | ||
300 | return lh_entry(lh, lnet_eq_t, eq_lh); | |
301 | } | |
302 | ||
303 | static inline void | |
62fbc9f7 | 304 | lnet_md2handle(lnet_handle_md_t *handle, lnet_libmd_t *md) |
d7e09d03 PT |
305 | { |
306 | handle->cookie = md->md_lh.lh_cookie; | |
307 | } | |
308 | ||
309 | static inline lnet_libmd_t * | |
310 | lnet_handle2md(lnet_handle_md_t *handle) | |
311 | { | |
312 | /* ALWAYS called with resource lock held */ | |
313 | lnet_libhandle_t *lh; | |
188acc61 | 314 | int cpt; |
d7e09d03 PT |
315 | |
316 | cpt = lnet_cpt_of_cookie(handle->cookie); | |
317 | lh = lnet_res_lh_lookup(the_lnet.ln_md_containers[cpt], | |
318 | handle->cookie); | |
06ace26e | 319 | if (!lh) |
d7e09d03 PT |
320 | return NULL; |
321 | ||
322 | return lh_entry(lh, lnet_libmd_t, md_lh); | |
323 | } | |
324 | ||
325 | static inline lnet_libmd_t * | |
326 | lnet_wire_handle2md(lnet_handle_wire_t *wh) | |
327 | { | |
328 | /* ALWAYS called with resource lock held */ | |
329 | lnet_libhandle_t *lh; | |
188acc61 | 330 | int cpt; |
d7e09d03 PT |
331 | |
332 | if (wh->wh_interface_cookie != the_lnet.ln_interface_cookie) | |
333 | return NULL; | |
334 | ||
335 | cpt = lnet_cpt_of_cookie(wh->wh_object_cookie); | |
336 | lh = lnet_res_lh_lookup(the_lnet.ln_md_containers[cpt], | |
337 | wh->wh_object_cookie); | |
06ace26e | 338 | if (!lh) |
d7e09d03 PT |
339 | return NULL; |
340 | ||
341 | return lh_entry(lh, lnet_libmd_t, md_lh); | |
342 | } | |
343 | ||
344 | static inline void | |
62fbc9f7 | 345 | lnet_me2handle(lnet_handle_me_t *handle, lnet_me_t *me) |
d7e09d03 PT |
346 | { |
347 | handle->cookie = me->me_lh.lh_cookie; | |
348 | } | |
349 | ||
350 | static inline lnet_me_t * | |
351 | lnet_handle2me(lnet_handle_me_t *handle) | |
352 | { | |
353 | /* ALWAYS called with resource lock held */ | |
354 | lnet_libhandle_t *lh; | |
188acc61 | 355 | int cpt; |
d7e09d03 PT |
356 | |
357 | cpt = lnet_cpt_of_cookie(handle->cookie); | |
358 | lh = lnet_res_lh_lookup(the_lnet.ln_me_containers[cpt], | |
359 | handle->cookie); | |
06ace26e | 360 | if (!lh) |
d7e09d03 PT |
361 | return NULL; |
362 | ||
363 | return lh_entry(lh, lnet_me_t, me_lh); | |
364 | } | |
365 | ||
366 | static inline void | |
367 | lnet_peer_addref_locked(lnet_peer_t *lp) | |
368 | { | |
62fbc9f7 | 369 | LASSERT(lp->lp_refcount > 0); |
d7e09d03 PT |
370 | lp->lp_refcount++; |
371 | } | |
372 | ||
0ee98a9f | 373 | void lnet_destroy_peer_locked(lnet_peer_t *lp); |
d7e09d03 PT |
374 | |
375 | static inline void | |
376 | lnet_peer_decref_locked(lnet_peer_t *lp) | |
377 | { | |
62fbc9f7 | 378 | LASSERT(lp->lp_refcount > 0); |
d7e09d03 | 379 | lp->lp_refcount--; |
5fd88337 | 380 | if (!lp->lp_refcount) |
d7e09d03 PT |
381 | lnet_destroy_peer_locked(lp); |
382 | } | |
383 | ||
384 | static inline int | |
385 | lnet_isrouter(lnet_peer_t *lp) | |
386 | { | |
5fd88337 | 387 | return lp->lp_rtr_refcount ? 1 : 0; |
d7e09d03 PT |
388 | } |
389 | ||
390 | static inline void | |
391 | lnet_ni_addref_locked(lnet_ni_t *ni, int cpt) | |
392 | { | |
393 | LASSERT(cpt >= 0 && cpt < LNET_CPT_NUMBER); | |
394 | LASSERT(*ni->ni_refs[cpt] >= 0); | |
395 | ||
396 | (*ni->ni_refs[cpt])++; | |
397 | } | |
398 | ||
399 | static inline void | |
400 | lnet_ni_addref(lnet_ni_t *ni) | |
401 | { | |
402 | lnet_net_lock(0); | |
403 | lnet_ni_addref_locked(ni, 0); | |
404 | lnet_net_unlock(0); | |
405 | } | |
406 | ||
407 | static inline void | |
408 | lnet_ni_decref_locked(lnet_ni_t *ni, int cpt) | |
409 | { | |
410 | LASSERT(cpt >= 0 && cpt < LNET_CPT_NUMBER); | |
411 | LASSERT(*ni->ni_refs[cpt] > 0); | |
412 | ||
413 | (*ni->ni_refs[cpt])--; | |
414 | } | |
415 | ||
416 | static inline void | |
417 | lnet_ni_decref(lnet_ni_t *ni) | |
418 | { | |
419 | lnet_net_lock(0); | |
420 | lnet_ni_decref_locked(ni, 0); | |
421 | lnet_net_unlock(0); | |
422 | } | |
423 | ||
424 | void lnet_ni_free(lnet_ni_t *ni); | |
425 | ||
426 | static inline int | |
427 | lnet_nid2peerhash(lnet_nid_t nid) | |
428 | { | |
72c0824a | 429 | return hash_long(nid, LNET_PEER_HASH_BITS); |
d7e09d03 PT |
430 | } |
431 | ||
432 | static inline struct list_head * | |
433 | lnet_net2rnethash(__u32 net) | |
434 | { | |
435 | return &the_lnet.ln_remote_nets_hash[(LNET_NETNUM(net) + | |
436 | LNET_NETTYP(net)) & | |
437 | ((1U << the_lnet.ln_remote_nets_hbits) - 1)]; | |
438 | } | |
439 | ||
440 | extern lnd_t the_lolnd; | |
af3fa7c7 | 441 | extern int avoid_asym_router_failure; |
d7e09d03 | 442 | |
0ee98a9f GKH |
443 | int lnet_cpt_of_nid_locked(lnet_nid_t nid); |
444 | int lnet_cpt_of_nid(lnet_nid_t nid); | |
445 | lnet_ni_t *lnet_nid2ni_locked(lnet_nid_t nid, int cpt); | |
446 | lnet_ni_t *lnet_net2ni_locked(__u32 net, int cpt); | |
447 | lnet_ni_t *lnet_net2ni(__u32 net); | |
d7e09d03 | 448 | |
a9cf72b6 JS |
449 | int lnet_init(void); |
450 | void lnet_fini(void); | |
451 | ||
a649ad1d | 452 | int lnet_notify(lnet_ni_t *ni, lnet_nid_t peer, int alive, unsigned long when); |
2b06b70b AO |
453 | void lnet_notify_locked(lnet_peer_t *lp, int notifylnd, int alive, |
454 | unsigned long when); | |
e75fb87f DO |
455 | int lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway_nid, |
456 | unsigned int priority); | |
d7e09d03 PT |
457 | int lnet_check_routes(void); |
458 | int lnet_del_route(__u32 net, lnet_nid_t gw_nid); | |
459 | void lnet_destroy_routes(void); | |
460 | int lnet_get_route(int idx, __u32 *net, __u32 *hops, | |
e75fb87f | 461 | lnet_nid_t *gateway, __u32 *alive, __u32 *priority); |
edeb5d8c AS |
462 | int lnet_get_net_config(int idx, __u32 *cpt_count, __u64 *nid, |
463 | int *peer_timeout, int *peer_tx_credits, | |
464 | int *peer_rtr_cr, int *max_tx_credits, | |
465 | struct lnet_ioctl_net_config *net_config); | |
466 | int lnet_get_rtr_pool_cfg(int idx, struct lnet_ioctl_pool_cfg *pool_cfg); | |
467 | ||
b03f395a OD |
468 | void lnet_router_debugfs_init(void); |
469 | void lnet_router_debugfs_fini(void); | |
d7e09d03 | 470 | int lnet_rtrpools_alloc(int im_a_router); |
86ef6250 AS |
471 | void lnet_destroy_rtrbuf(lnet_rtrbuf_t *rb, int npages); |
472 | int lnet_rtrpools_adjust(int tiny, int small, int large); | |
473 | int lnet_rtrpools_enable(void); | |
474 | void lnet_rtrpools_disable(void); | |
475 | void lnet_rtrpools_free(int keep_pools); | |
62fbc9f7 | 476 | lnet_remotenet_t *lnet_find_net_locked(__u32 net); |
edeb5d8c AS |
477 | int lnet_dyn_add_ni(lnet_pid_t requested_pid, char *nets, |
478 | __s32 peer_timeout, __s32 peer_cr, __s32 peer_buf_cr, | |
479 | __s32 credits); | |
480 | int lnet_dyn_del_ni(__u32 net); | |
d7e09d03 PT |
481 | |
482 | int lnet_islocalnid(lnet_nid_t nid); | |
483 | int lnet_islocalnet(__u32 net); | |
484 | ||
485 | void lnet_msg_attach_md(lnet_msg_t *msg, lnet_libmd_t *md, | |
486 | unsigned int offset, unsigned int mlen); | |
487 | void lnet_msg_detach_md(lnet_msg_t *msg, int status); | |
488 | void lnet_build_unlink_event(lnet_libmd_t *md, lnet_event_t *ev); | |
489 | void lnet_build_msg_event(lnet_msg_t *msg, lnet_event_kind_t ev_type); | |
490 | void lnet_msg_commit(lnet_msg_t *msg, int cpt); | |
491 | void lnet_msg_decommit(lnet_msg_t *msg, int cpt, int status); | |
492 | ||
493 | void lnet_eq_enqueue_event(lnet_eq_t *eq, lnet_event_t *ev); | |
494 | void lnet_prep_send(lnet_msg_t *msg, int type, lnet_process_id_t target, | |
495 | unsigned int offset, unsigned int len); | |
496 | int lnet_send(lnet_nid_t nid, lnet_msg_t *msg, lnet_nid_t rtr_nid); | |
497 | void lnet_return_tx_credits_locked(lnet_msg_t *msg); | |
498 | void lnet_return_rx_credits_locked(lnet_msg_t *msg); | |
86ef6250 AS |
499 | void lnet_schedule_blocked_locked(lnet_rtrbufpool_t *rbp); |
500 | void lnet_drop_routed_msgs_locked(struct list_head *list, int cpt); | |
d7e09d03 PT |
501 | |
502 | /* portals functions */ | |
503 | /* portals attributes */ | |
504 | static inline int | |
505 | lnet_ptl_is_lazy(lnet_portal_t *ptl) | |
506 | { | |
507 | return !!(ptl->ptl_options & LNET_PTL_LAZY); | |
508 | } | |
509 | ||
510 | static inline int | |
511 | lnet_ptl_is_unique(lnet_portal_t *ptl) | |
512 | { | |
513 | return !!(ptl->ptl_options & LNET_PTL_MATCH_UNIQUE); | |
514 | } | |
515 | ||
516 | static inline int | |
517 | lnet_ptl_is_wildcard(lnet_portal_t *ptl) | |
518 | { | |
519 | return !!(ptl->ptl_options & LNET_PTL_MATCH_WILDCARD); | |
520 | } | |
521 | ||
522 | static inline void | |
523 | lnet_ptl_setopt(lnet_portal_t *ptl, int opt) | |
524 | { | |
525 | ptl->ptl_options |= opt; | |
526 | } | |
527 | ||
528 | static inline void | |
529 | lnet_ptl_unsetopt(lnet_portal_t *ptl, int opt) | |
530 | { | |
531 | ptl->ptl_options &= ~opt; | |
532 | } | |
533 | ||
534 | /* match-table functions */ | |
535 | struct list_head *lnet_mt_match_head(struct lnet_match_table *mtable, | |
09bce335 | 536 | lnet_process_id_t id, __u64 mbits); |
d7e09d03 PT |
537 | struct lnet_match_table *lnet_mt_of_attach(unsigned int index, |
538 | lnet_process_id_t id, __u64 mbits, | |
539 | __u64 ignore_bits, | |
540 | lnet_ins_pos_t pos); | |
541 | int lnet_mt_match_md(struct lnet_match_table *mtable, | |
542 | struct lnet_match_info *info, struct lnet_msg *msg); | |
543 | ||
544 | /* portals match/attach functions */ | |
545 | void lnet_ptl_attach_md(lnet_me_t *me, lnet_libmd_t *md, | |
546 | struct list_head *matches, struct list_head *drops); | |
547 | void lnet_ptl_detach_md(lnet_me_t *me, lnet_libmd_t *md); | |
548 | int lnet_ptl_match_md(struct lnet_match_info *info, struct lnet_msg *msg); | |
549 | ||
550 | /* initialized and finalize portals */ | |
551 | int lnet_portals_create(void); | |
552 | void lnet_portals_destroy(void); | |
553 | ||
554 | /* message functions */ | |
62fbc9f7 | 555 | int lnet_parse(lnet_ni_t *ni, lnet_hdr_t *hdr, |
09bce335 | 556 | lnet_nid_t fromnid, void *private, int rdma_req); |
d7e09d03 PT |
557 | void lnet_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, int delayed, |
558 | unsigned int offset, unsigned int mlen, unsigned int rlen); | |
62fbc9f7 | 559 | lnet_msg_t *lnet_create_reply_msg(lnet_ni_t *ni, lnet_msg_t *get_msg); |
d7e09d03 | 560 | void lnet_set_reply_msg_len(lnet_ni_t *ni, lnet_msg_t *msg, unsigned int len); |
188acc61 | 561 | |
d7e09d03 | 562 | void lnet_finalize(lnet_ni_t *ni, lnet_msg_t *msg, int rc); |
188acc61 | 563 | |
d7e09d03 PT |
564 | void lnet_drop_delayed_msg_list(struct list_head *head, char *reason); |
565 | void lnet_recv_delayed_msg_list(struct list_head *head); | |
566 | ||
567 | int lnet_msg_container_setup(struct lnet_msg_container *container, int cpt); | |
568 | void lnet_msg_container_cleanup(struct lnet_msg_container *container); | |
569 | void lnet_msg_containers_destroy(void); | |
570 | int lnet_msg_containers_create(void); | |
571 | ||
62fbc9f7 | 572 | char *lnet_msgtyp2str(int type); |
ac0a2871 | 573 | void lnet_print_hdr(lnet_hdr_t *hdr); |
d7e09d03 PT |
574 | int lnet_fail_nid(lnet_nid_t nid, unsigned int threshold); |
575 | ||
576 | void lnet_counters_get(lnet_counters_t *counters); | |
577 | void lnet_counters_reset(void); | |
578 | ||
f351bad2 AV |
579 | unsigned int lnet_iov_nob(unsigned int niov, struct kvec *iov); |
580 | int lnet_extract_iov(int dst_niov, struct kvec *dst, | |
581 | int src_niov, struct kvec *src, | |
d7e09d03 PT |
582 | unsigned int offset, unsigned int len); |
583 | ||
62fbc9f7 LN |
584 | unsigned int lnet_kiov_nob(unsigned int niov, lnet_kiov_t *iov); |
585 | int lnet_extract_kiov(int dst_niov, lnet_kiov_t *dst, | |
d7e09d03 PT |
586 | int src_niov, lnet_kiov_t *src, |
587 | unsigned int offset, unsigned int len); | |
588 | ||
f351bad2 | 589 | void lnet_copy_iov2iov(unsigned int ndiov, struct kvec *diov, |
09bce335 | 590 | unsigned int doffset, |
f351bad2 | 591 | unsigned int nsiov, struct kvec *siov, |
d7e09d03 | 592 | unsigned int soffset, unsigned int nob); |
f351bad2 | 593 | void lnet_copy_kiov2iov(unsigned int niov, struct kvec *iov, |
09bce335 | 594 | unsigned int iovoffset, |
d7e09d03 PT |
595 | unsigned int nkiov, lnet_kiov_t *kiov, |
596 | unsigned int kiovoffset, unsigned int nob); | |
62fbc9f7 | 597 | void lnet_copy_iov2kiov(unsigned int nkiov, lnet_kiov_t *kiov, |
09bce335 | 598 | unsigned int kiovoffset, |
f351bad2 | 599 | unsigned int niov, struct kvec *iov, |
d7e09d03 | 600 | unsigned int iovoffset, unsigned int nob); |
62fbc9f7 | 601 | void lnet_copy_kiov2kiov(unsigned int ndkiov, lnet_kiov_t *dkiov, |
09bce335 | 602 | unsigned int doffset, |
d7e09d03 PT |
603 | unsigned int nskiov, lnet_kiov_t *skiov, |
604 | unsigned int soffset, unsigned int nob); | |
605 | ||
606 | static inline void | |
607 | lnet_copy_iov2flat(int dlen, void *dest, unsigned int doffset, | |
f351bad2 | 608 | unsigned int nsiov, struct kvec *siov, unsigned int soffset, |
d7e09d03 PT |
609 | unsigned int nob) |
610 | { | |
f351bad2 | 611 | struct kvec diov = {/*.iov_base = */ dest, /*.iov_len = */ dlen}; |
d7e09d03 PT |
612 | |
613 | lnet_copy_iov2iov(1, &diov, doffset, | |
614 | nsiov, siov, soffset, nob); | |
615 | } | |
616 | ||
617 | static inline void | |
618 | lnet_copy_kiov2flat(int dlen, void *dest, unsigned int doffset, | |
2b06b70b AO |
619 | unsigned int nsiov, lnet_kiov_t *skiov, |
620 | unsigned int soffset, unsigned int nob) | |
d7e09d03 | 621 | { |
f351bad2 | 622 | struct kvec diov = {/* .iov_base = */ dest, /* .iov_len = */ dlen}; |
d7e09d03 PT |
623 | |
624 | lnet_copy_kiov2iov(1, &diov, doffset, | |
625 | nsiov, skiov, soffset, nob); | |
626 | } | |
627 | ||
628 | static inline void | |
f351bad2 | 629 | lnet_copy_flat2iov(unsigned int ndiov, struct kvec *diov, unsigned int doffset, |
d7e09d03 PT |
630 | int slen, void *src, unsigned int soffset, unsigned int nob) |
631 | { | |
f351bad2 | 632 | struct kvec siov = {/*.iov_base = */ src, /*.iov_len = */slen}; |
681fc807 | 633 | |
d7e09d03 PT |
634 | lnet_copy_iov2iov(ndiov, diov, doffset, |
635 | 1, &siov, soffset, nob); | |
636 | } | |
637 | ||
638 | static inline void | |
2b06b70b AO |
639 | lnet_copy_flat2kiov(unsigned int ndiov, lnet_kiov_t *dkiov, |
640 | unsigned int doffset, int slen, void *src, | |
641 | unsigned int soffset, unsigned int nob) | |
d7e09d03 | 642 | { |
f351bad2 | 643 | struct kvec siov = {/* .iov_base = */ src, /* .iov_len = */ slen}; |
681fc807 | 644 | |
d7e09d03 PT |
645 | lnet_copy_iov2kiov(ndiov, dkiov, doffset, |
646 | 1, &siov, soffset, nob); | |
647 | } | |
648 | ||
649 | void lnet_me_unlink(lnet_me_t *me); | |
650 | ||
651 | void lnet_md_unlink(lnet_libmd_t *md); | |
652 | void lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd); | |
653 | ||
654 | void lnet_register_lnd(lnd_t *lnd); | |
655 | void lnet_unregister_lnd(lnd_t *lnd); | |
d7e09d03 | 656 | |
e327dc88 | 657 | int lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, |
d7e09d03 PT |
658 | __u32 local_ip, __u32 peer_ip, int peer_port); |
659 | void lnet_connect_console_error(int rc, lnet_nid_t peer_nid, | |
660 | __u32 peer_ip, int port); | |
661 | int lnet_count_acceptor_nis(void); | |
662 | int lnet_acceptor_timeout(void); | |
663 | int lnet_acceptor_port(void); | |
664 | ||
665 | int lnet_count_acceptor_nis(void); | |
666 | int lnet_acceptor_port(void); | |
667 | ||
668 | int lnet_acceptor_start(void); | |
669 | void lnet_acceptor_stop(void); | |
670 | ||
1ad6a73e JS |
671 | int lnet_ipif_query(char *name, int *up, __u32 *ip, __u32 *mask); |
672 | int lnet_ipif_enumerate(char ***names); | |
673 | void lnet_ipif_free_enumeration(char **names, int n); | |
674 | int lnet_sock_setbuf(struct socket *socket, int txbufsize, int rxbufsize); | |
675 | int lnet_sock_getbuf(struct socket *socket, int *txbufsize, int *rxbufsize); | |
676 | int lnet_sock_getaddr(struct socket *socket, bool remote, __u32 *ip, int *port); | |
677 | int lnet_sock_write(struct socket *sock, void *buffer, int nob, int timeout); | |
678 | int lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout); | |
679 | ||
680 | int lnet_sock_listen(struct socket **sockp, __u32 ip, int port, int backlog); | |
681 | int lnet_sock_accept(struct socket **newsockp, struct socket *sock); | |
682 | int lnet_sock_connect(struct socket **sockp, int *fatal, | |
683 | __u32 local_ip, int local_port, | |
684 | __u32 peer_ip, int peer_port); | |
685 | void libcfs_sock_release(struct socket *sock); | |
686 | ||
d7e09d03 PT |
687 | int lnet_peers_start_down(void); |
688 | int lnet_peer_buffer_credits(lnet_ni_t *ni); | |
689 | ||
690 | int lnet_router_checker_start(void); | |
691 | void lnet_router_checker_stop(void); | |
af3fa7c7 | 692 | void lnet_router_ni_update_locked(lnet_peer_t *gw, __u32 net); |
d7e09d03 PT |
693 | void lnet_swap_pinginfo(lnet_ping_info_t *info); |
694 | ||
62fbc9f7 LN |
695 | int lnet_parse_ip2nets(char **networksp, char *ip2nets); |
696 | int lnet_parse_routes(char *route_str, int *im_a_router); | |
697 | int lnet_parse_networks(struct list_head *nilist, char *networks); | |
6c9e5a55 | 698 | int lnet_net_unique(__u32 net, struct list_head *nilist); |
d7e09d03 PT |
699 | |
700 | int lnet_nid2peer_locked(lnet_peer_t **lpp, lnet_nid_t nid, int cpt); | |
701 | lnet_peer_t *lnet_find_peer_locked(struct lnet_peer_table *ptable, | |
702 | lnet_nid_t nid); | |
21602c7d | 703 | void lnet_peer_tables_cleanup(lnet_ni_t *ni); |
d7e09d03 PT |
704 | void lnet_peer_tables_destroy(void); |
705 | int lnet_peer_tables_create(void); | |
706 | void lnet_debug_peer(lnet_nid_t nid); | |
edeb5d8c AS |
707 | int lnet_get_peer_info(__u32 peer_index, __u64 *nid, |
708 | char alivness[LNET_MAX_STR_LEN], | |
709 | __u32 *cpt_iter, __u32 *refcount, | |
710 | __u32 *ni_peer_tx_credits, __u32 *peer_tx_credits, | |
711 | __u32 *peer_rtr_credits, __u32 *peer_min_rtr_credtis, | |
712 | __u32 *peer_tx_qnob); | |
d7e09d03 | 713 | |
188acc61 JS |
714 | static inline void |
715 | lnet_peer_set_alive(lnet_peer_t *lp) | |
af3fa7c7 | 716 | { |
d3d3d37a JS |
717 | lp->lp_last_query = jiffies; |
718 | lp->lp_last_alive = jiffies; | |
af3fa7c7 LZ |
719 | if (!lp->lp_alive) |
720 | lnet_notify_locked(lp, 0, 1, lp->lp_last_alive); | |
721 | } | |
722 | ||
d7e09d03 | 723 | #endif |