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