Whamcloud - gitweb
LU-7734 lnet: proper cpt locking
[fs/lustre-release.git] / lnet / include / lnet / lib-types.h
index 601488f..76f5d31 100644 (file)
@@ -68,6 +68,8 @@ typedef struct lnet_msg {
        struct list_head        msg_list;       /* Q for credits/MD */
 
        lnet_process_id_t       msg_target;
+       /* Primary NID of the source. */
+       lnet_nid_t              msg_initiator;
        /* where is it from, it's only for building event */
        lnet_nid_t              msg_from;
        __u32                   msg_type;
@@ -100,8 +102,8 @@ typedef struct lnet_msg {
        unsigned int          msg_onactivelist:1; /* on the activelist */
        unsigned int          msg_rdma_get:1;
 
-       struct lnet_peer     *msg_txpeer;         /* peer I'm sending to */
-       struct lnet_peer     *msg_rxpeer;         /* peer I received from */
+       struct lnet_peer_ni  *msg_txpeer;         /* peer I'm sending to */
+       struct lnet_peer_ni  *msg_rxpeer;         /* peer I received from */
 
        void                 *msg_private;
        struct lnet_libmd    *msg_md;
@@ -290,13 +292,19 @@ enum lnet_ni_state {
        LNET_NI_STATE_DELETING
 };
 
+struct lnet_element_stats {
+       atomic_t        send_count;
+       atomic_t        recv_count;
+       atomic_t        drop_count;
+};
+
 struct lnet_net {
        /* chain on the ln_nets */
        struct list_head        net_list;
 
-       /* net ID, which is compoed of
+       /* net ID, which is composed of
         * (net_type << 16) | net_num.
-        * net_type can be one of the enumarated types defined in
+        * net_type can be one of the enumerated types defined in
         * lnet/include/lnet/nidstr.h */
        __u32                   net_id;
 
@@ -355,6 +363,9 @@ typedef struct lnet_ni {
        /* instance-specific data */
        void                    *ni_data;
 
+       /* per ni credits */
+       atomic_t                ni_tx_credits;
+
        /* percpt TX queues */
        struct lnet_tx_queue    **ni_tx_queues;
 
@@ -379,6 +390,15 @@ typedef struct lnet_ni {
        /* lnd tunables set explicitly */
        bool ni_lnd_tunables_set;
 
+       /* NI statistics */
+       struct lnet_element_stats ni_stats;
+
+       /* physical device CPT */
+       int                     dev_cpt;
+
+       /* sequence number used to round robin over nis within a net */
+       __u32                   ni_seq;
+
        /*
         * equivalent interfaces to use
         * This is an array because socklnd bonding can still be configured
@@ -414,63 +434,117 @@ typedef struct {
        /* chain on the_lnet.ln_zombie_rcd or ln_deathrow_rcd */
        struct list_head        rcd_list;
        lnet_handle_md_t        rcd_mdh;        /* ping buffer MD */
-       struct lnet_peer        *rcd_gateway;   /* reference to gateway */
+       struct lnet_peer_ni     *rcd_gateway;   /* reference to gateway */
        struct lnet_ping_info   *rcd_pinginfo;  /* ping buffer */
 } lnet_rc_data_t;
 
-typedef struct lnet_peer {
+struct lnet_peer_ni {
+       /* chain on peer_net */
+       struct list_head        lpni_on_peer_net_list;
+       /* chain on remote peer list */
+       struct list_head        lpni_on_remote_peer_ni_list;
        /* chain on peer hash */
-       struct list_head        lp_hashlist;
+       struct list_head        lpni_hashlist;
        /* messages blocking for tx credits */
-       struct list_head        lp_txq;
+       struct list_head        lpni_txq;
        /* messages blocking for router credits */
-       struct list_head        lp_rtrq;
+       struct list_head        lpni_rtrq;
        /* chain on router list */
-       struct list_head        lp_rtr_list;
+       struct list_head        lpni_rtr_list;
+       /* pointer to peer net I'm part of */
+       struct lnet_peer_net    *lpni_peer_net;
+       /* statistics kept on each peer NI */
+       struct lnet_element_stats lpni_stats;
+       /* spin lock protecting credits and lpni_txq / lpni_rtrq */
+       spinlock_t              lpni_lock;
        /* # tx credits available */
-       int                     lp_txcredits;
+       int                     lpni_txcredits;
        /* low water mark */
-       int                     lp_mintxcredits;
+       int                     lpni_mintxcredits;
        /* # router credits */
-       int                     lp_rtrcredits;
+       int                     lpni_rtrcredits;
        /* low water mark */
-       int                     lp_minrtrcredits;
+       int                     lpni_minrtrcredits;
        /* alive/dead? */
-       unsigned int            lp_alive:1;
+       bool                    lpni_alive;
        /* notification outstanding? */
-       unsigned int            lp_notify:1;
+       bool                    lpni_notify;
        /* outstanding notification for LND? */
-       unsigned int            lp_notifylnd:1;
+       bool                    lpni_notifylnd;
        /* some thread is handling notification */
-       unsigned int            lp_notifying:1;
+       bool                    lpni_notifying;
        /* SEND event outstanding from ping */
-       unsigned int            lp_ping_notsent;
-       /* # times router went dead<->alive */
-       int                     lp_alive_count;
+       bool                    lpni_ping_notsent;
+       /* # times router went dead<->alive. Protected with lpni_lock */
+       int                     lpni_alive_count;
        /* bytes queued for sending */
-       long                    lp_txqnob;
+       long                    lpni_txqnob;
        /* time of last aliveness news */
-       cfs_time_t              lp_timestamp;
+       cfs_time_t              lpni_timestamp;
        /* time of last ping attempt */
-       cfs_time_t              lp_ping_timestamp;
+       cfs_time_t              lpni_ping_timestamp;
        /* != 0 if ping reply expected */
-       cfs_time_t              lp_ping_deadline;
+       cfs_time_t              lpni_ping_deadline;
        /* when I was last alive */
-       cfs_time_t              lp_last_alive;
-       /* when lp_ni was queried last time */
-       cfs_time_t              lp_last_query;
+       cfs_time_t              lpni_last_alive;
+       /* when lpni_ni was queried last time */
+       cfs_time_t              lpni_last_query;
        /* network peer is on */
-       struct lnet_net         *lp_net;
-       lnet_nid_t              lp_nid;         /* peer's NID */
-       int                     lp_refcount;    /* # refs */
-       int                     lp_cpt;         /* CPT this peer attached on */
+       struct lnet_net         *lpni_net;
+       /* peer's NID */
+       lnet_nid_t              lpni_nid;
+       /* # refs */
+       atomic_t                lpni_refcount;
+       /* CPT this peer attached on */
+       int                     lpni_cpt;
        /* # refs from lnet_route_t::lr_gateway */
-       int                     lp_rtr_refcount;
-       /* returned RC ping features */
-       unsigned int            lp_ping_feats;
-       struct list_head        lp_routes;      /* routers on this peer */
-       lnet_rc_data_t          *lp_rcd;        /* router checker state */
-} lnet_peer_t;
+       int                     lpni_rtr_refcount;
+       /* sequence number used to round robin over peer nis within a net */
+       __u32                   lpni_seq;
+       /* health flag */
+       bool                    lpni_healthy;
+       /* returned RC ping features. Protected with lpni_lock */
+       unsigned int            lpni_ping_feats;
+       /* routes on this peer */
+       struct list_head        lpni_routes;
+       /* array of preferred local nids */
+       lnet_nid_t              *lpni_pref_nids;
+       /* number of preferred NIDs in lnpi_pref_nids */
+       __u32                   lpni_pref_nnids;
+       /* router checker state */
+       lnet_rc_data_t          *lpni_rcd;
+};
+
+struct lnet_peer {
+       /* chain on global peer list */
+       struct list_head        lp_on_lnet_peer_list;
+
+       /* list of peer nets */
+       struct list_head        lp_peer_nets;
+
+       /* primary NID of the peer */
+       lnet_nid_t              lp_primary_nid;
+
+       /* peer is Multi-Rail enabled peer */
+       bool                    lp_multi_rail;
+};
+
+struct lnet_peer_net {
+       /* chain on peer block */
+       struct list_head        lpn_on_peer_list;
+
+       /* list of peer_nis on this network */
+       struct list_head        lpn_peer_nis;
+
+       /* pointer to the peer I'm part of */
+       struct lnet_peer        *lpn_peer;
+
+       /* Net ID */
+       __u32                   lpn_net_id;
+
+       /* health flag */
+       bool                    lpn_healthy;
+};
 
 /* peer hash size */
 #define LNET_PEER_HASH_BITS    9
@@ -479,22 +553,22 @@ typedef struct lnet_peer {
 /* peer hash table */
 struct lnet_peer_table {
        int                     pt_version;     /* /proc validity stamp */
-       int                     pt_number;      /* # peers extant */
-       int                     pt_zombies;     /* # zombies to go to deathrow
-                                                * (and not there yet) */
-       struct list_head        pt_deathrow;    /* zombie peers */
+       atomic_t                pt_number;      /* # peers extant */
        struct list_head        *pt_hash;       /* NID->peer hash */
+       struct list_head        pt_zombie_list; /* zombie peers */
+       int                     pt_zombies;     /* # zombie peers */
+       spinlock_t              pt_zombie_lock; /* protect list and count */
 };
 
 /* peer aliveness is enabled only on routers for peers in a network where the
  * lnet_ni_t::ni_peertimeout has been set to a positive value */
 #define lnet_peer_aliveness_enabled(lp) (the_lnet.ln_routing != 0 && \
-                                        (lp)->lp_net->net_tunables.lct_peer_timeout > 0)
+                                        (lp)->lpni_net->net_tunables.lct_peer_timeout > 0)
 
 typedef struct {
        struct list_head        lr_list;        /* chain on net */
        struct list_head        lr_gwlist;      /* chain on gateway */
-       lnet_peer_t             *lr_gateway;    /* router node */
+       struct lnet_peer_ni     *lr_gateway;    /* router node */
        __u32                   lr_net;         /* remote network number */
        int                     lr_seq;         /* sequence for round-robin */
        unsigned int            lr_downis;      /* number of down NIs */
@@ -691,6 +765,10 @@ typedef struct
        struct lnet_msg_container       **ln_msg_containers;
        lnet_counters_t                 **ln_counters;
        struct lnet_peer_table          **ln_peer_tables;
+       /* list of configured or discovered peers */
+       struct list_head                ln_peers;
+       /* list of peer nis not on a local network */
+       struct list_head                ln_remote_peer_ni_list;
        /* failure simulation */
        struct list_head                ln_test_peers;
        struct list_head                ln_drop_rules;