o2iblnd.h

来自「lustre 1.6.5 source code」· C头文件 代码 · 共 762 行 · 第 1/3 页

H
762
字号
        kib_rdma_desc_t   ibpam_rd;             /* sender's sink buffer */} WIRE_ATTR kib_putack_msg_t;typedef struct{        lnet_hdr_t        ibgm_hdr;             /* portals header */        __u64             ibgm_cookie;          /* opaque completion cookie */        kib_rdma_desc_t   ibgm_rd;              /* rdma descriptor */} WIRE_ATTR kib_get_msg_t;typedef struct{        __u64             ibcm_cookie;          /* opaque completion cookie */        __s32             ibcm_status;          /* < 0 failure: >= 0 length */} WIRE_ATTR kib_completion_msg_t;typedef struct{        /* First 2 fields fixed FOR ALL TIME */        __u32             ibm_magic;            /* I'm an openibnal message */        __u16             ibm_version;          /* this is my version number */        __u8              ibm_type;             /* msg type */        __u8              ibm_credits;          /* returned credits */        __u32             ibm_nob;              /* # bytes in whole message */        __u32             ibm_cksum;            /* checksum (0 == no checksum) */        __u64             ibm_srcnid;           /* sender's NID */        __u64             ibm_srcstamp;         /* sender's incarnation */        __u64             ibm_dstnid;           /* destination's NID */        __u64             ibm_dststamp;         /* destination's incarnation */        union {                kib_connparams_t      connparams;                kib_immediate_msg_t   immediate;                kib_putreq_msg_t      putreq;                kib_putack_msg_t      putack;                kib_get_msg_t         get;                kib_completion_msg_t  completion;        } WIRE_ATTR ibm_u;} WIRE_ATTR kib_msg_t;#define IBLND_MSG_MAGIC LNET_PROTO_IB_MAGIC	/* unique magic */#define IBLND_MSG_VERSION           0x11#define IBLND_MSG_CONNREQ           0xc0        /* connection request */#define IBLND_MSG_CONNACK           0xc1        /* connection acknowledge */#define IBLND_MSG_NOOP              0xd0        /* nothing (just credits) */#define IBLND_MSG_IMMEDIATE         0xd1        /* immediate */#define IBLND_MSG_PUT_REQ           0xd2        /* putreq (src->sink) */#define IBLND_MSG_PUT_NAK           0xd3        /* completion (sink->src) */#define IBLND_MSG_PUT_ACK           0xd4        /* putack (sink->src) */#define IBLND_MSG_PUT_DONE          0xd5        /* completion (src->sink) */#define IBLND_MSG_GET_REQ           0xd6        /* getreq (sink->src) */#define IBLND_MSG_GET_DONE          0xd7        /* completion (src->sink: all OK) */typedef struct {        __u32            ibr_magic;             /* sender's magic */        __u16            ibr_version;           /* sender's version */        __u8             ibr_why;               /* reject reason */} WIRE_ATTR kib_rej_t;/* connection rejection reasons */#define IBLND_REJECT_CONN_RACE       1          /* You lost connection race */#define IBLND_REJECT_NO_RESOURCES    2          /* Out of memory/conns etc */#define IBLND_REJECT_FATAL           3          /* Anything else *//***********************************************************************/typedef struct kib_rx                           /* receive message */{        struct list_head          rx_list;      /* queue for attention */        struct kib_conn          *rx_conn;      /* owning conn */        int                       rx_nob;       /* # bytes received (-1 while posted) */        enum ib_wc_status         rx_status;    /* completion status */        kib_msg_t                *rx_msg;       /* message buffer (host vaddr) */        __u64                     rx_msgaddr;   /* message buffer (I/O addr) */        DECLARE_PCI_UNMAP_ADDR   (rx_msgunmap); /* for dma_unmap_single() */        struct ib_recv_wr         rx_wrq;       /* receive work item... */        struct ib_sge             rx_sge;       /* ...and its memory */} kib_rx_t;#define IBLND_POSTRX_DONT_POST    0             /* don't post */#define IBLND_POSTRX_NO_CREDIT    1             /* post: no credits */#define IBLND_POSTRX_PEER_CREDIT  2             /* post: give peer back 1 credit */#define IBLND_POSTRX_RSRVD_CREDIT 3             /* post: give myself back 1 reserved credit */typedef struct kib_tx                           /* transmit message */{        struct list_head          tx_list;      /* queue on idle_txs ibc_tx_queue etc. */        struct kib_conn          *tx_conn;      /* owning conn */        int                       tx_sending;   /* # tx callbacks outstanding */        int                       tx_queued;    /* queued for sending */        int                       tx_waiting;   /* waiting for peer */        int                       tx_status;    /* LNET completion status */        unsigned long             tx_deadline;  /* completion deadline */        __u64                     tx_cookie;    /* completion cookie */        lnet_msg_t               *tx_lntmsg[2]; /* lnet msgs to finalize on completion */        kib_msg_t                *tx_msg;       /* message buffer (host vaddr) */        __u64                     tx_msgaddr;   /* message buffer (I/O addr) */        DECLARE_PCI_UNMAP_ADDR   (tx_msgunmap); /* for dma_unmap_single() */        int                       tx_nwrq;      /* # send work items */#if IBLND_MAP_ON_DEMAND        struct ib_send_wr         tx_wrq[2];    /* send work items... */        struct ib_sge             tx_sge[2];    /* ...and their memory */        kib_rdma_desc_t           tx_rd[1];     /* rdma descriptor */        __u64                    *tx_pages;     /* rdma phys page addrs */        struct ib_pool_fmr       *tx_fmr;       /* rdma mapping (mapped if != NULL) */#else        struct ib_send_wr        *tx_wrq;       /* send work items... */        struct ib_sge            *tx_sge;       /* ...and their memory */        kib_rdma_desc_t          *tx_rd;        /* rdma descriptor */        int                       tx_nfrags;    /* # entries in... */        struct scatterlist       *tx_frags;     /* dma_map_sg descriptor */        int                       tx_dmadir;    /* dma direction */#endif        } kib_tx_t;typedef struct kib_connvars{        /* connection-in-progress variables */        kib_msg_t                 cv_msg;} kib_connvars_t;typedef struct kib_conn{        struct kib_peer    *ibc_peer;           /* owning peer */        struct list_head    ibc_list;           /* stash on peer's conn list */        struct list_head    ibc_sched_list;     /* schedule for attention */        __u64               ibc_incarnation;    /* which instance of the peer */        atomic_t            ibc_refcount;       /* # users */        int                 ibc_state;          /* what's happening */        int                 ibc_nsends_posted;  /* # uncompleted sends */        int                 ibc_credits;        /* # credits I have */        int                 ibc_outstanding_credits; /* # credits to return */        int                 ibc_reserved_credits;/* # ACK/DONE msg credits */        int                 ibc_comms_error;    /* set on comms error */        int                 ibc_nrx:8;          /* receive buffers owned */        int                 ibc_scheduled:1;    /* scheduled for attention */        int                 ibc_ready:1;        /* CQ callback fired */        unsigned long       ibc_last_send;      /* time of last send */        struct list_head    ibc_early_rxs;      /* rxs completed before ESTABLISHED */        struct list_head    ibc_tx_noops;       /* IBLND_MSG_NOOPs */        struct list_head    ibc_tx_queue;       /* sends that need a credit */        struct list_head    ibc_tx_queue_nocred;/* sends that don't need a credit */        struct list_head    ibc_tx_queue_rsrvd; /* sends that need to reserve an ACK/DONE msg */        struct list_head    ibc_active_txs;     /* active tx awaiting completion */        spinlock_t          ibc_lock;           /* serialise */        kib_rx_t           *ibc_rxs;            /* the rx descs */        kib_pages_t        *ibc_rx_pages;       /* premapped rx msg pages */        struct rdma_cm_id  *ibc_cmid;           /* CM id */        struct ib_cq       *ibc_cq;             /* completion queue */        kib_connvars_t     *ibc_connvars;       /* in-progress connection state */} kib_conn_t;#define IBLND_CONN_INIT               0         /* being intialised */#define IBLND_CONN_ACTIVE_CONNECT     1         /* active sending req */#define IBLND_CONN_PASSIVE_WAIT       2         /* passive waiting for rtu */#define IBLND_CONN_ESTABLISHED        3         /* connection established */#define IBLND_CONN_CLOSING            4         /* being closed */#define IBLND_CONN_DISCONNECTED       5         /* disconnected */typedef struct kib_peer{        struct list_head    ibp_list;           /* stash on global peer list */        lnet_nid_t          ibp_nid;            /* who's on the other end(s) */        lnet_ni_t          *ibp_ni;             /* LNet interface */        atomic_t            ibp_refcount;       /* # users */        struct list_head    ibp_conns;          /* all active connections */        struct list_head    ibp_tx_queue;       /* msgs waiting for a conn */        int                 ibp_connecting;     /* current active connection attempts */        int                 ibp_accepting;      /* current passive connection attempts */        int                 ibp_error;          /* errno on closing this peer */        cfs_time_t          ibp_last_alive;     /* when (in jiffies) I was last alive */} kib_peer_t;extern kib_data_t      kiblnd_data;extern kib_tunables_t  kiblnd_tunables;#define kiblnd_conn_addref(conn)                                \do {                                                            \        CDEBUG(D_NET, "conn[%p] (%d)++\n",                      \               (conn), atomic_read(&(conn)->ibc_refcount));     \        LASSERT(atomic_read(&(conn)->ibc_refcount) > 0);        \        atomic_inc(&(conn)->ibc_refcount);                      \} while (0)#define kiblnd_conn_decref(conn)                                              \do {                                                                          \        unsigned long   flags;                                                \                                                                              \        CDEBUG(D_NET, "conn[%p] (%d)--\n",                                    \               (conn), atomic_read(&(conn)->ibc_refcount));                   \        LASSERT(atomic_read(&(conn)->ibc_refcount) > 0);                      \        if (atomic_dec_and_test(&(conn)->ibc_refcount)) {                     \                spin_lock_irqsave(&kiblnd_data.kib_connd_lock, flags);        \                list_add_tail(&(conn)->ibc_list,                              \                              &kiblnd_data.kib_connd_zombies);                \                wake_up(&kiblnd_data.kib_connd_waitq);                        \                spin_unlock_irqrestore(&kiblnd_data.kib_connd_lock, flags);   \        }                                                                     \} while (0)#define kiblnd_peer_addref(peer)                                \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);        \        atomic_inc(&(peer)->ibp_refcount);                      \} while (0)#define kiblnd_peer_decref(peer)                                \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))         \                kiblnd_destroy_peer(peer);                      \} while (0)static inline struct list_head *kiblnd_nid2peerlist (lnet_nid_t nid){        unsigned int hash = ((unsigned int)nid) % kiblnd_data.kib_peer_hash_size;        return (&kiblnd_data.kib_peers [hash]);}static inline intkiblnd_peer_active (kib_peer_t *peer){        /* Am I in the peer hash table? */        return (!list_empty(&peer->ibp_list));}static inline kib_conn_t *kiblnd_get_conn_locked (kib_peer_t *peer){        LASSERT (!list_empty(&peer->ibp_conns));                /* just return the first connection */        return list_entry(peer->ibp_conns.next, kib_conn_t, ibc_list);}static inline intkiblnd_send_keepalive(kib_conn_t *conn) {        return (*kiblnd_tunables.kib_keepalive > 0) &&

⌨️ 快捷键说明

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