Я пытаюсь создать пару очередей с помощью ibv_create_qp()
, и мне нужно описать размер пары очередей, установив поля struct ibv_qp_cap
и предоставив их функции создания. Моя проблема связана с полем max_send_wr
, которое соответствует максимальному количеству невыполненных рабочих запросов, которые могут быть отправлены в очередь отправки этой конкретной пары очередей.
Согласно различным веб-ресурсам [1,2], вы должны установить это конкретное поле где-то в диапазоне [0 ... dev_cap.max_qp_wr], где max_qp_wr
— это максимальное количество невыполненных рабочих запросов в любой поддерживаемой очереди отправки или получения. устройством RDMA (информацию можно получить, отправив запрос на устройство с помощью ibv_devinfo -v
). При попытке создать QueuePair, когда я устанавливаю для поля максимально возможное значение (max_qp_wr, которое для моего устройства равно 32 КБ), функция ibv_create_qp()
завершается с ошибкой ENOMEM
. Путем проб и ошибок я выяснил, что он отлично работает, если я уменьшаю его до 8K.
Таким образом, мне интересно узнать, существует ли детерминированный способ вычисления значения max_send_wr
для устройства RDMA, не прибегая к методу проб и ошибок? Кроме того, согласно некоторым данным [1], для конкретного устройства RDMA могут быть другие соображения для очереди отправки или получения, которые не позволяют создать QP с максимальными значениями. Каковы могут быть эти особенности устройства RDMA и как они влияют на расчет максимального значения?
[1] https://www.rdmamojo.com/2012/12/21/ibv_create_qp/
[2] https://linux-rdma.vger.kernel.narkive.com/rkR0gUjT/rdma-create-qp-and-max-send-wr