Разъяснение linux rdma mellanox
Я собирался через linux/drivers/net/ethernet/mellanox/mlx4/qp.c
Есть несколько вопросов. Был бы очень признателен, если кто-то может уточнить:
В функции mlx4_qp_alloc_icm,
Для выделения QP используются 2 пути:
используя виртуальную команду ALLOC_RES
используя 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(¶m, qpn);
326 return mlx4_cmd_imm(dev, param, ¶m, 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
функция.