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); | |
9c26b89d AS |
425 | lnet_ni_t * |
426 | lnet_ni_alloc(__u32 net, struct cfs_expr_list *el, struct list_head *nilist); | |
d7e09d03 PT |
427 | |
428 | static inline int | |
429 | lnet_nid2peerhash(lnet_nid_t nid) | |
430 | { | |
72c0824a | 431 | return hash_long(nid, LNET_PEER_HASH_BITS); |
d7e09d03 PT |
432 | } |
433 | ||
434 | static inline struct list_head * | |
435 | lnet_net2rnethash(__u32 net) | |
436 | { | |
437 | return &the_lnet.ln_remote_nets_hash[(LNET_NETNUM(net) + | |
438 | LNET_NETTYP(net)) & | |
439 | ((1U << the_lnet.ln_remote_nets_hbits) - 1)]; | |
440 | } | |
441 | ||
442 | extern lnd_t the_lolnd; | |
af3fa7c7 | 443 | extern int avoid_asym_router_failure; |
d7e09d03 | 444 | |
0ee98a9f GKH |
445 | int lnet_cpt_of_nid_locked(lnet_nid_t nid); |
446 | int lnet_cpt_of_nid(lnet_nid_t nid); | |
447 | lnet_ni_t *lnet_nid2ni_locked(lnet_nid_t nid, int cpt); | |
448 | lnet_ni_t *lnet_net2ni_locked(__u32 net, int cpt); | |
449 | lnet_ni_t *lnet_net2ni(__u32 net); | |
d7e09d03 | 450 | |
505510fd FZ |
451 | extern int portal_rotor; |
452 | ||
e0f94113 AD |
453 | int lnet_lib_init(void); |
454 | void lnet_lib_exit(void); | |
a9cf72b6 | 455 | |
a649ad1d | 456 | int lnet_notify(lnet_ni_t *ni, lnet_nid_t peer, int alive, unsigned long when); |
2b06b70b AO |
457 | void lnet_notify_locked(lnet_peer_t *lp, int notifylnd, int alive, |
458 | unsigned long when); | |
b9bbb61c | 459 | int lnet_add_route(__u32 net, __u32 hops, lnet_nid_t gateway_nid, |
e75fb87f | 460 | unsigned int priority); |
d7e09d03 PT |
461 | int lnet_check_routes(void); |
462 | int lnet_del_route(__u32 net, lnet_nid_t gw_nid); | |
463 | void lnet_destroy_routes(void); | |
464 | int lnet_get_route(int idx, __u32 *net, __u32 *hops, | |
e75fb87f | 465 | lnet_nid_t *gateway, __u32 *alive, __u32 *priority); |
edeb5d8c AS |
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); |
d76d9385 AS |
477 | int lnet_dyn_add_ni(lnet_pid_t requested_pid, |
478 | struct lnet_ioctl_config_data *conf); | |
edeb5d8c | 479 | int lnet_dyn_del_ni(__u32 net); |
1a9be843 | 480 | int lnet_clear_lazy_portal(struct lnet_ni *ni, int portal, char *reason); |
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); |
b7acfc95 LZ |
557 | int lnet_parse_local(lnet_ni_t *ni, lnet_msg_t *msg); |
558 | int lnet_parse_forward_locked(lnet_ni_t *ni, lnet_msg_t *msg); | |
559 | ||
d7e09d03 PT |
560 | void lnet_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, int delayed, |
561 | unsigned int offset, unsigned int mlen, unsigned int rlen); | |
b7acfc95 LZ |
562 | void lnet_ni_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, |
563 | int delayed, unsigned int offset, | |
564 | unsigned int mlen, unsigned int rlen); | |
565 | ||
62fbc9f7 | 566 | lnet_msg_t *lnet_create_reply_msg(lnet_ni_t *ni, lnet_msg_t *get_msg); |
d7e09d03 | 567 | void lnet_set_reply_msg_len(lnet_ni_t *ni, lnet_msg_t *msg, unsigned int len); |
188acc61 | 568 | |
d7e09d03 | 569 | void lnet_finalize(lnet_ni_t *ni, lnet_msg_t *msg, int rc); |
188acc61 | 570 | |
b7acfc95 LZ |
571 | void lnet_drop_message(lnet_ni_t *ni, int cpt, void *private, |
572 | unsigned int nob); | |
d7e09d03 PT |
573 | void lnet_drop_delayed_msg_list(struct list_head *head, char *reason); |
574 | void lnet_recv_delayed_msg_list(struct list_head *head); | |
575 | ||
576 | int lnet_msg_container_setup(struct lnet_msg_container *container, int cpt); | |
577 | void lnet_msg_container_cleanup(struct lnet_msg_container *container); | |
578 | void lnet_msg_containers_destroy(void); | |
579 | int lnet_msg_containers_create(void); | |
580 | ||
62fbc9f7 | 581 | char *lnet_msgtyp2str(int type); |
ac0a2871 | 582 | void lnet_print_hdr(lnet_hdr_t *hdr); |
d7e09d03 PT |
583 | int lnet_fail_nid(lnet_nid_t nid, unsigned int threshold); |
584 | ||
0fbbced2 LZ |
585 | /** \addtogroup lnet_fault_simulation @{ */ |
586 | ||
587 | int lnet_fault_ctl(int cmd, struct libcfs_ioctl_data *data); | |
588 | int lnet_fault_init(void); | |
589 | void lnet_fault_fini(void); | |
590 | ||
591 | bool lnet_drop_rule_match(lnet_hdr_t *hdr); | |
592 | ||
b7acfc95 LZ |
593 | int lnet_delay_rule_add(struct lnet_fault_attr *attr); |
594 | int lnet_delay_rule_del(lnet_nid_t src, lnet_nid_t dst, bool shutdown); | |
595 | int lnet_delay_rule_list(int pos, struct lnet_fault_attr *attr, | |
596 | struct lnet_fault_stat *stat); | |
597 | void lnet_delay_rule_reset(void); | |
598 | void lnet_delay_rule_check(void); | |
599 | bool lnet_delay_rule_match_locked(lnet_hdr_t *hdr, struct lnet_msg *msg); | |
600 | ||
0fbbced2 LZ |
601 | /** @} lnet_fault_simulation */ |
602 | ||
d7e09d03 PT |
603 | void lnet_counters_get(lnet_counters_t *counters); |
604 | void lnet_counters_reset(void); | |
605 | ||
f351bad2 AV |
606 | unsigned int lnet_iov_nob(unsigned int niov, struct kvec *iov); |
607 | int lnet_extract_iov(int dst_niov, struct kvec *dst, | |
03766dca | 608 | int src_niov, const struct kvec *src, |
d7e09d03 PT |
609 | unsigned int offset, unsigned int len); |
610 | ||
62fbc9f7 LN |
611 | unsigned int lnet_kiov_nob(unsigned int niov, lnet_kiov_t *iov); |
612 | int lnet_extract_kiov(int dst_niov, lnet_kiov_t *dst, | |
03766dca | 613 | int src_niov, const lnet_kiov_t *src, |
d7e09d03 PT |
614 | unsigned int offset, unsigned int len); |
615 | ||
4cae780e | 616 | void lnet_copy_iov2iter(struct iov_iter *to, |
03766dca | 617 | unsigned int nsiov, const struct kvec *siov, |
d7e09d03 | 618 | unsigned int soffset, unsigned int nob); |
4cae780e | 619 | void lnet_copy_kiov2iter(struct iov_iter *to, |
03766dca | 620 | unsigned int nkiov, const lnet_kiov_t *kiov, |
d7e09d03 | 621 | unsigned int kiovoffset, unsigned int nob); |
d7e09d03 PT |
622 | |
623 | void lnet_me_unlink(lnet_me_t *me); | |
624 | ||
625 | void lnet_md_unlink(lnet_libmd_t *md); | |
626 | void lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd); | |
627 | ||
628 | void lnet_register_lnd(lnd_t *lnd); | |
629 | void lnet_unregister_lnd(lnd_t *lnd); | |
d7e09d03 | 630 | |
e327dc88 | 631 | int lnet_connect(struct socket **sockp, lnet_nid_t peer_nid, |
d7e09d03 PT |
632 | __u32 local_ip, __u32 peer_ip, int peer_port); |
633 | void lnet_connect_console_error(int rc, lnet_nid_t peer_nid, | |
634 | __u32 peer_ip, int port); | |
635 | int lnet_count_acceptor_nis(void); | |
636 | int lnet_acceptor_timeout(void); | |
637 | int lnet_acceptor_port(void); | |
638 | ||
639 | int lnet_count_acceptor_nis(void); | |
640 | int lnet_acceptor_port(void); | |
641 | ||
642 | int lnet_acceptor_start(void); | |
643 | void lnet_acceptor_stop(void); | |
644 | ||
1ad6a73e JS |
645 | int lnet_ipif_query(char *name, int *up, __u32 *ip, __u32 *mask); |
646 | int lnet_ipif_enumerate(char ***names); | |
647 | void lnet_ipif_free_enumeration(char **names, int n); | |
648 | int lnet_sock_setbuf(struct socket *socket, int txbufsize, int rxbufsize); | |
649 | int lnet_sock_getbuf(struct socket *socket, int *txbufsize, int *rxbufsize); | |
650 | int lnet_sock_getaddr(struct socket *socket, bool remote, __u32 *ip, int *port); | |
651 | int lnet_sock_write(struct socket *sock, void *buffer, int nob, int timeout); | |
652 | int lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout); | |
653 | ||
654 | int lnet_sock_listen(struct socket **sockp, __u32 ip, int port, int backlog); | |
655 | int lnet_sock_accept(struct socket **newsockp, struct socket *sock); | |
656 | int lnet_sock_connect(struct socket **sockp, int *fatal, | |
657 | __u32 local_ip, int local_port, | |
658 | __u32 peer_ip, int peer_port); | |
659 | void libcfs_sock_release(struct socket *sock); | |
660 | ||
d7e09d03 PT |
661 | int lnet_peers_start_down(void); |
662 | int lnet_peer_buffer_credits(lnet_ni_t *ni); | |
663 | ||
664 | int lnet_router_checker_start(void); | |
665 | void lnet_router_checker_stop(void); | |
af3fa7c7 | 666 | void lnet_router_ni_update_locked(lnet_peer_t *gw, __u32 net); |
d7e09d03 PT |
667 | void lnet_swap_pinginfo(lnet_ping_info_t *info); |
668 | ||
62fbc9f7 LN |
669 | int lnet_parse_ip2nets(char **networksp, char *ip2nets); |
670 | int lnet_parse_routes(char *route_str, int *im_a_router); | |
671 | int lnet_parse_networks(struct list_head *nilist, char *networks); | |
6c9e5a55 | 672 | int lnet_net_unique(__u32 net, struct list_head *nilist); |
d7e09d03 PT |
673 | |
674 | int lnet_nid2peer_locked(lnet_peer_t **lpp, lnet_nid_t nid, int cpt); | |
675 | lnet_peer_t *lnet_find_peer_locked(struct lnet_peer_table *ptable, | |
676 | lnet_nid_t nid); | |
21602c7d | 677 | void lnet_peer_tables_cleanup(lnet_ni_t *ni); |
d7e09d03 PT |
678 | void lnet_peer_tables_destroy(void); |
679 | int lnet_peer_tables_create(void); | |
680 | void lnet_debug_peer(lnet_nid_t nid); | |
edeb5d8c AS |
681 | int lnet_get_peer_info(__u32 peer_index, __u64 *nid, |
682 | char alivness[LNET_MAX_STR_LEN], | |
683 | __u32 *cpt_iter, __u32 *refcount, | |
684 | __u32 *ni_peer_tx_credits, __u32 *peer_tx_credits, | |
685 | __u32 *peer_rtr_credits, __u32 *peer_min_rtr_credtis, | |
686 | __u32 *peer_tx_qnob); | |
d7e09d03 | 687 | |
188acc61 JS |
688 | static inline void |
689 | lnet_peer_set_alive(lnet_peer_t *lp) | |
af3fa7c7 | 690 | { |
d3d3d37a JS |
691 | lp->lp_last_query = jiffies; |
692 | lp->lp_last_alive = jiffies; | |
af3fa7c7 LZ |
693 | if (!lp->lp_alive) |
694 | lnet_notify_locked(lp, 0, 1, lp->lp_last_alive); | |
695 | } | |
696 | ||
d7e09d03 | 697 | #endif |