slub-i386-support.patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Just want to report that I've been running SLUB on i386, both in -mm
and with slub-i386-support.patch applied to 2.6.21-git, and observed
no problems with it.  I'm anxious that it (or an equivalent) go into
2.6.22-rc1, i386 being now the last ARCH_USES_SLAB_PAGE_STRUCT holdout.

In the frenzy over PowerPC, maybe Linus overlooked that i386
was still not supporting SLUB; and I fear that once people get
"# CONFIG_SLUB is not set" into their .config, they're less likely to
switch over to testing CONFIG_SLUB=y - I remain anxious that it see
as much testing as possible (but under EXPERIMENTAL for 2.6.22, yes).

Though when I look at the patchset (copied below), I do wonder why
it puts a quicklist_trim() into i386's cpu_idle() and flush_tlb_mm():
neither is where I'd expect us to be secretly freeing pages.  Ah,
several arches do it in cpu_idle(): how odd, oh well.

Hugh

> From: Christoph Lameter <[email protected]>
> 
> SLUB cannot run on i386 at this point because i386 uses the page->private and
> page->index field of slab pages for the pgd cache.
> 
> Make SLUB run on i386 by replacing the pgd slab cache with a quicklist.
> Limit the changes as much as possible. Leave the improvised linked list in place
> etc etc. This has been working here for a couple of weeks now.
> 
> Acked-by: William Lee Irwin III <[email protected]>
> Signed-off-by: Christoph Lameter <[email protected]>
> Signed-off-by: Andrew Morton <[email protected]>
> ---
> 
>  arch/i386/Kconfig          |    8 ++++----
>  arch/i386/kernel/process.c |    1 +
>  arch/i386/kernel/smp.c     |    2 +-
>  arch/i386/mm/init.c        |    7 -------
>  arch/i386/mm/pgtable.c     |   26 +++++++++++++++++---------
>  include/asm-i386/pgalloc.h |    2 --
>  include/asm-i386/pgtable.h |    5 ++---
>  7 files changed, 25 insertions(+), 26 deletions(-)
> 
> diff -puN arch/i386/Kconfig~slub-i386-support arch/i386/Kconfig
> --- a/arch/i386/Kconfig~slub-i386-support
> +++ a/arch/i386/Kconfig
> @@ -55,6 +55,10 @@ config ZONE_DMA
>  	bool
>  	default y
>  
> +config QUICKLIST
> +	bool
> +	default y
> +
>  config SBUS
>  	bool
>  
> @@ -79,10 +83,6 @@ config ARCH_MAY_HAVE_PC_FDC
>  	bool
>  	default y
>  
> -config ARCH_USES_SLAB_PAGE_STRUCT
> -	bool
> -	default y
> -
>  config DMI
>  	bool
>  	default y
> diff -puN arch/i386/kernel/process.c~slub-i386-support arch/i386/kernel/process.c
> --- a/arch/i386/kernel/process.c~slub-i386-support
> +++ a/arch/i386/kernel/process.c
> @@ -187,6 +187,7 @@ void cpu_idle(void)
>  			if (__get_cpu_var(cpu_idle_state))
>  				__get_cpu_var(cpu_idle_state) = 0;
>  
> +			check_pgt_cache();
>  			rmb();
>  			idle = pm_idle;
>  
> diff -puN arch/i386/kernel/smp.c~slub-i386-support arch/i386/kernel/smp.c
> --- a/arch/i386/kernel/smp.c~slub-i386-support
> +++ a/arch/i386/kernel/smp.c
> @@ -422,7 +422,7 @@ void flush_tlb_mm (struct mm_struct * mm
>  	}
>  	if (!cpus_empty(cpu_mask))
>  		flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL);
> -
> +	check_pgt_cache();
>  	preempt_enable();
>  }
>  
> diff -puN arch/i386/mm/init.c~slub-i386-support arch/i386/mm/init.c
> --- a/arch/i386/mm/init.c~slub-i386-support
> +++ a/arch/i386/mm/init.c
> @@ -752,7 +752,6 @@ int remove_memory(u64 start, u64 size)
>  EXPORT_SYMBOL_GPL(remove_memory);
>  #endif
>  
> -struct kmem_cache *pgd_cache;
>  struct kmem_cache *pmd_cache;
>  
>  void __init pgtable_cache_init(void)
> @@ -776,12 +775,6 @@ void __init pgtable_cache_init(void)
>  			pgd_size = PAGE_SIZE;
>  		}
>  	}
> -	pgd_cache = kmem_cache_create("pgd",
> -				pgd_size,
> -				pgd_size,
> -				SLAB_PANIC,
> -				pgd_ctor,
> -				(!SHARED_KERNEL_PMD) ? pgd_dtor : NULL);
>  }
>  
>  /*
> diff -puN arch/i386/mm/pgtable.c~slub-i386-support arch/i386/mm/pgtable.c
> --- a/arch/i386/mm/pgtable.c~slub-i386-support
> +++ a/arch/i386/mm/pgtable.c
> @@ -13,6 +13,7 @@
>  #include <linux/pagemap.h>
>  #include <linux/spinlock.h>
>  #include <linux/module.h>
> +#include <linux/quicklist.h>
>  
>  #include <asm/system.h>
>  #include <asm/pgtable.h>
> @@ -205,8 +206,6 @@ void pmd_ctor(void *pmd, struct kmem_cac
>   * against pageattr.c; it is the unique case in which a valid change
>   * of kernel pagetables can't be lazily synchronized by vmalloc faults.
>   * vmalloc faults work because attached pagetables are never freed.
> - * The locking scheme was chosen on the basis of manfred's
> - * recommendations and having no core impact whatsoever.
>   * -- wli
>   */
>  DEFINE_SPINLOCK(pgd_lock);
> @@ -232,9 +231,11 @@ static inline void pgd_list_del(pgd_t *p
>  		set_page_private(next, (unsigned long)pprev);
>  }
>  
> +
> +
>  #if (PTRS_PER_PMD == 1)
>  /* Non-PAE pgd constructor */
> -void pgd_ctor(void *pgd, struct kmem_cache *cache, unsigned long unused)
> +void pgd_ctor(void *pgd)
>  {
>  	unsigned long flags;
>  
> @@ -256,7 +257,7 @@ void pgd_ctor(void *pgd, struct kmem_cac
>  }
>  #else  /* PTRS_PER_PMD > 1 */
>  /* PAE pgd constructor */
> -void pgd_ctor(void *pgd, struct kmem_cache *cache, unsigned long unused)
> +void pgd_ctor(void *pgd)
>  {
>  	/* PAE, kernel PMD may be shared */
>  
> @@ -275,11 +276,12 @@ void pgd_ctor(void *pgd, struct kmem_cac
>  }
>  #endif	/* PTRS_PER_PMD */
>  
> -void pgd_dtor(void *pgd, struct kmem_cache *cache, unsigned long unused)
> +void pgd_dtor(void *pgd)
>  {
>  	unsigned long flags; /* can be called from interrupt context */
>  
> -	BUG_ON(SHARED_KERNEL_PMD);
> +	if (SHARED_KERNEL_PMD)
> +		return;
>  
>  	paravirt_release_pd(__pa(pgd) >> PAGE_SHIFT);
>  	spin_lock_irqsave(&pgd_lock, flags);
> @@ -321,7 +323,7 @@ static void pmd_cache_free(pmd_t *pmd, i
>  pgd_t *pgd_alloc(struct mm_struct *mm)
>  {
>  	int i;
> -	pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
> +	pgd_t *pgd = quicklist_alloc(0, GFP_KERNEL, pgd_ctor);
>  
>  	if (PTRS_PER_PMD == 1 || !pgd)
>  		return pgd;
> @@ -344,7 +346,7 @@ out_oom:
>  		paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
>  		pmd_cache_free(pmd, i);
>  	}
> -	kmem_cache_free(pgd_cache, pgd);
> +	quicklist_free(0, pgd_dtor, pgd);
>  	return NULL;
>  }
>  
> @@ -361,5 +363,11 @@ void pgd_free(pgd_t *pgd)
>  			pmd_cache_free(pmd, i);
>  		}
>  	/* in the non-PAE case, free_pgtables() clears user pgd entries */
> -	kmem_cache_free(pgd_cache, pgd);
> +	quicklist_free(0, pgd_dtor, pgd);
>  }
> +
> +void check_pgt_cache(void)
> +{
> +	quicklist_trim(0, pgd_dtor, 25, 16);
> +}
> +
> diff -puN include/asm-i386/pgalloc.h~slub-i386-support include/asm-i386/pgalloc.h
> --- a/include/asm-i386/pgalloc.h~slub-i386-support
> +++ a/include/asm-i386/pgalloc.h
> @@ -65,6 +65,4 @@ do {									\
>  #define pud_populate(mm, pmd, pte)	BUG()
>  #endif
>  
> -#define check_pgt_cache()	do { } while (0)
> -
>  #endif /* _I386_PGALLOC_H */
> diff -puN include/asm-i386/pgtable.h~slub-i386-support include/asm-i386/pgtable.h
> --- a/include/asm-i386/pgtable.h~slub-i386-support
> +++ a/include/asm-i386/pgtable.h
> @@ -35,17 +35,16 @@ struct vm_area_struct;
>  #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
>  extern unsigned long empty_zero_page[1024];
>  extern pgd_t swapper_pg_dir[1024];
> -extern struct kmem_cache *pgd_cache;
>  extern struct kmem_cache *pmd_cache;
>  extern spinlock_t pgd_lock;
>  extern struct page *pgd_list;
> +void check_pgt_cache(void);
>  
>  void pmd_ctor(void *, struct kmem_cache *, unsigned long);
> -void pgd_ctor(void *, struct kmem_cache *, unsigned long);
> -void pgd_dtor(void *, struct kmem_cache *, unsigned long);
>  void pgtable_cache_init(void);
>  void paging_init(void);
>  
> +
>  /*
>   * The Linux x86 paging architecture is 'compile-time dual-mode', it
>   * implements both the traditional 2-level x86 page tables and the
> _
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux