mirror of
https://github.com/ARM-software/devlib.git
synced 2025-03-13 13:27:51 +00:00
module/cgroups: robustify task freezer
The set() method of the CGroup class used to freeze tasks relies on target's write_value(). Sometimes, the freezing procedure takes some time and the call to write_value() in set() fails by reading "FREEZING" while it expected "FROZEN". To avoid this issue, this commits introduces a shutil call dedicated to changing the state of the freezer controller.
This commit is contained in:
parent
66a50a2f49
commit
4b36439de8
@ -177,6 +177,23 @@ cgroups_tasks_in() {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cgroups_freezer_set_state() {
|
||||||
|
STATE=${1}
|
||||||
|
SYSFS_ENTRY=${2}/freezer.state
|
||||||
|
|
||||||
|
# Set the state of the freezer
|
||||||
|
echo $STATE > $SYSFS_ENTRY
|
||||||
|
|
||||||
|
# And check it applied cleanly
|
||||||
|
for i in `seq 1 10`; do
|
||||||
|
[ $($CAT $SYSFS_ENTRY) = $STATE ] && exit 0
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# We have an issue
|
||||||
|
echo "ERROR: Freezer stalled while changing state to \"$STATE\"." >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Main Function Dispatcher
|
# Main Function Dispatcher
|
||||||
@ -213,6 +230,9 @@ cgroups_tasks_move)
|
|||||||
cgroups_tasks_in)
|
cgroups_tasks_in)
|
||||||
cgroups_tasks_in $*
|
cgroups_tasks_in $*
|
||||||
;;
|
;;
|
||||||
|
cgroups_freezer_set_state)
|
||||||
|
cgroups_freezer_set_state $*
|
||||||
|
;;
|
||||||
ftrace_get_function_stats)
|
ftrace_get_function_stats)
|
||||||
ftrace_get_function_stats
|
ftrace_get_function_stats
|
||||||
;;
|
;;
|
||||||
|
@ -466,11 +466,11 @@ class CgroupsModule(Module):
|
|||||||
if freezer is None:
|
if freezer is None:
|
||||||
raise RuntimeError('freezer cgroup controller not present')
|
raise RuntimeError('freezer cgroup controller not present')
|
||||||
freezer_cg = freezer.cgroup('/DEVLIB_FREEZER')
|
freezer_cg = freezer.cgroup('/DEVLIB_FREEZER')
|
||||||
thawed_cg = freezer.cgroup('/')
|
cmd = 'cgroups_freezer_set_state {{}} {}'.format(freezer_cg.directory)
|
||||||
|
|
||||||
if thaw:
|
if thaw:
|
||||||
# Restart froozen tasks
|
# Restart froozen tasks
|
||||||
freezer_cg.set(state='THAWED')
|
freezer.target._execute_util(cmd.format('THAWED'), as_root=True)
|
||||||
# Remove all tasks from freezer
|
# Remove all tasks from freezer
|
||||||
freezer.move_all_tasks_to('/')
|
freezer.move_all_tasks_to('/')
|
||||||
return
|
return
|
||||||
@ -482,7 +482,7 @@ class CgroupsModule(Module):
|
|||||||
tasks = freezer.tasks('/')
|
tasks = freezer.tasks('/')
|
||||||
|
|
||||||
# Freeze all tasks
|
# Freeze all tasks
|
||||||
freezer_cg.set(state='FROZEN')
|
freezer.target._execute_util(cmd.format('FROZEN'), as_root=True)
|
||||||
|
|
||||||
return tasks
|
return tasks
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user