Whamcloud - gitweb
LU-6142 lnet: convert kiblnd/ksocknal_thread_start to vararg
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd.h
index cd95ea6..1c64f5b 100644 (file)
@@ -156,6 +156,11 @@ 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 {
@@ -163,6 +168,7 @@ struct ksock_net {
        struct list_head  ksnn_list;            /* chain on global list */
        atomic_t          ksnn_npeers;          /* # peers */
        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.
@@ -245,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 */
@@ -289,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
@@ -357,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 */
@@ -372,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 */
@@ -390,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  */
@@ -446,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
@@ -459,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);
@@ -528,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
@@ -559,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);
@@ -581,7 +599,8 @@ struct ksock_peer_ni *ksocknal_find_peer_locked(struct lnet_ni *ni,
 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);
@@ -602,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);