From: Andor Daam <andor.daam@xxxxxxxxxxxxxx> This patch makes dynamic enabling/disabling of zcache via a sysfsnode possible. The node is used to toggle the preexisting zcache_freeze variable to stop/start accepting pages by zcache. Signed-off-by: Andor Daam <andor.daam@xxxxxxxxxxxxxx> Signed-off-by: Florian Schmaus <fschmaus@xxxxxxxxx> Signed-off-by: Stefan Hengelein <ilendir@xxxxxxxxxxxxxx> --- drivers/staging/zcache/zcache-main.c | 57 +++++++++++++++++++++++++++++----- 1 files changed, 49 insertions(+), 8 deletions(-) diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c index 2734dac..1bece03 100644 --- a/drivers/staging/zcache/zcache-main.c +++ b/drivers/staging/zcache/zcache-main.c @@ -469,6 +469,15 @@ out: } /* + * When zcache is disabled ("frozen"), pools can be created and destroyed, + * but all puts (and thus all other operations that require memory allocation) + * must fail. If zcache is unfrozen, accepts puts, then frozen again, + * data consistency requires all puts while frozen to be converted into + * flushes. + */ +static bool zcache_freeze; + +/* * The following routines handle shrinking of ephemeral pages by evicting * pages "least valuable" first. */ @@ -913,6 +922,45 @@ static struct kobj_attribute zcache_zv_page_count_policy_percent_attr = { .show = zv_page_count_policy_percent_show, .store = zv_page_count_policy_percent_store, }; + +static ssize_t zcache_freeze_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + if (zcache_freeze) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static ssize_t zcache_freeze_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned int val; + int err; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + err = kstrtouint(buf, 10, &val); + if (err) + return -EINVAL; + + if (val > 0) + zcache_freeze = true; + else + zcache_freeze = false; + + return count; +} + +static struct kobj_attribute zcache_freeze_attr = { + .attr = { .name = "zcache_freeze", .mode = 0644 }, + .show = zcache_freeze_show, + .store = zcache_freeze_store, +}; + #endif /* @@ -1515,6 +1563,7 @@ static struct attribute *zcache_attrs[] = { &zcache_zv_max_zsize_attr.attr, &zcache_zv_max_mean_zsize_attr.attr, &zcache_zv_page_count_policy_percent_attr.attr, + &zcache_freeze_attr.attr, NULL, }; @@ -1524,14 +1573,6 @@ static struct attribute_group zcache_attr_group = { }; #endif /* CONFIG_SYSFS */ -/* - * When zcache is disabled ("frozen"), pools can be created and destroyed, - * but all puts (and thus all other operations that require memory allocation) - * must fail. If zcache is unfrozen, accepts puts, then frozen again, - * data consistency requires all puts while frozen to be converted into - * flushes. - */ -static bool zcache_freeze; /* * zcache shrinker interface (only useful for ephemeral pages, so zbud only) -- 1.7.5.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel