| # SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) |
| # Copyright (c) 2019, Mellanox Technologies. All rights reserved. |
| import weakref |
| |
| from pyverbs.pyverbs_error import PyverbsError, PyverbsRDMAError |
| from pyverbs.base import PyverbsRDMAErrno |
| from pyverbs.base cimport close_weakrefs |
| from pyverbs.device cimport Context |
| from pyverbs.srq cimport SRQ |
| from pyverbs.qp cimport QP |
| |
| |
| cdef class XRCDInitAttr(PyverbsObject): |
| def __init__(self, comp_mask, oflags, fd): |
| super().__init__() |
| self.attr.fd = fd |
| self.attr.comp_mask = comp_mask |
| self.attr.oflags = oflags |
| |
| @property |
| def fd(self): |
| return self.attr.fd |
| @fd.setter |
| def fd(self, val): |
| self.attr.fd = val |
| |
| @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 oflags(self): |
| return self.attr.oflags |
| @oflags.setter |
| def oflags(self, val): |
| self.attr.oflags = val |
| |
| |
| cdef class XRCD(PyverbsCM): |
| def __init__(self, Context context not None, XRCDInitAttr init_attr not None): |
| """ |
| Initializes a XRCD object. |
| :param context: The Context object creating the XRCD |
| :return: The newly created XRCD on success |
| """ |
| super().__init__() |
| self.xrcd = v.ibv_open_xrcd(<v.ibv_context*> context.context, |
| &init_attr.attr) |
| if self.xrcd == NULL: |
| raise PyverbsRDMAErrno('Failed to allocate XRCD') |
| self.ctx = context |
| context.add_ref(self) |
| self.logger.debug('XRCD: Allocated ibv_xrcd') |
| self.srqs = weakref.WeakSet() |
| self.qps = weakref.WeakSet() |
| |
| def __dealloc__(self): |
| """ |
| Closes the inner XRCD. |
| :return: None |
| """ |
| self.close() |
| |
| cpdef close(self): |
| """ |
| Closes the underlying C object of the XRCD. |
| :return: None |
| """ |
| # XRCD may be deleted directly or indirectly by closing its context, |
| # which leaves the Python XRCD object without the underlying C object, |
| # so during destruction, need to check whether or not the C object |
| # exists. |
| if self.xrcd != NULL: |
| if self.logger: |
| self.logger.debug('Closing XRCD') |
| close_weakrefs([self.qps, self.srqs]) |
| rc = v.ibv_close_xrcd(self.xrcd) |
| if rc != 0: |
| raise PyverbsRDMAError('Failed to dealloc XRCD', rc) |
| self.xrcd = NULL |
| self.ctx = None |
| |
| cdef add_ref(self, obj): |
| if isinstance(obj, QP): |
| self.qps.add(obj) |
| elif isinstance(obj, SRQ): |
| self.srqs.add(obj) |
| else: |
| raise PyverbsError('Unrecognized object type') |