Merge "msm: ipa: fix reference count in rm"

This commit is contained in:
Linux Build Service Account 2016-10-19 11:18:03 -07:00 committed by Gerrit - the friendly Code Review server
commit 07b2776c8c
4 changed files with 20 additions and 9 deletions

View file

@ -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 {

View file

@ -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,

View file

@ -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);

View file

@ -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,