Loading drivers/platform/msm/ipa/ipa_rm.c +27 −9 Original line number Diff line number Diff line /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -155,6 +155,21 @@ int ipa_rm_delete_resource(enum ipa_rm_resource_name resource_name) result = -EINVAL; goto bail; } if (resource->state == IPA_RM_GRANTED) { /* There might pending timer work to * release release the resource */ if (resource->release_work != NULL) { if (flush_delayed_work(&resource->release_work->work) == true) { IPA_RM_DBG("Flushed the pending work\n"); } else { IPA_RM_DBG("Work was already idle\n"); } } } result = ipa_rm_resource_delete(resource); if (result) { IPA_RM_ERR("ipa_rm_resource_delete() failed\n"); Loading Loading @@ -464,6 +479,8 @@ void delayed_release_work_func(struct work_struct *work) bail: spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags); kfree(rwork); if (resource) resource->release_work = NULL; } Loading @@ -478,7 +495,6 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) { unsigned long flags; struct ipa_rm_resource *resource; struct ipa_rm_delayed_release_work_type *release_work; int result; if (!IPA_RM_RESORCE_IS_CONS(resource_name)) { Loading @@ -502,16 +518,18 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) goto bail; } release_work = kzalloc(sizeof(*release_work), GFP_ATOMIC); if (!release_work) { resource->release_work = kzalloc(sizeof(*resource->release_work), GFP_ATOMIC); if (!resource->release_work) { result = -ENOMEM; goto bail; } release_work->resource_name = resource->name; release_work->needed_bw = 0; release_work->dec_usage_count = false; INIT_DELAYED_WORK(&release_work->work, delayed_release_work_func); schedule_delayed_work(&release_work->work, resource->release_work->resource_name = resource->name; resource->release_work->needed_bw = 0; resource->release_work->dec_usage_count = false; INIT_DELAYED_WORK(&resource->release_work->work, delayed_release_work_func); schedule_delayed_work(&resource->release_work->work, msecs_to_jiffies(IPA_RM_RELEASE_DELAY_IN_MSEC)); result = 0; bail: Loading drivers/platform/msm/ipa/ipa_rm_resource.c +15 −4 Original line number Diff line number Diff line /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -122,11 +122,20 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, bool dec_client_on_err) { int driver_result; int result = 0; IPA_RM_DBG_LOW("calling driver CB\n"); driver_result = consumer->request_resource(); IPA_RM_DBG_LOW("driver CB returned with %d\n", driver_result); if (driver_result == 0) { if (driver_result == 0 || driver_result == -EPERM) { /* * Go ahead and handle suspend of * resources in case of -EPERM return, * as the client driver is unloaded and * Holb drop is enabled */ if (notify_completion) { ipa_rm_resource_consumer_handle_cb(consumer, IPA_RM_RESOURCE_GRANTED); Loading @@ -140,9 +149,11 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, consumer->resource.needed_bw -= prod_needed_bw; if (dec_client_on_err) consumer->usage_count--; } result = driver_result; } else result = driver_result; return driver_result; return result; } int ipa_rm_resource_consumer_request( Loading drivers/platform/msm/ipa/ipa_rm_resource.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016,2018 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -65,6 +65,7 @@ struct ipa_rm_resource { u32 needed_bw; enum ipa_rm_resource_state state; struct ipa_rm_peers_list *peers_list; struct ipa_rm_delayed_release_work_type *release_work; }; /** Loading Loading
drivers/platform/msm/ipa/ipa_rm.c +27 −9 Original line number Diff line number Diff line /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -155,6 +155,21 @@ int ipa_rm_delete_resource(enum ipa_rm_resource_name resource_name) result = -EINVAL; goto bail; } if (resource->state == IPA_RM_GRANTED) { /* There might pending timer work to * release release the resource */ if (resource->release_work != NULL) { if (flush_delayed_work(&resource->release_work->work) == true) { IPA_RM_DBG("Flushed the pending work\n"); } else { IPA_RM_DBG("Work was already idle\n"); } } } result = ipa_rm_resource_delete(resource); if (result) { IPA_RM_ERR("ipa_rm_resource_delete() failed\n"); Loading Loading @@ -464,6 +479,8 @@ void delayed_release_work_func(struct work_struct *work) bail: spin_unlock_irqrestore(&ipa_rm_ctx->ipa_rm_lock, flags); kfree(rwork); if (resource) resource->release_work = NULL; } Loading @@ -478,7 +495,6 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) { unsigned long flags; struct ipa_rm_resource *resource; struct ipa_rm_delayed_release_work_type *release_work; int result; if (!IPA_RM_RESORCE_IS_CONS(resource_name)) { Loading @@ -502,16 +518,18 @@ int ipa_rm_request_resource_with_timer(enum ipa_rm_resource_name resource_name) goto bail; } release_work = kzalloc(sizeof(*release_work), GFP_ATOMIC); if (!release_work) { resource->release_work = kzalloc(sizeof(*resource->release_work), GFP_ATOMIC); if (!resource->release_work) { result = -ENOMEM; goto bail; } release_work->resource_name = resource->name; release_work->needed_bw = 0; release_work->dec_usage_count = false; INIT_DELAYED_WORK(&release_work->work, delayed_release_work_func); schedule_delayed_work(&release_work->work, resource->release_work->resource_name = resource->name; resource->release_work->needed_bw = 0; resource->release_work->dec_usage_count = false; INIT_DELAYED_WORK(&resource->release_work->work, delayed_release_work_func); schedule_delayed_work(&resource->release_work->work, msecs_to_jiffies(IPA_RM_RELEASE_DELAY_IN_MSEC)); result = 0; bail: Loading
drivers/platform/msm/ipa/ipa_rm_resource.c +15 −4 Original line number Diff line number Diff line /* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -122,11 +122,20 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, bool dec_client_on_err) { int driver_result; int result = 0; IPA_RM_DBG_LOW("calling driver CB\n"); driver_result = consumer->request_resource(); IPA_RM_DBG_LOW("driver CB returned with %d\n", driver_result); if (driver_result == 0) { if (driver_result == 0 || driver_result == -EPERM) { /* * Go ahead and handle suspend of * resources in case of -EPERM return, * as the client driver is unloaded and * Holb drop is enabled */ if (notify_completion) { ipa_rm_resource_consumer_handle_cb(consumer, IPA_RM_RESOURCE_GRANTED); Loading @@ -140,9 +149,11 @@ int ipa_rm_resource_consumer_request_work(struct ipa_rm_resource_cons *consumer, consumer->resource.needed_bw -= prod_needed_bw; if (dec_client_on_err) consumer->usage_count--; } result = driver_result; } else result = driver_result; return driver_result; return result; } int ipa_rm_resource_consumer_request( Loading
drivers/platform/msm/ipa/ipa_rm_resource.h +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016,2018 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -65,6 +65,7 @@ struct ipa_rm_resource { u32 needed_bw; enum ipa_rm_resource_state state; struct ipa_rm_peers_list *peers_list; struct ipa_rm_delayed_release_work_type *release_work; }; /** Loading