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( ipa_rm_resource_consumer_request_work(
(struct ipa_rm_resource_cons *)resource, (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); spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags);
bail: bail:
kfree(ipa_rm_work); 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, int ipa_rm_wq_send_resume_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state, enum ipa_rm_resource_state prev_state,
u32 needed_bw) u32 needed_bw,
bool inc_usage_count)
{ {
int result = -ENOMEM; int result = -ENOMEM;
struct ipa_rm_wq_suspend_resume_work_type *work = kzalloc(sizeof(*work), 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->resource_name = resource_name;
work->prev_state = prev_state; work->prev_state = prev_state;
work->needed_bw = needed_bw; work->needed_bw = needed_bw;
work->inc_usage_count = inc_usage_count;
result = queue_work(ipa_rm_ctx->ipa_rm_wq, result = queue_work(ipa_rm_ctx->ipa_rm_wq,
(struct work_struct *)work); (struct work_struct *)work);
} else { } 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_name resource_name;
enum ipa_rm_resource_state prev_state; enum ipa_rm_resource_state prev_state;
u32 needed_bw; 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, int ipa_rm_wq_send_resume_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state, 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, int ipa_rm_wq_send_suspend_cmd(enum ipa_rm_resource_name resource_name,
enum ipa_rm_resource_state prev_state, 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, int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
enum ipa_rm_resource_state prev_state, enum ipa_rm_resource_state prev_state,
u32 prod_needed_bw, u32 prod_needed_bw,
bool notify_completion) bool notify_completion,
bool dec_client_on_err)
{ {
int driver_result; 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) { } else if (driver_result != -EINPROGRESS) {
consumer->resource.state = prev_state; consumer->resource.state = prev_state;
consumer->resource.needed_bw -= prod_needed_bw; consumer->resource.needed_bw -= prod_needed_bw;
consumer->usage_count--; if (dec_client_on_err)
consumer->usage_count--;
} }
return driver_result; return driver_result;
@ -170,19 +172,22 @@ int ipa_rm_resource_consumer_request(
ipa_rm_resource_str(consumer->resource.name)); ipa_rm_resource_str(consumer->resource.name));
ipa_rm_wq_send_resume_cmd(consumer->resource.name, ipa_rm_wq_send_resume_cmd(consumer->resource.name,
prev_state, prev_state,
prod_needed_bw); prod_needed_bw,
inc_usage_count);
result = -EINPROGRESS; result = -EINPROGRESS;
break; break;
} }
result = ipa_rm_resource_consumer_request_work(consumer, result = ipa_rm_resource_consumer_request_work(consumer,
prev_state, prev_state,
prod_needed_bw, prod_needed_bw,
false); false,
inc_usage_count);
break; break;
case IPA_RM_GRANTED: case IPA_RM_GRANTED:
if (wake_client) { if (wake_client) {
result = ipa_rm_resource_consumer_request_work( 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; break;
} }
ipa_rm_perf_profile_change(consumer->resource.name); 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, int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer,
enum ipa_rm_resource_state prev_state, enum ipa_rm_resource_state prev_state,
u32 needed_bw, u32 needed_bw,
bool notify_completion); bool notify_completion,
bool dec_client_on_err);
int ipa_rm_resource_consumer_release_work( int ipa_rm_resource_consumer_release_work(
struct ipa_rm_resource_cons *consumer, struct ipa_rm_resource_cons *consumer,