[PATCH 1/3] Add r/w sysfs attribute for zcache_freeze

Konrad Rzeszutek Wilk konrad.wilk at oracle.com
Thu Mar 15 16:37:44 UTC 2012


On Tue, Mar 13, 2012 at 11:34:46AM +0100, Florian Schmaus wrote:
> From: Andor Daam <andor.daam at googlemail.com>
> 
> This patch makes dynamic enabling/disabling of zcache via a sysfsnode possible.

There should be an patch to the Documentation/ABI/testing for these parameters.

> The node is used to toggle the preexisting zcache_freeze variable to
> stop/start accepting pages by zcache.

What is the reasoning to do this in the frontend instead of the backend (Cleancache/frontswap)?

> 
> Signed-off-by: Andor Daam <andor.daam at googlemail.com>
> Signed-off-by: Florian Schmaus <fschmaus at gmail.com>
> Signed-off-by: Stefan Hengelein <ilendir at googlemail.com>
> ---
>  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



More information about the devel mailing list