static void __pm_qos_update_request(struct pm_qos_request *req, s32 new_value) { if (new_value != req->node.prio) pm_qos_update_target( pm_qos_array[req->pm_qos_class]->constraints, &req->node, PM_QOS_UPDATE_REQ, new_value); }
void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, s32 value) { if (!req) /*guard against callers passing in null */ return; if (pm_qos_request_active(req)) { WARN(1, KERN_ERR "pm_qos_add_request() called for already added request\n"); return; } req->pm_qos_class = pm_qos_class; INIT_DELAYED_WORK(&req->work, pm_qos_work_fn); pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints, &req->node, PM_QOS_ADD_REQ, value); }
/** * pm_qos_remove_request - modifies an existing qos request * @req: handle to request list element * * Will remove pm qos request from the list of constraints and * recompute the current target value for the pm_qos_class. Call this * on slow code paths. */ void pm_qos_remove_request(struct pm_qos_request *req) { if (!req) /*guard against callers passing in null */ return; /* silent return to keep pcm code cleaner */ if (!pm_qos_request_active(req)) { WARN(1, KERN_ERR "pm_qos_remove_request() called for unknown object\n"); return; } if (delayed_work_pending(&req->work)) cancel_delayed_work_sync(&req->work); pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints, &req->node, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); memset(req, 0, sizeof(*req)); }
/** * pm_qos_update_request_timeout - modifies an existing qos request temporarily. * @req : handle to list element holding a pm_qos request to use * @new_value: defines the temporal qos request * @timeout_us: the effective duration of this qos request in usecs. * * After timeout_us, this qos request is cancelled automatically. */ void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value, unsigned long timeout_us) { if (!req) return; if (WARN(!pm_qos_request_active(req), "%s called for unknown object.", __func__)) return; if (delayed_work_pending(&req->work)) cancel_delayed_work_sync(&req->work); if (new_value != req->node.prio) pm_qos_update_target( pm_qos_array[req->pm_qos_class]->constraints, &req->node, PM_QOS_UPDATE_REQ, new_value); schedule_delayed_work(&req->work, usecs_to_jiffies(timeout_us)); }
/** * pm_qos_update_request - modifies an existing qos request * @req : handle to list element holding a pm_qos request to use * @value: defines the qos request * * Updates an existing qos request for the pm_qos_class of parameters along * with updating the target pm_qos_class value. * * Attempts are made to make this code callable on hot code paths. */ void pm_qos_update_request(struct pm_qos_request *req, s32 new_value) { if (!req) /*guard against callers passing in null */ return; if (!pm_qos_request_active(req)) { WARN(1, KERN_ERR "pm_qos_update_request() called for unknown object\n"); return; } if (delayed_work_pending(&req->work)) cancel_delayed_work_sync(&req->work); if (new_value != req->node.prio) pm_qos_update_target( pm_qos_array[req->pm_qos_class]->constraints, &req->node, PM_QOS_UPDATE_REQ, new_value); }