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