/* Progress VC RXs. Reschedule VC if more there is more work. */ static int __gnix_vc_rx_progress(struct gnix_vc *vc) { int ret; ret = __gnix_vc_connected(vc); if (ret) { /* The CM will schedule the VC when the connection is complete. * Return success to allow continued VC RX processing. */ _gnix_vc_rx_schedule(vc); return FI_SUCCESS; } /* Process pending RXs */ fastlock_acquire(&vc->ep->nic->lock); ret = _gnix_vc_dequeue_smsg(vc); fastlock_release(&vc->ep->nic->lock); if (ret != FI_SUCCESS) { /* We didn't finish processing RXs. Low memory likely. * Try again later. Return error to abort processing * other VCs. */ _gnix_vc_rx_schedule(vc); return -FI_EAGAIN; } /* Return success to continue processing other VCs */ return FI_SUCCESS; }
static int __process_rx_cqe(struct gnix_nic *nic, gni_cq_entry_t cqe) { int ret = FI_SUCCESS, vc_id = 0; struct gnix_vc *vc; vc_id = GNI_CQ_GET_INST_ID(cqe); /* * its possible this vc has been destroyed, so may get NULL * back. */ vc = __gnix_nic_elem_by_rem_id(nic, vc_id); if (vc != NULL) { switch (vc->conn_state) { case GNIX_VC_CONNECTING: GNIX_DEBUG(FI_LOG_EP_DATA, "Scheduling VC for RX processing (%p)\n", vc); ret = _gnix_vc_rx_schedule(vc); assert(ret == FI_SUCCESS); break; case GNIX_VC_CONNECTED: GNIX_DEBUG(FI_LOG_EP_DATA, "Processing VC RX (%p)\n", vc); ret = _gnix_vc_dequeue_smsg(vc); if (ret != FI_SUCCESS) { GNIX_WARN(FI_LOG_EP_DATA, "_gnix_vc_dqueue_smsg returned %d\n", ret); } break; default: break; /* VC not in a state for scheduling or SMSG processing */ } } return ret; }