@@ -1899,33 +1899,51 @@ const ucp_request_send_proto_t ucp_am_reply_proto = {
18991899 .only_hdr_size = sizeof (ucp_am_hdr_t ) + sizeof (ucp_am_reply_ftr_t )
19001900};
19011901
1902- ucs_status_t ucp_am_proto_request_zcopy_reset (ucp_request_t * request )
1902+ static void ucp_am_proto_request_zcopy_reset_header (ucp_request_t * request )
19031903{
19041904 ucs_assert (request -> send .msg_proto .am .header .reg_desc != NULL );
1905- /* Zcopy pack function releases header if it's stored in mpool buffer
1906- * and set copied flag to zero. Zcopy pack function is always called
1907- * before reset function.
1908- */
1909- ucs_assert (!(request -> flags & UCP_REQUEST_FLAG_USER_HEADER_COPIED ));
19101905
19111906 /* If user header is not guaranteed to be valid,
19121907 * use mpool buffer for storing the user header.
19131908 */
19141909 if ((request -> send .msg_proto .am .flags & UCP_AM_SEND_FLAG_COPY_HEADER ) &&
19151910 (request -> send .msg_proto .am .header .length != 0 )) {
1916- request -> send .msg_proto .am .header .ptr = ucs_mpool_set_get_inline (
1917- & request -> send .ep -> worker -> am_mps ,
1918- request -> send .msg_proto .am .header .length );
1919- memcpy (request -> send .msg_proto .am .header .ptr ,
1920- request -> send .msg_proto .am .header .reg_desc + 1 ,
1921- request -> send .msg_proto .am .header .length );
1922- request -> flags |= UCP_REQUEST_FLAG_USER_HEADER_COPIED ;
1911+ request -> send .msg_proto .am .header .ptr = ucs_mpool_set_get_inline (
1912+ & request -> send .ep -> worker -> am_mps ,
1913+ request -> send .msg_proto .am .header .length );
1914+ memcpy (request -> send .msg_proto .am .header .ptr ,
1915+ request -> send .msg_proto .am .header .reg_desc + 1 ,
1916+ request -> send .msg_proto .am .header .length );
1917+ request -> flags |= UCP_REQUEST_FLAG_USER_HEADER_COPIED ;
19231918 }
19241919
19251920 ucs_mpool_put_inline (request -> send .msg_proto .am .header .reg_desc );
19261921 request -> send .msg_proto .am .header .reg_desc = NULL ;
19271922
1928- return ucp_proto_request_zcopy_reset (request );
1923+ }
1924+
1925+ ucs_status_t ucp_am_proto_request_zcopy_reset (ucp_request_t * request )
1926+ {
1927+ /* Zcopy pack function releases header if it's stored in mpool buffer
1928+ * and set copied flag to zero. Zcopy pack function is always called
1929+ * before reset function.
1930+ * TODO: check the statement above, in case of failover request should
1931+ * be restarted after its (error) completion but the completion
1932+ * releases header buffer.
1933+ */
1934+ ucs_assert (!(request -> flags & UCP_REQUEST_FLAG_USER_HEADER_COPIED ));
1935+
1936+ if (request -> send .state .uct_comp .status != UCS_OK ) {
1937+ ucs_assert (request -> send .msg_proto .am .header .reg_desc == NULL );
1938+ } else {
1939+ ucp_am_proto_request_zcopy_reset_header (request );
1940+ }
1941+
1942+ request -> send .msg_proto .am .internal_flags &=
1943+ ~UCP_REQUEST_AM_FLAG_HEADER_SENT ;
1944+
1945+ request -> send .msg_proto .am .internal_flags |= UCP_REQUEST_AM_FLAG_RESET_DONE ;
1946+ return ucp_proto_offload_zcopy_reset (request );
19291947}
19301948
19311949void ucp_proto_am_request_bcopy_abort (ucp_request_t * req , ucs_status_t status )
0 commit comments