Whamcloud - gitweb
LU-10391 socklnd: use interface index to track local addr
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd_cb.c
index bf62b22..8439652 100644 (file)
@@ -152,7 +152,7 @@ static int
 ksocknal_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx,
                   struct kvec *scratch_iov)
 {
-       lnet_kiov_t *kiov = tx->tx_kiov;
+       struct bio_vec *kiov = tx->tx_kiov;
        int nob;
        int rc;
 
@@ -173,13 +173,13 @@ ksocknal_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx,
        do {
                LASSERT(tx->tx_nkiov > 0);
 
-               if (nob < (int)kiov->kiov_len) {
-                       kiov->kiov_offset += nob;
-                       kiov->kiov_len -= nob;
+               if (nob < (int)kiov->bv_len) {
+                       kiov->bv_offset += nob;
+                       kiov->bv_len -= nob;
                        return rc;
                }
 
-               nob -= (int)kiov->kiov_len;
+               nob -= (int)kiov->bv_len;
                tx->tx_kiov = ++kiov;
                tx->tx_nkiov--;
        } while (nob != 0);
@@ -302,7 +302,7 @@ static int
 ksocknal_recv_kiov(struct ksock_conn *conn, struct page **rx_scratch_pgs,
                   struct kvec *scratch_iov)
 {
-       lnet_kiov_t *kiov = conn->ksnc_rx_kiov;
+       struct bio_vec *kiov = conn->ksnc_rx_kiov;
        int nob;
        int rc;
        LASSERT(conn->ksnc_rx_nkiov > 0);
@@ -329,13 +329,13 @@ ksocknal_recv_kiov(struct ksock_conn *conn, struct page **rx_scratch_pgs,
        do {
                LASSERT(conn->ksnc_rx_nkiov > 0);
 
-               if (nob < (int) kiov->kiov_len) {
-                       kiov->kiov_offset += nob;
-                       kiov->kiov_len -= nob;
+               if (nob < (int) kiov->bv_len) {
+                       kiov->bv_offset += nob;
+                       kiov->bv_len -= nob;
                        return -EAGAIN;
                }
 
-               nob -= kiov->kiov_len;
+               nob -= kiov->bv_len;
                conn->ksnc_rx_kiov = ++kiov;
                conn->ksnc_rx_nkiov--;
        } while (nob != 0);
@@ -985,14 +985,14 @@ ksocknal_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
        int mpflag = 1;
        int type = lntmsg->msg_type;
        struct lnet_process_id target = lntmsg->msg_target;
-        unsigned int      payload_niov = lntmsg->msg_niov;
+       unsigned int     payload_niov = lntmsg->msg_niov;
        struct kvec *payload_iov = lntmsg->msg_iov;
-        lnet_kiov_t      *payload_kiov = lntmsg->msg_kiov;
-        unsigned int      payload_offset = lntmsg->msg_offset;
-        unsigned int      payload_nob = lntmsg->msg_len;
-       struct ksock_tx *tx;
-        int               desc_size;
-        int               rc;
+       struct bio_vec  *payload_kiov = lntmsg->msg_kiov;
+       unsigned int     payload_offset = lntmsg->msg_offset;
+       unsigned int     payload_nob = lntmsg->msg_len;
+       struct ksock_tx *tx;
+       int              desc_size;
+       int              rc;
 
         /* NB 'private' is different depending on what we're sending.
          * Just ignore it... */
@@ -1083,7 +1083,8 @@ void
 ksocknal_thread_fini (void)
 {
        write_lock_bh(&ksocknal_data.ksnd_global_lock);
-        ksocknal_data.ksnd_nthreads--;
+       if (--ksocknal_data.ksnd_nthreads == 0)
+               wake_up_var(&ksocknal_data.ksnd_nthreads);
        write_unlock_bh(&ksocknal_data.ksnd_global_lock);
 }
 
@@ -1384,7 +1385,7 @@ ksocknal_process_receive(struct ksock_conn *conn,
 int
 ksocknal_recv(struct lnet_ni *ni, void *private, struct lnet_msg *msg,
              int delayed, unsigned int niov, struct kvec *iov,
-             lnet_kiov_t *kiov, unsigned int offset, unsigned int mlen,
+             struct bio_vec *kiov, unsigned int offset, unsigned int mlen,
              unsigned int rlen)
 {
        struct ksock_conn *conn = private;
@@ -1482,8 +1483,6 @@ int ksocknal_scheduler(void *arg)
                return -ENOMEM;
        }
 
-       cfs_block_allsigs();
-
        rc = cfs_cpt_bind(lnet_cpt_table(), sched->kss_cpt);
        if (rc != 0) {
                CWARN("Can't set CPU partition affinity to %d: %d\n",
@@ -1545,11 +1544,7 @@ int ksocknal_scheduler(void *arg)
                if (!list_empty(&sched->kss_tx_conns)) {
                        LIST_HEAD(zlist);
 
-                       if (!list_empty(&sched->kss_zombie_noop_txs)) {
-                               list_add(&zlist,
-                                        &sched->kss_zombie_noop_txs);
-                               list_del_init(&sched->kss_zombie_noop_txs);
-                       }
+                       list_splice_init(&sched->kss_zombie_noop_txs, &zlist);
 
                        conn = list_entry(sched->kss_tx_conns.next,
                                          struct ksock_conn, ksnc_tx_list);
@@ -1633,10 +1628,8 @@ int ksocknal_scheduler(void *arg)
        }
 
        spin_unlock_bh(&sched->kss_lock);
-       LIBCFS_FREE(rx_scratch_pgs, sizeof(*rx_scratch_pgs) *
-                   LNET_MAX_IOV);
-       LIBCFS_FREE(scratch_iov, sizeof(*scratch_iov) *
-                   LNET_MAX_IOV);
+       CFS_FREE_PTR_ARRAY(rx_scratch_pgs, LNET_MAX_IOV);
+       CFS_FREE_PTR_ARRAY(scratch_iov, LNET_MAX_IOV);
        ksocknal_thread_fini();
        return 0;
 }
@@ -1700,8 +1693,8 @@ void ksocknal_write_callback(struct ksock_conn *conn)
        EXIT;
 }
 
-static struct ksock_proto *
-ksocknal_parse_proto_version (struct ksock_hello_msg *hello)
+static const struct ksock_proto *
+ksocknal_parse_proto_version(struct ksock_hello_msg *hello)
 {
         __u32   version = 0;
 
@@ -1799,7 +1792,7 @@ ksocknal_recv_hello(struct lnet_ni *ni, struct ksock_conn *conn,
         int                  timeout;
         int                  proto_match;
         int                  rc;
-       struct ksock_proto *proto;
+       const struct ksock_proto *proto;
        struct lnet_process_id recv_id;
 
        /* socket type set on active connections - not set on passive */
@@ -1992,12 +1985,14 @@ ksocknal_connect(struct ksock_route *route)
                         goto failed;
                 }
 
-               rc = lnet_connect(&sock, peer_ni->ksnp_id.nid,
-                                 route->ksnr_myipaddr,
-                                 route->ksnr_ipaddr, route->ksnr_port,
-                                 peer_ni->ksnp_ni->ni_net_ns);
-               if (rc != 0)
+               sock = lnet_connect(peer_ni->ksnp_id.nid,
+                                   route->ksnr_myiface,
+                                   route->ksnr_ipaddr, route->ksnr_port,
+                                   peer_ni->ksnp_ni->ni_net_ns);
+               if (IS_ERR(sock)) {
+                       rc = PTR_ERR(sock);
                        goto failed;
+               }
 
                 rc = ksocknal_create_conn(peer_ni->ksnp_ni, route, sock, type);
                 if (rc < 0) {
@@ -2220,8 +2215,6 @@ ksocknal_connd(void *arg)
        int nloops = 0;
        int cons_retry = 0;
 
-       cfs_block_allsigs();
-
        init_waitqueue_entry(&wait, current);
 
        spin_lock_bh(connd_lock);
@@ -2612,8 +2605,6 @@ int ksocknal_reaper(void *arg)
        int peer_index = 0;
        time64_t deadline = ktime_get_seconds();
 
-        cfs_block_allsigs ();
-
        init_waitqueue_entry(&wait, current);
 
        spin_lock_bh(&ksocknal_data.ksnd_reaper_lock);
@@ -2643,14 +2634,11 @@ int ksocknal_reaper(void *arg)
                        ksocknal_destroy_conn(conn);
 
                        spin_lock_bh(&ksocknal_data.ksnd_reaper_lock);
-                        continue;
-                }
+                       continue;
+               }
 
-               if (!list_empty(&ksocknal_data.ksnd_enomem_conns)) {
-                       list_add(&enomem_conns,
-                                     &ksocknal_data.ksnd_enomem_conns);
-                       list_del_init(&ksocknal_data.ksnd_enomem_conns);
-                }
+               list_splice_init(&ksocknal_data.ksnd_enomem_conns,
+                                &enomem_conns);
 
                spin_unlock_bh(&ksocknal_data.ksnd_reaper_lock);