linux/drivers/staging/lustre/include/linux/lnet/lib-types.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.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 *
  36 * lnet/include/lnet/lib-types.h
  37 *
  38 * Types used by the library side routines that do not need to be
  39 * exposed to the user application
  40 */
  41
  42#ifndef __LNET_LIB_TYPES_H__
  43#define __LNET_LIB_TYPES_H__
  44
  45#include <linux/lnet/linux/lib-types.h>
  46
  47#include <linux/libcfs/libcfs.h>
  48#include <linux/list.h>
  49#include <linux/lnet/types.h>
  50
  51#define WIRE_ATTR       __attribute__((packed))
  52
  53/* Packed version of lnet_process_id_t to transfer via network */
  54typedef struct {
  55        lnet_nid_t nid;
  56        lnet_pid_t pid;   /* node id / process id */
  57} WIRE_ATTR lnet_process_id_packed_t;
  58
  59/* The wire handle's interface cookie only matches one network interface in
  60 * one epoch (i.e. new cookie when the interface restarts or the node
  61 * reboots).  The object cookie only matches one object on that interface
  62 * during that object's lifetime (i.e. no cookie re-use). */
  63typedef struct {
  64        __u64 wh_interface_cookie;
  65        __u64 wh_object_cookie;
  66} WIRE_ATTR lnet_handle_wire_t;
  67
  68typedef enum {
  69        LNET_MSG_ACK = 0,
  70        LNET_MSG_PUT,
  71        LNET_MSG_GET,
  72        LNET_MSG_REPLY,
  73        LNET_MSG_HELLO,
  74} lnet_msg_type_t;
  75
  76/* The variant fields of the portals message header are aligned on an 8
  77 * byte boundary in the message header.  Note that all types used in these
  78 * wire structs MUST be fixed size and the smaller types are placed at the
  79 * end. */
  80typedef struct lnet_ack {
  81        lnet_handle_wire_t  dst_wmd;
  82        __u64          match_bits;
  83        __u32          mlength;
  84} WIRE_ATTR lnet_ack_t;
  85
  86typedef struct lnet_put {
  87        lnet_handle_wire_t  ack_wmd;
  88        __u64          match_bits;
  89        __u64          hdr_data;
  90        __u32          ptl_index;
  91        __u32          offset;
  92} WIRE_ATTR lnet_put_t;
  93
  94typedef struct lnet_get {
  95        lnet_handle_wire_t  return_wmd;
  96        __u64          match_bits;
  97        __u32          ptl_index;
  98        __u32          src_offset;
  99        __u32          sink_length;
 100} WIRE_ATTR lnet_get_t;
 101
 102typedef struct lnet_reply {
 103        lnet_handle_wire_t  dst_wmd;
 104} WIRE_ATTR lnet_reply_t;
 105
 106typedef struct lnet_hello {
 107        __u64         incarnation;
 108        __u32         type;
 109} WIRE_ATTR lnet_hello_t;
 110
 111typedef struct {
 112        lnet_nid_t        dest_nid;
 113        lnet_nid_t        src_nid;
 114        lnet_pid_t        dest_pid;
 115        lnet_pid_t        src_pid;
 116        __u32          type;           /* lnet_msg_type_t */
 117        __u32          payload_length;     /* payload data to follow */
 118        /*<------__u64 aligned------->*/
 119        union {
 120                lnet_ack_t   ack;
 121                lnet_put_t   put;
 122                lnet_get_t   get;
 123                lnet_reply_t reply;
 124                lnet_hello_t hello;
 125        } msg;
 126} WIRE_ATTR lnet_hdr_t;
 127
 128/* A HELLO message contains a magic number and protocol version
 129 * code in the header's dest_nid, the peer's NID in the src_nid, and
 130 * LNET_MSG_HELLO in the type field.  All other common fields are zero
 131 * (including payload_size; i.e. no payload).
 132 * This is for use by byte-stream LNDs (e.g. TCP/IP) to check the peer is
 133 * running the same protocol and to find out its NID. These LNDs should
 134 * exchange HELLO messages when a connection is first established.  Individual
 135 * LNDs can put whatever else they fancy in lnet_hdr_t::msg.
 136 */
 137typedef struct {
 138        __u32   magic;                    /* LNET_PROTO_TCP_MAGIC */
 139        __u16   version_major;            /* increment on incompatible change */
 140        __u16   version_minor;            /* increment on compatible change */
 141} WIRE_ATTR lnet_magicversion_t;
 142
 143/* PROTO MAGIC for LNDs */
 144#define LNET_PROTO_IB_MAGIC              0x0be91b91
 145#define LNET_PROTO_RA_MAGIC              0x0be91b92
 146#define LNET_PROTO_QSW_MAGIC            0x0be91b93
 147#define LNET_PROTO_GNI_MAGIC            0xb00fbabe /* ask Kim */
 148#define LNET_PROTO_TCP_MAGIC            0xeebc0ded
 149#define LNET_PROTO_PTL_MAGIC            0x50746C4E /* 'PtlN' unique magic */
 150#define LNET_PROTO_MX_MAGIC              0x4d583130 /* 'MX10'! */
 151#define LNET_PROTO_ACCEPTOR_MAGIC          0xacce7100
 152#define LNET_PROTO_PING_MAGIC          0x70696E67 /* 'ping' */
 153
 154/* Placeholder for a future "unified" protocol across all LNDs */
 155/* Current LNDs that receive a request with this magic will respond with a
 156 * "stub" reply using their current protocol */
 157#define LNET_PROTO_MAGIC                    0x45726963 /* ! */
 158
 159
 160#define LNET_PROTO_TCP_VERSION_MAJOR    1
 161#define LNET_PROTO_TCP_VERSION_MINOR    0
 162
 163/* Acceptor connection request */
 164typedef struct {
 165        __u32       acr_magic;            /* PTL_ACCEPTOR_PROTO_MAGIC */
 166        __u32       acr_version;                /* protocol version */
 167        __u64       acr_nid;                /* target NID */
 168} WIRE_ATTR lnet_acceptor_connreq_t;
 169
 170#define LNET_PROTO_ACCEPTOR_VERSION       1
 171
 172/* forward refs */
 173struct lnet_libmd;
 174
 175typedef struct lnet_msg {
 176        struct list_head            msg_activelist;
 177        struct list_head            msg_list;      /* Q for credits/MD */
 178
 179        lnet_process_id_t     msg_target;
 180        /* where is it from, it's only for building event */
 181        lnet_nid_t              msg_from;
 182        __u32                   msg_type;
 183
 184        /* commited for sending */
 185        unsigned int            msg_tx_committed:1;
 186        /* CPT # this message committed for sending */
 187        unsigned int            msg_tx_cpt:15;
 188        /* commited for receiving */
 189        unsigned int            msg_rx_committed:1;
 190        /* CPT # this message committed for receiving */
 191        unsigned int            msg_rx_cpt:15;
 192        /* queued for tx credit */
 193        unsigned int            msg_tx_delayed:1;
 194        /* queued for RX buffer */
 195        unsigned int            msg_rx_delayed:1;
 196        /* ready for pending on RX delay list */
 197        unsigned int            msg_rx_ready_delay:1;
 198
 199        unsigned int      msg_vmflush:1;      /* VM trying to free memory */
 200        unsigned int      msg_target_is_router:1; /* sending to a router */
 201        unsigned int      msg_routing:1;      /* being forwarded */
 202        unsigned int      msg_ack:1;      /* ack on finalize (PUT) */
 203        unsigned int      msg_sending:1;      /* outgoing message */
 204        unsigned int      msg_receiving:1;    /* being received */
 205        unsigned int      msg_txcredit:1;     /* taken an NI send credit */
 206        unsigned int      msg_peertxcredit:1; /* taken a peer send credit */
 207        unsigned int      msg_rtrcredit:1;    /* taken a globel router credit */
 208        unsigned int      msg_peerrtrcredit:1; /* taken a peer router credit */
 209        unsigned int      msg_onactivelist:1; /* on the activelist */
 210
 211        struct lnet_peer     *msg_txpeer;        /* peer I'm sending to */
 212        struct lnet_peer     *msg_rxpeer;        /* peer I received from */
 213
 214        void             *msg_private;
 215        struct lnet_libmd    *msg_md;
 216
 217        unsigned int      msg_len;
 218        unsigned int      msg_wanted;
 219        unsigned int      msg_offset;
 220        unsigned int      msg_niov;
 221        struct iovec     *msg_iov;
 222        lnet_kiov_t       *msg_kiov;
 223
 224        lnet_event_t      msg_ev;
 225        lnet_hdr_t          msg_hdr;
 226} lnet_msg_t;
 227
 228
 229typedef struct lnet_libhandle {
 230        struct list_head            lh_hash_chain;
 231        __u64            lh_cookie;
 232} lnet_libhandle_t;
 233
 234#define lh_entry(ptr, type, member) \
 235        ((type *)((char *)(ptr)-(char *)(&((type *)0)->member)))
 236
 237typedef struct lnet_eq {
 238        struct list_head                eq_list;
 239        lnet_libhandle_t        eq_lh;
 240        lnet_seq_t              eq_enq_seq;
 241        lnet_seq_t              eq_deq_seq;
 242        unsigned int            eq_size;
 243        lnet_eq_handler_t       eq_callback;
 244        lnet_event_t            *eq_events;
 245        int                     **eq_refs;      /* percpt refcount for EQ */
 246} lnet_eq_t;
 247
 248typedef struct lnet_me {
 249        struct list_head             me_list;
 250        lnet_libhandle_t       me_lh;
 251        lnet_process_id_t      me_match_id;
 252        unsigned int       me_portal;
 253        unsigned int       me_pos;              /* hash offset in mt_hash */
 254        __u64             me_match_bits;
 255        __u64             me_ignore_bits;
 256        lnet_unlink_t     me_unlink;
 257        struct lnet_libmd     *me_md;
 258} lnet_me_t;
 259
 260typedef struct lnet_libmd {
 261        struct list_head            md_list;
 262        lnet_libhandle_t      md_lh;
 263        lnet_me_t           *md_me;
 264        char             *md_start;
 265        unsigned int      md_offset;
 266        unsigned int      md_length;
 267        unsigned int      md_max_size;
 268        int                md_threshold;
 269        int                md_refcount;
 270        unsigned int      md_options;
 271        unsigned int      md_flags;
 272        void             *md_user_ptr;
 273        lnet_eq_t           *md_eq;
 274        unsigned int      md_niov;              /* # frags */
 275        union {
 276                struct iovec  iov[LNET_MAX_IOV];
 277                lnet_kiov_t   kiov[LNET_MAX_IOV];
 278        } md_iov;
 279} lnet_libmd_t;
 280
 281#define LNET_MD_FLAG_ZOMBIE        (1 << 0)
 282#define LNET_MD_FLAG_AUTO_UNLINK      (1 << 1)
 283
 284#ifdef LNET_USE_LIB_FREELIST
 285typedef struct
 286{
 287        void              *fl_objs;       /* single contiguous array of objects */
 288        int                 fl_nobjs;    /* the number of them */
 289        int                 fl_objsize;       /* the size (including overhead) of each of them */
 290        struct list_head             fl_list;     /* where they are enqueued */
 291} lnet_freelist_t;
 292
 293typedef struct
 294{
 295        struct list_head             fo_list;        /* enqueue on fl_list */
 296        void              *fo_contents;  /* aligned contents */
 297} lnet_freeobj_t;
 298#endif
 299
 300typedef struct {
 301        /* info about peers we are trying to fail */
 302        struct list_head             tp_list;        /* ln_test_peers */
 303        lnet_nid_t           tp_nid;          /* matching nid */
 304        unsigned int       tp_threshold;        /* # failures to simulate */
 305} lnet_test_peer_t;
 306
 307#define LNET_COOKIE_TYPE_MD    1
 308#define LNET_COOKIE_TYPE_ME    2
 309#define LNET_COOKIE_TYPE_EQ    3
 310#define LNET_COOKIE_TYPE_BITS  2
 311#define LNET_COOKIE_MASK        ((1ULL << LNET_COOKIE_TYPE_BITS) - 1ULL)
 312
 313struct lnet_ni;                           /* forward ref */
 314
 315typedef struct lnet_lnd
 316{
 317        /* fields managed by portals */
 318        struct list_head            lnd_list;        /* stash in the LND table */
 319        int                lnd_refcount;         /* # active instances */
 320
 321        /* fields initialised by the LND */
 322        unsigned int      lnd_type;
 323
 324        int  (*lnd_startup) (struct lnet_ni *ni);
 325        void (*lnd_shutdown) (struct lnet_ni *ni);
 326        int  (*lnd_ctl)(struct lnet_ni *ni, unsigned int cmd, void *arg);
 327
 328        /* In data movement APIs below, payload buffers are described as a set
 329         * of 'niov' fragments which are...
 330         * EITHER
 331         *    in virtual memory (struct iovec *iov != NULL)
 332         * OR
 333         *    in pages (kernel only: plt_kiov_t *kiov != NULL).
 334         * The LND may NOT overwrite these fragment descriptors.
 335         * An 'offset' and may specify a byte offset within the set of
 336         * fragments to start from
 337         */
 338
 339        /* Start sending a preformatted message.  'private' is NULL for PUT and
 340         * GET messages; otherwise this is a response to an incoming message
 341         * and 'private' is the 'private' passed to lnet_parse().  Return
 342         * non-zero for immediate failure, otherwise complete later with
 343         * lnet_finalize() */
 344        int (*lnd_send)(struct lnet_ni *ni, void *private, lnet_msg_t *msg);
 345
 346        /* Start receiving 'mlen' bytes of payload data, skipping the following
 347         * 'rlen' - 'mlen' bytes. 'private' is the 'private' passed to
 348         * lnet_parse().  Return non-zero for immedaite failure, otherwise
 349         * complete later with lnet_finalize().  This also gives back a receive
 350         * credit if the LND does flow control. */
 351        int (*lnd_recv)(struct lnet_ni *ni, void *private, lnet_msg_t *msg,
 352                        int delayed, unsigned int niov,
 353                        struct iovec *iov, lnet_kiov_t *kiov,
 354                        unsigned int offset, unsigned int mlen, unsigned int rlen);
 355
 356        /* lnet_parse() has had to delay processing of this message
 357         * (e.g. waiting for a forwarding buffer or send credits).  Give the
 358         * LND a chance to free urgently needed resources.  If called, return 0
 359         * for success and do NOT give back a receive credit; that has to wait
 360         * until lnd_recv() gets called.  On failure return < 0 and
 361         * release resources; lnd_recv() will not be called. */
 362        int (*lnd_eager_recv)(struct lnet_ni *ni, void *private, lnet_msg_t *msg,
 363                              void **new_privatep);
 364
 365        /* notification of peer health */
 366        void (*lnd_notify)(struct lnet_ni *ni, lnet_nid_t peer, int alive);
 367
 368        /* query of peer aliveness */
 369        void (*lnd_query)(struct lnet_ni *ni, lnet_nid_t peer, cfs_time_t *when);
 370
 371        /* accept a new connection */
 372        int (*lnd_accept)(struct lnet_ni *ni, socket_t *sock);
 373
 374} lnd_t;
 375
 376#define LNET_NI_STATUS_UP      0x15aac0de
 377#define LNET_NI_STATUS_DOWN    0xdeadface
 378#define LNET_NI_STATUS_INVALID 0x00000000
 379typedef struct {
 380        lnet_nid_t ns_nid;
 381        __u32      ns_status;
 382        __u32      ns_unused;
 383} WIRE_ATTR lnet_ni_status_t;
 384
 385struct lnet_tx_queue {
 386        int                     tq_credits;     /* # tx credits free */
 387        int                     tq_credits_min; /* lowest it's been */
 388        int                     tq_credits_max; /* total # tx credits */
 389        struct list_head                tq_delayed;     /* delayed TXs */
 390};
 391
 392#define LNET_MAX_INTERFACES   16
 393
 394typedef struct lnet_ni {
 395        spinlock_t              ni_lock;
 396        struct list_head                ni_list;        /* chain on ln_nis */
 397        struct list_head                ni_cptlist;     /* chain on ln_nis_cpt */
 398        int                     ni_maxtxcredits; /* # tx credits  */
 399        /* # per-peer send credits */
 400        int                     ni_peertxcredits;
 401        /* # per-peer router buffer credits */
 402        int                     ni_peerrtrcredits;
 403        /* seconds to consider peer dead */
 404        int                     ni_peertimeout;
 405        int                     ni_ncpts;       /* number of CPTs */
 406        __u32                   *ni_cpts;       /* bond NI on some CPTs */
 407        lnet_nid_t              ni_nid;         /* interface's NID */
 408        void                    *ni_data;       /* instance-specific data */
 409        lnd_t                   *ni_lnd;        /* procedural interface */
 410        struct lnet_tx_queue    **ni_tx_queues; /* percpt TX queues */
 411        int                     **ni_refs;      /* percpt reference count */
 412        long                    ni_last_alive;  /* when I was last alive */
 413        lnet_ni_status_t        *ni_status;     /* my health status */
 414        /* equivalent interfaces to use */
 415        char                    *ni_interfaces[LNET_MAX_INTERFACES];
 416} lnet_ni_t;
 417
 418#define LNET_PROTO_PING_MATCHBITS       0x8000000000000000LL
 419
 420/* NB: value of these features equal to LNET_PROTO_PING_VERSION_x
 421 * of old LNet, so there shouldn't be any compatibility issue */
 422#define LNET_PING_FEAT_INVAL            (0)             /* no feature */
 423#define LNET_PING_FEAT_BASE             (1 << 0)        /* just a ping */
 424#define LNET_PING_FEAT_NI_STATUS        (1 << 1)        /* return NI status */
 425
 426#define LNET_PING_FEAT_MASK             (LNET_PING_FEAT_BASE | \
 427                                         LNET_PING_FEAT_NI_STATUS)
 428
 429typedef struct {
 430        __u32                   pi_magic;
 431        __u32                   pi_features;
 432        lnet_pid_t              pi_pid;
 433        __u32                   pi_nnis;
 434        lnet_ni_status_t        pi_ni[0];
 435} WIRE_ATTR lnet_ping_info_t;
 436
 437/* router checker data, per router */
 438#define LNET_MAX_RTR_NIS   16
 439#define LNET_PINGINFO_SIZE offsetof(lnet_ping_info_t, pi_ni[LNET_MAX_RTR_NIS])
 440typedef struct {
 441        /* chain on the_lnet.ln_zombie_rcd or ln_deathrow_rcd */
 442        struct list_head                rcd_list;
 443        lnet_handle_md_t        rcd_mdh;        /* ping buffer MD */
 444        struct lnet_peer        *rcd_gateway;   /* reference to gateway */
 445        lnet_ping_info_t        *rcd_pinginfo;  /* ping buffer */
 446} lnet_rc_data_t;
 447
 448typedef struct lnet_peer {
 449        struct list_head        lp_hashlist;      /* chain on peer hash */
 450        struct list_head        lp_txq;        /* messages blocking for tx credits */
 451        struct list_head        lp_rtrq;              /* messages blocking for router credits */
 452        struct list_head        lp_rtr_list;      /* chain on router list */
 453        int            lp_txcredits;     /* # tx credits available */
 454        int            lp_mintxcredits;      /* low water mark */
 455        int            lp_rtrcredits;   /* # router credits */
 456        int            lp_minrtrcredits;     /* low water mark */
 457        unsigned int      lp_alive:1;      /* alive/dead? */
 458        unsigned int      lp_notify:1;    /* notification outstanding? */
 459        unsigned int      lp_notifylnd:1;       /* outstanding notification for LND? */
 460        unsigned int      lp_notifying:1;       /* some thread is handling notification */
 461        unsigned int      lp_ping_notsent;      /* SEND event outstanding from ping */
 462        int            lp_alive_count;       /* # times router went dead<->alive */
 463        long          lp_txqnob;            /* bytes queued for sending */
 464        cfs_time_t      lp_timestamp;    /* time of last aliveness news */
 465        cfs_time_t      lp_ping_timestamp;    /* time of last ping attempt */
 466        cfs_time_t      lp_ping_deadline;     /* != 0 if ping reply expected */
 467        cfs_time_t      lp_last_alive;  /* when I was last alive */
 468        cfs_time_t      lp_last_query;  /* when lp_ni was queried last time */
 469        lnet_ni_t       *lp_ni;         /* interface peer is on */
 470        lnet_nid_t      lp_nid;        /* peer's NID */
 471        int            lp_refcount;       /* # refs */
 472        int                     lp_cpt;         /* CPT this peer attached on */
 473        /* # refs from lnet_route_t::lr_gateway */
 474        int                     lp_rtr_refcount;
 475        /* returned RC ping features */
 476        unsigned int            lp_ping_feats;
 477        struct list_head                lp_routes;      /* routers on this peer */
 478        lnet_rc_data_t          *lp_rcd;        /* router checker state */
 479} lnet_peer_t;
 480
 481
 482/* peer hash size */
 483#define LNET_PEER_HASH_BITS     9
 484#define LNET_PEER_HASH_SIZE     (1 << LNET_PEER_HASH_BITS)
 485
 486/* peer hash table */
 487struct lnet_peer_table {
 488        int                     pt_version;     /* /proc validity stamp */
 489        int                     pt_number;      /* # peers extant */
 490        struct list_head                pt_deathrow;    /* zombie peers */
 491        struct list_head                *pt_hash;       /* NID->peer hash */
 492};
 493
 494/* peer aliveness is enabled only on routers for peers in a network where the
 495 * lnet_ni_t::ni_peertimeout has been set to a positive value */
 496#define lnet_peer_aliveness_enabled(lp) (the_lnet.ln_routing != 0 && \
 497                                         (lp)->lp_ni->ni_peertimeout > 0)
 498
 499typedef struct {
 500        struct list_head                lr_list;        /* chain on net */
 501        struct list_head                lr_gwlist;      /* chain on gateway */
 502        lnet_peer_t             *lr_gateway;    /* router node */
 503        __u32                   lr_net;         /* remote network number */
 504        int                     lr_seq;         /* sequence for round-robin */
 505        unsigned int            lr_downis;      /* number of down NIs */
 506        unsigned int            lr_hops;        /* how far I am */
 507} lnet_route_t;
 508
 509#define LNET_REMOTE_NETS_HASH_DEFAULT   (1U << 7)
 510#define LNET_REMOTE_NETS_HASH_MAX       (1U << 16)
 511#define LNET_REMOTE_NETS_HASH_SIZE      (1 << the_lnet.ln_remote_nets_hbits)
 512
 513typedef struct {
 514        struct list_head              lrn_list;       /* chain on ln_remote_nets_hash */
 515        struct list_head              lrn_routes;     /* routes to me */
 516        __u32              lrn_net;     /* my net number */
 517} lnet_remotenet_t;
 518
 519typedef struct {
 520        struct list_head rbp_bufs;           /* my free buffer pool */
 521        struct list_head rbp_msgs;           /* messages blocking for a buffer */
 522        int     rbp_npages;        /* # pages in each buffer */
 523        int     rbp_nbuffers;    /* # buffers */
 524        int     rbp_credits;      /* # free buffers / blocked messages */
 525        int     rbp_mincredits;       /* low water mark */
 526} lnet_rtrbufpool_t;
 527
 528typedef struct {
 529        struct list_head             rb_list;        /* chain on rbp_bufs */
 530        lnet_rtrbufpool_t     *rb_pool;      /* owning pool */
 531        lnet_kiov_t         rb_kiov[0];   /* the buffer space */
 532} lnet_rtrbuf_t;
 533
 534typedef struct {
 535        __u32   msgs_alloc;
 536        __u32   msgs_max;
 537        __u32   errors;
 538        __u32   send_count;
 539        __u32   recv_count;
 540        __u32   route_count;
 541        __u32   drop_count;
 542        __u64   send_length;
 543        __u64   recv_length;
 544        __u64   route_length;
 545        __u64   drop_length;
 546} WIRE_ATTR lnet_counters_t;
 547
 548#define LNET_PEER_HASHSIZE   503                /* prime! */
 549
 550#define LNET_NRBPOOLS    3               /* # different router buffer pools */
 551
 552enum {
 553        /* Didn't match anything */
 554        LNET_MATCHMD_NONE       = (1 << 0),
 555        /* Matched OK */
 556        LNET_MATCHMD_OK         = (1 << 1),
 557        /* Must be discarded */
 558        LNET_MATCHMD_DROP       = (1 << 2),
 559        /* match and buffer is exhausted */
 560        LNET_MATCHMD_EXHAUSTED  = (1 << 3),
 561        /* match or drop */
 562        LNET_MATCHMD_FINISH     = (LNET_MATCHMD_OK | LNET_MATCHMD_DROP),
 563};
 564
 565/* Options for lnet_portal_t::ptl_options */
 566#define LNET_PTL_LAZY          (1 << 0)
 567#define LNET_PTL_MATCH_UNIQUE       (1 << 1)    /* unique match, for RDMA */
 568#define LNET_PTL_MATCH_WILDCARD     (1 << 2)    /* wildcard match, request portal */
 569
 570/* parameter for matching operations (GET, PUT) */
 571struct lnet_match_info {
 572        __u64                   mi_mbits;
 573        lnet_process_id_t       mi_id;
 574        unsigned int            mi_opc;
 575        unsigned int            mi_portal;
 576        unsigned int            mi_rlength;
 577        unsigned int            mi_roffset;
 578};
 579
 580/* ME hash of RDMA portal */
 581#define LNET_MT_HASH_BITS               8
 582#define LNET_MT_HASH_SIZE               (1 << LNET_MT_HASH_BITS)
 583#define LNET_MT_HASH_MASK               (LNET_MT_HASH_SIZE - 1)
 584/* we allocate (LNET_MT_HASH_SIZE + 1) entries for lnet_match_table::mt_hash,
 585 * the last entry is reserved for MEs with ignore-bits */
 586#define LNET_MT_HASH_IGNORE             LNET_MT_HASH_SIZE
 587/* __u64 has 2^6 bits, so need 2^(LNET_MT_HASH_BITS - LNET_MT_BITS_U64) which
 588 * is 4 __u64s as bit-map, and add an extra __u64 (only use one bit) for the
 589 * ME-list with ignore-bits, which is mtable::mt_hash[LNET_MT_HASH_IGNORE] */
 590#define LNET_MT_BITS_U64                6       /* 2^6 bits */
 591#define LNET_MT_EXHAUSTED_BITS          (LNET_MT_HASH_BITS - LNET_MT_BITS_U64)
 592#define LNET_MT_EXHAUSTED_BMAP          ((1 << LNET_MT_EXHAUSTED_BITS) + 1)
 593
 594/* portal match table */
 595struct lnet_match_table {
 596        /* reserved for upcoming patches, CPU partition ID */
 597        unsigned int            mt_cpt;
 598        unsigned int            mt_portal;      /* portal index */
 599        /* match table is set as "enabled" if there's non-exhausted MD
 600         * attached on mt_mhash, it's only valide for wildcard portal */
 601        unsigned int            mt_enabled;
 602        /* bitmap to flag whether MEs on mt_hash are exhausted or not */
 603        __u64                   mt_exhausted[LNET_MT_EXHAUSTED_BMAP];
 604        struct list_head                *mt_mhash;      /* matching hash */
 605};
 606
 607/* these are only useful for wildcard portal */
 608/* Turn off message rotor for wildcard portals */
 609#define LNET_PTL_ROTOR_OFF      0
 610/* round-robin dispatch all PUT messages for wildcard portals */
 611#define LNET_PTL_ROTOR_ON       1
 612/* round-robin dispatch routed PUT message for wildcard portals */
 613#define LNET_PTL_ROTOR_RR_RT    2
 614/* dispatch routed PUT message by hashing source NID for wildcard portals */
 615#define LNET_PTL_ROTOR_HASH_RT  3
 616
 617typedef struct lnet_portal {
 618        spinlock_t              ptl_lock;
 619        unsigned int            ptl_index;      /* portal ID, reserved */
 620        /* flags on this portal: lazy, unique... */
 621        unsigned int            ptl_options;
 622        /* list of messags which are stealing buffer */
 623        struct list_head                ptl_msg_stealing;
 624        /* messages blocking for MD */
 625        struct list_head                ptl_msg_delayed;
 626        /* Match table for each CPT */
 627        struct lnet_match_table **ptl_mtables;
 628        /* spread rotor of incoming "PUT" */
 629        int                     ptl_rotor;
 630        /* # active entries for this portal */
 631        int                  ptl_mt_nmaps;
 632        /* array of active entries' cpu-partition-id */
 633        int                  ptl_mt_maps[0];
 634} lnet_portal_t;
 635
 636#define LNET_LH_HASH_BITS       12
 637#define LNET_LH_HASH_SIZE       (1ULL << LNET_LH_HASH_BITS)
 638#define LNET_LH_HASH_MASK       (LNET_LH_HASH_SIZE - 1)
 639
 640/* resource container (ME, MD, EQ) */
 641struct lnet_res_container {
 642        unsigned int            rec_type;       /* container type */
 643        __u64                   rec_lh_cookie;  /* cookie generator */
 644        struct list_head                rec_active;     /* active resource list */
 645        struct list_head                *rec_lh_hash;   /* handle hash */
 646#ifdef LNET_USE_LIB_FREELIST
 647        lnet_freelist_t         rec_freelist;   /* freelist for resources */
 648#endif
 649};
 650
 651/* message container */
 652struct lnet_msg_container {
 653        int                     msc_init;       /* initialized or not */
 654        /* max # threads finalizing */
 655        int                     msc_nfinalizers;
 656        /* msgs waiting to complete finalizing */
 657        struct list_head                msc_finalizing;
 658        struct list_head                msc_active;     /* active message list */
 659        /* threads doing finalization */
 660        void                    **msc_finalizers;
 661#ifdef LNET_USE_LIB_FREELIST
 662        lnet_freelist_t         msc_freelist;   /* freelist for messages */
 663#endif
 664};
 665
 666/* Router Checker states */
 667#define LNET_RC_STATE_SHUTDOWN          0       /* not started */
 668#define LNET_RC_STATE_RUNNING           1       /* started up OK */
 669#define LNET_RC_STATE_STOPPING          2       /* telling thread to stop */
 670
 671typedef struct
 672{
 673        /* CPU partition table of LNet */
 674        struct cfs_cpt_table            *ln_cpt_table;
 675        /* number of CPTs in ln_cpt_table */
 676        unsigned int                    ln_cpt_number;
 677        unsigned int                    ln_cpt_bits;
 678
 679        /* protect LNet resources (ME/MD/EQ) */
 680        struct cfs_percpt_lock          *ln_res_lock;
 681        /* # portals */
 682        int                             ln_nportals;
 683        /* the vector of portals */
 684        lnet_portal_t                   **ln_portals;
 685        /* percpt ME containers */
 686        struct lnet_res_container       **ln_me_containers;
 687        /* percpt MD container */
 688        struct lnet_res_container       **ln_md_containers;
 689
 690        /* Event Queue container */
 691        struct lnet_res_container       ln_eq_container;
 692        wait_queue_head_t                       ln_eq_waitq;
 693        spinlock_t                      ln_eq_wait_lock;
 694        unsigned int                    ln_remote_nets_hbits;
 695
 696        /* protect NI, peer table, credits, routers, rtrbuf... */
 697        struct cfs_percpt_lock          *ln_net_lock;
 698        /* percpt message containers for active/finalizing/freed message */
 699        struct lnet_msg_container       **ln_msg_containers;
 700        lnet_counters_t                 **ln_counters;
 701        struct lnet_peer_table          **ln_peer_tables;
 702        /* failure simulation */
 703        struct list_head                        ln_test_peers;
 704
 705        struct list_head                        ln_nis;         /* LND instances */
 706        /* NIs bond on specific CPT(s) */
 707        struct list_head                        ln_nis_cpt;
 708        /* dying LND instances */
 709        struct list_head                        ln_nis_zombie;
 710        lnet_ni_t                       *ln_loni;       /* the loopback NI */
 711        /* NI to wait for events in */
 712        lnet_ni_t                       *ln_eq_waitni;
 713
 714        /* remote networks with routes to them */
 715        struct list_head                        *ln_remote_nets_hash;
 716        /* validity stamp */
 717        __u64                           ln_remote_nets_version;
 718        /* list of all known routers */
 719        struct list_head                        ln_routers;
 720        /* validity stamp */
 721        __u64                           ln_routers_version;
 722        /* percpt router buffer pools */
 723        lnet_rtrbufpool_t               **ln_rtrpools;
 724
 725        lnet_handle_md_t                ln_ping_target_md;
 726        lnet_handle_eq_t                ln_ping_target_eq;
 727        lnet_ping_info_t                *ln_ping_info;
 728
 729        /* router checker startup/shutdown state */
 730        int                             ln_rc_state;
 731        /* router checker's event queue */
 732        lnet_handle_eq_t                ln_rc_eqh;
 733        /* rcd still pending on net */
 734        struct list_head                        ln_rcd_deathrow;
 735        /* rcd ready for free */
 736        struct list_head                        ln_rcd_zombie;
 737        /* serialise startup/shutdown */
 738        struct semaphore                ln_rc_signal;
 739
 740        struct mutex                    ln_api_mutex;
 741        struct mutex                    ln_lnd_mutex;
 742        int                             ln_init;        /* LNetInit() called? */
 743        /* Have I called LNetNIInit myself? */
 744        int                             ln_niinit_self;
 745        /* LNetNIInit/LNetNIFini counter */
 746        int                             ln_refcount;
 747        /* shutdown in progress */
 748        int                             ln_shutdown;
 749
 750        int                             ln_routing;     /* am I a router? */
 751        lnet_pid_t                      ln_pid;         /* requested pid */
 752        /* uniquely identifies this ni in this epoch */
 753        __u64                           ln_interface_cookie;
 754        /* registered LNDs */
 755        struct list_head                        ln_lnds;
 756
 757        /* space for network names */
 758        char                            *ln_network_tokens;
 759        int                             ln_network_tokens_nob;
 760        /* test protocol compatibility flags */
 761        int                             ln_testprotocompat;
 762
 763} lnet_t;
 764
 765#endif
 766