From 899f54c8d2f5cce95f4badb5e35183da0728d80c Mon Sep 17 00:00:00 2001 From: Yajun Li Date: Thu, 6 Sep 2018 16:37:24 +0800 Subject: [PATCH] soc: hab: change lifecycle of exp_id from vchan to ctx To make sure unexport/unimport the same buffer successfully in different threads from export/import function, only check pchan's validation, instead of vchan id. Change-Id: I3203f198c37e8b169090d8f93d92e87bbd4cdb6e Signed-off-by: Yajun Li --- drivers/soc/qcom/hab/hab_mem_linux.c | 8 ++++++-- drivers/soc/qcom/hab/hab_mimex.c | 12 ++++-------- drivers/soc/qcom/hab/hab_msg.c | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/soc/qcom/hab/hab_mem_linux.c b/drivers/soc/qcom/hab/hab_mem_linux.c index 428d3e7cee60..e5c22a99d876 100644 --- a/drivers/soc/qcom/hab/hab_mem_linux.c +++ b/drivers/soc/qcom/hab/hab_mem_linux.c @@ -32,6 +32,7 @@ struct pages_list { struct dma_buf *dmabuf; int32_t export_id; int32_t vcid; + struct physical_channel *pchan; }; struct importer_context { @@ -511,6 +512,7 @@ static int habmem_imp_hyp_map_fd(void *imp_ctx, pglist->userflags = userflags; pglist->export_id = exp->export_id; pglist->vcid = exp->vcid_remote; + pglist->pchan = exp->pchan; if (!(userflags & HABMM_IMPORT_FLAGS_CACHED)) prot = pgprot_writecombine(prot); @@ -589,6 +591,7 @@ static int habmem_imp_hyp_map_kva(void *imp_ctx, pglist->userflags = userflags; pglist->export_id = exp->export_id; pglist->vcid = exp->vcid_remote; + pglist->pchan = exp->pchan; if (!(userflags & HABMM_IMPORT_FLAGS_CACHED)) prot = pgprot_writecombine(prot); @@ -658,6 +661,7 @@ static int habmem_imp_hyp_map_uva(void *imp_ctx, pglist->userflags = userflags; pglist->export_id = exp->export_id; pglist->vcid = exp->vcid_remote; + pglist->pchan = exp->pchan; write_lock(&priv->implist_lock); list_add_tail(&pglist->list, &priv->imp_list); @@ -699,7 +703,7 @@ int habmm_imp_hyp_unmap(void *imp_ctx, struct export_desc *exp, int kernel) write_lock(&priv->implist_lock); list_for_each_entry_safe(pglist, tmp, &priv->imp_list, list) { if (pglist->export_id == exp->export_id && - pglist->vcid == exp->vcid_remote) { + pglist->pchan == exp->pchan) { found = 1; list_del(&pglist->list); priv->cnt--; @@ -775,7 +779,7 @@ int habmm_imp_hyp_map_check(void *imp_ctx, struct export_desc *exp) read_lock(&priv->implist_lock); list_for_each_entry(pglist, &priv->imp_list, list) { if (pglist->export_id == exp->export_id && - pglist->vcid == exp->vcid_remote) { + pglist->pchan == exp->pchan) { found = 1; break; } diff --git a/drivers/soc/qcom/hab/hab_mimex.c b/drivers/soc/qcom/hab/hab_mimex.c index 23087680c690..d5786170f0f3 100644 --- a/drivers/soc/qcom/hab/hab_mimex.c +++ b/drivers/soc/qcom/hab/hab_mimex.c @@ -319,8 +319,7 @@ int hab_mem_unexport(struct uhab_context *ctx, write_lock(&ctx->exp_lock); list_for_each_entry_safe(exp, tmp, &ctx->exp_whse, node) { if (param->exportid == exp->export_id && - param->vcid == exp->vcid_local) { - /* same vchan guarantees the pchan for idr */ + vchan->pchan == exp->pchan) { list_del(&exp->node); found = 1; break; @@ -367,10 +366,7 @@ int hab_mem_import(struct uhab_context *ctx, spin_lock_bh(&ctx->imp_lock); list_for_each_entry(exp, &ctx->imp_whse, node) { if ((exp->export_id == param->exportid) && - (param->vcid == exp->vcid_remote)) { - /* only allow import on the vchan recevied from - * remote - */ + (exp->pchan == vchan->pchan)) { found = 1; break; } @@ -424,8 +420,8 @@ int hab_mem_unimport(struct uhab_context *ctx, spin_lock_bh(&ctx->imp_lock); list_for_each_entry_safe(exp, exp_tmp, &ctx->imp_whse, node) { if (exp->export_id == param->exportid && - param->vcid == exp->vcid_remote) { - /* same vchan is expected here */ + exp->pchan == vchan->pchan) { + /* same pchan is expected here */ list_del(&exp->node); ctx->import_total--; found = 1; diff --git a/drivers/soc/qcom/hab/hab_msg.c b/drivers/soc/qcom/hab/hab_msg.c index 9d5ee134c94e..3765623d3190 100644 --- a/drivers/soc/qcom/hab/hab_msg.c +++ b/drivers/soc/qcom/hab/hab_msg.c @@ -282,6 +282,7 @@ int hab_msg_recv(struct physical_channel *pchan, } exp_desc->domid_local = pchan->dom_id; + exp_desc->pchan = pchan; hab_export_enqueue(vchan, exp_desc); hab_send_export_ack(vchan, pchan, exp_desc);