On Wed, 14 Dec 2011 15:41:30 +0000 Mel Gorman <mgorman@xxxxxxx> wrote: > This patch adds a lightweight sync migrate operation MIGRATE_SYNC_LIGHT > mode that avoids writing back pages to backing storage. Async > compaction maps to MIGRATE_ASYNC while sync compaction maps to > MIGRATE_SYNC_LIGHT. For other migrate_pages users such as memory > hotplug, MIGRATE_SYNC is used. > > This avoids sync compaction stalling for an excessive length of time, > particularly when copying files to a USB stick where there might be > a large number of dirty pages backed by a filesystem that does not > support ->writepages. > > ... > > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -525,6 +525,7 @@ enum positive_aop_returns { > struct page; > struct address_space; > struct writeback_control; > +enum migrate_mode; > > struct iov_iter { > const struct iovec *iov; > @@ -614,7 +615,7 @@ struct address_space_operations { > * is false, it must not block. > */ > int (*migratepage) (struct address_space *, > - struct page *, struct page *, bool); > + struct page *, struct page *, enum migrate_mode); I'm getting a huge warning spew from this with my sparc64 gcc-3.4.5. I'm not sure why, really. Forward-declaring an enum in this fashion is problematic because some compilers (I'm unsure about gcc) use different sizeofs for enums, depending on the enum's value range. For example, an enum which only has values 0...255 can fit into a byte. (iirc, the compiler actually put it in a 16-bit storage). So I propose: From: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Subject: mm: fix warnings regarding enum migrate_mode sparc64 allmodconfig: In file included from include/linux/compat.h:15, from /usr/src/25/arch/sparc/include/asm/siginfo.h:19, from include/linux/signal.h:5, from include/linux/sched.h:73, from arch/sparc/kernel/asm-offsets.c:13: include/linux/fs.h:618: warning: parameter has incomplete type It seems that my sparc64 compiler (gcc-3.4.5) doesn't like the forward declaration of enums. Fix this by moving the "enum migrate_mode" definition into its own header file. Cc: Mel Gorman <mgorman@xxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Cc: Andrea Arcangeli <aarcange@xxxxxxxxxx> Cc: Minchan Kim <minchan.kim@xxxxxxxxx> Cc: Dave Jones <davej@xxxxxxxxxx> Cc: Jan Kara <jack@xxxxxxx> Cc: Andy Isaacson <adi@xxxxxxxxxxxxx> Cc: Nai Xia <nai.xia@xxxxxxxxx> Cc: Johannes Weiner <jweiner@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/fs.h | 2 +- include/linux/migrate.h | 14 +------------- include/linux/migrate_mode.h | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 14 deletions(-) diff -puN include/linux/fs.h~mm-fix-warnings-regarding-enum-migrate_mode include/linux/fs.h --- a/include/linux/fs.h~mm-fix-warnings-regarding-enum-migrate_mode +++ a/include/linux/fs.h @@ -10,6 +10,7 @@ #include <linux/ioctl.h> #include <linux/blk_types.h> #include <linux/types.h> +#include <linux/migrate_mode.h> /* * It's silly to have NR_OPEN bigger than NR_FILE, but you can change @@ -525,7 +526,6 @@ enum positive_aop_returns { struct page; struct address_space; struct writeback_control; -enum migrate_mode; struct iov_iter { const struct iovec *iov; diff -puN include/linux/migrate.h~mm-fix-warnings-regarding-enum-migrate_mode include/linux/migrate.h --- a/include/linux/migrate.h~mm-fix-warnings-regarding-enum-migrate_mode +++ a/include/linux/migrate.h @@ -3,22 +3,10 @@ #include <linux/mm.h> #include <linux/mempolicy.h> +#include <linux/migrate_mode.h> typedef struct page *new_page_t(struct page *, unsigned long private, int **); -/* - * MIGRATE_ASYNC means never block - * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking - * on most operations but not ->writepage as the potential stall time - * is too significant - * MIGRATE_SYNC will block when migrating pages - */ -enum migrate_mode { - MIGRATE_ASYNC, - MIGRATE_SYNC_LIGHT, - MIGRATE_SYNC, -}; - #ifdef CONFIG_MIGRATION #define PAGE_MIGRATION 1 diff -puN /dev/null include/linux/migrate_mode.h --- /dev/null +++ a/include/linux/migrate_mode.h @@ -0,0 +1,16 @@ +#ifndef MIGRATE_MODE_H_INCLUDED +#define MIGRATE_MODE_H_INCLUDED +/* + * MIGRATE_ASYNC means never block + * MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking + * on most operations but not ->writepage as the potential stall time + * is too significant + * MIGRATE_SYNC will block when migrating pages + */ +enum migrate_mode { + MIGRATE_ASYNC, + MIGRATE_SYNC_LIGHT, + MIGRATE_SYNC, +}; + +#endif /* MIGRATE_MODE_H_INCLUDED */ _ -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>