iiblnd.h

来自「非常经典的一个分布式系统」· C头文件 代码 · 共 740 行 · 第 1/3 页

H
740
字号
do {                                                            \        CDEBUG(D_NET, "peer[%p] -> %s (%d)--\n",                \               (peer), libcfs_nid2str((peer)->ibp_nid),         \               atomic_read (&(peer)->ibp_refcount));            \        LASSERT(atomic_read(&(peer)->ibp_refcount) > 0);        \        if (atomic_dec_and_test(&(peer)->ibp_refcount))         \                kibnal_destroy_peer(peer);                      \} while (0)/******************************************************************************/static inline struct list_head *kibnal_nid2peerlist (lnet_nid_t nid){        unsigned int hash = ((unsigned int)nid) % kibnal_data.kib_peer_hash_size;        return (&kibnal_data.kib_peers [hash]);}static inline intkibnal_peer_active(kib_peer_t *peer){        /* Am I in the peer hash table? */        return (!list_empty(&peer->ibp_list));}static inline intkibnal_peer_connecting(kib_peer_t *peer){        /* Am I expecting a connection to materialise? */        return (peer->ibp_connecting != 0 ||                peer->ibp_accepting != 0 ||                peer->ibp_passivewait);}static inline voidkibnal_queue_tx_locked (kib_tx_t *tx, kib_conn_t *conn){        struct list_head  *q;                LASSERT (tx->tx_nwrq > 0);              /* work items set up */        LASSERT (!tx->tx_queued);               /* not queued for sending already */        tx->tx_queued = 1;        tx->tx_deadline = jiffies + (*kibnal_tunables.kib_timeout * HZ);        if (tx->tx_conn == NULL) {                kibnal_conn_addref(conn);                tx->tx_conn = conn;                LASSERT (tx->tx_msg->ibm_type != IBNAL_MSG_PUT_DONE);        } else {                LASSERT (tx->tx_conn == conn);                LASSERT (tx->tx_msg->ibm_type == IBNAL_MSG_PUT_DONE);        }        if (conn->ibc_version == IBNAL_MSG_VERSION_RDMAREPLYNOTRSRVD) {                /* All messages have simple credit control */                q = &conn->ibc_tx_queue;        } else {                LASSERT (conn->ibc_version == IBNAL_MSG_VERSION);                                switch (tx->tx_msg->ibm_type) {                case IBNAL_MSG_PUT_REQ:                case IBNAL_MSG_GET_REQ:                        /* RDMA request: reserve a buffer for the RDMA reply                         * before sending */                        q = &conn->ibc_tx_queue_rsrvd;                        break;                case IBNAL_MSG_PUT_NAK:                case IBNAL_MSG_PUT_ACK:                case IBNAL_MSG_PUT_DONE:                case IBNAL_MSG_GET_DONE:                        /* RDMA reply/completion: no credits; peer has reserved                         * a reply buffer */                        q = &conn->ibc_tx_queue_nocred;                        break;                                case IBNAL_MSG_NOOP:                case IBNAL_MSG_IMMEDIATE:                        /* Otherwise: consume a credit before sending */                        q = &conn->ibc_tx_queue;                        break;                                default:                        LBUG();                        q = NULL;                }        }                list_add_tail(&tx->tx_list, q);}static inline intkibnal_send_keepalive(kib_conn_t *conn) {        return (*kibnal_tunables.kib_keepalive > 0) &&                time_after(jiffies, conn->ibc_last_send +                           *kibnal_tunables.kib_keepalive*HZ);}#define KIBNAL_SERVICE_KEY_MASK  (IB_SERVICE_RECORD_COMP_SERVICENAME |          \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_1 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_2 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_3 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_4 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_5 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_6 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_7 |       \                                  IB_SERVICE_RECORD_COMP_SERVICEDATA8_8)static inline __u64*kibnal_service_nid_field(IB_SERVICE_RECORD *srv){        /* must be consistent with KIBNAL_SERVICE_KEY_MASK */        return (__u64 *)srv->ServiceData8;}static inline voidkibnal_set_service_keys(IB_SERVICE_RECORD *srv, lnet_nid_t nid){        char *svc_name = *kibnal_tunables.kib_service_name;        LASSERT (strlen(svc_name) < sizeof(srv->ServiceName));        memset (srv->ServiceName, 0, sizeof(srv->ServiceName));        strcpy (srv->ServiceName, svc_name);        *kibnal_service_nid_field(srv) = cpu_to_le64(nid);}/* CAVEAT EMPTOR: We rely on tx/rx descriptor alignment to allow us to use the * lowest 2 bits of the work request id to stash the work item type (the op * field is not valid when the wc completes in error). */#define IBNAL_WID_TX    0#define IBNAL_WID_RX    1#define IBNAL_WID_RDMA  2#define IBNAL_WID_MASK  3ULstatic inline __u64kibnal_ptr2wreqid (void *ptr, int type){        unsigned long lptr = (unsigned long)ptr;        LASSERT ((lptr & IBNAL_WID_MASK) == 0);        LASSERT ((type & ~IBNAL_WID_MASK) == 0);        return (__u64)(lptr | type);}static inline void *kibnal_wreqid2ptr (__u64 wreqid){        return (void *)(((unsigned long)wreqid) & ~IBNAL_WID_MASK);}static inline intkibnal_wreqid2type (__u64 wreqid){        return (wreqid & IBNAL_WID_MASK);}static inline voidkibnal_set_conn_state (kib_conn_t *conn, int state){        CDEBUG(D_NET,"%p state %d\n", conn, state);        conn->ibc_state = state;        mb();}#if IBNAL_USE_FMRstatic inline intkibnal_rd_size (kib_rdma_desc_t *rd) {        return rd->rd_nob;}#elsestatic inline intkibnal_rd_size (kib_rdma_desc_t *rd){        int   i;        int   size;                for (i = size = 0; i < rd->rd_nfrag; i++)                size += rd->rd_frags[i].rf_nob;                return size;}#endifint  kibnal_startup (lnet_ni_t *ni);void kibnal_shutdown (lnet_ni_t *ni);int  kibnal_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg);int  kibnal_send (lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg);int  kibnal_eager_recv (lnet_ni_t *ni, void *private,                         lnet_msg_t *lntmsg, void **new_private);int  kibnal_recv (lnet_ni_t *ni, void *private, lnet_msg_t *msg,                  int delayed, unsigned int niov,                  struct iovec *iov, lnet_kiov_t *kiov,                  unsigned int offset, unsigned int mlen, unsigned int rlen);void kibnal_init_msg(kib_msg_t *msg, int type, int body_nob);void kibnal_pack_msg(kib_msg_t *msg, __u32 version, int credits,                      lnet_nid_t dstnid, __u64 dststamp, __u64 seq);void kibnal_pack_connmsg(kib_msg_t *msg, __u32 version, int nob, int type,                         lnet_nid_t dstnid, __u64 dststamp);int  kibnal_unpack_msg(kib_msg_t *msg, __u32 expected_version, int nob);IB_HANDLE kibnal_create_cep(lnet_nid_t nid);int  kibnal_create_peer (kib_peer_t **peerp, lnet_nid_t nid);void kibnal_destroy_peer (kib_peer_t *peer);kib_peer_t *kibnal_find_peer_locked (lnet_nid_t nid);int  kibnal_del_peer (lnet_nid_t nid);void kibnal_peer_alive (kib_peer_t *peer);void kibnal_unlink_peer_locked (kib_peer_t *peer);int  kibnal_add_persistent_peer (lnet_nid_t nid);int  kibnal_close_stale_conns_locked (kib_peer_t *peer,                                      __u64 incarnation);int  kibnal_conn_rts(kib_conn_t *conn,                     __u32 qpn, __u8 resp_res, __u8 init_depth, __u32 psn);kib_conn_t *kibnal_create_conn (lnet_nid_t nid, int proto_version);void kibnal_destroy_conn (kib_conn_t *conn);void kibnal_listen_callback(IB_HANDLE cep, CM_CONN_INFO *info, void *arg);int  kibnal_alloc_pages (kib_pages_t **pp, int npages);void kibnal_free_pages (kib_pages_t *p);void kibnal_queue_tx (kib_tx_t *tx, kib_conn_t *conn);void kibnal_txlist_done (struct list_head *txlist, int status);int  kibnal_post_receives (kib_conn_t *conn);int  kibnal_init_rdma (kib_tx_t *tx, int type, int nob,                       kib_rdma_desc_t *dstrd, __u64 dstcookie);void kibnal_check_sends (kib_conn_t *conn);void kibnal_close_conn_locked (kib_conn_t *conn, int error);int  kibnal_thread_start (int (*fn)(void *arg), void *arg);int  kibnal_scheduler(void *arg);int  kibnal_connd (void *arg);void kibnal_init_tx_msg (kib_tx_t *tx, int type, int body_nob);void kibnal_close_conn (kib_conn_t *conn, int why);void kibnal_start_active_rdma (int type, int status,                               kib_rx_t *rx, lnet_msg_t *lntmsg,                               unsigned int niov,                               struct iovec *iov, lnet_kiov_t *kiov,                               unsigned int offset, unsigned int nob);void kibnal_hca_async_callback (void *hca_arg, IB_EVENT_RECORD *ev);void kibnal_hca_callback (void *hca_arg, void *cq_arg);int  kibnal_tunables_init (void);void kibnal_tunables_fini (void);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?