codec_mm: not to be blocked to wait scatter cache done [1/2]

PD#SWPL-2206

Problem:
decoding thread was blocked to wait scatter memory to be cached done. it
may take 30+ ms and lead to cts/vts fail

Solution:
not to wait scatter cached done. it save timing of system

Verify:
Verified U212

Change-Id: I75fa3e892e0b9b8023c07b62a31ebd43d3c92044
Signed-off-by: Hui Zhang <hui.zhang@amlogic.com>
This commit is contained in:
Hui Zhang
2018-12-22 16:55:43 +08:00
committed by Luan Yuan
parent 5e29fb3703
commit bfa1bcd608
2 changed files with 19 additions and 7 deletions

View File

@@ -2205,6 +2205,14 @@ int codec_mm_scatter_update_config(struct codec_mm_scatter_mgt *smgt)
smgt->no_alloc_from_sys = g_scatter.no_alloc_from_sys;
return 0;
}
int codec_mm_scatter_size(int is_tvp)
{
struct codec_mm_scatter_mgt *smgt;
smgt = codec_mm_get_scatter_mgt(is_tvp ? 1 : 0);
return smgt->total_page_num;
}
EXPORT_SYMBOL(codec_mm_scatter_size);
int codec_mm_scatter_mgt_delay_free_swith(
int on,
@@ -2213,7 +2221,6 @@ int codec_mm_scatter_mgt_delay_free_swith(
int is_tvp)
{
struct codec_mm_scatter_mgt *smgt;
unsigned long ret = 0;
smgt = codec_mm_get_scatter_mgt(is_tvp);
codec_mm_list_lock(smgt);
@@ -2231,14 +2238,12 @@ int codec_mm_scatter_mgt_delay_free_swith(
}
codec_mm_list_unlock(smgt);
if (on && wait_size_M > 0 && !is_tvp) {
u64 start_time = get_jiffies_64();
int try_max = 10;
smgt->force_cache_on = 1;
smgt->force_cache_page_cnt = wait_size_M >> PAGE_SHIFT;
smgt->delay_free_timeout_jiffies64 =
get_jiffies_64() + 10000 * HZ/1000;
codec_mm_schedule_delay_work(smgt, 0, 1);/*start cache*/
#if 0
while (smgt->total_page_num < smgt->force_cache_page_cnt) {
if (smgt->cache_sc &&
(smgt->cached_pages >=
@@ -2263,6 +2268,7 @@ int codec_mm_scatter_mgt_delay_free_swith(
smgt->force_cache_on = 0;
smgt->delay_free_timeout_jiffies64 =
get_jiffies_64() + delay_ms * HZ/1000;
#endif
} else if (on) {
codec_mm_schedule_delay_work(smgt, 0, 1);
} else {
@@ -2288,8 +2294,11 @@ static void codec_mm_scatter_cache_manage(
(smgt->no_cache_size_M * (SZ_1M >> PAGE_SHIFT)))) {
/*have enough pages for most movies.*/
/*don't cache more.*/
if (smgt->force_cache_on)
complete(&smgt->complete);
if (smgt->force_cache_on) {
smgt->force_cache_on = 0;
smgt->delay_free_timeout_jiffies64 =
get_jiffies_64() + 2000 * HZ/1000;
}
} else if ((smgt->cached_pages < smgt->keep_size_PAGE) ||
(smgt->force_cache_on &&/*on star cache*/
(smgt->total_page_num < smgt->force_cache_page_cnt))
@@ -2333,7 +2342,9 @@ static void codec_mm_scatter_cache_manage(
smgt->force_cache_on &&
(smgt->cached_pages >=
smgt->force_cache_page_cnt)) {
complete(&smgt->complete);
smgt->force_cache_on = 0;
smgt->delay_free_timeout_jiffies64 =
get_jiffies_64() + 2000 * HZ/1000;
}
} else if ((smgt->cached_pages >
(smgt->keep_size_PAGE + 1000)) &&

View File

@@ -60,6 +60,7 @@ struct codec_mm_scatter *codec_mm_scatter_alloc(int max_page,
int page_num, int istvp);
int codec_mm_scatter_alloc_want_pages(struct codec_mm_scatter *mms,
int want_pages);
int codec_mm_scatter_size(int is_tvp);
int codec_mm_scatter_mgt_delay_free_swith(int on, int delay_ms,
int wait_size_M, int istvp);
int codec_mm_dump_scatter(struct codec_mm_scatter *mms, void *buf, int size);