summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-19 11:18:03 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-10-19 11:18:03 -0700
commit07b2776c8c57a6c66669bc511b6bccc6582d9eff (patch)
tree407728ed02c37e770be92a1c238b461db71cd41e
parent407e17bb1112b25416ae8d127756252c7236b745 (diff)
parentfc5f7188367782031f0756dffdb6f4fc333ecb8f (diff)
Merge "msm: ipa: fix reference count in rm"
-rw-r--r--drivers/platform/msm/ipa/ipa_rm.c7
-rw-r--r--drivers/platform/msm/ipa/ipa_rm_i.h4
-rw-r--r--drivers/platform/msm/ipa/ipa_rm_resource.c15
-rw-r--r--drivers/platform/msm/ipa/ipa_rm_resource.h3
4 files changed, 20 insertions, 9 deletions
diff --git a/drivers/platform/msm/ipa/ipa_rm.c b/drivers/platform/msm/ipa/ipa_rm.c
index 209264d69b26..bcdd99deae1f 100644
--- a/drivers/platform/msm/ipa/ipa_rm.c
+++ b/drivers/platform/msm/ipa/ipa_rm.c
@@ -820,7 +820,8 @@ static void ipa_rm_wq_resume_handler(struct work_struct *work)
}
ipa_rm_resource_consumer_request_work(
(struct ipa_rm_resource_cons *)resource,
- ipa_rm_work->prev_state, ipa_rm_work->needed_bw, true);
+ ipa_rm_work->prev_state, ipa_rm_work->needed_bw, true,
+ ipa_rm_work->inc_usage_count);
spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags);
bail:
kfree(ipa_rm_work);
@@ -916,7 +917,8 @@ int ipa_rm_wq_send_suspend_cmd(enum ipa_rm_resource_name resource_name,
int ipa_rm_wq_send_resume_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state,
- u32 needed_bw)
+ u32 needed_bw,
+ bool inc_usage_count)
{
int result = -ENOMEM;
struct ipa_rm_wq_suspend_resume_work_type *work = kzalloc(sizeof(*work),
@@ -926,6 +928,7 @@ int ipa_rm_wq_send_resume_cmd(enum ipa_rm_resource_name resource_name,
work->resource_name = resource_name;
work->prev_state = prev_state;
work->needed_bw = needed_bw;
+ work->inc_usage_count = inc_usage_count;
result = queue_work(ipa_rm_ctx->ipa_rm_wq,
(struct work_struct *)work);
} else {
diff --git a/drivers/platform/msm/ipa/ipa_rm_i.h b/drivers/platform/msm/ipa/ipa_rm_i.h
index eb86c54d7382..1610bb1e1ead 100644
--- a/drivers/platform/msm/ipa/ipa_rm_i.h
+++ b/drivers/platform/msm/ipa/ipa_rm_i.h
@@ -118,6 +118,7 @@ struct ipa_rm_wq_suspend_resume_work_type {
enum ipa_rm_resource_name resource_name;
enum ipa_rm_resource_state prev_state;
u32 needed_bw;
+ bool inc_usage_count;
};
@@ -128,7 +129,8 @@ int ipa_rm_wq_send_cmd(enum ipa_rm_wq_cmd wq_cmd,
int ipa_rm_wq_send_resume_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state,
- u32 needed_bw);
+ u32 needed_bw,
+ bool inc_usage_count);
int ipa_rm_wq_send_suspend_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state,
diff --git a/drivers/platform/msm/ipa/ipa_rm_resource.c b/drivers/platform/msm/ipa/ipa_rm_resource.c
index 0a3f66307eee..da4490ce0aa0 100644
--- a/drivers/platform/msm/ipa/ipa_rm_resource.c
+++ b/drivers/platform/msm/ipa/ipa_rm_resource.c
@@ -116,7 +116,8 @@ bail:
int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
enum ipa_rm_resource_state prev_state,
u32 prod_needed_bw,
- bool notify_completion)
+ bool notify_completion,
+ bool dec_client_on_err)
{
int driver_result;
@@ -135,7 +136,8 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
} else if (driver_result != -EINPROGRESS) {
consumer->resource.state = prev_state;
consumer->resource.needed_bw -= prod_needed_bw;
- consumer->usage_count--;
+ if (dec_client_on_err)
+ consumer->usage_count--;
}
return driver_result;
@@ -170,19 +172,22 @@ int ipa_rm_resource_consumer_request(
ipa_rm_resource_str(consumer->resource.name));
ipa_rm_wq_send_resume_cmd(consumer->resource.name,
prev_state,
- prod_needed_bw);
+ prod_needed_bw,
+ inc_usage_count);
result = -EINPROGRESS;
break;
}
result = ipa_rm_resource_consumer_request_work(consumer,
prev_state,
prod_needed_bw,
- false);
+ false,
+ inc_usage_count);
break;
case IPA_RM_GRANTED:
if (wake_client) {
result = ipa_rm_resource_consumer_request_work(
- consumer, prev_state, prod_needed_bw, false);
+ consumer, prev_state, prod_needed_bw, false,
+ inc_usage_count);
break;
}
ipa_rm_perf_profile_change(consumer->resource.name);
diff --git a/drivers/platform/msm/ipa/ipa_rm_resource.h b/drivers/platform/msm/ipa/ipa_rm_resource.h
index 5c3a0190753f..da149c51c96c 100644
--- a/drivers/platform/msm/ipa/ipa_rm_resource.h
+++ b/drivers/platform/msm/ipa/ipa_rm_resource.h
@@ -155,7 +155,8 @@ int ipa_rm_resource_producer_print_stat(
int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
enum ipa_rm_resource_state prev_state,
u32 needed_bw,
- bool notify_completion);
+ bool notify_completion,
+ bool dec_client_on_err);
int ipa_rm_resource_consumer_release_work(
struct ipa_rm_resource_cons *consumer,