On Tue, Mar 13, 2012 at 11:34:46AM +0100, Florian Schmaus wrote:
> From: Andor Daam <[email protected]>
> 
> 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 <[email protected]>
> Signed-off-by: Florian Schmaus <[email protected]>
> Signed-off-by: Stefan Hengelein <[email protected]>
> ---
>  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
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to