OSDN Git Service

soc: hab: change lifecycle of exp_id from vchan to ctx
authorYajun Li <yajunl@codeaurora.org>
Thu, 6 Sep 2018 08:37:24 +0000 (16:37 +0800)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 27 Sep 2018 03:03:16 +0000 (20:03 -0700)
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 <yajunl@codeaurora.org>
drivers/soc/qcom/hab/hab_mem_linux.c
drivers/soc/qcom/hab/hab_mimex.c
drivers/soc/qcom/hab/hab_msg.c

index 428d3e7..e5c22a9 100644 (file)
@@ -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;
                }
index 2308768..d578617 100644 (file)
@@ -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;
index 9d5ee13..3765623 100644 (file)
@@ -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);