Skip to content

Commit

Permalink
pyverbs: Support RSS QPs
Browse files Browse the repository at this point in the history
Support creation of Indirection Tables in order to support
Receive Side Scaling (RSS) QPs.
The following objects are added: RwqIndTable, RxHashConf.

Signed-off-by: Shachar Kagan <skagan@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
  • Loading branch information
ShacharKagan authored and EdwardSro committed Feb 23, 2022
1 parent 037a175 commit 64a8525
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 14 deletions.
1 change: 1 addition & 0 deletions pyverbs/device.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ cdef class Context(PyverbsCM):
cdef object sched_leafs
cdef object dr_domains
cdef object wqs
cdef object rwq_ind_tbls

cdef class DeviceAttr(PyverbsObject):
cdef v.ibv_device_attr dev_attr
Expand Down
9 changes: 6 additions & 3 deletions pyverbs/device.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ from pyverbs.cq cimport CQEX, CQ, CompChannel
from .pyverbs_error import PyverbsUserError
from pyverbs.base import PyverbsRDMAErrno
from pyverbs.base cimport close_weakrefs
from pyverbs.wq cimport WQ, RwqIndTable
cimport pyverbs.libibverbs_enums as e
cimport pyverbs.libibverbs as v
cimport pyverbs.librdmacm as cm
Expand All @@ -22,7 +23,6 @@ from pyverbs.addr cimport GID
from pyverbs.mr import DMMR
from pyverbs.pd cimport PD
from pyverbs.qp cimport QP
from pyverbs.wq cimport WQ
from libc.stdlib cimport free, malloc
from libc.string cimport memset
from libc.stdint cimport uint64_t
Expand Down Expand Up @@ -120,6 +120,7 @@ cdef class Context(PyverbsCM):
self.sched_leafs = weakref.WeakSet()
self.dr_domains = weakref.WeakSet()
self.wqs = weakref.WeakSet()
self.rwq_ind_tbls = weakref.WeakSet()

self.name = kwargs.get('name')
provider_attr = kwargs.get('attr')
Expand Down Expand Up @@ -171,8 +172,8 @@ cdef class Context(PyverbsCM):
cpdef close(self):
if self.context != NULL:
self.logger.debug('Closing Context')
close_weakrefs([self.qps, self.wqs, self.ccs, self.cqs, self.dms, self.pds,
self.xrcds, self.vars, self.sched_leafs,
close_weakrefs([self.qps, self.rwq_ind_tbls, self.wqs, self.ccs, self.cqs,
self.dms, self.pds, self.xrcds, self.vars, self.sched_leafs,
self.sched_nodes, self.dr_domains])
rc = v.ibv_close_device(self.context)
if rc != 0:
Expand Down Expand Up @@ -332,6 +333,8 @@ cdef class Context(PyverbsCM):
self.xrcds.add(obj)
elif isinstance(obj, WQ):
self.wqs.add(obj)
elif isinstance(obj, RwqIndTable):
self.rwq_ind_tbls.add(obj)
else:
raise PyverbsError('Unrecognized object type')

Expand Down
17 changes: 15 additions & 2 deletions pyverbs/libibverbs.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -391,10 +391,16 @@ cdef extern from 'infiniband/verbs.h':
unsigned int events_completed

cdef struct ibv_rwq_ind_table:
pass
ibv_context *context
int ind_tbl_handle
int ind_tbl_num
uint32_t comp_mask

cdef struct ibv_rx_hash_conf:
pass
uint8_t rx_hash_function
uint8_t rx_hash_key_len
uint8_t *rx_hash_key
uint64_t rx_hash_fields_mask

cdef struct ibv_qp_init_attr_ex:
void *qp_context
Expand Down Expand Up @@ -603,6 +609,11 @@ cdef extern from 'infiniband/verbs.h':
uint32_t flags
uint32_t flags_mask

cdef struct ibv_rwq_ind_table_init_attr:
uint32_t log_ind_tbl_size
ibv_wq **ind_tbl
uint32_t comp_mask

ibv_device **ibv_get_device_list(int *n)
int ibv_get_device_index(ibv_device *device);
void ibv_free_device_list(ibv_device **list)
Expand Down Expand Up @@ -758,6 +769,8 @@ cdef extern from 'infiniband/verbs.h':
int ibv_modify_wq(ibv_wq *wq, ibv_wq_attr *wq_attr)
int ibv_destroy_wq(ibv_wq *wq)
int ibv_post_wq_recv(ibv_wq *wq, ibv_recv_wr *recv_wr, ibv_recv_wr **bad_recv_wr)
ibv_rwq_ind_table *ibv_create_rwq_ind_table(ibv_context *context, ibv_rwq_ind_table_init_attr *init_attr)
int ibv_destroy_rwq_ind_table(ibv_rwq_ind_table *rwq_ind_table)


cdef extern from 'infiniband/driver.h':
Expand Down
2 changes: 2 additions & 0 deletions pyverbs/qp.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ cdef class QPInitAttrEx(PyverbsObject):
cdef object _pd
cdef object xrcd
cdef object srq
cdef object ind_table

cdef class QPAttr(PyverbsObject):
cdef v.ibv_qp_attr attr
Expand All @@ -48,6 +49,7 @@ cdef class DataBuffer(PyverbsCM):

cdef class QPEx(QP):
cdef v.ibv_qp_ex *qp_ex
cdef object ind_table

cdef class ECE(PyverbsCM):
cdef v.ibv_ece ece
33 changes: 25 additions & 8 deletions pyverbs/qp.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import weakref
from pyverbs.pyverbs_error import PyverbsUserError, PyverbsError, PyverbsRDMAError
from pyverbs.utils import gid_str, qp_type_to_str, qp_state_to_str, mtu_to_str
from pyverbs.utils import access_flags_to_str, mig_state_to_str
from pyverbs.wq cimport RwqIndTable, RxHashConf
from pyverbs.mr cimport MW, MWBindInfo, MWBind
from pyverbs.wr cimport RecvWR, SendWR, SGE
from pyverbs.base import PyverbsRDMAErrno
Expand Down Expand Up @@ -252,8 +253,8 @@ cdef class QPInitAttrEx(PyverbsObject):
PyverbsObject scq=None, PyverbsObject rcq=None,
SRQ srq=None, QPCap cap=None, sq_sig_all=0, comp_mask=0,
PD pd=None, XRCD xrcd=None, create_flags=0,
max_tso_header=0, source_qpn=0, object hash_conf=None,
object ind_table=None, send_ops_flags=0):
max_tso_header=0, source_qpn=0, RxHashConf hash_conf=None,
RwqIndTable ind_table=None, send_ops_flags=0):
"""
Initialize a QPInitAttrEx object with user-defined or default values.
:param qp_type: QP type to be created
Expand All @@ -272,8 +273,8 @@ cdef class QPInitAttrEx(PyverbsObject):
:param max_tso_header: Maximum TSO header size
:param source_qpn: Source QP number (requires IBV_QP_CREATE_SOURCE_QPN
set in create_flags)
:param hash_conf: Not yet supported
:param ind_table: Not yet supported
:param hash_conf: A RxHashConf object, config of RX hash key.
:param ind_table: A RwqIndTable object, indirection table of RWQs.
:param send_ops_flags: Send opcodes to be supported by the extended QP.
Use ibv_qp_create_send_ops_flags enum
:return: An initialized QPInitAttrEx object
Expand Down Expand Up @@ -304,12 +305,12 @@ cdef class QPInitAttrEx(PyverbsObject):
self.attr.srq = srq.srq if srq else NULL
self.xrcd = xrcd
self.attr.xrcd = xrcd.xrcd if xrcd else NULL
self.attr.rwq_ind_tbl = NULL # Until RSS support is added
if hash_conf:
self.attr.rx_hash_conf = hash_conf.rx_hash_conf
self.ind_table = ind_table
self.attr.rwq_ind_tbl = ind_table.rwq_ind_table if ind_table else NULL
self.attr.qp_type = qp_type
self.attr.sq_sig_all = sq_sig_all
unsupp_flags = e.IBV_QP_INIT_ATTR_IND_TABLE | e.IBV_QP_INIT_ATTR_RX_HASH
if comp_mask & unsupp_flags:
raise PyverbsUserError('RSS is not yet supported in pyverbs')
self.attr.comp_mask = comp_mask
if pd is not None:
self._pd = pd
Expand Down Expand Up @@ -453,6 +454,14 @@ cdef class QPInitAttrEx(PyverbsObject):
def max_inline_data(self, val):
self.attr.cap.max_inline_data = val

@property
def ind_table(self):
return self.ind_table
@ind_table.setter
def ind_table(self, RwqIndTable val):
self.attr.rwq_ind_tbl = <v.ibv_rwq_ind_table*>val.rwq_ind_table
self.ind_table = val

def mask_to_str(self, mask):
comp_masks = {1: 'PD', 2: 'XRCD', 4: 'Create Flags',
8: 'Max TSO header', 16: 'Indirection Table',
Expand Down Expand Up @@ -1274,6 +1283,10 @@ cdef class QPEx(QP):
:return: An initialized QPEx object
"""
super().__init__(creator, init_attr, qp_attr)
if init_attr.ind_table is not None:
ind_table = <RwqIndTable>init_attr.ind_table
ind_table.add_ref(self)
self.ind_table = ind_table
if init_attr.comp_mask & v.IBV_QP_INIT_ATTR_SEND_OPS_FLAGS:
self.qp_ex = v.ibv_qp_to_qp_ex(self.qp)
if self.qp_ex == NULL:
Expand Down Expand Up @@ -1302,6 +1315,10 @@ cdef class QPEx(QP):
def wr_flags(self, val):
self.qp_ex.wr_flags = val

@property
def ind_table(self):
return self.ind_table

def wr_atomic_cmp_swp(self, rkey, remote_addr, compare, swap):
v.ibv_wr_atomic_cmp_swp(self.qp_ex, rkey, remote_addr, compare, swap)

Expand Down
16 changes: 16 additions & 0 deletions pyverbs/wq.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,19 @@ cdef class WQ(PyverbsCM):
cdef Context context
cdef PD pd
cdef CQ cq
cdef object rwq_ind_tables
cpdef add_ref(self, obj)

cdef class RwqIndTableInitAttr(PyverbsObject):
cdef v.ibv_rwq_ind_table_init_attr attr
cdef object wqs_list

cdef class RwqIndTable(PyverbsCM):
cdef v.ibv_rwq_ind_table *rwq_ind_table
cdef Context context
cdef object wqs
cdef object qps
cpdef add_ref(self, obj)

cdef class RxHashConf(PyverbsObject):
cdef v.ibv_rx_hash_conf rx_hash_conf

0 comments on commit 64a8525

Please sign in to comment.