int check_interval = 1; /* In milliseconds */
int exp = 10;
int waited_time = 0;
- g_autofree char *state = NULL;
virLXCDomainObjPrivate *priv = vm->privateData;
while (waited_time < timeout) {
+ virCgroupFreezerState state;
int r;
+
/*
* Writing "FROZEN" to the "freezer.state" freezes the group,
* i.e., the container, temporarily transiting "FREEZING" state.
* to "FROZEN".
* (see linux-2.6/Documentation/cgroups/freezer-subsystem.txt)
*/
- r = virCgroupSetFreezerState(priv->cgroup, "FROZEN");
+ r = virCgroupSetFreezerState(priv->cgroup,
+ VIR_CGROUP_FREEZER_STATE_FROZEN);
/*
* Returning EBUSY explicitly indicates that the group is
VIR_DEBUG("Reading freezer.state failed with errno: %d", r);
goto error;
}
- VIR_DEBUG("Read freezer.state: %s", state);
+ VIR_DEBUG("Read freezer.state: %d", state);
- if (STREQ(state, "FROZEN"))
+ if (state == VIR_CGROUP_FREEZER_STATE_FROZEN)
return 0;
waited_time += check_interval;
* activate the group again and return an error.
* This is likely to fall the group back again gracefully.
*/
- virCgroupSetFreezerState(priv->cgroup, "THAWED");
+ virCgroupSetFreezerState(priv->cgroup, VIR_CGROUP_FREEZER_STATE_THAWED);
return -1;
}
"%s", _("domain is already running"));
goto endjob;
} else if (state == VIR_DOMAIN_PAUSED) {
- if (virCgroupSetFreezerState(priv->cgroup, "THAWED") < 0) {
+ if (virCgroupSetFreezerState(priv->cgroup,
+ VIR_CGROUP_FREEZER_STATE_THAWED) < 0) {
virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("Resume operation failed"));
goto endjob;
return -1;
}
- if (virCgroupSetFreezerState(priv->cgroup, "THAWED") < 0) {
+ if (virCgroupSetFreezerState(priv->cgroup,
+ VIR_CGROUP_FREEZER_STATE_THAWED) < 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Unable to thaw all processes"));
int
-virCgroupSetFreezerState(virCgroup *group, const char *state)
+virCgroupSetFreezerState(virCgroup *group,
+ virCgroupFreezerState state)
{
virCgroup *parent = virCgroupGetNested(group);
int
-virCgroupGetFreezerState(virCgroup *group, char **state)
+virCgroupGetFreezerState(virCgroup *group,
+ virCgroupFreezerState *state)
{
virCgroup *parent = virCgroupGetNested(group);
int
virCgroupSetFreezerState(virCgroup *group G_GNUC_UNUSED,
- const char *state G_GNUC_UNUSED)
+ virCgroupFreezerState state G_GNUC_UNUSED)
{
virReportSystemError(ENOSYS, "%s",
_("Control groups not supported on this platform"));
int
virCgroupGetFreezerState(virCgroup *group G_GNUC_UNUSED,
- char **state G_GNUC_UNUSED)
+ virCgroupFreezerState **state G_GNUC_UNUSED)
{
virReportSystemError(ENOSYS, "%s",
_("Control groups not supported on this platform"));
int virCgroupGetCpuacctStat(virCgroup *group, unsigned long long *user,
unsigned long long *sys);
-int virCgroupSetFreezerState(virCgroup *group, const char *state);
-int virCgroupGetFreezerState(virCgroup *group, char **state);
+typedef enum {
+ VIR_CGROUP_FREEZER_STATE_THAWED,
+ VIR_CGROUP_FREEZER_STATE_FROZEN,
+ VIR_CGROUP_FREEZER_STATE_FREEZING,
+
+ VIR_CGROUP_FREEZER_STATE_LAST
+} virCgroupFreezerState;
+
+int virCgroupSetFreezerState(virCgroup *group, virCgroupFreezerState state);
+int virCgroupGetFreezerState(virCgroup *group, virCgroupFreezerState *state);
int virCgroupSetCpusetMems(virCgroup *group, const char *mems);
int virCgroupGetCpusetMems(virCgroup *group, char **mems);
typedef int
(*virCgroupSetFreezerStateCB)(virCgroup *group,
- const char *state);
+ virCgroupFreezerState state);
typedef int
(*virCgroupGetFreezerStateCB)(virCgroup *group,
- char **state);
+ virCgroupFreezerState *state);
typedef int
(*virCgroupSetCpusetMemsCB)(virCgroup *group,
}
+VIR_ENUM_DECL(virCgroupFreezerState);
+VIR_ENUM_IMPL(virCgroupFreezerState,
+ VIR_CGROUP_FREEZER_STATE_LAST,
+ "THAWED",
+ "FROZEN",
+ "FREEZING"
+);
+
static int
virCgroupV1SetFreezerState(virCgroup *group,
- const char *state)
+ virCgroupFreezerState state)
{
+ const char *stateStr = virCgroupFreezerStateTypeToString(state);
+
return virCgroupSetValueStr(group,
VIR_CGROUP_CONTROLLER_FREEZER,
- "freezer.state", state);
+ "freezer.state", stateStr);
}
static int
virCgroupV1GetFreezerState(virCgroup *group,
- char **state)
+ virCgroupFreezerState *state)
{
- return virCgroupGetValueStr(group,
- VIR_CGROUP_CONTROLLER_FREEZER,
- "freezer.state", state);
+ g_autofree char *stateStr = NULL;
+ int s;
+
+ if (virCgroupGetValueStr(group,
+ VIR_CGROUP_CONTROLLER_FREEZER,
+ "freezer.state", &stateStr) < 0) {
+ return -1;
+ }
+
+ s = virCgroupFreezerStateTypeFromString(stateStr);
+ if (s < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown value of freezer controller: %1$s"),
+ stateStr);
+ return -1;
+ }
+
+ *state = s;
+ return 0;
}