@@ -175,6 +175,9 @@ int efadv_query_device(struct ibv_context *ibvctx,
175
175
176
176
if (EFA_DEV_CAP (ctx , UNSOLICITED_WRITE_RECV ))
177
177
attr -> device_caps |= EFADV_DEVICE_ATTR_CAPS_UNSOLICITED_WRITE_RECV ;
178
+
179
+ if (EFA_DEV_CAP (ctx , CQ_WITH_EXT_MEM_DMABUF ))
180
+ attr -> device_caps |= EFADV_DEVICE_ATTR_CAPS_CQ_WITH_EXT_MEM_DMABUF ;
178
181
}
179
182
180
183
if (vext_field_avail (typeof (* attr ), max_rdma_size , inlen )) {
@@ -873,9 +876,9 @@ static void efa_cq_fill_pfns(struct efa_cq *cq,
873
876
if (attr -> wc_flags & IBV_WC_EX_WITH_DLID_PATH_BITS )
874
877
ibvcqx -> read_dlid_path_bits = efa_wc_read_dlid_path_bits ;
875
878
876
- if (efa_attr && ( efa_attr -> wc_flags & EFADV_WC_EX_WITH_SGID ) )
879
+ if (efa_attr -> wc_flags & EFADV_WC_EX_WITH_SGID )
877
880
cq -> dv_cq .wc_read_sgid = efa_wc_read_sgid ;
878
- if (efa_attr && ( efa_attr -> wc_flags & EFADV_WC_EX_WITH_IS_UNSOLICITED ) )
881
+ if (efa_attr -> wc_flags & EFADV_WC_EX_WITH_IS_UNSOLICITED )
879
882
cq -> dv_cq .wc_is_unsolicited = efa_wc_is_unsolicited ;
880
883
}
881
884
@@ -925,12 +928,20 @@ static struct ibv_cq_ex *create_cq(struct ibv_context *ibvctx,
925
928
if (!cq )
926
929
return NULL ;
927
930
928
- if (efa_attr && ( efa_attr -> wc_flags & EFADV_WC_EX_WITH_SGID ) )
931
+ if (efa_attr -> wc_flags & EFADV_WC_EX_WITH_SGID )
929
932
cmd .flags |= EFA_CREATE_CQ_WITH_SGID ;
930
933
931
934
num_sub_cqs = ctx -> sub_cqs_per_cq ;
932
935
cmd .num_sub_cqs = num_sub_cqs ;
933
936
cmd .cq_entry_size = cqe_size ;
937
+
938
+ if (efa_attr -> flags & EFADV_CQ_INIT_FLAGS_EXT_MEM_DMABUF ) {
939
+ cmd .ext_mem_fd = efa_attr -> ext_mem_dmabuf .fd ;
940
+ cmd .ext_mem_offset = efa_attr -> ext_mem_dmabuf .offset ;
941
+ cmd .ext_mem_length = efa_attr -> ext_mem_dmabuf .length ;
942
+ cmd .flags |= EFA_CREATE_CQ_WITH_EXT_MEM_DMABUF ;
943
+ }
944
+
934
945
if (attr -> channel )
935
946
cmd .flags |= EFA_CREATE_CQ_WITH_COMPLETION_CHANNEL ;
936
947
@@ -945,22 +956,30 @@ static struct ibv_cq_ex *create_cq(struct ibv_context *ibvctx,
945
956
946
957
sub_cq_size = cq -> verbs_cq .cq .cqe ;
947
958
cq -> cqn = resp .cq_idx ;
948
- cq -> buf_size = resp .q_mmap_size ;
949
959
cq -> num_sub_cqs = num_sub_cqs ;
950
960
cq -> cqe_size = cqe_size ;
951
961
cq -> dev = ibvctx -> device ;
952
962
953
- cq -> buf = mmap (NULL , cq -> buf_size , PROT_READ , MAP_SHARED ,
954
- ibvctx -> cmd_fd , resp .q_mmap_key );
955
- if (cq -> buf == MAP_FAILED )
956
- goto err_destroy_cq ;
963
+ if (efa_attr -> flags & EFADV_CQ_INIT_FLAGS_EXT_MEM_DMABUF ) {
964
+ cq -> buf_size = efa_attr -> ext_mem_dmabuf .length ;
965
+ cq -> buf = efa_attr -> ext_mem_dmabuf .buffer ;
966
+ } else {
967
+ cq -> buf_size = resp .q_mmap_size ;
968
+ cq -> buf = mmap (NULL , cq -> buf_size , PROT_READ , MAP_SHARED , ibvctx -> cmd_fd ,
969
+ resp .q_mmap_key );
970
+ if (cq -> buf == MAP_FAILED )
971
+ goto err_destroy_cq ;
972
+
973
+ cq -> buf_mmaped = true;
974
+ }
957
975
958
- buf = cq -> buf ;
959
- sub_buf_size = cq -> cqe_size * sub_cq_size ;
960
- for (i = 0 ; i < num_sub_cqs ; i ++ ) {
961
- efa_sub_cq_initialize (& cq -> sub_cq_arr [i ], buf , sub_cq_size ,
962
- cq -> cqe_size );
963
- buf += sub_buf_size ;
976
+ if (cq -> buf ) {
977
+ buf = cq -> buf ;
978
+ sub_buf_size = cq -> cqe_size * sub_cq_size ;
979
+ for (i = 0 ; i < num_sub_cqs ; i ++ ) {
980
+ efa_sub_cq_initialize (& cq -> sub_cq_arr [i ], buf , sub_cq_size , cq -> cqe_size );
981
+ buf += sub_buf_size ;
982
+ }
964
983
}
965
984
966
985
if (resp .comp_mask & EFA_CREATE_CQ_RESP_DB_OFF ) {
@@ -979,7 +998,8 @@ static struct ibv_cq_ex *create_cq(struct ibv_context *ibvctx,
979
998
return & cq -> verbs_cq .cq_ex ;
980
999
981
1000
err_unmap_cq :
982
- munmap (cq -> buf , cq -> buf_size );
1001
+ if (cq -> buf_mmaped )
1002
+ munmap (cq -> buf , cq -> buf_size );
983
1003
err_destroy_cq :
984
1004
ibv_cmd_destroy_cq (& cq -> verbs_cq .cq );
985
1005
err_free_cq :
@@ -991,29 +1011,33 @@ static struct ibv_cq_ex *create_cq(struct ibv_context *ibvctx,
991
1011
struct ibv_cq * efa_create_cq (struct ibv_context * ibvctx , int ncqe ,
992
1012
struct ibv_comp_channel * channel , int vec )
993
1013
{
1014
+ struct efadv_cq_init_attr efa_attr = {};
994
1015
struct ibv_cq_init_attr_ex attr_ex = {
995
1016
.cqe = ncqe ,
996
1017
.channel = channel ,
997
1018
.comp_vector = vec
998
1019
};
999
1020
struct ibv_cq_ex * ibvcqx ;
1000
1021
1001
- ibvcqx = create_cq (ibvctx , & attr_ex , NULL );
1022
+ ibvcqx = create_cq (ibvctx , & attr_ex , & efa_attr );
1002
1023
1003
1024
return ibvcqx ? ibv_cq_ex_to_cq (ibvcqx ) : NULL ;
1004
1025
}
1005
1026
1006
1027
struct ibv_cq_ex * efa_create_cq_ex (struct ibv_context * ibvctx ,
1007
1028
struct ibv_cq_init_attr_ex * attr_ex )
1008
1029
{
1009
- return create_cq (ibvctx , attr_ex , NULL );
1030
+ struct efadv_cq_init_attr efa_attr = {};
1031
+
1032
+ return create_cq (ibvctx , attr_ex , & efa_attr );
1010
1033
}
1011
1034
1012
1035
struct ibv_cq_ex * efadv_create_cq (struct ibv_context * ibvctx ,
1013
1036
struct ibv_cq_init_attr_ex * attr_ex ,
1014
1037
struct efadv_cq_init_attr * efa_attr ,
1015
1038
uint32_t inlen )
1016
1039
{
1040
+ struct efadv_cq_init_attr local_efa_attr = {};
1017
1041
uint64_t supp_wc_flags = 0 ;
1018
1042
struct efa_context * ctx ;
1019
1043
@@ -1043,7 +1067,8 @@ struct ibv_cq_ex *efadv_create_cq(struct ibv_context *ibvctx,
1043
1067
return NULL ;
1044
1068
}
1045
1069
1046
- return create_cq (ibvctx , attr_ex , efa_attr );
1070
+ memcpy (& local_efa_attr , efa_attr , min_t (uint32_t , inlen , sizeof (local_efa_attr )));
1071
+ return create_cq (ibvctx , attr_ex , & local_efa_attr );
1047
1072
}
1048
1073
1049
1074
int efadv_query_cq (struct ibv_cq * ibvcq , struct efadv_cq_attr * attr , uint32_t inlen )
@@ -1088,7 +1113,8 @@ int efa_destroy_cq(struct ibv_cq *ibvcq)
1088
1113
}
1089
1114
1090
1115
munmap (cq -> db_mmap_addr , to_efa_dev (cq -> dev )-> pg_sz );
1091
- munmap (cq -> buf , cq -> buf_size );
1116
+ if (cq -> buf_mmaped )
1117
+ munmap (cq -> buf , cq -> buf_size );
1092
1118
1093
1119
pthread_spin_destroy (& cq -> lock );
1094
1120
0 commit comments