blob: 12e812cb927fcc93f93c0543b17f664c0df15df9 [file] [edit]
# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
# Copyright Amazon.com, Inc. or its affiliates. All rights reserved.
#cython: language_level=3
from pyverbs.base import PyverbsRDMAErrno, PyverbsRDMAError
from pyverbs.device cimport Context
cimport pyverbs.libibverbs as v
cdef class CompCntrInitAttr(PyverbsObject):
"""Represents ibv_comp_cntr_init_attr struct."""
def __init__(self, comp_mask=0, cntr_type=0, flags=0):
super().__init__()
self.attr.comp_mask = comp_mask
self.attr.type = cntr_type
self.attr.flags = flags
@property
def comp_mask(self):
return self.attr.comp_mask
@property
def cntr_type(self):
return self.attr.type
@property
def flags(self):
return self.attr.flags
cdef class CompCntr(PyverbsCM):
"""Completion Counter object for tracking aggregate completions."""
def __init__(self, Context ctx not None, CompCntrInitAttr attr not None):
"""Create a completion counter.
:param ctx: Device context to create the counter on.
:param attr: Completion counter init attributes.
"""
super().__init__()
self.comp_cntr = v.ibv_create_comp_cntr(ctx.context, &attr.attr)
if self.comp_cntr == NULL:
raise PyverbsRDMAErrno('Failed to create comp_cntr')
self.ctx = ctx
ctx.add_ref(self)
def __dealloc__(self):
self.close()
cpdef close(self):
"""Destroy the completion counter."""
if self.comp_cntr != NULL:
rc = v.ibv_destroy_comp_cntr(self.comp_cntr)
if rc:
raise PyverbsRDMAError('Failed to destroy comp_cntr', rc)
self.comp_cntr = NULL
def set(self, value):
"""Set the completion count to the given value."""
rc = v.ibv_set_comp_cntr(self.comp_cntr, value)
if rc:
raise PyverbsRDMAError('Failed to set comp_cntr', rc)
def set_err(self, value):
"""Set the error count to the given value."""
rc = v.ibv_set_err_comp_cntr(self.comp_cntr, value)
if rc:
raise PyverbsRDMAError('Failed to set_err comp_cntr', rc)
def inc(self, amount):
"""Increment the completion count by amount."""
rc = v.ibv_inc_comp_cntr(self.comp_cntr, amount)
if rc:
raise PyverbsRDMAError('Failed to inc comp_cntr', rc)
def inc_err(self, amount):
"""Increment the error count by amount."""
rc = v.ibv_inc_err_comp_cntr(self.comp_cntr, amount)
if rc:
raise PyverbsRDMAError('Failed to inc_err comp_cntr', rc)
def read(self):
"""Read and return the current completion count."""
cdef unsigned long value = 0
rc = v.ibv_read_comp_cntr(self.comp_cntr, &value)
if rc:
raise PyverbsRDMAError('Failed to read comp_cntr', rc)
return value
def read_err(self):
"""Read and return the current error count."""
cdef unsigned long value = 0
rc = v.ibv_read_err_comp_cntr(self.comp_cntr, &value)
if rc:
raise PyverbsRDMAError('Failed to read_err comp_cntr', rc)
return value