X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Finclude%2Flnet%2Flib-types.h;h=73b958062f46f80f99e27b5f96792e1ef0a2d551;hp=d39553a713e488d7dbc1f10edb1f2f313974ee0f;hb=8d38912a8445060ccb5ca64f956ed8c4d584a904;hpb=e069296630240947f1815e505067fd48033909f7 diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index d39553a..73b9580 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -26,6 +26,8 @@ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -46,6 +48,8 @@ #include #elif defined(__WINNT__) #include +#include +#include #else #error Unsupported Operating System #endif @@ -57,7 +61,6 @@ #define WIRE_ATTR __attribute__((packed)) /* Packed version of lnet_process_id_t to transfer via network */ -#include typedef struct { lnet_nid_t nid; lnet_pid_t pid; /* node id / process id */ @@ -71,7 +74,6 @@ typedef struct { __u64 wh_interface_cookie; __u64 wh_object_cookie; } WIRE_ATTR lnet_handle_wire_t; -#include typedef enum { LNET_MSG_ACK = 0, @@ -85,7 +87,6 @@ typedef enum { * byte boundary in the message header. Note that all types used in these * wire structs MUST be fixed size and the smaller types are placed at the * end. */ -#include typedef struct lnet_ack { lnet_handle_wire_t dst_wmd; __u64 match_bits; @@ -175,7 +176,6 @@ typedef struct { __u32 acr_version; /* protocol version */ __u64 acr_nid; /* target NID */ } WIRE_ATTR lnet_acceptor_connreq_t; -#include #define LNET_PROTO_ACCEPTOR_VERSION 1 @@ -260,6 +260,7 @@ typedef struct lnet_me { lnet_libhandle_t me_lh; lnet_process_id_t me_match_id; unsigned int me_portal; + unsigned int me_pos; /* hash offset in mt_hash */ __u64 me_match_bits; __u64 me_ignore_bits; lnet_unlink_t me_unlink; @@ -317,9 +318,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 */ @@ -413,7 +412,7 @@ struct lnet_tx_queue { typedef struct lnet_ni { #ifdef __KERNEL__ - cfs_spinlock_t ni_lock; + spinlock_t ni_lock; #else # ifndef HAVE_LIBPTHREAD int ni_lock; @@ -443,19 +442,23 @@ typedef struct lnet_ni { 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 */ @@ -496,8 +499,8 @@ typedef struct lnet_peer { int lp_cpt; /* CPT this peer attached on */ /* # refs from lnet_route_t::lr_gateway */ int lp_rtr_refcount; - /* returned RC ping version */ - unsigned int lp_ping_version; + /* 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; @@ -527,8 +530,12 @@ typedef struct { unsigned int lr_hops; /* how far I am */ } lnet_route_t; +#define LNET_REMOTE_NETS_HASH_DEFAULT (1U << 7) +#define LNET_REMOTE_NETS_HASH_MAX (1U << 16) +#define LNET_REMOTE_NETS_HASH_SIZE (1 << the_lnet.ln_remote_nets_hbits) + typedef struct { - cfs_list_t lrn_list; /* chain on ln_remote_nets */ + cfs_list_t lrn_list; /* chain on ln_remote_nets_hash */ cfs_list_t lrn_routes; /* routes to me */ __u32 lrn_net; /* my net number */ } lnet_remotenet_t; @@ -548,7 +555,6 @@ typedef struct { lnet_kiov_t rb_kiov[0]; /* the buffer space */ } lnet_rtrbuf_t; -#include typedef struct { __u32 msgs_alloc; __u32 msgs_max; @@ -562,7 +568,6 @@ typedef struct { __u64 route_length; __u64 drop_length; } WIRE_ATTR lnet_counters_t; -#include #define LNET_PEER_HASHSIZE 503 /* prime! */ @@ -599,6 +604,16 @@ struct lnet_match_info { /* ME hash of RDMA portal */ #define LNET_MT_HASH_BITS 8 #define LNET_MT_HASH_SIZE (1 << LNET_MT_HASH_BITS) +#define LNET_MT_HASH_MASK (LNET_MT_HASH_SIZE - 1) +/* we allocate (LNET_MT_HASH_SIZE + 1) entries for lnet_match_table::mt_hash, + * the last entry is reserved for MEs with ignore-bits */ +#define LNET_MT_HASH_IGNORE LNET_MT_HASH_SIZE +/* __u64 has 2^6 bits, so need 2^(LNET_MT_HASH_BITS - LNET_MT_BITS_U64) which + * is 4 __u64s as bit-map, and add an extra __u64 (only use one bit) for the + * ME-list with ignore-bits, which is mtable::mt_hash[LNET_MT_HASH_IGNORE] */ +#define LNET_MT_BITS_U64 6 /* 2^6 bits */ +#define LNET_MT_EXHAUSTED_BITS (LNET_MT_HASH_BITS - LNET_MT_BITS_U64) +#define LNET_MT_EXHAUSTED_BMAP ((1 << LNET_MT_EXHAUSTED_BITS) + 1) /* portal match table */ struct lnet_match_table { @@ -606,15 +621,26 @@ struct lnet_match_table { unsigned int mt_cpt; unsigned int mt_portal; /* portal index */ /* match table is set as "enabled" if there's non-exhausted MD - * attached on mt_mlist, it's only valide for wildcard portal */ + * attached on mt_mhash, it's only valide for wildcard portal */ unsigned int mt_enabled; - cfs_list_t mt_mlist; /* matching list */ + /* bitmap to flag whether MEs on mt_hash are exhausted or not */ + __u64 mt_exhausted[LNET_MT_EXHAUSTED_BMAP]; cfs_list_t *mt_mhash; /* matching hash */ }; +/* these are only useful for wildcard portal */ +/* Turn off message rotor for wildcard portals */ +#define LNET_PTL_ROTOR_OFF 0 +/* round-robin dispatch all PUT messages for wildcard portals */ +#define LNET_PTL_ROTOR_ON 1 +/* round-robin dispatch routed PUT message for wildcard portals */ +#define LNET_PTL_ROTOR_RR_RT 2 +/* dispatch routed PUT message by hashing source NID for wildcard portals */ +#define LNET_PTL_ROTOR_HASH_RT 3 + typedef struct lnet_portal { #ifdef __KERNEL__ - cfs_spinlock_t ptl_lock; + spinlock_t ptl_lock; #else # ifndef HAVE_LIBPTHREAD int ptl_lock; @@ -688,16 +714,16 @@ typedef struct int ln_nportals; /* the vector of portals */ lnet_portal_t **ln_portals; - /* ME container */ + /* percpt ME containers */ struct lnet_res_container **ln_me_containers; - /* MD container */ + /* percpt MD container */ struct lnet_res_container **ln_md_containers; /* Event Queue container */ struct lnet_res_container ln_eq_container; #ifdef __KERNEL__ cfs_waitq_t ln_eq_waitq; - cfs_spinlock_t ln_eq_wait_lock; + spinlock_t ln_eq_wait_lock; #else # ifndef HAVE_LIBPTHREAD int ln_eq_wait_lock; @@ -706,9 +732,11 @@ typedef struct pthread_mutex_t ln_eq_wait_lock; # endif #endif + unsigned int ln_remote_nets_hbits; + /* protect NI, peer table, credits, routers, rtrbuf... */ struct cfs_percpt_lock *ln_net_lock; - /* message container for active/finalizing/freed message */ + /* 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; @@ -725,14 +753,14 @@ typedef struct lnet_ni_t *ln_eq_waitni; /* remote networks with routes to them */ - cfs_list_t ln_remote_nets; + cfs_list_t *ln_remote_nets_hash; /* validity stamp */ __u64 ln_remote_nets_version; /* list of all known routers */ cfs_list_t ln_routers; /* validity stamp */ __u64 ln_routers_version; - /* router buffer pools */ + /* percpt router buffer pools */ lnet_rtrbufpool_t **ln_rtrpools; lnet_handle_md_t ln_ping_target_md; @@ -749,10 +777,10 @@ typedef struct cfs_list_t ln_rcd_zombie; #ifdef __KERNEL__ /* serialise startup/shutdown */ - cfs_semaphore_t ln_rc_signal; + struct semaphore ln_rc_signal; - cfs_mutex_t ln_api_mutex; - cfs_mutex_t ln_lnd_mutex; + struct mutex ln_api_mutex; + struct mutex ln_lnd_mutex; #else # ifndef HAVE_LIBPTHREAD int ln_api_mutex;