OSDN Git Service

msm: ipa3: fix hdr offset issue
authorSkylar Chang <chiaweic@codeaurora.org>
Sat, 21 Apr 2018 08:42:45 +0000 (01:42 -0700)
committerMohammed Javid <mjavid@codeaurora.org>
Mon, 6 Aug 2018 09:35:25 +0000 (15:05 +0530)
Hdr offset calculation is wrong when
driver received clean-up ioctl from
user-space. The fix is to find right
hdr offset to commit ned headers.

Change-Id: I70878a19b64c3defa6101bd68d435f0b74bcfb9b
Acked-by: Pooja Kumari <kumarip@qti.qualcomm.com>
Signed-off-by: Mohammed Javid <mjavid@codeaurora.org>
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c
drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c

index 15c8f92..e0868ad 100644 (file)
@@ -1249,7 +1249,8 @@ int ipa2_reset_hdr(bool user_only)
        struct ipa_hdr_offset_entry *off_next;
        struct ipa_hdr_proc_ctx_offset_entry *ctx_off_entry;
        struct ipa_hdr_proc_ctx_offset_entry *ctx_off_next;
-       int i;
+       int i, end = 0;
+       bool user_rule = false;
 
        /*
         * issue a reset on the routing module since routing rules point to
@@ -1287,6 +1288,9 @@ int ipa2_reset_hdr(bool user_only)
                        return -EFAULT;
                }
 
+               if (entry->ipacm_installed)
+                       user_rule = true;
+
                if (!user_only || entry->ipacm_installed) {
                        if (entry->is_hdr_proc_ctx) {
                                dma_unmap_single(ipa_ctx->pdev,
@@ -1296,6 +1300,7 @@ int ipa2_reset_hdr(bool user_only)
                                entry->proc_ctx = NULL;
                        }
                        list_del(&entry->link);
+                       ipa_ctx->hdr_tbl.hdr_cnt--;
                        entry->ref_cnt = 0;
                        entry->cookie = 0;
 
@@ -1321,6 +1326,13 @@ int ipa2_reset_hdr(bool user_only)
                                list_del(&off_entry->link);
                                kmem_cache_free(ipa_ctx->hdr_offset_cache,
                                        off_entry);
+                       } else {
+                               if (off_entry->offset +
+                                       ipa_hdr_bin_sz[off_entry->bin] > end) {
+                                       end = off_entry->offset +
+                                               ipa_hdr_bin_sz[off_entry->bin];
+                                       IPADBG("replace end = %d\n", end);
+                               }
                        }
                }
                list_for_each_entry_safe(off_entry, off_next,
@@ -1335,11 +1347,15 @@ int ipa2_reset_hdr(bool user_only)
                        }
                }
        }
-       /* there is one header of size 8 */
-       ipa_ctx->hdr_tbl.end = 8;
-       ipa_ctx->hdr_tbl.hdr_cnt = 1;
 
+       IPADBG("hdr_tbl.end = %d\n", end);
+       if (user_rule) {
+               ipa_ctx->hdr_tbl.end = end;
+               IPADBG("hdr_tbl.end = %d\n", end);
+       }
        IPADBG("reset hdr proc ctx\n");
+       user_rule = false;
+       end = 0;
        list_for_each_entry_safe(
                ctx_entry,
                ctx_next,
@@ -1352,9 +1368,13 @@ int ipa2_reset_hdr(bool user_only)
                        return -EFAULT;
                }
 
+               if (entry->ipacm_installed)
+                       user_rule = true;
+
                if (!user_only ||
                                ctx_entry->ipacm_installed) {
                        list_del(&ctx_entry->link);
+                       ipa_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt--;
                        ctx_entry->ref_cnt = 0;
                        ctx_entry->cookie = 0;
 
@@ -1375,6 +1395,14 @@ int ipa2_reset_hdr(bool user_only)
                                kmem_cache_free(
                                        ipa_ctx->hdr_proc_ctx_offset_cache,
                                        ctx_off_entry);
+                       } else {
+                               if (ctx_off_entry->offset +
+                                       ipa_hdr_bin_sz[ctx_off_entry->bin]
+                                       > end) {
+                                       end = ctx_off_entry->offset +
+                                       ipa_hdr_bin_sz[ctx_off_entry->bin];
+                                       IPADBG("replace hdr_proc as %d\n", end);
+                               }
                        }
                }
                list_for_each_entry_safe(ctx_off_entry, ctx_off_next,
@@ -1390,8 +1418,12 @@ int ipa2_reset_hdr(bool user_only)
                        }
                }
        }
-       ipa_ctx->hdr_proc_ctx_tbl.end = 0;
-       ipa_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt = 0;
+
+       IPADBG("hdr_proc_tbl.end = %d\n", end);
+       if (user_rule) {
+               ipa_ctx->hdr_proc_ctx_tbl.end = end;
+               IPADBG("hdr_proc_tbl.end = %d\n", end);
+       }
        mutex_unlock(&ipa_ctx->lock);
 
        return 0;
index f71eb95..956546a 100644 (file)
@@ -654,7 +654,6 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl,
        return 0;
 }
 
-
 int __ipa3_del_hdr(u32 hdr_hdl, bool by_user)
 {
        struct ipa3_hdr_entry *entry;
@@ -994,7 +993,8 @@ int ipa3_reset_hdr(bool user_only)
        struct ipa_hdr_offset_entry *off_next;
        struct ipa3_hdr_proc_ctx_offset_entry *ctx_off_entry;
        struct ipa3_hdr_proc_ctx_offset_entry *ctx_off_next;
-       int i;
+       int i, end = 0;
+       bool user_rule = false;
 
        /*
         * issue a reset on the routing module since routing rules point to
@@ -1032,6 +1032,9 @@ int ipa3_reset_hdr(bool user_only)
                        return -EFAULT;
                }
 
+               if (entry->ipacm_installed)
+                       user_rule = true;
+
                if (!user_only || entry->ipacm_installed) {
                        if (entry->is_hdr_proc_ctx) {
                                dma_unmap_single(ipa3_ctx->pdev,
@@ -1041,6 +1044,7 @@ int ipa3_reset_hdr(bool user_only)
                                entry->proc_ctx = NULL;
                        }
                        list_del(&entry->link);
+                       ipa3_ctx->hdr_tbl.hdr_cnt--;
                        entry->ref_cnt = 0;
                        entry->cookie = 0;
 
@@ -1066,6 +1070,13 @@ int ipa3_reset_hdr(bool user_only)
                                list_del(&off_entry->link);
                                kmem_cache_free(ipa3_ctx->hdr_offset_cache,
                                        off_entry);
+                       } else {
+                               if (off_entry->offset +
+                                       ipa_hdr_bin_sz[off_entry->bin] > end) {
+                                       end = off_entry->offset +
+                                               ipa_hdr_bin_sz[off_entry->bin];
+                                       IPADBG("replace end = %d\n", end);
+                               }
                        }
                }
                list_for_each_entry_safe(off_entry, off_next,
@@ -1080,11 +1091,15 @@ int ipa3_reset_hdr(bool user_only)
                        }
                }
        }
-       /* there is one header of size 8 */
-       ipa3_ctx->hdr_tbl.end = 8;
-       ipa3_ctx->hdr_tbl.hdr_cnt = 1;
 
+       IPADBG("hdr_tbl.end = %d\n", end);
+       if (user_rule) {
+               ipa3_ctx->hdr_tbl.end = end;
+               IPADBG("hdr_tbl.end = %d\n", end);
+       }
        IPADBG("reset hdr proc ctx\n");
+       user_rule = false;
+       end = 0;
        list_for_each_entry_safe(
                ctx_entry,
                ctx_next,
@@ -1097,9 +1112,13 @@ int ipa3_reset_hdr(bool user_only)
                        return -EFAULT;
                }
 
+               if (entry->ipacm_installed)
+                       user_rule = true;
+
                if (!user_only ||
                                ctx_entry->ipacm_installed) {
                        list_del(&ctx_entry->link);
+                       ipa3_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt--;
                        ctx_entry->ref_cnt = 0;
                        ctx_entry->cookie = 0;
 
@@ -1120,6 +1139,14 @@ int ipa3_reset_hdr(bool user_only)
                                kmem_cache_free(
                                        ipa3_ctx->hdr_proc_ctx_offset_cache,
                                        ctx_off_entry);
+                       } else {
+                               if (ctx_off_entry->offset +
+                                       ipa_hdr_bin_sz[ctx_off_entry->bin]
+                                       > end) {
+                                       end = ctx_off_entry->offset +
+                                       ipa_hdr_bin_sz[ctx_off_entry->bin];
+                                       IPADBG("replace hdr_proc as %d\n", end);
+                               }
                        }
                }
                list_for_each_entry_safe(ctx_off_entry, ctx_off_next,
@@ -1135,8 +1162,12 @@ int ipa3_reset_hdr(bool user_only)
                        }
                }
        }
-       ipa3_ctx->hdr_proc_ctx_tbl.end = 0;
-       ipa3_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt = 0;
+
+       IPADBG("hdr_proc_tbl.end = %d\n", end);
+       if (user_rule) {
+               ipa3_ctx->hdr_proc_ctx_tbl.end = end;
+               IPADBG("hdr_proc_tbl.end = %d\n", end);
+       }
        mutex_unlock(&ipa3_ctx->lock);
 
        return 0;