* Ingo Molnar <mi...@kernel.org> wrote:

> +/*
> + * Return a consistent snapshot of the current vmalloc allocation
> + * statistics, for /proc/meminfo:
> + */
> +void get_vmalloc_info(struct vmalloc_info *vmi)
> +{
> +     int gen = READ_ONCE(vmap_info_gen);
> +
> +     /*
> +      * If the generation counter of the cache matches that of
> +      * the vmalloc generation counter then return the cache:
> +      */
> +     if (READ_ONCE(vmap_info_cache_gen) == gen) {
> +             int gen_after;
> +
> +             /*
> +              * The two read barriers make sure that we read
> +              * 'gen', 'vmap_info_cache' and 'gen_after' in
> +              * precisely that order:
> +              */
> +             smp_rmb();
> +             *vmi = vmap_info_cache;
> +
> +             smp_rmb();
> +             gen_after = READ_ONCE(vmap_info_gen);
> +
> +             /* The cache is still valid: */
> +             if (gen == gen_after)
> +                     return;
> +
> +             /* Ok, the cache got invalidated just now, regenerate it */
> +             gen = gen_after;
> +     }

One more detail: I just realized that with the read barriers, the READ_ONCE() 
accesses are not needed anymore - the barriers and the control dependencies are 
enough.

This will further simplify the code.

Thanks,

        Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to