| # SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) |
| # Copyright (c) 2020 Nvidia, Inc. All rights reserved. See COPYING file |
| |
| from pyverbs.base import PyverbsRDMAErrno, PyverbsRDMAError |
| from pyverbs.providers.mlx5.dr_matcher import DrMatcher |
| from pyverbs.providers.mlx5.dr_domain cimport DrDomain |
| from pyverbs.providers.mlx5.dr_action cimport DrAction |
| from pyverbs.pyverbs_error import PyverbsError |
| from pyverbs.base cimport close_weakrefs |
| import weakref |
| |
| |
| cdef class DrTable(PyverbsCM): |
| def __init__(self, DrDomain domain, level): |
| """ |
| Initialize DrTable object over underlying mlx5dv_dr_table C object. |
| :param domain: Domain object |
| :param level: Table level |
| """ |
| super().__init__() |
| self.table = dv.mlx5dv_dr_table_create(domain.domain, level) |
| if self.table == NULL: |
| raise PyverbsRDMAErrno('DrTable creation failed.') |
| domain.add_ref(self) |
| self.dr_domain = domain |
| self.dr_matchers = weakref.WeakSet() |
| self.dr_actions = weakref.WeakSet() |
| |
| cdef add_ref(self, obj): |
| if isinstance(obj, DrMatcher): |
| self.dr_matchers.add(obj) |
| elif isinstance(obj, DrAction): |
| self.dr_actions.add(obj) |
| else: |
| raise PyverbsError('Unrecognized object type') |
| |
| def __dealloc__(self): |
| self.close() |
| |
| cpdef close(self): |
| if self.table != NULL: |
| if self.logger: |
| self.logger.debug('Closing DrTable.') |
| close_weakrefs([self.dr_matchers, self.dr_actions]) |
| rc = dv.mlx5dv_dr_table_destroy(self.table) |
| if rc: |
| raise PyverbsRDMAError('Failed to destroy DrTable.', rc) |
| self.table = NULL |
| self.dr_domain = None |
| self.dr_actions = None |