linux/drivers/staging/lustre/include/linux/lnet/lib-lnet.h
<<
>>
Prefs
   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
  18 * http://www.gnu.org/licenses/gpl-2.0.html
  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 *
  26 * Copyright (c) 2012, 2015, Intel Corporation.
  27 */
  28/*
  29 * This file is part of Lustre, http://www.lustre.org/
  30 * Lustre is a trademark of Seagate, Inc.
  31 *
  32 * lnet/include/lnet/lib-lnet.h
  33 */
  34
  35#ifndef __LNET_LIB_LNET_H__
  36#define __LNET_LIB_LNET_H__
  37
  38#include "../libcfs/libcfs.h"
  39#include "api.h"
  40#include "lnet.h"
  41#include "lib-types.h"
  42#include "lib-dlc.h"
  43
  44extern lnet_t   the_lnet;       /* THE network */
  45
  46#if (BITS_PER_LONG == 32)
  47/* 2 CPTs, allowing more CPTs might make us under memory pressure */
  48#define LNET_CPT_MAX_BITS       1
  49
  50#else /* 64-bit system */
  51/*
  52 * 256 CPTs for thousands of CPUs, allowing more CPTs might make us
  53 * under risk of consuming all lh_cookie.
  54 */
  55#define LNET_CPT_MAX_BITS       8
  56#endif /* BITS_PER_LONG == 32 */
  57
  58/* max allowed CPT number */
  59#define LNET_CPT_MAX            (1 << LNET_CPT_MAX_BITS)
  60
  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)
  64
  65/** exclusive lock */
  66#define LNET_LOCK_EX            CFS_PERCPT_LOCK_EX
  67
  68static 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
  81static inline int lnet_is_wire_handle_none(lnet_handle_wire_t *wh)
  82{
  83        return (wh->wh_interface_cookie == LNET_WIRE_HANDLE_COOKIE_NONE &&
  84                wh->wh_object_cookie == LNET_WIRE_HANDLE_COOKIE_NONE);
  85}
  86
  87static inline int lnet_md_exhausted(lnet_libmd_t *md)
  88{
  89        return (!md->md_threshold ||
  90                ((md->md_options & LNET_MD_MAX_SIZE) &&
  91                 md->md_offset + md->md_max_size > md->md_length));
  92}
  93
  94static inline int lnet_md_unlinkable(lnet_libmd_t *md)
  95{
  96        /*
  97         * Should unlink md when its refcount is 0 and either:
  98         *  - md has been flagged for deletion (by auto unlink or
  99         *    LNetM[DE]Unlink, in the latter case md may not be exhausted).
 100         *  - auto unlink is on and md is exhausted.
 101         */
 102        if (md->md_refcount)
 103                return 0;
 104
 105        if (md->md_flags & LNET_MD_FLAG_ZOMBIE)
 106                return 1;
 107
 108        return ((md->md_flags & LNET_MD_FLAG_AUTO_UNLINK) &&
 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
 115static inline int
 116lnet_cpt_of_cookie(__u64 cookie)
 117{
 118        unsigned int cpt = (cookie >> LNET_COOKIE_TYPE_BITS) & LNET_CPT_MASK;
 119
 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         */
 124        return cpt < LNET_CPT_NUMBER ? cpt : cpt % LNET_CPT_NUMBER;
 125}
 126
 127static inline void
 128lnet_res_lock(int cpt)
 129{
 130        cfs_percpt_lock(the_lnet.ln_res_lock, cpt);
 131}
 132
 133static inline void
 134lnet_res_unlock(int cpt)
 135{
 136        cfs_percpt_unlock(the_lnet.ln_res_lock, cpt);
 137}
 138
 139static inline int
 140lnet_res_lock_current(void)
 141{
 142        int cpt = lnet_cpt_current();
 143
 144        lnet_res_lock(cpt);
 145        return cpt;
 146}
 147
 148static inline void
 149lnet_net_lock(int cpt)
 150{
 151        cfs_percpt_lock(the_lnet.ln_net_lock, cpt);
 152}
 153
 154static inline void
 155lnet_net_unlock(int cpt)
 156{
 157        cfs_percpt_unlock(the_lnet.ln_net_lock, cpt);
 158}
 159
 160static inline int
 161lnet_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
 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)
 178
 179#define MAX_PORTALS             64
 180
 181static inline lnet_eq_t *
 182lnet_eq_alloc(void)
 183{
 184        lnet_eq_t *eq;
 185
 186        LIBCFS_ALLOC(eq, sizeof(*eq));
 187        return eq;
 188}
 189
 190static inline void
 191lnet_eq_free(lnet_eq_t *eq)
 192{
 193        LIBCFS_FREE(eq, sizeof(*eq));
 194}
 195
 196static inline lnet_libmd_t *
 197lnet_md_alloc(lnet_md_t *umd)
 198{
 199        lnet_libmd_t *md;
 200        unsigned int size;
 201        unsigned int niov;
 202
 203        if (umd->options & LNET_MD_KIOV) {
 204                niov = umd->length;
 205                size = offsetof(lnet_libmd_t, md_iov.kiov[niov]);
 206        } else {
 207                niov = umd->options & LNET_MD_IOVEC ? umd->length : 1;
 208                size = offsetof(lnet_libmd_t, md_iov.iov[niov]);
 209        }
 210
 211        LIBCFS_ALLOC(md, size);
 212
 213        if (md) {
 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
 220        return md;
 221}
 222
 223static inline void
 224lnet_md_free(lnet_libmd_t *md)
 225{
 226        unsigned int size;
 227
 228        if (md->md_options & LNET_MD_KIOV)
 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
 236static inline lnet_me_t *
 237lnet_me_alloc(void)
 238{
 239        lnet_me_t *me;
 240
 241        LIBCFS_ALLOC(me, sizeof(*me));
 242        return me;
 243}
 244
 245static inline void
 246lnet_me_free(lnet_me_t *me)
 247{
 248        LIBCFS_FREE(me, sizeof(*me));
 249}
 250
 251static inline lnet_msg_t *
 252lnet_msg_alloc(void)
 253{
 254        lnet_msg_t *msg;
 255
 256        LIBCFS_ALLOC(msg, sizeof(*msg));
 257
 258        /* no need to zero, LIBCFS_ALLOC does for us */
 259        return msg;
 260}
 261
 262static inline void
 263lnet_msg_free(lnet_msg_t *msg)
 264{
 265        LASSERT(!msg->msg_onactivelist);
 266        LIBCFS_FREE(msg, sizeof(*msg));
 267}
 268
 269lnet_libhandle_t *lnet_res_lh_lookup(struct lnet_res_container *rec,
 270                                     __u64 cookie);
 271void lnet_res_lh_initialize(struct lnet_res_container *rec,
 272                            lnet_libhandle_t *lh);
 273static inline void
 274lnet_res_lh_invalidate(lnet_libhandle_t *lh)
 275{
 276        /* NB: cookie is still useful, don't reset it */
 277        list_del(&lh->lh_hash_chain);
 278}
 279
 280static inline void
 281lnet_eq2handle(lnet_handle_eq_t *handle, lnet_eq_t *eq)
 282{
 283        if (!eq) {
 284                LNetInvalidateHandle(handle);
 285                return;
 286        }
 287
 288        handle->cookie = eq->eq_lh.lh_cookie;
 289}
 290
 291static inline lnet_eq_t *
 292lnet_handle2eq(lnet_handle_eq_t *handle)
 293{
 294        lnet_libhandle_t *lh;
 295
 296        lh = lnet_res_lh_lookup(&the_lnet.ln_eq_container, handle->cookie);
 297        if (!lh)
 298                return NULL;
 299
 300        return lh_entry(lh, lnet_eq_t, eq_lh);
 301}
 302
 303static inline void
 304lnet_md2handle(lnet_handle_md_t *handle, lnet_libmd_t *md)
 305{
 306        handle->cookie = md->md_lh.lh_cookie;
 307}
 308
 309static inline lnet_libmd_t *
 310lnet_handle2md(lnet_handle_md_t *handle)
 311{
 312        /* ALWAYS called with resource lock held */
 313        lnet_libhandle_t *lh;
 314        int cpt;
 315
 316        cpt = lnet_cpt_of_cookie(handle->cookie);
 317        lh = lnet_res_lh_lookup(the_lnet.ln_md_containers[cpt],
 318                                handle->cookie);
 319        if (!lh)
 320                return NULL;
 321
 322        return lh_entry(lh, lnet_libmd_t, md_lh);
 323}
 324
 325static inline lnet_libmd_t *
 326lnet_wire_handle2md(lnet_handle_wire_t *wh)
 327{
 328        /* ALWAYS called with resource lock held */
 329        lnet_libhandle_t *lh;
 330        int cpt;
 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);
 338        if (!lh)
 339                return NULL;
 340
 341        return lh_entry(lh, lnet_libmd_t, md_lh);
 342}
 343
 344static inline void
 345lnet_me2handle(lnet_handle_me_t *handle, lnet_me_t *me)
 346{
 347        handle->cookie = me->me_lh.lh_cookie;
 348}
 349
 350static inline lnet_me_t *
 351lnet_handle2me(lnet_handle_me_t *handle)
 352{
 353        /* ALWAYS called with resource lock held */
 354        lnet_libhandle_t *lh;
 355        int cpt;
 356
 357        cpt = lnet_cpt_of_cookie(handle->cookie);
 358        lh = lnet_res_lh_lookup(the_lnet.ln_me_containers[cpt],
 359                                handle->cookie);
 360        if (!lh)
 361                return NULL;
 362
 363        return lh_entry(lh, lnet_me_t, me_lh);
 364}
 365
 366static inline void
 367lnet_peer_addref_locked(lnet_peer_t *lp)
 368{
 369        LASSERT(lp->lp_refcount > 0);
 370        lp->lp_refcount++;
 371}
 372
 373void lnet_destroy_peer_locked(lnet_peer_t *lp);
 374
 375static inline void
 376lnet_peer_decref_locked(lnet_peer_t *lp)
 377{
 378        LASSERT(lp->lp_refcount > 0);
 379        lp->lp_refcount--;
 380        if (!lp->lp_refcount)
 381                lnet_destroy_peer_locked(lp);
 382}
 383
 384static inline int
 385lnet_isrouter(lnet_peer_t *lp)
 386{
 387        return lp->lp_rtr_refcount ? 1 : 0;
 388}
 389
 390static inline void
 391lnet_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
 399static inline void
 400lnet_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
 407static inline void
 408lnet_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
 416static inline void
 417lnet_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
 424void lnet_ni_free(lnet_ni_t *ni);
 425lnet_ni_t *
 426lnet_ni_alloc(__u32 net, struct cfs_expr_list *el, struct list_head *nilist);
 427
 428static inline int
 429lnet_nid2peerhash(lnet_nid_t nid)
 430{
 431        return hash_long(nid, LNET_PEER_HASH_BITS);
 432}
 433
 434static inline struct list_head *
 435lnet_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
 442extern lnd_t the_lolnd;
 443extern int avoid_asym_router_failure;
 444
 445int lnet_cpt_of_nid_locked(lnet_nid_t nid);
 446int lnet_cpt_of_nid(lnet_nid_t nid);
 447lnet_ni_t *lnet_nid2ni_locked(lnet_nid_t nid, int cpt);
 448lnet_ni_t *lnet_net2ni_locked(__u32 net, int cpt);
 449lnet_ni_t *lnet_net2ni(__u32 net);
 450
 451extern int portal_rotor;
 452
 453int lnet_lib_init(void);
 454void lnet_lib_exit(void);
 455
 456int lnet_notify(lnet_ni_t *ni, lnet_nid_t peer, int alive, unsigned long when);
 457void lnet_notify_locked(lnet_peer_t *lp, int notifylnd, int alive,
 458                        unsigned long when);
 459int lnet_add_route(__u32 net, __u32 hops, lnet_nid_t gateway_nid,
 460                   unsigned int priority);
 461int lnet_check_routes(void);
 462int lnet_del_route(__u32 net, lnet_nid_t gw_nid);
 463void lnet_destroy_routes(void);
 464int lnet_get_route(int idx, __u32 *net, __u32 *hops,
 465                   lnet_nid_t *gateway, __u32 *alive, __u32 *priority);
 466int lnet_get_rtr_pool_cfg(int idx, struct lnet_ioctl_pool_cfg *pool_cfg);
 467
 468void lnet_router_debugfs_init(void);
 469void lnet_router_debugfs_fini(void);
 470int  lnet_rtrpools_alloc(int im_a_router);
 471void lnet_destroy_rtrbuf(lnet_rtrbuf_t *rb, int npages);
 472int lnet_rtrpools_adjust(int tiny, int small, int large);
 473int lnet_rtrpools_enable(void);
 474void lnet_rtrpools_disable(void);
 475void lnet_rtrpools_free(int keep_pools);
 476lnet_remotenet_t *lnet_find_net_locked(__u32 net);
 477int lnet_dyn_add_ni(lnet_pid_t requested_pid,
 478                    struct lnet_ioctl_config_data *conf);
 479int lnet_dyn_del_ni(__u32 net);
 480int lnet_clear_lazy_portal(struct lnet_ni *ni, int portal, char *reason);
 481
 482int lnet_islocalnid(lnet_nid_t nid);
 483int lnet_islocalnet(__u32 net);
 484
 485void lnet_msg_attach_md(lnet_msg_t *msg, lnet_libmd_t *md,
 486                        unsigned int offset, unsigned int mlen);
 487void lnet_msg_detach_md(lnet_msg_t *msg, int status);
 488void lnet_build_unlink_event(lnet_libmd_t *md, lnet_event_t *ev);
 489void lnet_build_msg_event(lnet_msg_t *msg, lnet_event_kind_t ev_type);
 490void lnet_msg_commit(lnet_msg_t *msg, int cpt);
 491void lnet_msg_decommit(lnet_msg_t *msg, int cpt, int status);
 492
 493void lnet_eq_enqueue_event(lnet_eq_t *eq, lnet_event_t *ev);
 494void lnet_prep_send(lnet_msg_t *msg, int type, lnet_process_id_t target,
 495                    unsigned int offset, unsigned int len);
 496int lnet_send(lnet_nid_t nid, lnet_msg_t *msg, lnet_nid_t rtr_nid);
 497void lnet_return_tx_credits_locked(lnet_msg_t *msg);
 498void lnet_return_rx_credits_locked(lnet_msg_t *msg);
 499void lnet_schedule_blocked_locked(lnet_rtrbufpool_t *rbp);
 500void lnet_drop_routed_msgs_locked(struct list_head *list, int cpt);
 501
 502/* portals functions */
 503/* portals attributes */
 504static inline int
 505lnet_ptl_is_lazy(lnet_portal_t *ptl)
 506{
 507        return !!(ptl->ptl_options & LNET_PTL_LAZY);
 508}
 509
 510static inline int
 511lnet_ptl_is_unique(lnet_portal_t *ptl)
 512{
 513        return !!(ptl->ptl_options & LNET_PTL_MATCH_UNIQUE);
 514}
 515
 516static inline int
 517lnet_ptl_is_wildcard(lnet_portal_t *ptl)
 518{
 519        return !!(ptl->ptl_options & LNET_PTL_MATCH_WILDCARD);
 520}
 521
 522static inline void
 523lnet_ptl_setopt(lnet_portal_t *ptl, int opt)
 524{
 525        ptl->ptl_options |= opt;
 526}
 527
 528static inline void
 529lnet_ptl_unsetopt(lnet_portal_t *ptl, int opt)
 530{
 531        ptl->ptl_options &= ~opt;
 532}
 533
 534/* match-table functions */
 535struct list_head *lnet_mt_match_head(struct lnet_match_table *mtable,
 536                                     lnet_process_id_t id, __u64 mbits);
 537struct 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);
 541int 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 */
 545void lnet_ptl_attach_md(lnet_me_t *me, lnet_libmd_t *md,
 546                        struct list_head *matches, struct list_head *drops);
 547void lnet_ptl_detach_md(lnet_me_t *me, lnet_libmd_t *md);
 548int lnet_ptl_match_md(struct lnet_match_info *info, struct lnet_msg *msg);
 549
 550/* initialized and finalize portals */
 551int lnet_portals_create(void);
 552void lnet_portals_destroy(void);
 553
 554/* message functions */
 555int lnet_parse(lnet_ni_t *ni, lnet_hdr_t *hdr,
 556               lnet_nid_t fromnid, void *private, int rdma_req);
 557int lnet_parse_local(lnet_ni_t *ni, lnet_msg_t *msg);
 558int lnet_parse_forward_locked(lnet_ni_t *ni, lnet_msg_t *msg);
 559
 560void lnet_recv(lnet_ni_t *ni, void *private, lnet_msg_t *msg, int delayed,
 561               unsigned int offset, unsigned int mlen, unsigned int rlen);
 562void 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
 566lnet_msg_t *lnet_create_reply_msg(lnet_ni_t *ni, lnet_msg_t *get_msg);
 567void lnet_set_reply_msg_len(lnet_ni_t *ni, lnet_msg_t *msg, unsigned int len);
 568
 569void lnet_finalize(lnet_ni_t *ni, lnet_msg_t *msg, int rc);
 570
 571void lnet_drop_message(lnet_ni_t *ni, int cpt, void *private,
 572                       unsigned int nob);
 573void lnet_drop_delayed_msg_list(struct list_head *head, char *reason);
 574void lnet_recv_delayed_msg_list(struct list_head *head);
 575
 576int lnet_msg_container_setup(struct lnet_msg_container *container, int cpt);
 577void lnet_msg_container_cleanup(struct lnet_msg_container *container);
 578void lnet_msg_containers_destroy(void);
 579int lnet_msg_containers_create(void);
 580
 581char *lnet_msgtyp2str(int type);
 582void lnet_print_hdr(lnet_hdr_t *hdr);
 583int lnet_fail_nid(lnet_nid_t nid, unsigned int threshold);
 584
 585/** \addtogroup lnet_fault_simulation @{ */
 586
 587int lnet_fault_ctl(int cmd, struct libcfs_ioctl_data *data);
 588int lnet_fault_init(void);
 589void lnet_fault_fini(void);
 590
 591bool lnet_drop_rule_match(lnet_hdr_t *hdr);
 592
 593int lnet_delay_rule_add(struct lnet_fault_attr *attr);
 594int lnet_delay_rule_del(lnet_nid_t src, lnet_nid_t dst, bool shutdown);
 595int lnet_delay_rule_list(int pos, struct lnet_fault_attr *attr,
 596                         struct lnet_fault_stat *stat);
 597void lnet_delay_rule_reset(void);
 598void lnet_delay_rule_check(void);
 599bool lnet_delay_rule_match_locked(lnet_hdr_t *hdr, struct lnet_msg *msg);
 600
 601/** @} lnet_fault_simulation */
 602
 603void lnet_counters_get(lnet_counters_t *counters);
 604void lnet_counters_reset(void);
 605
 606unsigned int lnet_iov_nob(unsigned int niov, struct kvec *iov);
 607int lnet_extract_iov(int dst_niov, struct kvec *dst,
 608                     int src_niov, const struct kvec *src,
 609                      unsigned int offset, unsigned int len);
 610
 611unsigned int lnet_kiov_nob(unsigned int niov, lnet_kiov_t *iov);
 612int lnet_extract_kiov(int dst_niov, lnet_kiov_t *dst,
 613                      int src_niov, const lnet_kiov_t *src,
 614                      unsigned int offset, unsigned int len);
 615
 616void lnet_copy_iov2iter(struct iov_iter *to,
 617                        unsigned int nsiov, const struct kvec *siov,
 618                        unsigned int soffset, unsigned int nob);
 619void lnet_copy_kiov2iter(struct iov_iter *to,
 620                         unsigned int nkiov, const lnet_kiov_t *kiov,
 621                         unsigned int kiovoffset, unsigned int nob);
 622
 623void lnet_me_unlink(lnet_me_t *me);
 624
 625void lnet_md_unlink(lnet_libmd_t *md);
 626void lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd);
 627
 628void lnet_register_lnd(lnd_t *lnd);
 629void lnet_unregister_lnd(lnd_t *lnd);
 630
 631int lnet_connect(struct socket **sockp, lnet_nid_t peer_nid,
 632                 __u32 local_ip, __u32 peer_ip, int peer_port);
 633void lnet_connect_console_error(int rc, lnet_nid_t peer_nid,
 634                                __u32 peer_ip, int port);
 635int lnet_count_acceptor_nis(void);
 636int lnet_acceptor_timeout(void);
 637int lnet_acceptor_port(void);
 638
 639int lnet_count_acceptor_nis(void);
 640int lnet_acceptor_port(void);
 641
 642int lnet_acceptor_start(void);
 643void lnet_acceptor_stop(void);
 644
 645int lnet_ipif_query(char *name, int *up, __u32 *ip, __u32 *mask);
 646int lnet_ipif_enumerate(char ***names);
 647void lnet_ipif_free_enumeration(char **names, int n);
 648int lnet_sock_setbuf(struct socket *socket, int txbufsize, int rxbufsize);
 649int lnet_sock_getbuf(struct socket *socket, int *txbufsize, int *rxbufsize);
 650int lnet_sock_getaddr(struct socket *socket, bool remote, __u32 *ip, int *port);
 651int lnet_sock_write(struct socket *sock, void *buffer, int nob, int timeout);
 652int lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout);
 653
 654int lnet_sock_listen(struct socket **sockp, __u32 ip, int port, int backlog);
 655int lnet_sock_accept(struct socket **newsockp, struct socket *sock);
 656int lnet_sock_connect(struct socket **sockp, int *fatal,
 657                      __u32 local_ip, int local_port,
 658                      __u32 peer_ip, int peer_port);
 659void libcfs_sock_release(struct socket *sock);
 660
 661int lnet_peers_start_down(void);
 662int lnet_peer_buffer_credits(lnet_ni_t *ni);
 663
 664int lnet_router_checker_start(void);
 665void lnet_router_checker_stop(void);
 666void lnet_router_ni_update_locked(lnet_peer_t *gw, __u32 net);
 667void lnet_swap_pinginfo(lnet_ping_info_t *info);
 668
 669int lnet_parse_ip2nets(char **networksp, char *ip2nets);
 670int lnet_parse_routes(char *route_str, int *im_a_router);
 671int lnet_parse_networks(struct list_head *nilist, char *networks);
 672int lnet_net_unique(__u32 net, struct list_head *nilist);
 673
 674int lnet_nid2peer_locked(lnet_peer_t **lpp, lnet_nid_t nid, int cpt);
 675lnet_peer_t *lnet_find_peer_locked(struct lnet_peer_table *ptable,
 676                                   lnet_nid_t nid);
 677void lnet_peer_tables_cleanup(lnet_ni_t *ni);
 678void lnet_peer_tables_destroy(void);
 679int lnet_peer_tables_create(void);
 680void lnet_debug_peer(lnet_nid_t nid);
 681int 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);
 687
 688static inline void
 689lnet_peer_set_alive(lnet_peer_t *lp)
 690{
 691        lp->lp_last_query = jiffies;
 692        lp->lp_last_alive = jiffies;
 693        if (!lp->lp_alive)
 694                lnet_notify_locked(lp, 0, 1, lp->lp_last_alive);
 695}
 696
 697#endif
 698