Skip to content

Commit

Permalink
libhns: Fix several context locks issue
Browse files Browse the repository at this point in the history
[ Upstream commit 6772962 ]

Fix several context lock issue:

1. db_list_mutex is used without init currently. Add its init to
   hns_roce_alloc_context().

2. pthread_mutex_init()/pthread_spin_init() may return error value.
   Check the return value in hns_roce_alloc_context().

3. Add destruction for these context locks.

4. Encapsulate init and destruction functions for these context locks.

Fixes: 13eae88 ("libhns: Support rq record doorbell")
Fixes: 887b78c ("libhns: Add initial main frame")
Signed-off-by: Junxian Huang <[email protected]>
Signed-off-by: Nicolas Morey <[email protected]>
  • Loading branch information
Junxian Huang authored and nmorey committed May 27, 2024
1 parent 41a5939 commit 71c36ed
Showing 1 changed file with 51 additions and 7 deletions.
58 changes: 51 additions & 7 deletions providers/hns/hns_roce_u.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,47 @@ static uint32_t calc_table_shift(uint32_t entry_count, uint32_t size_shift)
return count_shift > size_shift ? count_shift - size_shift : 0;
}

static int hns_roce_init_context_lock(struct hns_roce_context *context)
{
int ret;

ret = pthread_spin_init(&context->uar_lock, PTHREAD_PROCESS_PRIVATE);
if (ret)
return ret;

ret = pthread_mutex_init(&context->qp_table_mutex, NULL);
if (ret)
goto destroy_uar_lock;

ret = pthread_mutex_init(&context->srq_table_mutex, NULL);
if (ret)
goto destroy_qp_mutex;

ret = pthread_mutex_init(&context->db_list_mutex, NULL);
if (ret)
goto destroy_srq_mutex;

return 0;

destroy_srq_mutex:
pthread_mutex_destroy(&context->srq_table_mutex);

destroy_qp_mutex:
pthread_mutex_destroy(&context->qp_table_mutex);

destroy_uar_lock:
pthread_spin_destroy(&context->uar_lock);
return ret;
}

static void hns_roce_destroy_context_lock(struct hns_roce_context *context)
{
pthread_spin_destroy(&context->uar_lock);
pthread_mutex_destroy(&context->qp_table_mutex);
pthread_mutex_destroy(&context->srq_table_mutex);
pthread_mutex_destroy(&context->db_list_mutex);
}

static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
int cmd_fd,
void *private_data)
Expand All @@ -118,7 +159,10 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,

if (ibv_cmd_get_context(&context->ibv_ctx, &cmd, sizeof(cmd),
&resp.ibv_resp, sizeof(resp)))
goto err_free;
goto err_ibv_cmd;

if (hns_roce_init_context_lock(context))
goto err_ibv_cmd;

if (!resp.cqe_size)
context->cqe_size = HNS_ROCE_CQE_SIZE;
Expand All @@ -130,14 +174,12 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
context->qp_table_shift = calc_table_shift(resp.qp_tab_size,
HNS_ROCE_QP_TABLE_BITS);
context->qp_table_mask = (1 << context->qp_table_shift) - 1;
pthread_mutex_init(&context->qp_table_mutex, NULL);
for (i = 0; i < HNS_ROCE_QP_TABLE_SIZE; ++i)
context->qp_table[i].refcnt = 0;

context->srq_table_shift = calc_table_shift(resp.srq_tab_size,
HNS_ROCE_SRQ_TABLE_BITS);
context->srq_table_mask = (1 << context->srq_table_shift) - 1;
pthread_mutex_init(&context->srq_table_mutex, NULL);
for (i = 0; i < HNS_ROCE_SRQ_TABLE_SIZE; ++i)
context->srq_table[i].refcnt = 0;

Expand All @@ -146,7 +188,7 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
struct ibv_device_attr_ex,
orig_attr),
sizeof(dev_attrs)))
goto err_free;
goto err_set_attr;

hr_dev->hw_version = dev_attrs.hw_ver;
context->max_qp_wr = dev_attrs.max_qp_wr;
Expand All @@ -158,7 +200,7 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
context->uar = mmap(NULL, hr_dev->page_size, PROT_READ | PROT_WRITE,
MAP_SHARED, cmd_fd, offset);
if (context->uar == MAP_FAILED)
goto err_free;
goto err_set_attr;

offset += hr_dev->page_size;

Expand All @@ -174,7 +216,6 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
goto db_free;
}

pthread_spin_init(&context->uar_lock, PTHREAD_PROCESS_PRIVATE);

verbs_set_ops(&context->ibv_ctx, &hns_common_ops);
verbs_set_ops(&context->ibv_ctx, &hr_dev->u_hw->hw_ops);
Expand All @@ -185,7 +226,9 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
munmap(context->uar, hr_dev->page_size);
context->uar = NULL;

err_free:
err_set_attr:
hns_roce_destroy_context_lock(context);
err_ibv_cmd:
verbs_uninit_context(&context->ibv_ctx);
free(context);
return NULL;
Expand All @@ -200,6 +243,7 @@ static void hns_roce_free_context(struct ibv_context *ibctx)
if (hr_dev->hw_version == HNS_ROCE_HW_VER1)
munmap(context->cq_tptr_base, HNS_ROCE_CQ_DB_BUF_SIZE);

hns_roce_destroy_context_lock(context);
verbs_uninit_context(&context->ibv_ctx);
free(context);
}
Expand Down

0 comments on commit 71c36ed

Please sign in to comment.