forked from linux-rdma/rdma-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
srq.pyx
208 lines (177 loc) · 5.76 KB
/
srq.pyx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import weakref
from pyverbs.pyverbs_error import PyverbsRDMAError, PyverbsError
from pyverbs.base import PyverbsRDMAErrno
from pyverbs.base cimport close_weakrefs
from pyverbs.device cimport Context
from pyverbs.cq cimport CQEX, CQ
from pyverbs.xrcd cimport XRCD
from pyverbs.wr cimport RecvWR
from pyverbs.qp cimport QP
from pyverbs.pd cimport PD
from libc.errno cimport errno
from libc.string cimport memcpy
cdef class SrqAttr(PyverbsObject):
def __init__(self, max_wr=100, max_sge=1, srq_limit=0):
super().__init__()
self.attr.max_wr = max_wr
self.attr.max_sge = max_sge
self.attr.srq_limit = srq_limit
@property
def max_wr(self):
return self.attr.max_wr
@max_wr.setter
def max_wr(self, val):
self.attr.max_wr = val
@property
def max_sge(self):
return self.attr.max_sge
@max_sge.setter
def max_sge(self, val):
self.attr.max_sge = val
@property
def srq_limit(self):
return self.attr.srq_limit
@srq_limit.setter
def srq_limit(self, val):
self.attr.srq_limit = val
cdef class SrqInitAttr(PyverbsObject):
def __init__(self, SrqAttr attr = None):
super().__init__()
if attr is not None:
self.attr.attr.max_wr = attr.max_wr
self.attr.attr.max_sge = attr.max_sge
self.attr.attr.srq_limit = attr.srq_limit
@property
def max_wr(self):
return self.attr.attr.max_wr
@property
def max_sge(self):
return self.attr.attr.max_sge
@property
def srq_limit(self):
return self.attr.attr.srq_limit
cdef class SrqInitAttrEx(PyverbsObject):
def __init__(self, max_wr=100, max_sge=1, srq_limit=0):
super().__init__()
self.attr.attr.max_wr = max_wr
self.attr.attr.max_sge = max_sge
self.attr.attr.srq_limit = srq_limit
self._cq = None
self._pd = None
self._xrcd = None
@property
def max_wr(self):
return self.attr.attr.max_wr
@property
def max_sge(self):
return self.attr.attr.max_sge
@property
def srq_limit(self):
return self.attr.attr.srq_limit
@property
def comp_mask(self):
return self.attr.comp_mask
@comp_mask.setter
def comp_mask(self, val):
self.attr.comp_mask = val
@property
def srq_type(self):
return self.attr.srq_type
@srq_type.setter
def srq_type(self, val):
self.attr.srq_type = val
@property
def pd(self):
return self._pd
@pd.setter
def pd(self, PD val):
self._pd = val
self.attr.pd = val.pd
@property
def xrcd(self):
return self._xrcd
@xrcd.setter
def xrcd(self, XRCD val):
self._xrcd = val
self.attr.xrcd = val.xrcd
@property
def cq(self):
return self._cq
@cq.setter
def cq(self, val):
if type(val) == CQ:
self.attr.cq = (<CQ>val).cq
self._cq = val
else:
self.attr.cq = (<CQEX>val).ibv_cq
self._cq = val
cdef class SRQ(PyverbsCM):
def __init__(self, object creator not None, object attr not None):
super().__init__()
self.srq = NULL
self.cq = None
self.qps = weakref.WeakSet()
if isinstance(creator, PD):
self._create_srq(creator, attr)
elif type(creator) == Context:
self._create_srq_ex(creator, attr)
else:
raise PyverbsRDMAError('Srq needs either Context or PD for creation')
if self.srq == NULL:
raise PyverbsRDMAErrno('Failed to create SRQ (errno is {err})'.
format(err=errno))
self.logger.debug('SRQ Created')
def __dealloc__(self):
self.close()
cpdef close(self):
if self.srq != NULL:
self.logger.debug('Closing SRQ')
close_weakrefs([self.qps])
rc = v.ibv_destroy_srq(self.srq)
if rc != 0:
raise PyverbsRDMAError('Failed to destroy SRQ', rc)
self.srq = NULL
self.cq =None
cdef add_ref(self, obj):
if isinstance(obj, QP):
self.qps.add(obj)
else:
raise PyverbsError('Unrecognized object type')
def _create_srq(self, PD pd, SrqInitAttr init_attr):
self.srq = v.ibv_create_srq(pd.pd, &init_attr.attr)
pd.add_ref(self)
def _create_srq_ex(self, Context context, SrqInitAttrEx init_attr_ex):
self.srq = v.ibv_create_srq_ex(context.context, &init_attr_ex.attr)
if init_attr_ex.cq:
cq = <CQ>init_attr_ex.cq
cq.add_ref(self)
self.cq = cq
if init_attr_ex.xrcd:
xrcd = <XRCD>init_attr_ex.xrcd
xrcd.add_ref(self)
if init_attr_ex.pd:
pd = <PD>init_attr_ex.pd
pd.add_ref(self)
def get_srq_num(self):
cdef unsigned int srqn
rc = v.ibv_get_srq_num(self.srq, &srqn)
if rc != 0:
raise PyverbsRDMAError('Failed to retrieve SRQ number', rc)
return srqn
def modify(self, SrqAttr attr, comp_mask):
rc = v.ibv_modify_srq(self.srq, &attr.attr, comp_mask)
if rc != 0:
raise PyverbsRDMAError('Failed to modify SRQ', rc)
def query(self):
attr = SrqAttr()
rc = v.ibv_query_srq(self.srq, &attr.attr)
if rc != 0:
raise PyverbsRDMAError('Failed to query SRQ', rc)
return attr
def post_recv(self, RecvWR wr not None, RecvWR bad_wr=None):
cdef v.ibv_recv_wr *my_bad_wr
rc = v.ibv_post_srq_recv(self.srq, &wr.recv_wr, &my_bad_wr)
if rc != 0:
if bad_wr:
memcpy(&bad_wr.recv_wr, my_bad_wr, sizeof(bad_wr.recv_wr))
raise PyverbsRDMAError('Failed to post receive to SRQ.', rc)