RE: [PATCH rdma-core v2 04/10] pyverbs: GID class

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: linux-rdma-owner@xxxxxxxxxxxxxxx <linux-rdma-
> owner@xxxxxxxxxxxxxxx> On Behalf Of Leon Romanovsky
> Sent: Sunday, December 9, 2018 7:33 AM
> To: Doug Ledford <dledford@xxxxxxxxxx>; Jason Gunthorpe
> <jgg@xxxxxxxxxxxx>
> Cc: Leon Romanovsky <leonro@xxxxxxxxxxxx>; RDMA mailing list <linux-
> rdma@xxxxxxxxxxxxxxx>; Alaa Hleihel <alaa@xxxxxxxxxxxx>; Maxim
> Chicherin <maximc@xxxxxxxxxxxx>; Noa Osherovich
> <noaos@xxxxxxxxxxxx>
> Subject: [PATCH rdma-core v2 04/10] pyverbs: GID class
> 
> From: Noa Osherovich <noaos@xxxxxxxxxxxx>
> 
> GID class represents ibv_gid and exposes the GID value.
> It can be used to query a GID as follows:
>   import pyverbs.device as d
>   ctx = d.Context(name='mlx5_0')
>   gid = ctx.query_gid(port_num=1, index=0)
>   print(gid)
>   fe80:0000:0000:0000:7cfe:9003:00af:7970
> 
> Signed-off-by: Noa Osherovich <noaos@xxxxxxxxxxxx>
> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> ---
>  pyverbs/addr.pxd       |  9 ++++++++
>  pyverbs/addr.pyx       | 50 ++++++++++++++++++++++++++++++++++++++++++
>  pyverbs/device.pyx     |  9 ++++++++
>  pyverbs/libibverbs.pxd | 10 +++++++++
>  4 files changed, 78 insertions(+)
>  create mode 100644 pyverbs/addr.pxd
>  create mode 100644 pyverbs/addr.pyx
> 
> diff --git a/pyverbs/addr.pxd b/pyverbs/addr.pxd new file mode 100644
> index 00000000..39039379
> --- /dev/null
> +++ b/pyverbs/addr.pxd
> @@ -0,0 +1,9 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) # Copyright (c)
> +2018, Mellanox Technologies. All rights reserved. See COPYING file
> +
> +from .base cimport PyverbsObject
> +from pyverbs cimport libibverbs as v
> +
> +
> +cdef class Gid(PyverbsObject):
> +    cdef v.ibv_gid gid
> diff --git a/pyverbs/addr.pyx b/pyverbs/addr.pyx new file mode 100644 index
> 00000000..986521b9
> --- /dev/null
> +++ b/pyverbs/addr.pyx
> @@ -0,0 +1,50 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) # Copyright (c)
> +2018, Mellanox Technologies. All rights reserved. See COPYING file
> +
> +import sys
> +from libc.stdint cimport uint8_t
> +from .pyverbs_error import PyverbsUserError
> +
> +cdef extern from 'endian.h':
> +    unsigned long be64toh(unsigned long host_64bits)
> +
> +
> +cdef class Gid(PyverbsObject):
> +    """
> +    GID class represents ibv_gid. It enables user to query for GIDs values.
> +    """

A user usually wants to now the RoCE GID type and its associated netdev in case of RoCE.
So combining gid_attr in a 'gid' python object is more useful. User doesn't need to invoke multiple APIs to get a usable GID.
So please consider adding gid_attr (ndev, gid_type) to python gid object.
If it fails to read the gid_attr for zero gid, just have those strings as null and gid_type as invalid gid.

> +    property gid:
> +        def __get__(self):
> +            """
> +            Expose the inner GID
> +            :return: A GID string in an 8 words format:
> +            'xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx'
> +            """
> +            return self.__str__()
> +        def __set__(self, val):
> +            """
> +            Sets the inner GID
> +            :param val: A GID string in an 8 words format:
> +            'xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx'
> +            :return: None
> +            """
> +            val = val.split(':')
> +            if len(val) != 8:
> +                raise PyverbsUserError("Invalid GID value ({val})".format(val=val))
> +            if any([len(v) != 4 for v in val]):
> +                raise PyverbsUserError("Invalid GID value ({val})".format(val=val))
> +            val_int = int("".join(val), 16)
> +            vals = []
> +            for i in range(8):
> +                vals.append(val[i][0:2])
> +                vals.append(val[i][2:4])
> +
> +            for i in range(16):
> +                self.gid.raw[i] = <uint8_t>int(vals[i],16)
> +
> +    def __str__(self):
> +        hex_values = '%016x%016x' % (be64toh(self.gid._global.subnet_prefix),
> +                                   be64toh(self.gid._global.interface_id))
> +        return ':'.join([hex_values[0:4], hex_values[4:8], hex_values[8:12],
> +                         hex_values[12:16], hex_values[16:20], hex_values[20:24],
> +                         hex_values[24:28],hex_values[28:32]])
> diff --git a/pyverbs/device.pyx b/pyverbs/device.pyx index
> 8432fc90..696459f7 100644
> --- a/pyverbs/device.pyx
> +++ b/pyverbs/device.pyx
> @@ -10,6 +10,7 @@ from .pyverbs_error import PyverbsRDMAError  from
> .pyverbs_error import PyverbsUserError  from pyverbs.base import
> PyverbsRDMAErrno  cimport pyverbs.libibverbs as v
> +from pyverbs.addr cimport Gid
> 
>  cdef extern from 'errno.h':
>      int errno
> @@ -132,6 +133,14 @@ cdef class Context(PyverbsObject):
>                                     format(name=self.name), errno)
>          return dev_attr
> 
> +    def query_gid(self, unsigned int port_num, int index):
> +        gid = Gid()
> +        rc = v.ibv_query_gid(self.context, port_num, index, &gid.gid)
> +        if rc != 0:
> +            raise PyverbsRDMAError('Failed to query gid {idx} of port {port}'.
> +
> format(idx=index, port=port_num))
> +        return gid
> +
> 
>  cdef class DeviceAttr(PyverbsObject):
>      """
> diff --git a/pyverbs/libibverbs.pxd b/pyverbs/libibverbs.pxd index
> 20f855c2..f212078f 100644
> --- a/pyverbs/libibverbs.pxd
> +++ b/pyverbs/libibverbs.pxd
> @@ -6,6 +6,14 @@ from libc.stdint cimport uint8_t, uint64_t
> 
>  cdef extern from 'infiniband/verbs.h':
> 
> +    cdef struct anon:
> +        unsigned long subnet_prefix
> +        unsigned long interface_id
> +
> +    cdef union ibv_gid:
> +        anon _global "global"
> +        uint8_t raw[16]
> +
>      cdef struct ibv_device:
>          char *name
>          int node_type
> @@ -62,3 +70,5 @@ cdef extern from 'infiniband/verbs.h':
>      int ibv_close_device(ibv_context *context)
>      int ibv_query_device(ibv_context *context, ibv_device_attr *device_attr)
>      unsigned long ibv_get_device_guid(ibv_device *device)
> +    int ibv_query_gid(ibv_context *context, unsigned int port_num,
> +                      int index, ibv_gid *gid)
> --
> 2.19.1





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux