* the current resource consumption level
*/
unsigned long long usage;
+ /*
+ * the maximal value of the usage from the counter creation
+ */
+ unsigned long long max_usage;
/*
* the limit that usage cannot exceed
*/
enum {
RES_USAGE,
+ RES_MAX_USAGE,
RES_LIMIT,
RES_FAILCNT,
};
return ret;
}
+static inline void res_counter_reset_max(struct res_counter *cnt)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&cnt->lock, flags);
+ cnt->max_usage = cnt->usage;
+ spin_unlock_irqrestore(&cnt->lock, flags);
+}
+
#endif
mem_cgroup_write_strategy);
}
+static ssize_t mem_cgroup_max_reset(struct cgroup *cont, struct cftype *cft,
+ struct file *file, const char __user *userbuf,
+ size_t nbytes, loff_t *ppos)
+{
+ struct mem_cgroup *mem;
+
+ mem = mem_cgroup_from_cont(cont);
+ res_counter_reset_max(&mem->res);
+ return nbytes;
+}
+
static ssize_t mem_force_empty_write(struct cgroup *cont,
struct cftype *cft, struct file *file,
const char __user *userbuf,
.private = RES_USAGE,
.read_u64 = mem_cgroup_read,
},
+ {
+ .name = "max_usage_in_bytes",
+ .private = RES_MAX_USAGE,
+ .write = mem_cgroup_max_reset,
+ .read_u64 = mem_cgroup_read,
+ },
{
.name = "limit_in_bytes",
.private = RES_LIMIT,