X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Finclude%2Flnet%2Flib-types.h;h=ca4512a244078f972ff45ff1c5b370c217c551a5;hb=e531dc437c56a08a65de9074a511faa55184712b;hp=63ef7c39821cb7024ea5ac9f4d8983f224d35063;hpb=279bbc81e03dc74d273ec12b4d9e703ca94404c4;p=fs%2Flustre-release.git diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 63ef7c3..ca4512a 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -193,10 +193,14 @@ typedef struct lnet_msg { /* commited for sending */ unsigned int msg_tx_committed:1; - /* queued for tx credit */ - unsigned int msg_tx_delayed:1; + /* CPT # this message committed for sending */ + unsigned int msg_tx_cpt:15; /* commited for receiving */ unsigned int msg_rx_committed:1; + /* CPT # this message committed for receiving */ + unsigned int msg_rx_cpt:15; + /* queued for tx credit */ + unsigned int msg_tx_delayed:1; /* queued for RX buffer */ unsigned int msg_rx_delayed:1; /* ready for pending on RX delay list */ @@ -313,9 +317,7 @@ typedef struct { #define LNET_COOKIE_TYPE_ME 2 #define LNET_COOKIE_TYPE_EQ 3 #define LNET_COOKIE_TYPE_BITS 2 -#define LNET_COOKIE_TYPES (1 << LNET_COOKIE_TYPE_BITS) -/* LNET_COOKIE_TYPES must be a power of 2, so the cookie type can be - * extracted by masking with (LNET_COOKIE_TYPES - 1) */ +#define LNET_COOKIE_MASK ((1ULL << LNET_COOKIE_TYPE_BITS) - 1ULL) struct lnet_ni; /* forward ref */ @@ -398,41 +400,64 @@ typedef struct { __u32 ns_unused; } WIRE_ATTR lnet_ni_status_t; +struct lnet_tx_queue { + int tq_credits; /* # tx credits free */ + int tq_credits_min; /* lowest it's been */ + int tq_credits_max; /* total # tx credits */ + cfs_list_t tq_delayed; /* delayed TXs */ +}; + #define LNET_MAX_INTERFACES 16 typedef struct lnet_ni { - cfs_list_t ni_list; /* chain on ln_nis */ - cfs_list_t ni_txq; /* messages waiting for tx credits */ - int ni_maxtxcredits; /* # tx credits */ - int ni_txcredits; /* # tx credits free */ - int ni_mintxcredits; /* lowest it's been */ - int ni_peertxcredits; /* # per-peer send credits */ - int ni_peerrtrcredits; /* # per-peer router buffer credits */ - int ni_peertimeout; /* seconds to consider peer dead */ - lnet_nid_t ni_nid; /* interface's NID */ - void *ni_data; /* instance-specific data */ - lnd_t *ni_lnd; /* procedural interface */ - int ni_refcount; /* reference count */ - /* when I was last alive */ - long ni_last_alive; +#ifdef __KERNEL__ + cfs_spinlock_t ni_lock; +#else +# ifndef HAVE_LIBPTHREAD + int ni_lock; +# else + pthread_mutex_t ni_lock; +# endif +#endif + cfs_list_t ni_list; /* chain on ln_nis */ + cfs_list_t ni_cptlist; /* chain on ln_nis_cpt */ + int ni_maxtxcredits; /* # tx credits */ + /* # per-peer send credits */ + int ni_peertxcredits; + /* # per-peer router buffer credits */ + int ni_peerrtrcredits; + /* seconds to consider peer dead */ + int ni_peertimeout; + int ni_ncpts; /* number of CPTs */ + __u32 *ni_cpts; /* bond NI on some CPTs */ + lnet_nid_t ni_nid; /* interface's NID */ + void *ni_data; /* instance-specific data */ + lnd_t *ni_lnd; /* procedural interface */ + struct lnet_tx_queue **ni_tx_queues; /* percpt TX queues */ + int **ni_refs; /* percpt reference count */ + long ni_last_alive; /* when I was last alive */ lnet_ni_status_t *ni_status; /* my health status */ /* equivalent interfaces to use */ char *ni_interfaces[LNET_MAX_INTERFACES]; } lnet_ni_t; -#define LNET_PROTO_PING_MATCHBITS 0x8000000000000000LL -enum { - LNET_PROTO_PING_UNKNOWN = 0, /* unknown */ - LNET_PROTO_PING_VERSION_1 = 1, /* old version */ - LNET_PROTO_PING_VERSION = 2, /* current version */ -}; +#define LNET_PROTO_PING_MATCHBITS 0x8000000000000000LL + +/* NB: value of these features equal to LNET_PROTO_PING_VERSION_x + * of old LNet, so there shouldn't be any compatibility issue */ +#define LNET_PING_FEAT_INVAL (0) /* no feature */ +#define LNET_PING_FEAT_BASE (1 << 0) /* just a ping */ +#define LNET_PING_FEAT_NI_STATUS (1 << 1) /* return NI status */ + +#define LNET_PING_FEAT_MASK (LNET_PING_FEAT_BASE | \ + LNET_PING_FEAT_NI_STATUS) typedef struct { - __u32 pi_magic; - __u32 pi_version; - lnet_pid_t pi_pid; - __u32 pi_nnis; - lnet_ni_status_t pi_ni[0]; + __u32 pi_magic; + __u32 pi_features; + lnet_pid_t pi_pid; + __u32 pi_nnis; + lnet_ni_status_t pi_ni[0]; } WIRE_ATTR lnet_ping_info_t; /* router checker data, per router */ @@ -470,9 +495,11 @@ typedef struct lnet_peer { lnet_ni_t *lp_ni; /* interface peer is on */ lnet_nid_t lp_nid; /* peer's NID */ int lp_refcount; /* # refs */ - int lp_rtr_refcount; /* # refs from lnet_route_t::lr_gateway */ - /* returned RC ping version */ - unsigned int lp_ping_version; + int lp_cpt; /* CPT this peer attached on */ + /* # refs from lnet_route_t::lr_gateway */ + int lp_rtr_refcount; + /* returned RC ping features */ + unsigned int lp_ping_feats; cfs_list_t lp_routes; /* routers on this peer */ lnet_rc_data_t *lp_rcd; /* router checker state */ } lnet_peer_t; @@ -497,6 +524,7 @@ typedef struct { cfs_list_t lr_gwlist; /* chain on gateway */ lnet_peer_t *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 */ unsigned int lr_hops; /* how far I am */ } lnet_route_t; @@ -656,88 +684,63 @@ typedef struct unsigned int ln_cpt_number; unsigned int ln_cpt_bits; + /* protect LNet resources (ME/MD/EQ) */ + struct cfs_percpt_lock *ln_res_lock; + /* # portals */ + int ln_nportals; + /* the vector of portals */ + lnet_portal_t **ln_portals; + /* percpt ME containers */ + struct lnet_res_container **ln_me_containers; + /* percpt MD container */ + struct lnet_res_container **ln_md_containers; + + /* Event Queue container */ + struct lnet_res_container ln_eq_container; #ifdef __KERNEL__ - cfs_spinlock_t ln_lock; - cfs_mutex_t ln_api_mutex; - cfs_mutex_t ln_lnd_mutex; cfs_waitq_t ln_eq_waitq; cfs_spinlock_t ln_eq_wait_lock; #else # ifndef HAVE_LIBPTHREAD - int ln_lock; - int ln_api_mutex; - int ln_lnd_mutex; int ln_eq_wait_lock; # else - pthread_mutex_t ln_lock; - pthread_mutex_t ln_api_mutex; - pthread_mutex_t ln_lnd_mutex; pthread_cond_t ln_eq_cond; pthread_mutex_t ln_eq_wait_lock; # endif #endif - struct cfs_percpt_lock *ln_res_lock; - /* ME container */ - struct lnet_res_container **ln_me_containers; - /* MD container */ - struct lnet_res_container **ln_md_containers; - /* Event Queue container */ - struct lnet_res_container ln_eq_container; - - /* # portals */ - int ln_nportals; - /* the vector of portals */ - lnet_portal_t **ln_portals; - - int ln_init; /* LNetInit() called? */ - /* LNetNIInit/LNetNIFini counter */ - int ln_refcount; - /* Have I called LNetNIInit myself? */ - int ln_niinit_self; - /* shutdown in progress */ - int ln_shutdown; - /* registered LNDs */ - cfs_list_t ln_lnds; - - lnet_pid_t ln_pid; /* requested pid */ - - cfs_list_t ln_nis; /* LND instances */ - lnet_ni_t *ln_loni; /* the loopback NI */ + /* protect NI, peer table, credits, routers, rtrbuf... */ + struct cfs_percpt_lock *ln_net_lock; + /* percpt message containers for active/finalizing/freed message */ + struct lnet_msg_container **ln_msg_containers; + lnet_counters_t **ln_counters; + struct lnet_peer_table **ln_peer_tables; + /* failure simulation */ + cfs_list_t ln_test_peers; + + cfs_list_t ln_nis; /* LND instances */ + /* NIs bond on specific CPT(s) */ + cfs_list_t ln_nis_cpt; + /* dying LND instances */ + cfs_list_t ln_nis_zombie; + lnet_ni_t *ln_loni; /* the loopback NI */ /* NI to wait for events in */ lnet_ni_t *ln_eq_waitni; - cfs_list_t ln_zombie_nis; /* dying LND instances */ - int ln_nzombie_nis; /* # of NIs to wait for */ - - cfs_list_t ln_remote_nets; /* remote networks with routes to them */ - __u64 ln_remote_nets_version; /* validity stamp */ - - cfs_list_t ln_routers; /* list of all known routers */ - __u64 ln_routers_version; /* validity stamp */ + /* remote networks with routes to them */ + cfs_list_t ln_remote_nets; + /* validity stamp */ + __u64 ln_remote_nets_version; + /* list of all known routers */ + cfs_list_t ln_routers; + /* validity stamp */ + __u64 ln_routers_version; + /* percpt router buffer pools */ + lnet_rtrbufpool_t **ln_rtrpools; + + lnet_handle_md_t ln_ping_target_md; + lnet_handle_eq_t ln_ping_target_eq; + lnet_ping_info_t *ln_ping_info; - int ln_routing; /* am I a router? */ - lnet_rtrbufpool_t ln_rtrpools[LNET_NRBPOOLS]; /* router buffer pools */ - - __u64 ln_interface_cookie; /* uniquely identifies this ni in this epoch */ - - char *ln_network_tokens; /* space for network names */ - int ln_network_tokens_nob; - - int ln_testprotocompat; /* test protocol compatibility flags */ - - cfs_list_t ln_test_peers; /* failure simulation */ - - /* message container */ - struct lnet_peer_table *ln_peer_table; - struct lnet_msg_container ln_msg_container; - - lnet_handle_md_t ln_ping_target_md; - lnet_handle_eq_t ln_ping_target_eq; - lnet_ping_info_t *ln_ping_info; - -#ifdef __KERNEL__ - cfs_semaphore_t ln_rc_signal; /* serialise startup/shutdown */ -#endif /* router checker startup/shutdown state */ int ln_rc_state; /* router checker's event queue */ @@ -746,16 +749,48 @@ typedef struct cfs_list_t ln_rcd_deathrow; /* rcd ready for free */ cfs_list_t ln_rcd_zombie; +#ifdef __KERNEL__ + /* serialise startup/shutdown */ + cfs_semaphore_t ln_rc_signal; + + cfs_mutex_t ln_api_mutex; + cfs_mutex_t ln_lnd_mutex; +#else +# ifndef HAVE_LIBPTHREAD + int ln_api_mutex; + int ln_lnd_mutex; +# else + pthread_mutex_t ln_api_mutex; + pthread_mutex_t ln_lnd_mutex; +# endif +#endif + int ln_init; /* LNetInit() called? */ + /* Have I called LNetNIInit myself? */ + int ln_niinit_self; + /* LNetNIInit/LNetNIFini counter */ + int ln_refcount; + /* shutdown in progress */ + int ln_shutdown; - lnet_counters_t ln_counters; + int ln_routing; /* am I a router? */ + lnet_pid_t ln_pid; /* requested pid */ + /* uniquely identifies this ni in this epoch */ + __u64 ln_interface_cookie; + /* registered LNDs */ + cfs_list_t ln_lnds; -#ifndef __KERNEL__ - /* Temporary workaround to allow uOSS and test programs force - * server mode in userspace. The only place where we use it is - * lnet_prepare(). The only way to turn this flag on is to - * call lnet_server_mode() */ + /* space for network names */ + char *ln_network_tokens; + int ln_network_tokens_nob; + /* test protocol compatibility flags */ + int ln_testprotocompat; - int ln_server_mode_flag; +#ifndef __KERNEL__ + /* Temporary workaround to allow uOSS and test programs force + * server mode in userspace. The only place where we use it is + * lnet_prepare(). The only way to turn this flag on is to + * call lnet_server_mode() */ + int ln_server_mode_flag; #endif } lnet_t;