4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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.
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).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2012, 2015, Intel Corporation.
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Seagate, Inc.
32 * lnet/include/lnet/lib-lnet.h
35 #ifndef __LNET_LIB_LNET_H__
36 #define __LNET_LIB_LNET_H__
38 #include "../libcfs/libcfs.h"
41 #include "lib-types.h"
43 extern lnet_t the_lnet
; /* THE network */
45 #if (BITS_PER_LONG == 32)
46 /* 2 CPTs, allowing more CPTs might make us under memory pressure */
47 #define LNET_CPT_MAX_BITS 1
49 #else /* 64-bit system */
51 * 256 CPTs for thousands of CPUs, allowing more CPTs might make us
52 * under risk of consuming all lh_cookie.
54 #define LNET_CPT_MAX_BITS 8
55 #endif /* BITS_PER_LONG == 32 */
57 /* max allowed CPT number */
58 #define LNET_CPT_MAX (1 << LNET_CPT_MAX_BITS)
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)
65 #define LNET_LOCK_EX CFS_PERCPT_LOCK_EX
67 static inline int lnet_is_route_alive(lnet_route_t
*route
)
70 if (!route
->lr_gateway
->lp_alive
)
72 /* no NI status, assume it's alive */
73 if ((route
->lr_gateway
->lp_ping_feats
&
74 LNET_PING_FEAT_NI_STATUS
) == 0)
76 /* has NI status, check # down NIs */
77 return route
->lr_downis
== 0;
80 static inline int lnet_is_wire_handle_none(lnet_handle_wire_t
*wh
)
82 return (wh
->wh_interface_cookie
== LNET_WIRE_HANDLE_COOKIE_NONE
&&
83 wh
->wh_object_cookie
== LNET_WIRE_HANDLE_COOKIE_NONE
);
86 static inline int lnet_md_exhausted(lnet_libmd_t
*md
)
88 return (!md
->md_threshold
||
89 ((md
->md_options
& LNET_MD_MAX_SIZE
) &&
90 md
->md_offset
+ md
->md_max_size
> md
->md_length
));
93 static inline int lnet_md_unlinkable(lnet_libmd_t
*md
)
96 * Should unlink md when its refcount is 0 and either:
97 * - md has been flagged for deletion (by auto unlink or
98 * LNetM[DE]Unlink, in the latter case md may not be exhausted).
99 * - auto unlink is on and md is exhausted.
104 if (md
->md_flags
& LNET_MD_FLAG_ZOMBIE
)
107 return ((md
->md_flags
& LNET_MD_FLAG_AUTO_UNLINK
) &&
108 lnet_md_exhausted(md
));
111 #define lnet_cpt_table() (the_lnet.ln_cpt_table)
112 #define lnet_cpt_current() cfs_cpt_current(the_lnet.ln_cpt_table, 1)
115 lnet_cpt_of_cookie(__u64 cookie
)
117 unsigned int cpt
= (cookie
>> LNET_COOKIE_TYPE_BITS
) & LNET_CPT_MASK
;
120 * LNET_CPT_NUMBER doesn't have to be power2, which means we can
121 * get illegal cpt from it's invalid cookie
123 return cpt
< LNET_CPT_NUMBER
? cpt
: cpt
% LNET_CPT_NUMBER
;
127 lnet_res_lock(int cpt
)
129 cfs_percpt_lock(the_lnet
.ln_res_lock
, cpt
);
133 lnet_res_unlock(int cpt
)
135 cfs_percpt_unlock(the_lnet
.ln_res_lock
, cpt
);
139 lnet_res_lock_current(void)
141 int cpt
= lnet_cpt_current();
148 lnet_net_lock(int cpt
)
150 cfs_percpt_lock(the_lnet
.ln_net_lock
, cpt
);
154 lnet_net_unlock(int cpt
)
156 cfs_percpt_unlock(the_lnet
.ln_net_lock
, cpt
);
160 lnet_net_lock_current(void)
162 int cpt
= lnet_cpt_current();
168 #define LNET_LOCK() lnet_net_lock(LNET_LOCK_EX)
169 #define LNET_UNLOCK() lnet_net_unlock(LNET_LOCK_EX)
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)
178 #define MAX_PORTALS 64
180 static inline lnet_eq_t
*
185 LIBCFS_ALLOC(eq
, sizeof(*eq
));
190 lnet_eq_free(lnet_eq_t
*eq
)
192 LIBCFS_FREE(eq
, sizeof(*eq
));
195 static inline lnet_libmd_t
*
196 lnet_md_alloc(lnet_md_t
*umd
)
202 if (umd
->options
& LNET_MD_KIOV
) {
204 size
= offsetof(lnet_libmd_t
, md_iov
.kiov
[niov
]);
206 niov
= umd
->options
& LNET_MD_IOVEC
? umd
->length
: 1;
207 size
= offsetof(lnet_libmd_t
, md_iov
.iov
[niov
]);
210 LIBCFS_ALLOC(md
, size
);
213 /* Set here in case of early free */
214 md
->md_options
= umd
->options
;
216 INIT_LIST_HEAD(&md
->md_list
);
223 lnet_md_free(lnet_libmd_t
*md
)
227 if (md
->md_options
& LNET_MD_KIOV
)
228 size
= offsetof(lnet_libmd_t
, md_iov
.kiov
[md
->md_niov
]);
230 size
= offsetof(lnet_libmd_t
, md_iov
.iov
[md
->md_niov
]);
232 LIBCFS_FREE(md
, size
);
235 static inline lnet_me_t
*
240 LIBCFS_ALLOC(me
, sizeof(*me
));
245 lnet_me_free(lnet_me_t
*me
)
247 LIBCFS_FREE(me
, sizeof(*me
));
250 static inline lnet_msg_t
*
255 LIBCFS_ALLOC(msg
, sizeof(*msg
));
257 /* no need to zero, LIBCFS_ALLOC does for us */
262 lnet_msg_free(lnet_msg_t
*msg
)
264 LASSERT(!msg
->msg_onactivelist
);
265 LIBCFS_FREE(msg
, sizeof(*msg
));
268 lnet_libhandle_t
*lnet_res_lh_lookup(struct lnet_res_container
*rec
,
270 void lnet_res_lh_initialize(struct lnet_res_container
*rec
,
271 lnet_libhandle_t
*lh
);
273 lnet_res_lh_invalidate(lnet_libhandle_t
*lh
)
275 /* NB: cookie is still useful, don't reset it */
276 list_del(&lh
->lh_hash_chain
);
280 lnet_eq2handle(lnet_handle_eq_t
*handle
, lnet_eq_t
*eq
)
283 LNetInvalidateHandle(handle
);
287 handle
->cookie
= eq
->eq_lh
.lh_cookie
;
290 static inline lnet_eq_t
*
291 lnet_handle2eq(lnet_handle_eq_t
*handle
)
293 lnet_libhandle_t
*lh
;
295 lh
= lnet_res_lh_lookup(&the_lnet
.ln_eq_container
, handle
->cookie
);
299 return lh_entry(lh
, lnet_eq_t
, eq_lh
);
303 lnet_md2handle(lnet_handle_md_t
*handle
, lnet_libmd_t
*md
)
305 handle
->cookie
= md
->md_lh
.lh_cookie
;
308 static inline lnet_libmd_t
*
309 lnet_handle2md(lnet_handle_md_t
*handle
)
311 /* ALWAYS called with resource lock held */
312 lnet_libhandle_t
*lh
;
315 cpt
= lnet_cpt_of_cookie(handle
->cookie
);
316 lh
= lnet_res_lh_lookup(the_lnet
.ln_md_containers
[cpt
],
321 return lh_entry(lh
, lnet_libmd_t
, md_lh
);
324 static inline lnet_libmd_t
*
325 lnet_wire_handle2md(lnet_handle_wire_t
*wh
)
327 /* ALWAYS called with resource lock held */
328 lnet_libhandle_t
*lh
;
331 if (wh
->wh_interface_cookie
!= the_lnet
.ln_interface_cookie
)
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
);
340 return lh_entry(lh
, lnet_libmd_t
, md_lh
);
344 lnet_me2handle(lnet_handle_me_t
*handle
, lnet_me_t
*me
)
346 handle
->cookie
= me
->me_lh
.lh_cookie
;
349 static inline lnet_me_t
*
350 lnet_handle2me(lnet_handle_me_t
*handle
)
352 /* ALWAYS called with resource lock held */
353 lnet_libhandle_t
*lh
;
356 cpt
= lnet_cpt_of_cookie(handle
->cookie
);
357 lh
= lnet_res_lh_lookup(the_lnet
.ln_me_containers
[cpt
],
362 return lh_entry(lh
, lnet_me_t
, me_lh
);
366 lnet_peer_addref_locked(lnet_peer_t
*lp
)
368 LASSERT(lp
->lp_refcount
> 0);
372 void lnet_destroy_peer_locked(lnet_peer_t
*lp
);
375 lnet_peer_decref_locked(lnet_peer_t
*lp
)
377 LASSERT(lp
->lp_refcount
> 0);
379 if (!lp
->lp_refcount
)
380 lnet_destroy_peer_locked(lp
);
384 lnet_isrouter(lnet_peer_t
*lp
)
386 return lp
->lp_rtr_refcount
? 1 : 0;
390 lnet_ni_addref_locked(lnet_ni_t
*ni
, int cpt
)
392 LASSERT(cpt
>= 0 && cpt
< LNET_CPT_NUMBER
);
393 LASSERT(*ni
->ni_refs
[cpt
] >= 0);
395 (*ni
->ni_refs
[cpt
])++;
399 lnet_ni_addref(lnet_ni_t
*ni
)
402 lnet_ni_addref_locked(ni
, 0);
407 lnet_ni_decref_locked(lnet_ni_t
*ni
, int cpt
)
409 LASSERT(cpt
>= 0 && cpt
< LNET_CPT_NUMBER
);
410 LASSERT(*ni
->ni_refs
[cpt
] > 0);
412 (*ni
->ni_refs
[cpt
])--;
416 lnet_ni_decref(lnet_ni_t
*ni
)
419 lnet_ni_decref_locked(ni
, 0);
423 void lnet_ni_free(lnet_ni_t
*ni
);
426 lnet_nid2peerhash(lnet_nid_t nid
)
428 return hash_long(nid
, LNET_PEER_HASH_BITS
);
431 static inline struct list_head
*
432 lnet_net2rnethash(__u32 net
)
434 return &the_lnet
.ln_remote_nets_hash
[(LNET_NETNUM(net
) +
436 ((1U << the_lnet
.ln_remote_nets_hbits
) - 1)];
439 extern lnd_t the_lolnd
;
440 extern int avoid_asym_router_failure
;
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
);
449 void lnet_fini(void);
451 int lnet_notify(lnet_ni_t
*ni
, lnet_nid_t peer
, int alive
, unsigned long when
);
452 void lnet_notify_locked(lnet_peer_t
*lp
, int notifylnd
, int alive
,
454 int lnet_add_route(__u32 net
, unsigned int hops
, lnet_nid_t gateway_nid
,
455 unsigned int priority
);
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
,
460 lnet_nid_t
*gateway
, __u32
*alive
, __u32
*priority
);
461 void lnet_router_debugfs_init(void);
462 void lnet_router_debugfs_fini(void);
463 int lnet_rtrpools_alloc(int im_a_router
);
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
);
469 lnet_remotenet_t
*lnet_find_net_locked(__u32 net
);
471 int lnet_islocalnid(lnet_nid_t nid
);
472 int lnet_islocalnet(__u32 net
);
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
);
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
);
488 void lnet_schedule_blocked_locked(lnet_rtrbufpool_t
*rbp
);
489 void lnet_drop_routed_msgs_locked(struct list_head
*list
, int cpt
);
491 /* portals functions */
492 /* portals attributes */
494 lnet_ptl_is_lazy(lnet_portal_t
*ptl
)
496 return !!(ptl
->ptl_options
& LNET_PTL_LAZY
);
500 lnet_ptl_is_unique(lnet_portal_t
*ptl
)
502 return !!(ptl
->ptl_options
& LNET_PTL_MATCH_UNIQUE
);
506 lnet_ptl_is_wildcard(lnet_portal_t
*ptl
)
508 return !!(ptl
->ptl_options
& LNET_PTL_MATCH_WILDCARD
);
512 lnet_ptl_setopt(lnet_portal_t
*ptl
, int opt
)
514 ptl
->ptl_options
|= opt
;
518 lnet_ptl_unsetopt(lnet_portal_t
*ptl
, int opt
)
520 ptl
->ptl_options
&= ~opt
;
523 /* match-table functions */
524 struct list_head
*lnet_mt_match_head(struct lnet_match_table
*mtable
,
525 lnet_process_id_t id
, __u64 mbits
);
526 struct lnet_match_table
*lnet_mt_of_attach(unsigned int index
,
527 lnet_process_id_t id
, __u64 mbits
,
530 int lnet_mt_match_md(struct lnet_match_table
*mtable
,
531 struct lnet_match_info
*info
, struct lnet_msg
*msg
);
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
);
539 /* initialized and finalize portals */
540 int lnet_portals_create(void);
541 void lnet_portals_destroy(void);
543 /* message functions */
544 int lnet_parse(lnet_ni_t
*ni
, lnet_hdr_t
*hdr
,
545 lnet_nid_t fromnid
, void *private, int rdma_req
);
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
);
548 lnet_msg_t
*lnet_create_reply_msg(lnet_ni_t
*ni
, lnet_msg_t
*get_msg
);
549 void lnet_set_reply_msg_len(lnet_ni_t
*ni
, lnet_msg_t
*msg
, unsigned int len
);
551 void lnet_finalize(lnet_ni_t
*ni
, lnet_msg_t
*msg
, int rc
);
553 void lnet_drop_delayed_msg_list(struct list_head
*head
, char *reason
);
554 void lnet_recv_delayed_msg_list(struct list_head
*head
);
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);
561 char *lnet_msgtyp2str(int type
);
562 void lnet_print_hdr(lnet_hdr_t
*hdr
);
563 int lnet_fail_nid(lnet_nid_t nid
, unsigned int threshold
);
565 void lnet_counters_get(lnet_counters_t
*counters
);
566 void lnet_counters_reset(void);
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
,
571 unsigned int offset
, unsigned int len
);
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
,
575 int src_niov
, lnet_kiov_t
*src
,
576 unsigned int offset
, unsigned int len
);
578 void lnet_copy_iov2iov(unsigned int ndiov
, struct kvec
*diov
,
579 unsigned int doffset
,
580 unsigned int nsiov
, struct kvec
*siov
,
581 unsigned int soffset
, unsigned int nob
);
582 void lnet_copy_kiov2iov(unsigned int niov
, struct kvec
*iov
,
583 unsigned int iovoffset
,
584 unsigned int nkiov
, lnet_kiov_t
*kiov
,
585 unsigned int kiovoffset
, unsigned int nob
);
586 void lnet_copy_iov2kiov(unsigned int nkiov
, lnet_kiov_t
*kiov
,
587 unsigned int kiovoffset
,
588 unsigned int niov
, struct kvec
*iov
,
589 unsigned int iovoffset
, unsigned int nob
);
590 void lnet_copy_kiov2kiov(unsigned int ndkiov
, lnet_kiov_t
*dkiov
,
591 unsigned int doffset
,
592 unsigned int nskiov
, lnet_kiov_t
*skiov
,
593 unsigned int soffset
, unsigned int nob
);
596 lnet_copy_iov2flat(int dlen
, void *dest
, unsigned int doffset
,
597 unsigned int nsiov
, struct kvec
*siov
, unsigned int soffset
,
600 struct kvec diov
= {/*.iov_base = */ dest
, /*.iov_len = */ dlen
};
602 lnet_copy_iov2iov(1, &diov
, doffset
,
603 nsiov
, siov
, soffset
, nob
);
607 lnet_copy_kiov2flat(int dlen
, void *dest
, unsigned int doffset
,
608 unsigned int nsiov
, lnet_kiov_t
*skiov
,
609 unsigned int soffset
, unsigned int nob
)
611 struct kvec diov
= {/* .iov_base = */ dest
, /* .iov_len = */ dlen
};
613 lnet_copy_kiov2iov(1, &diov
, doffset
,
614 nsiov
, skiov
, soffset
, nob
);
618 lnet_copy_flat2iov(unsigned int ndiov
, struct kvec
*diov
, unsigned int doffset
,
619 int slen
, void *src
, unsigned int soffset
, unsigned int nob
)
621 struct kvec siov
= {/*.iov_base = */ src
, /*.iov_len = */slen
};
623 lnet_copy_iov2iov(ndiov
, diov
, doffset
,
624 1, &siov
, soffset
, nob
);
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
)
632 struct kvec siov
= {/* .iov_base = */ src
, /* .iov_len = */ slen
};
634 lnet_copy_iov2kiov(ndiov
, dkiov
, doffset
,
635 1, &siov
, soffset
, nob
);
638 void lnet_me_unlink(lnet_me_t
*me
);
640 void lnet_md_unlink(lnet_libmd_t
*md
);
641 void lnet_md_deconstruct(lnet_libmd_t
*lmd
, lnet_md_t
*umd
);
643 void lnet_register_lnd(lnd_t
*lnd
);
644 void lnet_unregister_lnd(lnd_t
*lnd
);
646 int lnet_connect(struct socket
**sockp
, lnet_nid_t peer_nid
,
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);
654 int lnet_count_acceptor_nis(void);
655 int lnet_acceptor_port(void);
657 int lnet_acceptor_start(void);
658 void lnet_acceptor_stop(void);
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
);
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
);
676 int lnet_peers_start_down(void);
677 int lnet_peer_buffer_credits(lnet_ni_t
*ni
);
679 int lnet_router_checker_start(void);
680 void lnet_router_checker_stop(void);
681 void lnet_router_ni_update_locked(lnet_peer_t
*gw
, __u32 net
);
682 void lnet_swap_pinginfo(lnet_ping_info_t
*info
);
684 int lnet_ping_target_init(void);
685 void lnet_ping_target_fini(void);
687 int lnet_parse_ip2nets(char **networksp
, char *ip2nets
);
688 int lnet_parse_routes(char *route_str
, int *im_a_router
);
689 int lnet_parse_networks(struct list_head
*nilist
, char *networks
);
691 int lnet_nid2peer_locked(lnet_peer_t
**lpp
, lnet_nid_t nid
, int cpt
);
692 lnet_peer_t
*lnet_find_peer_locked(struct lnet_peer_table
*ptable
,
694 void lnet_peer_tables_cleanup(lnet_ni_t
*ni
);
695 void lnet_peer_tables_destroy(void);
696 int lnet_peer_tables_create(void);
697 void lnet_debug_peer(lnet_nid_t nid
);
700 lnet_peer_set_alive(lnet_peer_t
*lp
)
702 lp
->lp_last_query
= jiffies
;
703 lp
->lp_last_alive
= jiffies
;
705 lnet_notify_locked(lp
, 0, 1, lp
->lp_last_alive
);