mlx5_vdpa_logging_enable(struct mlx5_vdpa_priv *priv, int enable)
{
struct mlx5_devx_virtq_attr attr = {
- .type = MLX5_VIRTQ_MODIFY_TYPE_DIRTY_BITMAP_DUMP_ENABLE,
+ .mod_fields_bitmap =
+ MLX5_VIRTQ_MODIFY_TYPE_DIRTY_BITMAP_DUMP_ENABLE,
.dirty_bitmap_dump_enable = enable,
};
+ struct mlx5_vdpa_virtq *virtq;
int i;
for (i = 0; i < priv->nr_virtqs; ++i) {
attr.queue_index = i;
- if (mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq, &attr)) {
- DRV_LOG(ERR, "Failed to modify virtq %d logging.", i);
- return -1;
+ virtq = &priv->virtqs[i];
+ if (!virtq->configured) {
+ DRV_LOG(DEBUG, "virtq %d is invalid for dirty bitmap enabling.", i);
+ } else {
+ struct mlx5_vdpa_virtq *virtq = &priv->virtqs[i];
+
+ pthread_mutex_lock(&virtq->virtq_lock);
+ if (mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq,
+ &attr)) {
+ pthread_mutex_unlock(&virtq->virtq_lock);
+ DRV_LOG(ERR,
+ "Failed to modify virtq %d for dirty bitmap enabling.",
+ i);
+ return -1;
+ }
+ pthread_mutex_unlock(&virtq->virtq_lock);
}
}
return 0;
mlx5_vdpa_dirty_bitmap_set(struct mlx5_vdpa_priv *priv, uint64_t log_base,
uint64_t log_size)
{
- struct mlx5_devx_mkey_attr mkey_attr = {
- .addr = (uintptr_t)log_base,
- .size = log_size,
- .pd = priv->pdn,
- .pg_access = 1,
- .klm_array = NULL,
- .klm_num = 0,
- .relaxed_ordering = 0,
- };
struct mlx5_devx_virtq_attr attr = {
- .type = MLX5_VIRTQ_MODIFY_TYPE_DIRTY_BITMAP_PARAMS,
+ .mod_fields_bitmap = MLX5_VIRTQ_MODIFY_TYPE_DIRTY_BITMAP_PARAMS,
.dirty_bitmap_addr = log_base,
.dirty_bitmap_size = log_size,
};
- struct mlx5_vdpa_query_mr *mr = rte_malloc(__func__, sizeof(*mr), 0);
+ struct mlx5_vdpa_virtq *virtq;
int i;
+ int ret = mlx5_os_wrapped_mkey_create(priv->cdev->ctx, priv->cdev->pd,
+ priv->cdev->pdn,
+ (void *)(uintptr_t)log_base,
+ log_size, &priv->lm_mr);
- if (!mr) {
- DRV_LOG(ERR, "Failed to allocate mem for lm mr.");
+ if (ret) {
+ DRV_LOG(ERR, "Failed to allocate wrapped MR for lm.");
return -1;
}
- mr->umem = mlx5_glue->devx_umem_reg(priv->ctx,
- (void *)(uintptr_t)log_base,
- log_size, IBV_ACCESS_LOCAL_WRITE);
- if (!mr->umem) {
- DRV_LOG(ERR, "Failed to register umem for lm mr.");
- goto err;
- }
- mkey_attr.umem_id = mr->umem->umem_id;
- mr->mkey = mlx5_devx_cmd_mkey_create(priv->ctx, &mkey_attr);
- if (!mr->mkey) {
- DRV_LOG(ERR, "Failed to create Mkey for lm.");
- goto err;
- }
- attr.dirty_bitmap_mkey = mr->mkey->id;
+ attr.dirty_bitmap_mkey = priv->lm_mr.lkey;
for (i = 0; i < priv->nr_virtqs; ++i) {
attr.queue_index = i;
- if (mlx5_devx_cmd_modify_virtq(priv->virtqs[i].virtq, &attr)) {
- DRV_LOG(ERR, "Failed to modify virtq %d for lm.", i);
- goto err;
+ virtq = &priv->virtqs[i];
+ if (!virtq->configured) {
+ DRV_LOG(DEBUG, "virtq %d is invalid for LM.", i);
+ } else {
+ struct mlx5_vdpa_virtq *virtq = &priv->virtqs[i];
+
+ pthread_mutex_lock(&virtq->virtq_lock);
+ if (mlx5_devx_cmd_modify_virtq(
+ priv->virtqs[i].virtq,
+ &attr)) {
+ pthread_mutex_unlock(&virtq->virtq_lock);
+ DRV_LOG(ERR,
+ "Failed to modify virtq %d for LM.", i);
+ goto err;
+ }
+ pthread_mutex_unlock(&virtq->virtq_lock);
}
}
- mr->is_indirect = 0;
- SLIST_INSERT_HEAD(&priv->mr_list, mr, next);
return 0;
err:
- if (mr->mkey)
- mlx5_devx_cmd_destroy(mr->mkey);
- if (mr->umem)
- mlx5_glue->devx_umem_dereg(mr->umem);
- rte_free(mr);
+ mlx5_os_wrapped_mkey_destroy(&priv->lm_mr);
return -1;
}
int
mlx5_vdpa_lm_log(struct mlx5_vdpa_priv *priv)
{
- struct mlx5_devx_virtq_attr attr = {0};
+ struct mlx5_vdpa_virtq *virtq;
uint64_t features;
int ret = rte_vhost_get_negotiated_features(priv->vid, &features);
int i;
if (!RTE_VHOST_NEED_LOG(features))
return 0;
for (i = 0; i < priv->nr_virtqs; ++i) {
- ret = mlx5_vdpa_virtq_modify(&priv->virtqs[i], 0);
- if (ret)
- return -1;
- if (mlx5_devx_cmd_query_virtq(priv->virtqs[i].virtq, &attr)) {
- DRV_LOG(ERR, "Failed to query virtq %d.", i);
- return -1;
- }
- DRV_LOG(INFO, "Query vid %d vring %d: hw_available_idx=%d, "
- "hw_used_index=%d", priv->vid, i,
- attr.hw_available_index, attr.hw_used_index);
- ret = rte_vhost_set_vring_base(priv->vid, i,
- attr.hw_available_index,
- attr.hw_used_index);
- if (ret) {
- DRV_LOG(ERR, "Failed to set virtq %d base.", i);
- return -1;
+ virtq = &priv->virtqs[i];
+ if (!priv->virtqs[i].virtq) {
+ DRV_LOG(DEBUG, "virtq %d is invalid for LM log.", i);
+ } else {
+ pthread_mutex_lock(&virtq->virtq_lock);
+ ret = mlx5_vdpa_virtq_stop(priv, i);
+ pthread_mutex_unlock(&virtq->virtq_lock);
+ if (ret) {
+ DRV_LOG(ERR, "Failed to stop virtq %d for LM "
+ "log.", i);
+ return -1;
+ }
}
rte_vhost_log_used_vring(priv->vid, i, 0,
MLX5_VDPA_USED_RING_LEN(priv->virtqs[i].vq_size));