X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fklnds%2Fsocklnd%2Fsocklnd.h;h=1c64f5b3e5cc80adc30056ff10a907ab2b78e105;hb=9976d2c35d40a1709c3539aed76033124e88040e;hp=e0580bfcf22753a3a785bc7b7aa6f091caa00ae5;hpb=c35c1babc7466ed1f49a9efc879a4aaba8d000e6;p=fs%2Flustre-release.git diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index e0580bf..1c64f5b 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -56,6 +56,8 @@ #include #include +#include + #ifndef NETIF_F_CSUM_MASK # define NETIF_F_CSUM_MASK NETIF_F_ALL_CSUM #endif @@ -154,14 +156,19 @@ struct ksock_tunables { #if SOCKNAL_VERSION_DEBUG int *ksnd_protocol; /* protocol version */ #endif + int *ksnd_conns_per_peer; /* for typed mode, yields: + * 1 + 2*conns_per_peer total + * for untyped: + * conns_per_peer total + */ }; struct ksock_net { __u64 ksnn_incarnation; /* my epoch */ struct list_head ksnn_list; /* chain on global list */ atomic_t ksnn_npeers; /* # peers */ - int ksnn_ninterfaces; /* IP interfaces */ - struct ksock_interface ksnn_interfaces[LNET_INTERFACES_NUM]; + struct ksock_interface ksnn_interface; /* IP interface */ + struct lnet_ni *ksnn_ni; }; /* When the ksock_net is shut down, this (negative) bias is added to * ksnn_npeers, which prevents new peers from being added. @@ -244,7 +251,7 @@ struct ksock_nal_data { * received into struct bio_vec fragments. */ struct ksock_conn; /* forward ref */ -struct ksock_route; /* forward ref */ +struct ksock_conn_cb; /* forward ref */ struct ksock_proto; /* forward ref */ struct ksock_tx { /* transmit packet */ @@ -288,7 +295,7 @@ union ksock_rxiovspace { struct ksock_conn { struct ksock_peer_ni *ksnc_peer; /* owning peer_ni */ - struct ksock_route *ksnc_route; /* owning route */ + struct ksock_conn_cb *ksnc_conn_cb; /* owning conn control block */ struct list_head ksnc_list; /* on peer_ni's conn list */ struct socket *ksnc_sock; /* actual socket */ void *ksnc_saved_data_ready; /* socket's original @@ -356,8 +363,9 @@ struct ksock_conn { time64_t ksnc_tx_last_post; }; -struct ksock_route { - struct list_head ksnr_list; /* chain on peer_ni route list*/ +#define SOCKNAL_CONN_COUNT_MAX_BITS 8 /* max conn count bits */ + +struct ksock_conn_cb { struct list_head ksnr_connd_list;/* chain on ksnr_connd_routes */ struct ksock_peer_ni *ksnr_peer; /* owning peer_ni */ refcount_t ksnr_refcount; /* # users */ @@ -371,8 +379,11 @@ struct ksock_route { unsigned int ksnr_connecting:1;/* connection in progress */ unsigned int ksnr_connected:4;/* connections by type */ unsigned int ksnr_deleted:1; /* been removed from peer_ni? */ - unsigned int ksnr_share_count;/* created explicitly? */ - int ksnr_conn_count;/* # conns for this route */ + unsigned int ksnr_ctrl_conn_count:1; /* # conns by type */ + unsigned int ksnr_blki_conn_count:8; + unsigned int ksnr_blko_conn_count:8; + int ksnr_conn_count;/* total # conns for this cb */ + }; #define SOCKNAL_KEEPALIVE_PING 1 /* cookie for keepalive ping */ @@ -389,7 +400,7 @@ struct ksock_peer_ni { __u64 ksnp_incarnation; /* latest known peer_ni incarnation */ const struct ksock_proto *ksnp_proto; /* latest known protocol */ struct list_head ksnp_conns; /* all active connections */ - struct list_head ksnp_routes; /* routes */ + struct ksock_conn_cb *ksnp_conn_cb; /* conn control block */ struct list_head ksnp_tx_queue; /* waiting packets */ spinlock_t ksnp_lock; /* serialize, g_lock unsafe */ /* zero copy requests wait for ACK */ @@ -445,6 +456,11 @@ extern const struct ksock_proto ksocknal_protocol_v3x; #define CPU_MASK_NONE 0UL #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) +#undef netdev_notifier_info_to_dev +#define netdev_notifier_info_to_dev(ndev) ndev +#endif + static inline __u32 ksocknal_csum(__u32 crc, unsigned char const *p, size_t len) { #if 1 @@ -458,7 +474,7 @@ static inline __u32 ksocknal_csum(__u32 crc, unsigned char const *p, size_t len) } static inline int -ksocknal_route_mask(void) +ksocknal_conn_cb_mask(void) { if (!*ksocknal_tunables.ksnd_typed_conns) return BIT(SOCKLND_CONN_ANY); @@ -527,18 +543,18 @@ ksocknal_tx_decref(struct ksock_tx *tx) } static inline void -ksocknal_route_addref(struct ksock_route *route) +ksocknal_conn_cb_addref(struct ksock_conn_cb *conn_cb) { - refcount_inc(&route->ksnr_refcount); + refcount_inc(&conn_cb->ksnr_refcount); } -extern void ksocknal_destroy_route(struct ksock_route *route); +extern void ksocknal_destroy_conn_cb(struct ksock_conn_cb *conn_cb); static inline void -ksocknal_route_decref(struct ksock_route *route) +ksocknal_conn_cb_decref(struct ksock_conn_cb *conn_cb) { - if (refcount_dec_and_test(&route->ksnr_refcount)) - ksocknal_destroy_route (route); + if (refcount_dec_and_test(&conn_cb->ksnr_refcount)) + ksocknal_destroy_conn_cb(conn_cb); } static inline void @@ -558,9 +574,12 @@ ksocknal_peer_decref(struct ksock_peer_ni *peer_ni) static inline int ksocknal_timeout(void) { - return *ksocknal_tunables.ksnd_timeout ? - *ksocknal_tunables.ksnd_timeout : - lnet_get_lnd_timeout(); + return *ksocknal_tunables.ksnd_timeout ?: lnet_get_lnd_timeout(); +} + +static inline int ksocknal_conns_per_peer(void) +{ + return *ksocknal_tunables.ksnd_conns_per_peer ?: 1; } int ksocknal_startup(struct lnet_ni *ni); @@ -573,14 +592,15 @@ int ksocknal_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, unsigned int offset, unsigned int mlen, unsigned int rlen); int ksocknal_accept(struct lnet_ni *ni, struct socket *sock); -int ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id, __u32 ip, - int port); +int ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id, + struct sockaddr *addr); struct ksock_peer_ni *ksocknal_find_peer_locked(struct lnet_ni *ni, struct lnet_process_id id); struct ksock_peer_ni *ksocknal_find_peer(struct lnet_ni *ni, struct lnet_process_id id); extern void ksocknal_peer_failed(struct ksock_peer_ni *peer_ni); -extern int ksocknal_create_conn(struct lnet_ni *ni, struct ksock_route *route, +extern int ksocknal_create_conn(struct lnet_ni *ni, + struct ksock_conn_cb *conn_cb, struct socket *sock, int type); extern void ksocknal_close_conn_locked(struct ksock_conn *conn, int why); extern void ksocknal_terminate_conn(struct ksock_conn *conn); @@ -601,11 +621,19 @@ extern void ksocknal_next_tx_carrier(struct ksock_conn *conn); extern void ksocknal_queue_tx_locked(struct ksock_tx *tx, struct ksock_conn *conn); extern void ksocknal_txlist_done(struct lnet_ni *ni, struct list_head *txlist, int error); -extern int ksocknal_thread_start(int (*fn)(void *arg), void *arg, char *name); +#define ksocknal_thread_start(fn, data, namefmt, arg...) \ + ({ \ + struct task_struct *__task = kthread_run(fn, data, \ + namefmt, ##arg); \ + if (!IS_ERR(__task)) \ + atomic_inc(&ksocknal_data.ksnd_nthreads); \ + PTR_ERR_OR_ZERO(__task); \ + }) + extern void ksocknal_thread_fini(void); extern void ksocknal_launch_all_connections_locked(struct ksock_peer_ni *peer_ni); -extern struct ksock_route *ksocknal_find_connectable_route_locked(struct ksock_peer_ni *peer_ni); -extern struct ksock_route *ksocknal_find_connecting_route_locked(struct ksock_peer_ni *peer_ni); +extern struct ksock_conn_cb *ksocknal_find_connectable_conn_cb_locked(struct ksock_peer_ni *peer_ni); +extern struct ksock_conn_cb *ksocknal_find_connecting_conn_cb_locked(struct ksock_peer_ni *peer_ni); extern int ksocknal_new_packet(struct ksock_conn *conn, int skip); extern int ksocknal_scheduler(void *arg); extern int ksocknal_connd(void *arg);