X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fptlrpc%2Fniobuf.c;h=26eb727e87d007cc7e3b0bc0aa29a0d39e978517;hb=4cab34af56c645cfbe2e20ded908e7a871b5cc1a;hp=755032d8b4360e95f8532395bb8345c6f1dfe7c6;hpb=31b264e095ee5347c19cce08d6622ef1978ca7b6;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/niobuf.c b/lustre/ptlrpc/niobuf.c index 755032d..26eb727 100644 --- a/lustre/ptlrpc/niobuf.c +++ b/lustre/ptlrpc/niobuf.c @@ -20,19 +20,14 @@ * */ -#define EXPORT_SYMTAB - #define DEBUG_SUBSYSTEM S_RPC +#include #include -extern ptl_handle_eq_t request_out_eq, - reply_in_eq, - reply_out_eq, - bulk_source_eq, - bulk_sink_eq; -static ptl_process_id_t local_id = {PTL_ID_ANY, PTL_ID_ANY}; - +extern ptl_handle_eq_t request_out_eq, reply_in_eq, reply_out_eq, + bulk_source_eq, bulk_sink_eq; +static ptl_process_id_t local_id = {PTL_NID_ANY, PTL_PID_ANY}; int ptlrpc_check_bulk_sent(struct ptlrpc_bulk_desc *bulk) { @@ -97,10 +92,10 @@ static int ptl_send_buf(struct ptlrpc_request *request, CDEBUG(D_NET, "Sending %d bytes to portal %d, xid %Ld\n", request->rq_req_md.length, portal, request->rq_xid); - rc = PtlPut(md_h, ack, remote_id, portal, 0, request->rq_reqmsg->xid, + rc = PtlPut(md_h, ack, remote_id, portal, 0, request->rq_xid, 0, 0); if (rc != PTL_OK) { - CERROR("PtlPut(%d, %d, %Ld) failed: %d\n", remote_id.nid, + CERROR("PtlPut(%Lu, %d, %Ld) failed: %d\n", remote_id.nid, portal, request->rq_xid, rc); PtlMDUnlink(md_h); } @@ -108,101 +103,122 @@ static int ptl_send_buf(struct ptlrpc_request *request, return rc; } -int ptlrpc_send_bulk(struct ptlrpc_bulk_desc *bulk, int portal) +int ptlrpc_send_bulk(struct ptlrpc_bulk_desc *desc) { int rc; + struct list_head *tmp, *next; ptl_process_id_t remote_id; + ENTRY; - bulk->b_md.start = bulk->b_buf; - bulk->b_md.length = bulk->b_buflen; - bulk->b_md.eventq = bulk_source_eq; - bulk->b_md.threshold = 2; /* SENT and ACK events */ - bulk->b_md.options = PTL_MD_OP_PUT; - bulk->b_md.user_ptr = bulk; - - rc = PtlMDBind(bulk->b_connection->c_peer.peer_ni, bulk->b_md, - &bulk->b_md_h); - if (rc != 0) { - CERROR("PtlMDBind failed: %d\n", rc); - LBUG(); - return rc; - } - - remote_id.nid = bulk->b_connection->c_peer.peer_nid; - remote_id.pid = 0; - - CDEBUG(D_NET, "Sending %d bytes to portal %d, xid %d\n", - bulk->b_md.length, portal, bulk->b_xid); - - rc = PtlPut(bulk->b_md_h, PTL_ACK_REQ, remote_id, portal, 0, - bulk->b_xid, 0, 0); - if (rc != PTL_OK) { - CERROR("PtlPut(%d, %d, %d) failed: %d\n", remote_id.nid, - portal, bulk->b_xid, rc); - PtlMDUnlink(bulk->b_md_h); - LBUG(); + list_for_each_safe(tmp, next, &desc->b_page_list) { + struct ptlrpc_bulk_page *bulk; + bulk = list_entry(tmp, struct ptlrpc_bulk_page, b_link); + + bulk->b_md.start = bulk->b_buf; + bulk->b_md.length = bulk->b_buflen; + bulk->b_md.eventq = bulk_source_eq; + bulk->b_md.threshold = 2; /* SENT and ACK */ + bulk->b_md.options = PTL_MD_OP_PUT; + bulk->b_md.user_ptr = bulk; + + rc = PtlMDBind(desc->b_connection->c_peer.peer_ni, bulk->b_md, + &bulk->b_md_h); + if (rc != 0) { + CERROR("PtlMDBind failed: %d\n", rc); + LBUG(); + RETURN(rc); + } + + remote_id.nid = desc->b_connection->c_peer.peer_nid; + remote_id.pid = 0; + + CDEBUG(D_NET, "Sending %d bytes to portal %d, xid %d\n", + bulk->b_md.length, desc->b_portal, bulk->b_xid); + + rc = PtlPut(bulk->b_md_h, PTL_ACK_REQ, remote_id, + desc->b_portal, 0, bulk->b_xid, 0, 0); + if (rc != PTL_OK) { + CERROR("PtlPut(%Lu, %d, %d) failed: %d\n", + remote_id.nid, desc->b_portal, bulk->b_xid, rc); + PtlMDUnlink(bulk->b_md_h); + LBUG(); + RETURN(rc); + } } - return rc; + RETURN(0); } -int ptlrpc_register_bulk(struct ptlrpc_bulk_desc *bulk) +int ptlrpc_register_bulk(struct ptlrpc_bulk_desc *desc) { + struct list_head *tmp, *next; int rc; ENTRY; - rc = PtlMEAttach(bulk->b_connection->c_peer.peer_ni, bulk->b_portal, - local_id, bulk->b_xid, 0, PTL_UNLINK, PTL_INS_AFTER, - &bulk->b_me_h); - if (rc != PTL_OK) { - CERROR("PtlMEAttach failed: %d\n", rc); - LBUG(); - GOTO(cleanup, rc); - } - - bulk->b_md.start = bulk->b_buf; - bulk->b_md.length = bulk->b_buflen; - bulk->b_md.threshold = 1; - bulk->b_md.options = PTL_MD_OP_PUT; - bulk->b_md.user_ptr = bulk; - bulk->b_md.eventq = bulk_sink_eq; - - rc = PtlMDAttach(bulk->b_me_h, bulk->b_md, PTL_UNLINK, &bulk->b_md_h); - //CERROR("MDAttach (bulk sink): %Lu\n", (__u64)bulk->b_md_h); - if (rc != PTL_OK) { - CERROR("PtlMDAttach failed: %d\n", rc); - LBUG(); - GOTO(cleanup, rc); + list_for_each_safe(tmp, next, &desc->b_page_list) { + struct ptlrpc_bulk_page *bulk; + bulk = list_entry(tmp, struct ptlrpc_bulk_page, b_link); + + rc = PtlMEAttach(desc->b_connection->c_peer.peer_ni, + desc->b_portal, local_id, bulk->b_xid, 0, + PTL_UNLINK, PTL_INS_AFTER, &bulk->b_me_h); + if (rc != PTL_OK) { + CERROR("PtlMEAttach failed: %d\n", rc); + LBUG(); + GOTO(cleanup, rc); + } + + bulk->b_md.start = bulk->b_buf; + bulk->b_md.length = bulk->b_buflen; + bulk->b_md.threshold = 1; + bulk->b_md.options = PTL_MD_OP_PUT; + bulk->b_md.user_ptr = bulk; + bulk->b_md.eventq = bulk_sink_eq; + + rc = PtlMDAttach(bulk->b_me_h, bulk->b_md, PTL_UNLINK, + &bulk->b_md_h); + if (rc != PTL_OK) { + CERROR("PtlMDAttach failed: %d\n", rc); + LBUG(); + GOTO(cleanup, rc); + } + + CDEBUG(D_NET, "Setup bulk sink buffer: %u bytes, xid %u, " + "portal %u\n", bulk->b_buflen, bulk->b_xid, + desc->b_portal); } - CDEBUG(D_NET, "Setup bulk sink buffer: %u bytes, xid %u, portal %u\n", - bulk->b_buflen, bulk->b_xid, bulk->b_portal); RETURN(0); - // XXX Confirm that this is safe! cleanup: - PtlMEUnlink(bulk->b_me_h); + ptlrpc_abort_bulk(desc); + return rc; } -int ptlrpc_abort_bulk(struct ptlrpc_bulk_desc *bulk) +int ptlrpc_abort_bulk(struct ptlrpc_bulk_desc *desc) { - int rc; + struct list_head *tmp, *next; - rc = PtlMEUnlink(bulk->b_me_h); - if (rc != PTL_OK) - CERROR("PtlMEUnlink failed: %d\n", rc); + list_for_each_safe(tmp, next, &desc->b_page_list) { + struct ptlrpc_bulk_page *bulk; + bulk = list_entry(tmp, struct ptlrpc_bulk_page, b_link); - return rc; + /* This should be safe: these handles are initialized to be + * invalid in ptlrpc_prep_bulk_page() */ + PtlMDUnlink(bulk->b_md_h); + PtlMEUnlink(bulk->b_me_h); + } + + return 0; } int ptlrpc_reply(struct ptlrpc_service *svc, struct ptlrpc_request *req) { /* FIXME: we need to increment the count of handled events */ req->rq_type = PTL_RPC_TYPE_REPLY; - req->rq_repmsg->conn = req->rq_connection->c_remote_conn; - req->rq_repmsg->token = req->rq_connection->c_remote_token; - req->rq_repmsg->xid = HTON__u32(req->rq_reqmsg->xid); + //req->rq_repmsg->conn = req->rq_connection->c_remote_conn; + //req->rq_repmsg->token = req->rq_connection->c_remote_token; req->rq_repmsg->status = HTON__u32(req->rq_status); req->rq_reqmsg->type = HTON__u32(req->rq_type); return ptl_send_buf(req, req->rq_connection, svc->srv_rep_portal); @@ -231,7 +247,6 @@ int ptlrpc_error(struct ptlrpc_service *svc, struct ptlrpc_request *req) int ptl_send_rpc(struct ptlrpc_request *request) { - ptl_process_id_t local_id; int rc; char *repbuf; @@ -254,17 +269,16 @@ int ptl_send_rpc(struct ptlrpc_request *request) OBD_FREE(request->rq_reply_md.start, request->rq_replen); OBD_ALLOC(repbuf, request->rq_replen); - if (!repbuf) + if (!repbuf) { + LBUG(); RETURN(ENOMEM); - - local_id.nid = PTL_ID_ANY; - local_id.pid = PTL_ID_ANY; + } down(&request->rq_client->cli_rpc_sem); rc = PtlMEAttach(request->rq_connection->c_peer.peer_ni, request->rq_client->cli_reply_portal, - local_id, request->rq_reqmsg->xid, 0, PTL_UNLINK, + local_id, request->rq_xid, 0, PTL_UNLINK, PTL_INS_AFTER, &request->rq_reply_me_h); if (rc != PTL_OK) { CERROR("PtlMEAttach failed: %d\n", rc); @@ -349,7 +363,6 @@ int ptl_handled_rpc(struct ptlrpc_service *service, void *start) int index; spin_lock(&service->srv_lock); - for (index = 0; index < service->srv_ring_length; index++) if (service->srv_buf[index] == start) break;