X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fklnds%2Fgnilnd%2Fgnilnd.h;h=f7359a413e325ea8cad45a283e72f601e7ce4861;hb=57c03f3070753146a1d374939197e8c838a0bcc1;hp=b511c9fb2add4b5b4d61e533a1a4015e52507160;hpb=fdb5d3d508edb6d76b6fcc1f23d5d9649211ab64;p=fs%2Flustre-release.git diff --git a/lnet/klnds/gnilnd/gnilnd.h b/lnet/klnds/gnilnd/gnilnd.h index b511c9f..f7359a4 100644 --- a/lnet/klnds/gnilnd/gnilnd.h +++ b/lnet/klnds/gnilnd/gnilnd.h @@ -28,6 +28,8 @@ #ifndef _GNILND_GNILND_H_ #define _GNILND_GNILND_H_ +#define DEBUG_SUBSYSTEM S_LND + #include #include #include @@ -59,12 +61,9 @@ #include #include -#define DEBUG_SUBSYSTEM S_LND - #include #include -#include "gnilnd_version.h" static inline time_t cfs_duration_sec(long duration_jiffies) { @@ -149,6 +148,8 @@ static inline time_t cfs_duration_sec(long duration_jiffies) /* need sane upper bound to limit copy overhead */ #define GNILND_MAX_IMMEDIATE (64<<10) +/* allow for 4M transfers over gni. Note 2.5M used by DVS */ +#define GNILND_MAX_IOV 1024 /* Max number of connections to keep in purgatory per peer */ #define GNILND_PURGATORY_MAX 5 @@ -194,8 +195,6 @@ static inline time_t cfs_duration_sec(long duration_jiffies) #define GNILND_BUF_IMMEDIATE_KIOV 2 /* immediate data */ #define GNILND_BUF_PHYS_UNMAPPED 3 /* physical: not mapped yet */ #define GNILND_BUF_PHYS_MAPPED 4 /* physical: mapped already */ -#define GNILND_BUF_VIRT_UNMAPPED 5 /* virtual: not mapped yet */ -#define GNILND_BUF_VIRT_MAPPED 6 /* virtual: mapped already */ #define GNILND_TX_WAITING_REPLY (1<<1) /* expecting to receive reply */ #define GNILND_TX_WAITING_COMPLETION (1<<2) /* waiting for smsg_send to complete */ @@ -349,7 +348,7 @@ typedef enum kgn_dgram_type { v2: * - added checksum to FMA * moved seq before paylod - * WIRE_ATTR added for alignment + * __packed added for alignment v3: * added gnm_payload_len for FMA payload size v4: @@ -376,12 +375,12 @@ typedef struct kgn_gniparams { __u32 gnpr_host_id; /* ph. host ID of the NIC */ __u32 gnpr_cqid; /* cqid I want peer to use when sending events to me */ gni_smsg_attr_t gnpr_smsg_attr; /* my short msg. attributes */ -} WIRE_ATTR kgn_gniparams_t; +} __packed kgn_gniparams_t; typedef struct kgn_nak_data { __s32 gnnd_errno; /* errno reason for NAK */ -} WIRE_ATTR kgn_nak_data_t; +} __packed kgn_nak_data_t; /* the first bits of the connreq struct CANNOT CHANGE FORM EVER * without breaking the ability for us to properly NAK someone */ @@ -403,42 +402,42 @@ typedef struct kgn_connreq { /* connection request/response * kgn_gniparams_t gncr_gnparams; /* sender's endpoint info */ kgn_nak_data_t gncr_nakdata; /* data (rc, etc) for NAK */ }; -} WIRE_ATTR kgn_connreq_t; +} __packed kgn_connreq_t; typedef struct { gni_mem_handle_t gnrd_key; __u64 gnrd_addr; __u32 gnrd_nob; -} WIRE_ATTR kgn_rdma_desc_t; +} __packed kgn_rdma_desc_t; typedef struct { struct lnet_hdr gnim_hdr; /* LNet header */ /* LNet payload is in FMA "Message Data" */ -} WIRE_ATTR kgn_immediate_msg_t; +} __packed kgn_immediate_msg_t; typedef struct { struct lnet_hdr gnprm_hdr; /* LNet header */ __u64 gnprm_cookie; /* opaque completion cookie */ -} WIRE_ATTR kgn_putreq_msg_t; +} __packed kgn_putreq_msg_t; typedef struct { __u64 gnpam_src_cookie; /* reflected completion cookie */ __u64 gnpam_dst_cookie; /* opaque completion cookie */ __u16 gnpam_payload_cksum; /* checksum for get msg */ kgn_rdma_desc_t gnpam_desc; /* sender's sink buffer */ -} WIRE_ATTR kgn_putack_msg_t; +} __packed kgn_putack_msg_t; typedef struct { struct lnet_hdr gngm_hdr; /* LNet header */ __u64 gngm_cookie; /* opaque completion cookie */ __u16 gngm_payload_cksum; /* checksum for put msg */ kgn_rdma_desc_t gngm_desc; /* sender's sink buffer */ -} WIRE_ATTR kgn_get_msg_t; +} __packed kgn_get_msg_t; typedef struct { int gncm_retval; /* error on NAK, size on REQ */ __u64 gncm_cookie; /* reflected completion cookie */ -} WIRE_ATTR kgn_completion_msg_t; +} __packed kgn_completion_msg_t; typedef struct { /* NB must fit in FMA "Prefix" */ __u32 gnm_magic; /* I'm an gni message */ @@ -457,7 +456,7 @@ typedef struct { /* NB must fit in FMA "Prefix" * kgn_get_msg_t get; kgn_completion_msg_t completion; } gnm_u; -} WIRE_ATTR kgn_msg_t; +} __packed kgn_msg_t; /************************************************************************ * runtime tunable data @@ -581,8 +580,6 @@ typedef struct kgn_device { atomic64_t gnd_nbytes_map; /* bytes of total GART maps - fma, tx, etc */ __u32 gnd_map_nphys; /* # TX phys mappings */ __u32 gnd_map_physnop; /* # TX phys pages mapped */ - __u32 gnd_map_nvirt; /* # TX virt mappings */ - __u64 gnd_map_virtnob; /* # TX virt bytes mapped */ spinlock_t gnd_map_lock; /* serialize gnd_map_XXX */ unsigned long gnd_next_map; /* next mapping attempt in jiffies */ int gnd_map_attempt; /* last map attempt # */ @@ -813,7 +810,7 @@ typedef struct kgn_rx { kgn_msg_t *grx_msg; /* message */ struct lnet_msg *grx_lntmsg; /* lnet msg for this rx (eager only) */ int grx_eager; /* if eager, we copied msg to somewhere */ - struct timespec grx_received; /* time this msg received */ + struct timespec64 grx_received; /* time this msg received */ } kgn_rx_t; typedef struct kgn_data { @@ -1002,12 +999,10 @@ static inline void *kgnilnd_vzalloc(int size) { void *ret; if (*kgnilnd_tunables.kgn_vzalloc_noretry) - ret = __vmalloc(size, __GFP_HIGHMEM | GFP_NOIO | __GFP_NORETRY | - __GFP_ZERO, - PAGE_KERNEL); + ret = __ll_vmalloc(size, __GFP_HIGHMEM | GFP_NOIO | __GFP_ZERO | + __GFP_NORETRY); else - ret = __vmalloc(size, __GFP_HIGHMEM | GFP_NOIO | __GFP_ZERO, - PAGE_KERNEL); + ret = __ll_vmalloc(size, __GFP_HIGHMEM | GFP_NOIO | __GFP_ZERO); LIBCFS_ALLOC_POST(ret, size); return ret; @@ -1160,34 +1155,36 @@ do { \ #error "this code uses actions inside LASSERT for ref counting" #endif -#define kgnilnd_admin_addref(atomic) \ -do { \ - int val = atomic_inc_return(&atomic); \ - LASSERTF(val > 0, #atomic " refcount %d\n", val); \ - CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \ +#define kgnilnd_admin_addref(atomic) \ +do { \ + int val = atomic_inc_return(&atomic); \ + LASSERTF(val > 0, #atomic " refcount %d\n", val); \ + CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \ } while (0) -#define kgnilnd_admin_decref(atomic) \ -do { \ - int val = atomic_dec_return(&atomic); \ - LASSERTF(val >=0, #atomic " refcount %d\n", val); \ - CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \ +#define kgnilnd_admin_decref(atomic) \ +do { \ + int val = atomic_dec_return(&atomic); \ + LASSERTF(val >= 0, #atomic " refcount %d\n", val); \ + CDEBUG(D_NETTRACE, #atomic " refcount %d\n", val); \ + if (!val) \ + wake_up_var(&kgnilnd_data); \ }while (0) -#define kgnilnd_net_addref(net) \ -do { \ - int val = atomic_inc_return(&net->gnn_refcount); \ - LASSERTF(val > 1, "net %p refcount %d\n", net, val); \ - CDEBUG(D_NETTRACE, "net %p->%s++ (%d)\n", net, \ - libcfs_nid2str(net->gnn_ni->ni_nid), val); \ +#define kgnilnd_net_addref(net) \ +do { \ + int val = atomic_inc_return(&net->gnn_refcount); \ + LASSERTF(val > 1, "net %p refcount %d\n", net, val); \ + CDEBUG(D_NETTRACE, "net %p->%s++ (%d)\n", net, \ + libcfs_nidstr(&net->gnn_ni->ni_nid), val); \ } while (0) -#define kgnilnd_net_decref(net) \ -do { \ - int val = atomic_dec_return(&net->gnn_refcount); \ - LASSERTF(val >= 0, "net %p refcount %d\n", net, val); \ - CDEBUG(D_NETTRACE, "net %p->%s-- (%d)\n", net, \ - libcfs_nid2str(net->gnn_ni->ni_nid), val); \ +#define kgnilnd_net_decref(net) \ +do { \ + int val = atomic_dec_return(&net->gnn_refcount); \ + LASSERTF(val >= 0, "net %p refcount %d\n", net, val); \ + CDEBUG(D_NETTRACE, "net %p->%s-- (%d)\n", net, \ + libcfs_nidstr(&net->gnn_ni->ni_nid), val); \ } while (0) #define kgnilnd_peer_addref(peer) \ @@ -1381,7 +1378,7 @@ kgnilnd_check_purgatory_conn(kgn_conn_t *conn) if (conn->gnc_peer) { loopback = conn->gnc_peer->gnp_nid == - conn->gnc_peer->gnp_net->gnn_ni->ni_nid; + lnet_nid_to_nid4(&conn->gnc_peer->gnp_net->gnn_ni->ni_nid); } else { /* short circuit - a conn that didn't complete * setup never needs a purgatory hold */ @@ -1573,8 +1570,7 @@ kgnilnd_tx_del_state_locked(kgn_tx_t *tx, kgn_peer_t *peer, static inline int kgnilnd_tx_mapped(kgn_tx_t *tx) { - return (tx->tx_buftype == GNILND_BUF_VIRT_MAPPED || - tx->tx_buftype == GNILND_BUF_PHYS_MAPPED); + return tx->tx_buftype == GNILND_BUF_PHYS_MAPPED; } static inline struct list_head * @@ -1750,8 +1746,11 @@ kgnilnd_find_net(lnet_nid_t nid, kgn_net_t **netp) return -ESHUTDOWN; } - list_for_each_entry(net, kgnilnd_netnum2netlist(LNET_NETNUM(LNET_NIDNET(nid))), gnn_list) { - if (!net->gnn_shutdown && LNET_NIDNET(net->gnn_ni->ni_nid) == LNET_NIDNET(nid)) { + list_for_each_entry(net, + kgnilnd_netnum2netlist(LNET_NETNUM(LNET_NIDNET(nid))), + gnn_list) { + if (!net->gnn_shutdown && + LNET_NID_NET(&net->gnn_ni->ni_nid) == LNET_NIDNET(nid)) { kgnilnd_net_addref(net); up_read(&kgnilnd_data.kgn_net_rw_sem); *netp = net; @@ -1783,16 +1782,16 @@ void kgnilnd_unmap_fma_blocks(kgn_device_t *device); void kgnilnd_free_phys_fmablk(kgn_device_t *device); int kgnilnd_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg); -void kgnilnd_query(struct lnet_ni *ni, lnet_nid_t nid, time64_t *when); int kgnilnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg); int kgnilnd_eager_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, void **new_private); int kgnilnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, int delayed, unsigned int niov, - struct kvec *iov, lnet_kiov_t *kiov, + struct bio_vec *kiov, unsigned int offset, unsigned int mlen, unsigned int rlen); -__u16 kgnilnd_cksum_kiov(unsigned int nkiov, lnet_kiov_t *kiov, unsigned int offset, unsigned int nob, int dump_blob); +__u16 kgnilnd_cksum_kiov(unsigned int nkiov, struct bio_vec *kiov, + unsigned int offset, unsigned int nob, int dump_blob); /* purgatory functions */ void kgnilnd_add_purgatory_locked(kgn_conn_t *conn, kgn_peer_t *peer); @@ -1819,13 +1818,15 @@ int kgnilnd_del_conn_or_peer(kgn_net_t *net, lnet_nid_t nid, int command, int er void kgnilnd_peer_increase_reconnect_locked(kgn_peer_t *peer); void kgnilnd_queue_reply(kgn_conn_t *conn, kgn_tx_t *tx); void kgnilnd_queue_tx(kgn_conn_t *conn, kgn_tx_t *tx); -void kgnilnd_launch_tx(kgn_tx_t *tx, kgn_net_t *net, struct lnet_process_id *target); +void kgnilnd_launch_tx(kgn_tx_t *tx, kgn_net_t *net, + struct lnet_processid *target); int kgnilnd_send_mapped_tx(kgn_tx_t *tx, int try_map_if_full); void kgnilnd_consume_rx(kgn_rx_t *rx); void kgnilnd_schedule_device(kgn_device_t *dev); void kgnilnd_device_callback(__u32 devid, __u64 arg); -void kgnilnd_schedule_device_timer(unsigned long arg); +void kgnilnd_schedule_device_timer(cfs_timer_cb_arg_t data); +void kgnilnd_schedule_device_timer_rd(cfs_timer_cb_arg_t data); int kgnilnd_reaper(void *arg); int kgnilnd_scheduler(void *arg);