int mca_bcol_iboffload_small_msg_bcast_progress( bcol_function_args_t *input_args, struct mca_bcol_base_function_t *const_args) { mca_bcol_iboffload_collreq_t *coll_request = (mca_bcol_iboffload_collreq_t *) input_args->bcol_opaque_data; IBOFFLOAD_VERBOSE(10, ("Run progress.\n")); /* We should send the data to our children in the tree before the upper layer will start with buffers recycling */ if (BCOL_AND_NET_ARE_COMPLETED(coll_request)) { coll_request->user_handle_freed = true; if (COLLREQ_IS_DONE(coll_request)) { IBOFFLOAD_VERBOSE(10, ("Coll request already done.\n")); RELEASE_COLLREQ(coll_request); } IBOFFLOAD_VERBOSE(10, ("New bcast done !!!")); return BCOL_FN_COMPLETE; } return BCOL_FN_STARTED; }
static inline __opal_attribute_always_inline__ int handle_collfrag_done(mca_bcol_iboffload_collfrag_t *coll_frag, mca_bcol_iboffload_collreq_t *coll_request, mca_bcol_iboffload_device_t *device) { int rc; if (COLLFRAG_IS_DONE(coll_frag)) { IBOFFLOAD_VERBOSE(10, ("Coll frag - %p already done.\n", coll_frag)); coll_request->n_frag_net_complete++; IBOFFLOAD_VERBOSE(10, ("Free tasks resourse.\n")); /* Check if we are done with this coll_frag and release resources if so. */ rc = mca_bcol_iboffload_free_tasks_frags_resources(coll_frag, device->frags_free); if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) { IBOFFLOAD_ERROR(("mca_bcol_iboffload_free_tasks_frags_resources FAILED")); fatal_error("Failed to mca_bcol_iboffload_free_tasks_frags_resources\n"); return -1; } BCOL_IBOFFLOAD_MQ_RETURN_CREDITS(coll_request->module, coll_frag->mq_index, coll_frag->mq_credits); RELEASE_COLLFRAG(coll_frag); PROGRESS_PENDING_COLLFRAG(coll_frag); IBOFFLOAD_VERBOSE(10, ("Alg %d: user_handle_freed - %d, n_frag_mpi_complete - %d, " "n_fragments- %d, n_frag_net_complete - %d, n_fragments - %d.\n", coll_frag->alg, coll_request->user_handle_freed, coll_request->n_frag_mpi_complete, coll_request->n_fragments, coll_request->n_frag_net_complete, coll_request->n_fragments)); /* check for full message completion */ if (COLLREQ_IS_DONE(coll_request)) { IBOFFLOAD_VERBOSE(10, ("Coll request already done.\n")); RELEASE_COLLREQ(coll_request); } } IBOFFLOAD_VERBOSE(10, ("Exit with success.\n")); return 0; }
/************************************************************************ ************************ New style Fan-In ****************************** ***********************************************************************/ static int mca_bcol_iboffload_new_style_fanin_progress( bcol_function_args_t *input_args, struct coll_ml_function_t *const_args) { mca_bcol_iboffload_collreq_t *coll_request = (mca_bcol_iboffload_collreq_t *) input_args->bcol_opaque_data; if (BCOL_IS_COMPLETED(coll_request)) { coll_request->user_handle_freed = true; if (COLLREQ_IS_DONE(coll_request)) { IBOFFLOAD_VERBOSE(10, ("Coll request already done.\n")); RELEASE_COLLREQ(coll_request); } IBOFFLOAD_VERBOSE(10, ("Fan-In already done.\n")); return BCOL_FN_COMPLETE; } return BCOL_FN_STARTED; }