@@ -388,6 +388,24 @@ void test_rdm_cq_handshake_bad_send_status_unsupported_op(struct efa_resource **
388388 test_rdm_cq_handshake_bad_send_status_impl (state , EFA_IO_COMP_STATUS_LOCAL_ERROR_UNSUPPORTED_OP , true);
389389}
390390
391+
392+ /**
393+ * @brief Verify that unsolicited write recv status is tracked in efa_ibv_cq correctly
394+ *
395+ * @param[in] state struct efa_resource that is managed by the framework
396+ */
397+ void test_ibv_cq_unsolicited_write_recv_status (struct efa_resource * * state )
398+ {
399+ struct efa_resource * resource = * state ;
400+ struct efa_cq * efa_cq ;
401+
402+
403+ efa_unit_test_resource_construct (resource , FI_EP_RDM , EFA_FABRIC_NAME );
404+ efa_cq = container_of (resource -> cq , struct efa_cq , util_cq .cq_fid );
405+
406+ assert_true (efa_use_unsolicited_write_recv () == efa_cq -> ibv_cq .unsolicited_write_recv_enabled );
407+ }
408+
391409/**
392410 * @brief verify that fi_cq_read/fi_cq_readerr works properly when rdma-core return bad status for recv.
393411 *
@@ -460,7 +478,7 @@ void test_ibv_cq_ex_read_bad_recv_status(struct efa_resource **state)
460478 ibv_cq -> ibv_cq_ex -> status = IBV_WC_GENERAL_ERR ;
461479
462480#if HAVE_CAPS_UNSOLICITED_WRITE_RECV
463- if (efa_use_unsolicited_write_recv () ) {
481+ if (ibv_cq -> unsolicited_write_recv_enabled ) {
464482 g_efa_unit_test_mocks .efa_ibv_cq_wc_is_unsolicited = & efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock ;
465483 will_return (efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock , false);
466484 }
@@ -536,19 +554,18 @@ void test_ibv_cq_ex_read_bad_recv_rdma_with_imm_status_impl(struct efa_resource
536554 will_return_always (efa_mock_efa_ibv_cq_wc_read_qp_num_return_mock , efa_rdm_ep -> base_ep .qp -> qp_num );
537555 will_return (efa_mock_efa_ibv_cq_wc_read_vendor_err_return_mock , EFA_IO_COMP_STATUS_FLUSHED );
538556
539- g_efa_unit_test_mocks .efa_device_support_unsolicited_write_recv = & efa_mock_efa_device_support_unsolicited_write_recv ;
540557
541558#if HAVE_CAPS_UNSOLICITED_WRITE_RECV
542559 if (use_unsolicited_recv ) {
543560 g_efa_unit_test_mocks .efa_ibv_cq_wc_is_unsolicited = & efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock ;
544- will_return ( efa_mock_efa_device_support_unsolicited_write_recv , true) ;
561+ ibv_cq -> unsolicited_write_recv_enabled = true;
545562 will_return (efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock , true);
546563 ibv_cq -> ibv_cq_ex -> wr_id = 0 ;
547564 } else {
548565 /*
549566 * For solicited write recv, it will consume an internal rx pkt
550567 */
551- will_return ( efa_mock_efa_device_support_unsolicited_write_recv , false) ;
568+ ibv_cq -> unsolicited_write_recv_enabled = false;
552569 struct efa_rdm_pke * pkt_entry = efa_rdm_pke_alloc (efa_rdm_ep , efa_rdm_ep -> efa_rx_pkt_pool , EFA_RDM_PKE_FROM_EFA_RX_POOL );
553570 assert_non_null (pkt_entry );
554571 efa_rdm_ep -> efa_rx_pkts_posted = efa_rdm_ep_get_rx_pool_size (efa_rdm_ep );
@@ -558,7 +575,7 @@ void test_ibv_cq_ex_read_bad_recv_rdma_with_imm_status_impl(struct efa_resource
558575 /*
559576 * Always test with solicited recv
560577 */
561- will_return ( efa_mock_efa_device_support_unsolicited_write_recv , false) ;
578+ ibv_cq -> unsolicited_write_recv_enabled = false;
562579 struct efa_rdm_pke * pkt_entry = efa_rdm_pke_alloc (efa_rdm_ep , efa_rdm_ep -> efa_rx_pkt_pool , EFA_RDM_PKE_FROM_EFA_RX_POOL );
563580 assert_non_null (pkt_entry );
564581 efa_rdm_ep -> efa_rx_pkts_posted = efa_rdm_ep_get_rx_pool_size (efa_rdm_ep );
@@ -1065,7 +1082,7 @@ static void test_efa_cq_read_prep(struct efa_resource *resource,
10651082
10661083
10671084#if HAVE_CAPS_UNSOLICITED_WRITE_RECV
1068- if (efa_use_unsolicited_write_recv () ) {
1085+ if (ibv_cq -> unsolicited_write_recv_enabled ) {
10691086 g_efa_unit_test_mocks .efa_ibv_cq_wc_is_unsolicited = & efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock ;
10701087 will_return_maybe (efa_mock_efa_ibv_cq_wc_is_unsolicited_return_mock , is_unsolicited_write_recv );
10711088 }
0 commit comments