Subject: Re: linux-next: build failure after merge of the final tree (maybe vfs tree related)

From: Dave Chinner <[email-masked]>
Date: Thu, 21 Jul 2011 09:17:46 +1000

On Wed, Jul 20, 2011 at 02:55:24PM +0100, Al Viro wrote:
> On Wed, Jul 20, 2011 at 05:32:32PM +1000, Stephen Rothwell wrote:
> > Hi all,
> > 
> > After merging the final tree, today's linux-next build (sparc defconfig)
> > failed like this:
> 
> > And many more similar.  Again, I assume some include files changed.
> > Maybe commit 347727d3f51d ("superblock: introduce per-sb cache shrinker
> > infrastructure") which included linux/mm.h in linux/fs.h ...
> > 
> > I have left this again.
> 
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 1ce9086..e0569e4 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -395,7 +395,7 @@ struct inodes_stat_t {
>  #include <linux/semaphore.h>
>  #include <linux/fiemap.h>
>  #include <linux/rculist_bl.h>
> -#include <linux/mm.h>
> +#include <linux/shrinker.h>
>  #include <linux/atomic.h>
>  
>  #include <asm/byteorder.h>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 9b9777a..e3a1a9e 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -15,6 +15,7 @@
>  #include <linux/range.h>
>  #include <linux/pfn.h>
>  #include <linux/bit_spinlock.h>
> +#include <linux/shrinker.h>
>  
>  struct mempolicy;
>  struct anon_vma;
> @@ -1121,45 +1122,6 @@ static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm)
>  }
>  #endif
>  
> -/*
> - * This struct is used to pass information from page reclaim to the shrinkers.
> - * We consolidate the values for easier extention later.
> - */
> -struct shrink_control {
> -	gfp_t gfp_mask;
> -
> -	/* How many slab objects shrinker() should scan and try to reclaim */
> -	unsigned long nr_to_scan;
> -};
> -
> -/*
> - * A callback you can register to apply pressure to ageable caches.
> - *
> - * 'sc' is passed shrink_control which includes a count 'nr_to_scan'
> - * and a 'gfpmask'.  It should look through the least-recently-used
> - * 'nr_to_scan' entries and attempt to free them up.  It should return
> - * the number of objects which remain in the cache.  If it returns -1, it means
> - * it cannot do any scanning at this time (eg. there is a risk of deadlock).
> - *
> - * The 'gfpmask' refers to the allocation we are currently trying to
> - * fulfil.
> - *
> - * Note that 'shrink' will be passed nr_to_scan == 0 when the VM is
> - * querying the cache size, so a fastpath for that case is appropriate.
> - */
> -struct shrinker {
> -	int (*shrink)(struct shrinker *, struct shrink_control *sc);
> -	int seeks;	/* seeks to recreate an obj */
> -	long batch;	/* reclaim batch size, 0 = default */
> -
> -	/* These are for internal use */
> -	struct list_head list;
> -	long nr;	/* objs pending delete */
> -};
> -#define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
> -extern void register_shrinker(struct shrinker *);
> -extern void unregister_shrinker(struct shrinker *);
> -
>  int vma_wants_writenotify(struct vm_area_struct *vma);
>  
>  extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr,
> diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
> new file mode 100644
> index 0000000..790651b
> --- /dev/null
> +++ b/include/linux/shrinker.h
> @@ -0,0 +1,42 @@
> +#ifndef _LINUX_SHRINKER_H
> +#define _LINUX_SHRINKER_H
> +
> +/*
> + * This struct is used to pass information from page reclaim to the shrinkers.
> + * We consolidate the values for easier extention later.
> + */
> +struct shrink_control {
> +	gfp_t gfp_mask;
> +
> +	/* How many slab objects shrinker() should scan and try to reclaim */
> +	unsigned long nr_to_scan;
> +};
> +
> +/*
> + * A callback you can register to apply pressure to ageable caches.
> + *
> + * 'sc' is passed shrink_control which includes a count 'nr_to_scan'
> + * and a 'gfpmask'.  It should look through the least-recently-used
> + * 'nr_to_scan' entries and attempt to free them up.  It should return
> + * the number of objects which remain in the cache.  If it returns -1, it means
> + * it cannot do any scanning at this time (eg. there is a risk of deadlock).
> + *
> + * The 'gfpmask' refers to the allocation we are currently trying to
> + * fulfil.
> + *
> + * Note that 'shrink' will be passed nr_to_scan == 0 when the VM is
> + * querying the cache size, so a fastpath for that case is appropriate.
> + */
> +struct shrinker {
> +	int (*shrink)(struct shrinker *, struct shrink_control *sc);
> +	int seeks;	/* seeks to recreate an obj */
> +	long batch;	/* reclaim batch size, 0 = default */
> +
> +	/* These are for internal use */
> +	struct list_head list;
> +	long nr;	/* objs pending delete */
> +};
> +#define DEFAULT_SEEKS 2 /* A good number if you don't know better. */
> +extern void register_shrinker(struct shrinker *);
> +extern void unregister_shrinker(struct shrinker *);
> +#endif

Yup, that was what I was considering doing to fix it. Thanks, Al.

Acked-by: Dave Chinner <[email-masked]>

-- 
Dave Chinner
[email-masked]