linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Cc: linux-mm@kvack.org, m.szyprowski@samsung.com, mina86@mina86.com,
	minchan@kernel.org, mgorman@suse.de, hughd@google.com,
	kyungmin.park@samsung.com
Subject: Re: [PATCH v4 4/4] cma: fix watermark checking
Date: Wed, 19 Sep 2012 12:51:02 -0700	[thread overview]
Message-ID: <20120919125102.4a45e27c.akpm@linux-foundation.org> (raw)
In-Reply-To: <1347632974-20465-5-git-send-email-b.zolnierkie@samsung.com>

On Fri, 14 Sep 2012 16:29:34 +0200
Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> wrote:

> * Add ALLOC_CMA alloc flag and pass it to [__]zone_watermark_ok()
>   (from Minchan Kim).

What is its meaning and why was it added.

> * During watermark check decrease available free pages number by
>   free CMA pages number if necessary (unmovable allocations cannot
>   use pages from CMA areas).
> 
> ...
>
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -231,6 +231,21 @@ enum zone_watermarks {
>  #define low_wmark_pages(z) (z->watermark[WMARK_LOW])
>  #define high_wmark_pages(z) (z->watermark[WMARK_HIGH])
>  
> +/* The ALLOC_WMARK bits are used as an index to zone->watermark */
> +#define ALLOC_WMARK_MIN		WMARK_MIN
> +#define ALLOC_WMARK_LOW		WMARK_LOW
> +#define ALLOC_WMARK_HIGH	WMARK_HIGH
> +#define ALLOC_NO_WATERMARKS	0x04 /* don't check watermarks at all */
> +
> +/* Mask to get the watermark bits */
> +#define ALLOC_WMARK_MASK	(ALLOC_NO_WATERMARKS-1)
> +
> +#define ALLOC_HARDER		0x10 /* try to alloc harder */
> +#define ALLOC_HIGH		0x20 /* __GFP_HIGH set */
> +#define ALLOC_CPUSET		0x40 /* check for correct cpuset */
> +

Unneeded newline.

> +#define ALLOC_CMA		0x80

All the other enumerations were documented.  ALLOC_CMA was left
undocumented, despite sorely needing documentation.

>  struct per_cpu_pages {
>  	int count;		/* number of pages in the list */
>  	int high;		/* high watermark, emptying needed */
> diff --git a/mm/compaction.c b/mm/compaction.c
> index 4b902aa..36d79ea 100644
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -868,6 +868,7 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist,
>  	struct zoneref *z;
>  	struct zone *zone;
>  	int rc = COMPACT_SKIPPED;
> +	int alloc_flags = 0;
>  
>  	/*
>  	 * Check whether it is worth even starting compaction. The order check is
> @@ -879,6 +880,10 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist,
>  
>  	count_vm_event(COMPACTSTALL);
>  
> +#ifdef CONFIG_CMA
> +	if (allocflags_to_migratetype(gfp_mask) == MIGRATE_MOVABLE)
> +		alloc_flags |= ALLOC_CMA;

I find this rather obscure.  What is the significance of
MIGRATE_MOVABLE here?  If it had been 

:	if (allocflags_to_migratetype(gfp_mask) == MIGRATE_CMA)
:		alloc_flags |= ALLOC_CMA;

then I'd have read straight past it.  But it's unclear what's happening
here.  If we didn't have to resort to telepathy to understand the
meaning of ALLOC_CMA, this wouldn't be so hard.

> +#endif
>  	/* Compact each zone in the list */
>  	for_each_zone_zonelist_nodemask(zone, z, zonelist, high_zoneidx,
>  								nodemask) {
> @@ -889,7 +894,8 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist,
>  		rc = max(status, rc);
>  
>  		/* If a normal allocation would succeed, stop compacting */
> -		if (zone_watermark_ok(zone, order, low_wmark_pages(zone), 0, 0))
> +		if (zone_watermark_ok(zone, order, low_wmark_pages(zone), 0,
> +				      alloc_flags))
>  			break;
>  	}
>  
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 287f79d..5985cbf 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -1519,19 +1519,6 @@ failed:
>  	return NULL;
>  }
>  
> -/* The ALLOC_WMARK bits are used as an index to zone->watermark */
> -#define ALLOC_WMARK_MIN		WMARK_MIN
> -#define ALLOC_WMARK_LOW		WMARK_LOW
> -#define ALLOC_WMARK_HIGH	WMARK_HIGH
> -#define ALLOC_NO_WATERMARKS	0x04 /* don't check watermarks at all */
> -
> -/* Mask to get the watermark bits */
> -#define ALLOC_WMARK_MASK	(ALLOC_NO_WATERMARKS-1)
> -
> -#define ALLOC_HARDER		0x10 /* try to alloc harder */
> -#define ALLOC_HIGH		0x20 /* __GFP_HIGH set */
> -#define ALLOC_CPUSET		0x40 /* check for correct cpuset */

Perhaps mm/internal.h wouild have been a better place to move these.

>  #ifdef CONFIG_FAIL_PAGE_ALLOC
>  
>  static struct {
> @@ -1626,7 +1613,10 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
>  		min -= min / 2;
>  	if (alloc_flags & ALLOC_HARDER)
>  		min -= min / 4;
> -
> +#ifdef CONFIG_CMA
> +	if (!(alloc_flags & ALLOC_CMA))
> +		free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES);

Again, the negated test looks weird or just wrong.



Please do something to make this code more understandable.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2012-09-19 19:51 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-14 14:29 [PATCH v4 0/4] cma: fix watermark checking Bartlomiej Zolnierkiewicz
2012-09-14 14:29 ` [PATCH v4 1/4] mm: fix tracing in free_pcppages_bulk() Bartlomiej Zolnierkiewicz
2012-09-19  7:07   ` Yasuaki Ishimatsu
2012-09-19  7:32     ` Minchan Kim
2012-09-19  7:45       ` Yasuaki Ishimatsu
2012-09-19  8:03         ` Minchan Kim
2012-09-19 18:07   ` KOSAKI Motohiro
2012-09-19 19:28   ` Andrew Morton
2012-09-14 14:29 ` [PATCH v4 2/4] cma: fix counting of isolated pages Bartlomiej Zolnierkiewicz
2012-09-14 14:29 ` [PATCH v4 3/4] cma: count free CMA pages Bartlomiej Zolnierkiewicz
2012-09-14 14:29 ` [PATCH v4 4/4] cma: fix watermark checking Bartlomiej Zolnierkiewicz
2012-09-19 19:51   ` Andrew Morton [this message]
2012-09-24  9:30     ` Bartlomiej Zolnierkiewicz
2012-09-24 21:30       ` Andrew Morton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120919125102.4a45e27c.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=b.zolnierkie@samsung.com \
    --cc=hughd@google.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-mm@kvack.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mgorman@suse.de \
    --cc=mina86@mina86.com \
    --cc=minchan@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).