Разъяснение linux rdma mellanox

Я собирался через linux/drivers/net/ethernet/mellanox/mlx4/qp.c

Есть несколько вопросов. Был бы очень признателен, если кто-то может уточнить:

В функции mlx4_qp_alloc_icm,

Для выделения QP используются 2 пути:

  1. используя виртуальную команду ALLOC_RES

  2. используя MAP_ICM

Эти пути взяты на основе возвращаемого значения mlx4_is_func(dev). Это верно для MASTER или SLAVE, который я считаю драйвером физической функции / драйвером виртуальной функции. Так что для SRIOV это охватывает все случаи.

Часть MAP_ICM, которая выполняется как часть __mlx4_qp_alloc_icm, никогда не вызывается??

Я правильно понимаю? Потому что, насколько я понимаю, ICM должен быть выделен для всех QP.

Пожалуйста, помогите мне понять это.

РЕДАКТИРОВАТЬ:

Добавление соответствующего кода:

320 static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn)
321 {
322         u64 param = 0;
323 
324         if (mlx4_is_mfunc(dev)) {
325                 set_param_l(&param, qpn);
326                 return mlx4_cmd_imm(dev, param, &param, RES_QP, RES_OP_MAP_ICM,
327                                     MLX4_CMD_ALLOC_RES, MLX4_CMD_TIME_CLASS_A,
328                                     MLX4_CMD_WRAPPED);
329         }
330         return __mlx4_qp_alloc_icm(dev, qpn);
331 }

http://lxr.free-electrons.com/source/drivers/net/ethernet/mellanox/mlx4/icm.c#L226

226 static int mlx4_MAP_ICM(struct mlx4_dev *dev, struct mlx4_icm *icm, u64 virt)
227 {
228         return mlx4_map_cmd(dev, MLX4_CMD_MAP_ICM, icm, virt);
229 }

Спасибо.

С наилучшими пожеланиями, Марк

1 ответ

Решение

MAP_ICM Команда является привилегированной, и только физический драйвер функции может ее выполнить. Выполняется через __mlx4_qp_alloc_icm в примере, приведенном в вопросе, когда драйвер находится в "родном" режиме: ни обработка виртуальной функции, ни физическая функция, которая управляет другими виртуальными функциями.

В режиме SRIOV, когда драйвер управляет физической функцией, которая имеет некоторые виртуальные функции, __mlx4_qp_alloc_icm Функция вызывается только из трекера ресурса в resource_tracker.c, Этот модуль управляет распределением ICM для всех функций, которые он обрабатывает (виртуальные и физические), чтобы предотвратить конфликты. Призыв к __mlx4_qp_alloc_icm конкретно в qp_alloc_res функция.

Другие вопросы по тегам