On Wed, Mar 15, 2017 at 07:36:48PM +0800, Yisheng Xie wrote:
> @@ -100,6 +100,9 @@ struct scan_control {
>       /* Can cgroups be reclaimed below their normal consumption range? */
>       unsigned int may_thrash:1;
>  
> +     /* Did we have any memcg protected by the low limit */
> +     unsigned int memcg_low_protection:1;

These are both bad names. How about the following pair?

        /*
         * Cgroups are not reclaimed below their configured memory.low,
         * unless we threaten to OOM. If any cgroups are skipped due to
         * memory.low and nothing was reclaimed, go back for memory.low.
         */
        unsigned int memcg_low_skipped:1
        unsigned int memcg_low_reclaim:1;

> @@ -2557,6 +2560,8 @@ static bool shrink_node(pg_data_t *pgdat, struct 
> scan_control *sc)
>                       unsigned long scanned;
>  
>                       if (mem_cgroup_low(root, memcg)) {
> +                             sc->memcg_low_protection = 1;
> +
>                               if (!sc->may_thrash)
>                                       continue;

                                if (!sc->memcg_low_reclaim) {
                                        sc->memcg_low_skipped = 1;
                                        continue;
                                }

>                               mem_cgroup_events(memcg, MEMCG_LOW, 1);
> @@ -2808,7 +2813,7 @@ static unsigned long do_try_to_free_pages(struct 
> zonelist *zonelist,
>               return 1;
>  
>       /* Untapped cgroup reserves?  Don't OOM, retry. */
> -     if (!sc->may_thrash) {
> +     if (sc->memcg_low_protection && !sc->may_thrash) {

        if (sc->memcg_low_skipped) {
                [...]
                sc->memcg_low_reclaim = 1;
                goto retry;
        }

Reply via email to