forked from luck/tmp_suning_uos_patched
interconnect: Revert to previous config if any request fails
When consumers report their bandwidth needs with icc_set_bw(), it's possible that the requested amount of bandwidth is not available or just the new configuration fails to apply on some path. In this case revert to the previous configuration and propagate the error back to the consumers to let them know that bandwidth is not available, hardware is busy or whatever error is returned by the interconnect platform driver. Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ecfbed0c5c
commit
dce6d40666
|
@ -414,14 +414,18 @@ EXPORT_SYMBOL_GPL(of_icc_get);
|
|||
int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
|
||||
{
|
||||
struct icc_node *node;
|
||||
u32 old_avg, old_peak;
|
||||
size_t i;
|
||||
int ret;
|
||||
|
||||
if (!path)
|
||||
if (!path || !path->num_nodes)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&icc_lock);
|
||||
|
||||
old_avg = path->reqs[0].avg_bw;
|
||||
old_peak = path->reqs[0].peak_bw;
|
||||
|
||||
for (i = 0; i < path->num_nodes; i++) {
|
||||
node = path->reqs[i].node;
|
||||
|
||||
|
@ -434,10 +438,19 @@ int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
|
|||
}
|
||||
|
||||
ret = apply_constraints(path);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
pr_debug("interconnect: error applying constraints (%d)\n",
|
||||
ret);
|
||||
|
||||
for (i = 0; i < path->num_nodes; i++) {
|
||||
node = path->reqs[i].node;
|
||||
path->reqs[i].avg_bw = old_avg;
|
||||
path->reqs[i].peak_bw = old_peak;
|
||||
aggregate_requests(node);
|
||||
}
|
||||
apply_constraints(path);
|
||||
}
|
||||
|
||||
mutex_unlock(&icc_lock);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue
Block a user