IBV_QUERY_DEVICE(3)

πŸ“¦
version 65.0 Β· 2 versions
  • 65.0 Β· alpine 3.24, arch rolling, centos-stream 10, centos-stream 9, debian bookworm, debian trixie, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0, ubuntu jammy, ubuntu noble, ubuntu questing, ubuntu resolute, ubuntu stonking (latest)
  • 15.1 Β· freebsd 14.5, freebsd 15.1
, in alpine 3.24, arch rolling, centos-stream 10, centos-stream 9, debian bookworm, debian trixie, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0, ubuntu jammy, ubuntu noble, ubuntu questing, ubuntu resolute, ubuntu stonking

πŸ’– IBV_QUERY_DEVICE πŸ’–

okay so bestie, welcome to ibv_query_device(3) β€” it's the Libibverbs Programmer's Manual page and honestly? it's giving "let me tell you everything about this RDMA device". πŸ¦‹


✨ NAME ✨

ibv_query_device β€” query an RDMA device's attributes πŸ‘‘


🌸 SYNOPSIS 🌸

#include <infiniband/verbs.h>

int ibv_query_device(struct ibv_context *context,
                     struct ibv_device_attr *device_attr);

πŸ’… DESCRIPTION πŸ’…

so ibv_query_device() hands you back all the attributes of the device that belongs to context. literally it just returns the deets. πŸ’–

and the device_attr argument? it's a pointer to an ibv_device_attr struct, which lives in <infiniband/verbs.h>. iconic.

and here's the whole struct, no cap, every single field with its comment exactly as the universe intended:

struct ibv_device_attr {
        char                    fw_ver[64];             /* FW version */
        uint64_t                node_guid;              /* Node GUID (in network byte order) */
        uint64_t                sys_image_guid;         /* System image GUID (in network byte order) */
        uint64_t                max_mr_size;            /* Largest contiguous block that can be registered */
        uint64_t                page_size_cap;          /* Supported memory shift sizes */
        uint32_t                vendor_id;              /* Vendor ID, per IEEE */
        uint32_t                vendor_part_id;         /* Vendor supplied part ID */
        uint32_t                hw_ver;                 /* Hardware version */
        int                     max_qp;                 /* Maximum number of supported QPs */
        int                     max_qp_wr;              /* Maximum number of outstanding WR on any work queue */
        unsigned int            device_cap_flags;       /* HCA capabilities mask */
        int                     max_sge;                /* Maximum number of s/g per WR for SQ & RQ of QP for non RDMA Read operations */
        int                     max_sge_rd;             /* Maximum number of s/g per WR for RDMA Read operations */
        int                     max_cq;                 /* Maximum number of supported CQs */
        int                     max_cqe;                /* Maximum number of CQE capacity per CQ */
        int                     max_mr;                 /* Maximum number of supported MRs */
        int                     max_pd;                 /* Maximum number of supported PDs */
        int                     max_qp_rd_atom;         /* Maximum number of RDMA Read & Atomic operations that can be outstanding per QP */
        int                     max_ee_rd_atom;         /* Maximum number of RDMA Read & Atomic operations that can be outstanding per EEC */
        int                     max_res_rd_atom;        /* Maximum number of resources used for RDMA Read & Atomic operations by this HCA as the Target */
        int                     max_qp_init_rd_atom;    /* Maximum depth per QP for initiation of RDMA Read & Atomic operations */
        int                     max_ee_init_rd_atom;    /* Maximum depth per EEC for initiation of RDMA Read & Atomic operations */
        enum ibv_atomic_cap     atomic_cap;             /* Atomic operations support level */
        int                     max_ee;                 /* Maximum number of supported EE contexts */
        int                     max_rdd;                /* Maximum number of supported RD domains */
        int                     max_mw;                 /* Maximum number of supported MWs */
        int                     max_raw_ipv6_qp;        /* Maximum number of supported raw IPv6 datagram QPs */
        int                     max_raw_ethy_qp;        /* Maximum number of supported Ethertype datagram QPs */
        int                     max_mcast_grp;          /* Maximum number of supported multicast groups */
        int                     max_mcast_qp_attach;    /* Maximum number of QPs per multicast group which can be attached */
        int                     max_total_mcast_qp_attach;/* Maximum number of QPs which can be attached to multicast groups */
        int                     max_ah;                 /* Maximum number of supported address handles */
        int                     max_fmr;                /* Maximum number of supported FMRs */
        int                     max_map_per_fmr;        /* Maximum number of (re)maps per FMR before an unmap operation in required */
        int                     max_srq;                /* Maximum number of supported SRQs */
        int                     max_srq_wr;             /* Maximum number of WRs per SRQ */
        int                     max_srq_sge;            /* Maximum number of s/g per SRQ */
        uint16_t                max_pkeys;              /* Maximum number of partitions */
        uint8_t                 local_ca_ack_delay;     /* Local CA ack delay */
        uint8_t                 phys_port_cnt;          /* Number of physical ports */
};

πŸŽ€ RETURN VALUE πŸŽ€

  • success β†’ ibv_query_device() returns 0 ✨
  • failure β†’ it returns the value of errno, which tells you why it flopped 😭

πŸ”₯ NOTES πŸ”₯

so like, the maximum values this function gives you back are the upper limits of what the device can support. that's the ceiling, bestie. the absolute most. πŸ’€

but β€” and this is the important part β€” it may not be possible to actually use those maximum values, because the real number of any resource you can create might be limited by:

  • the machine configuration
  • the amount of host memory
  • user permissions
  • the amount of resources already in use by other users/processes
not me thinking max means max 😭 it's the theoretical ceiling, not a promise. plan accordingly, fr fr.

🌈 SEE ALSO 🌈


πŸ‘‘ AUTHORS πŸ‘‘

  • Dotan Barak <dotanba@gmail.com> β€” thank you for your service, king 🫢

and that's the whole page, bestie!! this lil cutie is from libibverbs and it's dated 2006-10-31 β€” a true vintage icon serving RDMA realness since way back. mwah πŸ’…βœ¨

πŸ“¦ where this page comes from